讲清楚embedding到底在干什么

本文探讨了Embedding和OneHot编码的区别,说明Embedding如何解决OneHot编码的维度冗余和关系缺失问题,通过神经网络降低训练数据量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

要搞清楚embeding先要弄明白他和one hot encoding的区别,以及他解决了什么one hot encoding不能解决的问题,带着这两个问题去思考,在看一个简单的计算例子

以下引用 YJango的Word Embedding–介绍
https://zhuanlan.zhihu.com/p/27830489

One hot representation
程序中编码单词的一个方法是one hot encoding。
实例:有1000个词汇量。排在第一个位置的代表英语中的冠词"a",那么这个"a"是用[1,0,0,0,0,…],只有第一个位置是1,其余位置都是0的1000维度的向量表示,如下图中的第一列所示。
在这里插入图片描述
也就是说,
在one hot representation编码的每个单词都是一个维度,彼此independent。

这里我们可以看到One hot方式处理的数据
1、会产生大量冗余的稀疏矩阵
2、维度(单词)间的关系,没有得到体现

继续引用

神经网络分析
假设我们的词汇只有4个,girl, woman, boy, man,下面就思考用两种不同的表达方式会有什么区别。
One hot representation
尽管我们知道他们彼此的关系,但是计算机并不知道。在神经网络的输入层中,每个单词都会被看作一个节点。 而我们知道训练神经网络就是要学习每个连接线的权重。如果只看第一层的权重,下面的情况需要确定43个连接线的关系,因为每个维度都彼此独立,girl的数据不会对其他单词的训练产生任何帮助,训练所需要的数据量,基本就固定在那里了。
在这里插入图片描述
Distributed representation
我们这里手动的寻找这四个单词之间的关系 f 。可以用两个节点去表示四个单词。每个节点取不同值时的意义如下表。 那么girl就可以被编码成向量[0,1],man可以被编码成[1,1](第一个维度是gender,第二个维度是age)。

那么这时再来看神经网络需要学习的连接线的权重就缩小到了2
3。同时,当送入girl为输入的训练数据时,因为它是由两个节点编码的。那么与girl共享相同连接的其他输入例子也可以被训练到(如可以帮助到与其共享female的woman,和child的boy的训练)。
在这里插入图片描述
Word embedding也就是要达到第二个神经网络所表示的结果,降低训练所需要的数据量。
Word embedding就是要从数据中自动学习到输入空间到Distributed representation空间的 映射f 。

以上的计算都没有涉及到label,所以训练过程是无监督的

看一个实际代码计算的例子

假设有一个维度为7的稀疏向量[0,1,0,1,1,0,0]。你可以把它变成一个非稀疏的2d向量,如下所示:

model = Sequential()
model.add(Embedding(2, 2, input_length=7))#输入维,输出维
model.compile('rmsprop', 'mse')
model.predict(np.array([[0,1,0,1,1,0,0]]))
array([[[ 0.03005414, -0.02224021],
        [ 0.03396987, -0.00576888],
        [ 0.03005414, -0.02224021],
        [ 0.03396987, -0.00576888],
        [ 0.03396987, -0.00576888],
        [ 0.03005414, -0.02224021],
        [ 0.03005414, -0.02224021]]], dtype=float32)

这个转换实际上是把[0,1,0,1,1,0,0]增加一个纵向展开的维度

model.layers[0].W.get_value()
array([[ 0.03005414, -0.02224021],
       [ 0.03396987, -0.00576888]], dtype=float32)

通过比较两个数组可以看出0值映射到第一个索引,1值映射到第二个索引。嵌入构造函数的第一个值是输入中的值范围。在示例中它是2,因为我们给出了二进制向量作为输入。第二个值是目标维度。第三个是我们给出的向量的长度。
所以,这里没有什么神奇之处,只是从整数到浮点数的映射。

计算例子的model.layers[0].W.get_value(),就是上面引用图示中的映射f

### Embedding模型的作用 Embedding模型通过将单词、句子或段落映射到一个连续的向量空间中,使得相似的文本在这个空间中的距离较近。这种映射方式能够有效捕捉文本的语义和上下文信息[^3]。 主要功能如下: - **文本表示**:将文本转换为固定长度的向量,这些向量可以作为机器学习模型的输入。 - **语义相似度计算**:在高维空间中,语义相似的文本会被映射到相近的位置,这可用于相似度计算、聚类等任务。 - **文本分类**:将文本表示为向量后,可应用于各种分类任务,例如情感分析、话题分类等。 - **信息检索**:通过计算向量间的相似度,可用于信息检索和推荐系统。 ### Embedding模型的应用场景 #### 搜索引擎 通过Embedding模型,查询和文档被表示为向量,再通过计算两者之间的相似度来排序搜索结果,从而提升搜索引擎的相关性和效率。 #### 推荐系统 利用用户行为数据以及内容本身的向量表示,推荐系统能更精准地找到与用户兴趣相匹配的内容或商品,提供个性化的服务体验。 #### 自然语言理解 在对话系统、机器翻译等领域,借助于Embedding技术所获得的良好语义表达能力,计算机可以更好地完成诸如问答交互、多语言互译等工作。 ```python import numpy as np from sklearn.metrics.pairwise import cosine_similarity def calculate_embedding(text, model): """ 计算给定文本的嵌入向量 """ return model.encode([text])[0] # 假设我们有一个预训练好的embedding模型model model = None # 这里应该加载实际使用的embedding模型 query_vector = calculate_embedding("如何制作披萨", model) document_vectors = [ calculate_embedding(doc, model) for doc in ["意大利美食介绍", "家庭烘焙技巧"] ] similarity_scores = cosine_similarity( [query_vector], document_vectors).flatten() print(similarity_scores.tolist()) ```
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值