深度学习:到底怎么理解embedding
深度学习:到底怎么理解embedding
注意到embedding这个词,很大可能是在进行时间序列上的处理过程中遇到的,遇到的时间序列模型中,很大部分需要用到embedding过程,同时在看相关的程序代码的时候看到模型的结构设计中设计到embedding层。那么到底什么是embedding,还有embedding完成了什么操作,这里记录一下最直观的解释。
1. 何为Embeddings–何为嵌入
Embeddings: 中文名词:嵌入
OpenAI的文本嵌入衡量文本字符串的相关性。
说的简单一点,就是一种编码,只不过这个编码的过程与one-hot这种简单的编码表示方式不同,这个embedding是有一个字典,同时通过这种嵌入方式所表示的数据可以含有数据之间的相似性信息,相似性可以通过计算相似度。如下面的余弦相似度计算方式。
通俗一点解释嵌入的过程:现在有一本字典,字典规定了每一个单词可以通过一个长度为10的向量进行表示。那么
现在有一句话,I like cats
,那么用字典每一个词都可以用长度为10的向量表示,则这个最终的表示维度大小为[3,10],现在你有另一句话I love cats
,这句话用这个字典可以通过维度[3,10]的数据表示。
如果采用one-hot 编码的方式表示,假设是有十个不同的单词,那么I like cats
这句话需要同样需要[3,10],但是其中只有三个数字是1,其他全是0。在NLP处理中并不是一个好的编码方式。
总的来说,嵌入具有以下优势:可以完成语义表示,完成降维,学习语义关系,提高计算效率。最重要一点,这个嵌入是从数据中学习得到的。
这是有一本字典的前提,如果要是没有,就相当于在自己的网络中Embedding层,然后通过训练得到Embedding的权重,完成嵌入过程。
- 余弦相似度:
s i m i l a r i t y = cos ( θ ) = A ⋅ B ∥ A ∥ ∥ B ∥ = ∑ i = 1 n A i × B i ∑ i = 1 n ( A i ) 2 × ∑ i = 1 n ( B i ) 2 \mathrm{similarity}=\cos(\theta)=\frac{A\cdot B}{\|A\|\|B\|}=\frac{\sum_{i=1}^nA_i\times B_i}{\sqrt{\sum_{i=1}^n{(A_i)^2}}\times\sqrt{\sum_{i=1}^n{(B_i)^2}}} similarity=cos(θ)=∥A∥∥B∥A⋅B=∑i=1n(Ai)2×∑i=1n(Bi)2∑i=1nAi×Bi
其中, A ⋅ B \mathbf{A}\cdot\mathbf{B} A⋅B表示点积, ∥ A ∥ \|\mathbf{A}\| ∥A∥表示范数,结果越靠近1越相近。
import numpy as np
from numpy.linalg import norm
def cosine_similarity(a, b):
dot_product = np.dot(a, b)
norm_a = norm(a)
norm_b = norm(b)
similarity = dot_product / (norm_a * norm_b)
return similarity
# 示例向量
vector_a = np.array([1, 2, 3])
vector_b = np.array([4, 5, 6])
# 计算余弦相似度
similarity = cosine_similarity(vector_a, vector_b)
print(f"Cosine Similarity: {similarity}")
下面用代码说明可能更直观。
2.torch.nn.Embeddings()
在torch中提供了一个nn.Embedding()层,可以构建网络的过程中使用,这里面涉及的参数包括以下
- num_embeddings(int) : 嵌入字典的大小
- embedding_dim(int) :每个嵌入向量的大小
- …
通过程序理解这两个参数,
import torch
import torch.nn as nn
embedding = nn.Embedding(20, 5)
input = torch.LongTensor([[1,2,3,4], [4,3,2,9]])
print(input.shape)
print(embedding(input).shape)
print(embedding(input))
print(embedding.weight.shape)
运行之后会得到:
torch.Size([2, 4])
torch.Size([2, 4, 5])
torch.Size([20, 5])
-第一个参数就是说你添加的这个字典的大小,对应的是训练更新权重的第一个维度,第二个参数对应的是训练更新权重的第二个维度,同时embedding_dim大的大小相当于在输入数据的后面添加了一个嵌入向量大小的维度。
通俗解释:输入数据是包含2句话,每一句话有四个数据(单词)(torch.Size([2,4])),经过embedding之后,还是有两句话,每一句话中的每一个数据,都用长度为5的向量表示,则输出的维度为torch.Size([2,4,5])。