Embedding介绍

    在NLP任务中,一般把输入文本映射成向量表示,以便神经网络的处理。在数据处理章节,我们已经将用户和电影的特征用数字表示。嵌入层Embedding可以完成数字到向量的映射。

    飞桨已经支持Embedding的API,该接口根据输入从Embedding矩阵中查询对应Embedding信息,并会根据输入参数size (vocab_size, emb_size)自动构造一个二维embedding矩阵。该API重要参数如下所示,详细介绍可参见Embedding API接口文档

    • size。size是包含两个整数元素的列表或者元组。第一个元素为vocab_size(词表大小), 第二个为emb_size(embedding层维度)。使用的ml-1m数据集的用户ID最大为6040,考虑到0的存在,所以这里我们需要将Embedding的输入size的第一个维度设置为6041(=6040+1)。emb_size表示将数据映射为emb_size维度的向量。这里将用户ID数据1转换成了维度为32的向量表示。32是设置的超参数,读者可以自行调整大小。

    通过上面的代码,我们简单了解了Embedding的工作方式,但是Embedding层是如何将数字映射为高维度的向量的呢?

    实际上,Embedding层和Conv2D, Linear层一样,Embedding层也有可学习的权重,通过矩阵相乘的方法对输入数据进行映射。Embedding中将输入映射成向量的实际步骤是:

    • one-hot向量和Embedding层的权重进行矩阵相乘得到Embedding的结果。

    上面代码中,我们在[0, 10]范围内随机产生了3个整数,因此数据的最大值为整数9,最小为0。因此,输入数据映射为每个one-hot向量的维度是10,定义Embedding权重的第一个维度USR_ID_NUM为10。

    这里输入的数据shape是[3, 1],Embedding层的权重形状则是[10, 16],Embedding在计算时,首先将输入数据转换成one-hot向量,one-hot向量的长度和Embedding层的输入参数size的第一个维度有关。比如这里我们设置的是10,所以输入数据将被转换成维度为[3, 10]的one-hot向量,参数size决定了Embedding层的权重形状。最终维度为[3, 10]的one-hot向量与维度为[10, 16]Embedding权重相乘,得到最终维度为[3, 16]的映射向量。

    我们也可以对Embeding层的权重进行初始化,如果不设置初始化方式,则采用默认的初始化方式。

    神经网络处理文本数据时,需要用数字代替文本,Embedding层则是将输入数字数据映射成了高维向量,然后就可以使用卷积、全连接、LSTM等网络层处理数据了,接下来我们开始设计用户和电影数据的特征提取网络。