## download:构建千万级高可用企业级Node.js应用
Embedding的中文含义是嵌入(将一个物品嵌入到另一个空间中),这种思想同Embedding在深度学习中的作用相似。Embedding最早应是呈现在NLP范畴,比方word2vec,后来推行至其他范畴,例如搜推行等。在学习过一段时间后,现对Embedding的作用和生成办法做一个扼要的总结。
Embedding是对某个对象在低维稠密空间上的一个向量表示,它能够将高维稠密特征转化为一个低维的稠密向量,进而进步模型的泛化性能,这个向量表示表征出了原始对象的某些特性,Embedding之间的间隔可表示两个对象之间的类似性。另外Embedding的生成能够和上层深度神经网络模型的锻炼独立停止,因而在迁移学习或者冷启动中也有相应的应用。
早期的矩阵合成曾经有了Embedding的思想,例如对共现矩阵停止合成得到隐向量的过程。后面就是词向量在自然言语处置范畴大放异彩,并逐步取代了以往的n-gram办法,其中代表性的word2vec办法是CBOW和Skip-gram办法,总体的网络构造如下:
词向量的生成能够看做是对离散变量(特征)求对应的Embedding的过程,输入的是每个词对应的one-hot向量,然后对应的隐层中每行的权重即为Embedding向量。one-hot向量和隐层权重的乘积实质上是一个查表的过程。在引荐范畴,求离散变量对应的Embedding的过程也是一个查表的过程,即需求对不同的离散变量停止编号,然后在表中查找对应位置的Embedding向量。
关于连续变量,求Ebedding的办法目前有多种:例如直接将连续型变量输入到DNN中输出Embedding,然后再和离散型变量的Embedding停止concat;另外一种办法是Field Embedidng,划分为多个域,同一个域内共享同一个Embedding,连续变量对应的Embedding为其数值乘以对应域内的Embedding;第三种办法则是对连续变量停止离散化,然后转化为求离散变量的Embedding,这种办法的缺陷是生成的Embedding可能不具备足够的辨别性,例如连续值处于离散化边境或者离散化为同一个值的状况。在2021 KDD上华为提出了名为AutoDis的连续变量的Embedding办法,此办法将连续值输入到DNN中,经过softmax输出对应的K个桶的概率,每个桶对应的一个Embedding,然后用最大池化或者Top-k或者加权均匀停止聚合得到对应的Embedidng,此过程交融了attention的思想。下面是Embedding的一种代码完成方式(连续变量停止离散化):
class CpuEmbedding(nn.Module):
def __init__(self, num_embeddings, embed_dim):
super(CpuEmbedding, self).__init__()
self.weight = nn.Parameter(torch.zeros((num_embeddings, embed_dim)))
nn.init.xavier_uniform_(self.weight.data)
def forward(self, x):
"""
:param x: shape (batch_size, num_fields)
:return: shape (batch_size, num_fields, embedding_dim)
"""
return self.weight[x]
class Embedding:
def __new__(cls, num_embeddings, embed_dim):
if torch.cuda.is_available():
embedding = nn.Embedding(num_embeddings, embed_dim)
nn.init.xavier_uniform_(embedding.weight.data)
return embedding
else:
return CpuEmbedding(num_embeddings, embed_dim)
class FeaturesEmbedding(nn.Module):
def __init__(self, field_dims, embed_dim):
super(FeaturesEmbedding, self).__init__()
self.embedding = Embedding(sum(field_dims), embed_dim)
# e.g. field_dims = [2, 3, 4, 5], offsets = [0, 2, 5, 9]
self.offsets = np.array((0, *np.cumsum(field_dims)[:-1]), dtype=np.long)
复制代码
另外依照Embedding的生成任务的类型分类,能够将其分为序列生成和目的拟合两种,比方词向量的生成属于序列生成类型,引荐范畴中双塔模型的Embedding属于目的拟合类型。从更广的层面看,应用无监视学习办法得到的表征Representation也是一种方式的Embedding,例如各种方式的编码器Encoder输出的表征,或者经过比照学习得到的表征,都能够依照Embedding的方式用于下游的任务,另外还有图卷积中Graph Embedding,也是一块能够深挖的范畴。