关于Embedding的两种实现方式

news2024/11/15 13:59:15

目录

  • 言简意赅
  • 方式一
  • 方式二
  • 以DNN为例两种方式全部demo代码

言简意赅

假设现在有一段话:“我爱你中国”,在训练入模的时候,常用的方法分别有:onehot、embedding、hash,如果词表很大、特征很多,那么onehot之后会极其稀疏,hash也会有一定的hash冲突,所以这其中emb是最常用的方法。

我们希望,通过一个向量去表征每一个词,以“我爱你中国”为例,将其映射成为一个二维矩阵,矩阵的维度即(词表大小,emb维度)。

图片

对于结构化数据而言,假设我们现在有2个特征分别为“性别”、“设备品牌”,这里规范下概念方便代码实现,如下图:

一个类别特征对应一个Field,但是对应多个Feature:图片

所以按照上面的例子,field有两个,分别为“性别”、“设备品牌”,假设性别有男女2个,设备品牌有3个,它们则分别对应着feature,即特征值。按照emb的方式,我们需要对每一个feature都去学习一个向量表征。

下面方法均以此例为基础讲解

  • x1、x2分别代表“性别”、“设备品牌”,为特征域field
  • 经过编码后特征值分别为2个、3个,即0 1、0 1 2
  • batch_size = 3
  • emb_dim = 10

在这里插入图片描述

方式一

推荐使用方式二

思路:对于每一个特征field定义一个emb向量,然后进行拼接。

  • 1.定义每个特征field的词表大小,即有多少个特征值;
  • 2.为每一个特征field定义一个emb向量;
  • 3.拼接每个特征的emb向量。
'''   用于 spare field embedding   '''
def sparseFeature(feat, vocabulary_size, embed_dim):
    return {'spare': feat, 'vocabulary_size': vocabulary_size, 'embed_dim': embed_dim}

# 每个特征field的词表大小,即有多少个特征值
spare_feature_columns = [sparseFeature(x, data[x].max() + 1, emb_dim) for x in ['x1', 'x2']]
print('spare_feature_columns: ', spare_feature_columns)

# 为每一个特征field定义一个emb向量
embedding_layer = nn.ModuleDict({'embed_layer{}'.format(i): nn.Embedding(feat['vocabulary_size'], feat['embed_dim'])
                                 for i, feat in enumerate(spare_feature_columns)})
# 初始化权重
for i in range(len(spare_feature_columns)):
    torch.nn.init.xavier_uniform_(embedding_layer['embed_layer{}'.format(i)].weight.data)

print('embedding_layer: ', embedding_layer)    

tensor = tensor.long()  # 转成long类型才能作为nn.embedding的输入
# 拼接每个特征的emb向量
sparse_emb = torch.cat([embedding_layer['embed_layer{}'.format(i)](tensor[:, i])
                          for i in range(tensor.shape[1])], dim=1)
print(sparse_emb.shape)
print(sparse_emb)
'''
spare_feature_columns:  [{'spare': 'x1', 'vocabulary_size': 2, 'embed_dim': 10}, {'spare': 'x2', 'vocabulary_size': 3, 'embed_dim': 10}]

embedding_layer:  ModuleDict(
  (embed_layer0): Embedding(2, 10)  
  (embed_layer1): Embedding(3, 10)
)

torch.Size([3, 20])

tensor([[ 0.4941,  0.3774, -0.5872, -0.5937,  0.6413, -0.6516,  0.6855, -0.2272,          
          0.3905, -0.5630, -0.0726,  0.6481,  0.0143,  0.0614,  0.0460, -0.2215,         
         -0.6515,  0.0103, -0.4000,  0.5353],       
        [ 0.4941,  0.3774, -0.5872, -0.5937,  0.6413, -0.6516,  0.6855, -0.2272,          
          0.3905, -0.5630,  0.5236,  0.3958, -0.1983,  0.4128, -0.0349, -0.5609,          
          0.4050, -0.4603,  0.3048, -0.6483],        
        [-0.2146, -0.4806,  0.2180,  0.3497,  0.1291, -0.4531, -0.6532,  0.2385,          
          0.3290, -0.7043,  0.1372, -0.1554,  0.0272, -0.4285, -0.2797, -0.0988,          
          0.2602,  0.6084,  0.0169,  0.0712]])
'''

方式二

这个是比较推荐的方式,并且经过实践这个方式比第一种方式效果还要好。

我们引入一个offset的概念,它的作用就是给每列特征的label加入之前特征的类别总和,来达到所有特征的label。以上述为例来理解下:

feature_fields = [2, 3],它代表“性别”、“设备品牌”各有几个特征值。

offsets = [0 2],它其实就代表着look up table。

即实际look up table中:

  • 0 - 1 行,对应特征性别,它的取值为0、1,所以dim为2,即feature_fields[0];
  • 2 - 4 行,对应特征设备品牌,它的取值为0、1、2,所以dim为3,即feature_fields[1];

但实际特征取值 forward(self, x) 的x大小 只在自身词表内取值:

  • 比如性别取值为1的时候,对应embedding内行数就是 offsets[性别] + 性别 = 0 + 1 = 1,也就是当x_性别取值为1的时候,对应emb的行数为1,注意是索引;
  • 再比如设备品牌取值为1的时候,对应embedding内行数就是 offsets[设备品牌] + 设备品牌 = 2 + 1 = 3;

所以offsets的作用其实就是找到每个特征值的emb向量。

所以思路为:获取每个特征的特征值,创建对应的offsets,再将两者相加,然后emb

  • 1.获取每个特征的特征值;
  • 2.定义offsets;
  • 3.创建emb。

在这里插入图片描述
在这里插入图片描述在这里插入图片描述

以DNN为例两种方式全部demo代码

https://wangguisen.blog.csdn.net/article/details/125928623

如何学习AI大模型?

作为一名热心肠的互联网老兵,我决定把宝贵的AI知识分享给大家。 至于能学习到多少就看你的学习毅力和能力了 。我已将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

一、全套AGI大模型学习路线

AI大模型时代的学习之旅:从基础到前沿,掌握人工智能的核心技能!

img

二、640套AI大模型报告合集

这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。

img

三、AI大模型经典PDF籍

随着人工智能技术的飞速发展,AI大模型已经成为了当今科技领域的一大热点。这些大型预训练模型,如GPT-3、BERT、XLNet等,以其强大的语言理解和生成能力,正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。

img

四、AI大模型商业化落地方案

img

作为普通人,入局大模型时代需要持续学习和实践,不断提高自己的技能和认知水平,同时也需要有责任感和伦理意识,为人工智能的健康发展贡献力量。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2097228.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

macos 使用port查询并安装python2, python3多版本, 设置默认python版本方法

不管是新版macos还是旧版本的macos都可以使用macport这个包管理工具简单方便的在mac上面安装并存多个版本的python, 还可以利用port select --set python python3 来设置默认的python版本等. port search查询可用python安装包 命令 port search --name --line --regex ^pytho…

判断二分图

题目链接 判断二分图 题目描述 注意点 graph.length n不存在自环(graph[u] 不包含 u)不存在平行边(graph[u] 不包含重复值)如果 v 在 graph[u] 内,那么 u 也应该在 graph[v] 内(该图是无向图&#xff0…

深度解析C++中函数重载与引用

🌈个人主页:Yui_ 🌈Linux专栏:Linux 🌈C语言笔记专栏:C语言笔记 🌈数据结构专栏:数据结构 🌈C专栏:C 文章目录 1. 函数重载1.1 函数重载概念1.2 C支持函数重载…

前端Flex布局常见的几个问题

1. 如何设置Flex布局的排列方向? 要设置Flex布局的排列方向,你可以使用CSS的flex-direction属性。该属性有四个值可以选择:row(默认值,水平排列)、row-reverse(反向水平排列)、colu…

零信任赋予安全牙齿,AI促使它更锋利

距离上次写关于安全的文字已经过去了很久很久,久到上次看到的AI还停留在TTS、ASR等最初的语音交互搜索类似的各种智能音箱以及通过关键字匹配的基于知识库的聊天的机器人。之后的几年各种视觉识别遍地开花,AI四小龙在人脸识别上成熟应用,再然…

Java:数字验证

Java中的有效数字验证:从混乱到清晰 引言问题背景初始尝试:一段令人困惑的代码解决方案:简化与重构 结语 引言 在计算机科学领域,确保输入数据的有效性至关重要。 尤其在处理用户提交的数据或解析文本文件时,确认数据…

第二证券:大洗牌!头部券商营收、净利集体下滑

前十券商营收团体下滑,银河证券跌幅最小 新股IPO数量锐减129家至44家,国内证券市场股票基金交易量日均规划 同比下降 6.83%……关于证券公司而言,本年上半年可谓多重要素叠加冲击,成果下滑难以避免。于大多数证券公司而言&#x…

金融行业选择数据安全交换系统三定律,你遵从了没?

金融行业对我国的重要性不言而喻,它作为国民经济的血脉,是国家核心竞争力的重要组成部分。金融行业是数据密集型行业,数据是金融行业的重要资产。数据在金融行业内部及内外部流动时,其价值才得以发挥,金融行业的业务以…

在麒麟系统安装php7.4中遇到的问题

一、安装过程 下载相关php安装包,进行解压,进入安装包,进行编译安装,编译 ./configure --prefix/soft/php74 --with-config-file-path/soft/php74/etc --with-libdir/usr/lib64 --with-freetype/usr/include/freetype2/free…

Zynq7000系列FPGA中的DDRC纠错码(ECC)

仅在半总线宽度(16位)数据宽度配置中提供可选的ECC支持。这种配置下,外部DRAM DDR设备需要26位,其中16位用于数据,10位用于ECC。每个数据字节使用独立的5位ECC字段,这种模式提供了单错误纠正和双错误检测的…

【C++】vector迭代器失效问题

本文是对vector迭代器失效问题的分析,需要对vector有一定了解,若还不了解的可以看这篇文章进行学习:【C】容器vector常用接口详解-CSDN博客 目录 一.什么是迭代器失效? 二.迭代器失效的典型案例 1.引起底层空间改变 2.指定位置…

Docker 在 Windows 上的使用指南

Docker 在 Windows 上的使用指南 Docker 是一种强大的容器化平台,广泛应用于开发和生产环境。本文将介绍如何在 Windows 系统上使用 Docker,包括容器的启动、常见问题的排查,以及网络问题的解决方法。 1. Docker 安装与配置 在开始使用 Do…

大模型书单指南:如何快速找到最适合你的那一本书?别找了就是这本!

大模型的书这么多,该怎么选呢? 本期书单就来教大家怎么快速地从众多大模型书中选到你想要的那一本! 大模型基础 大模型入门不可错过的一本书,就是这本大模型界的经典畅销书**《大规模语言模型》**!系统性强&#xf…

如何从 Mac 上清空的垃圾箱中恢复误删除的文件

在 Mac 上删除的文件将被移至垃圾箱并保留 30 天,然后才会被永久删除。但是,许多 Mac 用户可能会意外清空垃圾箱而没有意识到其中包含了重要文件。本指南包含从清空的垃圾箱中恢复 Mac 上已删除文件的所有有效方法。 当您意识到自己意外清空了 Mac 上的…

C语言基础(三十一)

1、线性搜索&#xff1a; #include "date.h" #include <stdio.h> #include <stdlib.h> #include <time.h> // 希尔排序 void shellSort(int arr[], int n) { for (int gap n / 2; gap > 0; gap / 2) { for (int i gap; i < n; i…

vue学习记录十四:路由(router)学习(五):Vue Router基本原理实现第二种方法

vue学习记录十四&#xff1a;路由&#xff08;router&#xff09;学习&#xff08;四&#xff09;&#xff1a;Vue Router基本原理实现二 一、vueRouter目录结构二、模拟vueRouter目录结构三、index.js文件实现四、install.js文件实现五、创建组件六、解析路由规则七、match实现…

浅谈人工智能之基于anaconda的AutoGen Studio环境搭建

浅谈人工智能之基于anaconda的AutoGen Studio环境搭建 AutoGen Studio 是一个基于 AutoGen 框架的图形用户界面&#xff08;GUI&#xff09;工具。它使开发人员能够更轻松地创建和管理多智能体应用&#xff0c;而无需编写代码。AutoGen Studio 提供了拖放式界面和各种预构建模…

绿色革命:‘众店‘如何重塑零售业并引领消费新潮流

在数字化浪潮的推动下&#xff0c;传统零售业正面临深刻的变革。在这一过程中&#xff0c;绿色积分系统作为一种创新的消费模式&#xff0c;逐渐成为市场的新宠。 一、"众店"平台的迅猛发展 "众店"平台仅用两年时间就实现了跨越式发展&#xff0c;交易额突…

JS基础【双重for循环的实现与应用、打印九九乘法表】

&#x1f680; 个人简介&#xff1a;某大型国企资深软件开发工程师&#xff0c;信息系统项目管理师、CSDN优质创作者、阿里云专家博主、华为云云享专家&#xff0c;分享前端后端相关技术与工作常见问题~ &#x1f49f; 作 者&#xff1a;码喽的自我修养&#x1f970; &#…

springboot+MySQL流浪猫狗疾病预约救治系统-计算机毕设 附源码 13676

springboot流浪猫狗疾病预约救治系统 摘 要 现如今在中国&#xff0c;随着人民生活质量的逐渐提高&#xff0c;以及人民群众消费能力的日渐增长&#xff0c;各种各样的家养小动物&#xff0c;已经逐渐成为人类越来越亲密的生活伴侣。并且&#xff0c;现如今社会竞争及其激烈&am…