Embeding技术:word2vec Parameter Learning Explained
参考链接
一、主要内容:
-
word2vec模型:
- CBOW 模型:continuous bag-of-word
- SG模型:skip-gram
-
优化技术:
- 分层softmax:hierarchical softmax
- 负采样:negative sampling
二、CBOW 模型:
-
1、One-word context 模型:
-
模型图:
- 上图是一个全连接神经网络,在预测当前此时我们只使用前一个词作为上下文信息,就像一个二元模型(bigram model)一样。
- 输入层是一个单词的one-hot表示,是词汇表的大小,隐藏层单元个数为
- 输入层到隐藏层:连接矩阵为,隐藏层与输入层的连接是简单的线性连接(即没有**函数),两层的连接公式为:
- 是的列(即的行),是输入的词。
- 由于是单词的one-hot表示,若表示词汇表的第个单词,则列向量除了第个元素为1以外其他元素都是0,这样,这相当于取出的第列(即的第行)作为,实质这就是第个单词的embeding表示.
- 隐藏到输出层:连接矩阵为, 两层的连接公式为:是一个大小为的列向量,每个元素对于词汇表的一个词,我把每个元素称为其对应词的分数 (score),第个词的分数就是公式如下:是词汇表中第个词的得分也是输出层每个单元的输入,是的第列。
- 然后将经过一softmax层(softmax:一个对数线性分类模型)得到每个单词的后验分布(即概率值),softmax层表达式(第个词的后验概率):上式的含义是输入词汇表的第个单词输出第个词的概率,即第个词在第个词后面的概率,其中是输出层第个单元的输出,对应于词汇表的第个词。
- 注意:和是对应单词的两表示,我们将他们分别称为的输入向量与输出向量,输入向量是输入层到隐藏层连接矩阵的行,输出向量是隐藏层到输出层连接矩阵的列
-
隐藏层到输出层参数更新:
- 优化的目标函数如下 是当前输入词,是目标预测词(实际输出词),是词在词汇表的下标。
- 损失函数为:目标函数就是最小化该损失函数
- 损失函数关于的导数:是输出层第个单元的输入,是输出层的误差,在时为1,其他情况为0,相当于的one-hot表示。
- 求对参数矩阵的导数:
- 使用梯度下降算法我们得到的更新公式注意: 按照上面的式子更新是我们要计算词汇表每个词的误差,所以计算量比较大.
- 优化的目标函数如下
-
输入层到隐藏层的参数更新:
-
求对隐藏层输出的导数:
令:矩阵形式为:即是输出向量的加权和权重就是其对应词的预测误差 -
求对的导数:
- 首先我们上面说过,输入层到隐藏层是简单的线性链接:
- 这样关于的导数为:
- 矩阵形式为:
- 上式的结果是一个与大小一样的矩阵,由于是one-hot编码,所以中间只有一个1其余都是0,所以结求导矩阵中只有一行是非零的其余行都是0,非零行就是.所以最后跟新的只是W中的一行,即输入词对应的行,所有更新公式为:是词汇表每个词的输出向量的误差加权和,所以上式可以理解为:将词汇表的每个词的输出向量按照一定比例加入到词的输入向量中去。
- 首先我们上面说过,输入层到隐藏层是简单的线性链接:
-
-
模型图:
-
2、Multi-word context 模型:
- 模型图:
- 该模型是用多个上下词的信息来预测当前词,用上下文词的one-hot编码的平均值作为输入产生隐藏层的输出,公式如下: C是上下文词的数量。
- 模型的损失函数是:该公式除了与one-word-context model公式不同以外其他都是相同的。
- 隐藏层到输出层权重更新公式为:与one-word-context model是一样
- 输出层到隐藏层权重更新公式为是输入的上下文中第个词的的输入向量。
- 模型图:
三、skip-gram 模型:
- 模型图:
- 目标词在输入层,上下文词在输出层。那么输入层到隐藏层的含义与One-word context模型是一样的,如下公式:
- 在输出层上,我们将输出个多项式分布,而不是输出一个多项式分布。 每个输出都是使用相同的隐藏层到输出层的矩阵进行计算:由于是共享的,所以虽然模型图上画了个是输出向量,但他们都是相等的即:
- 损失函数为:是是第个输出词在词汇表的索引号,是是C个上下文输出词的概率的乘积。
- 计算E对的导数为:令:即是个误差向量()之和
- 计算E对的导数为:是C个导数的累加,则更新公式为:
-
的更新公式为:其中是维向量,公式如下:
- 注意: 上面的推到公式与One-word context模型是非常相似的,不同的是误差:与。 是个输出误差的累加
四、优化技术:
- 对于词汇表的每个词都有一个对应的输入向量和一个输出向量,他们分别是输出层到隐藏层连接矩阵的行与隐藏层到输出层链接矩阵的列。由上面的更新公式可知,更新计算量是比较小的,更新计算量是比较大的。因为我们更新需要计算整个词汇表的全部词的误差或,这样在模型训练时对于每个样本我们都必须计算每个词的误差,这个计算量是非常大的。
- 为了解决这个问题,我们可以每次必须更新的输出向量的数量,具体的方法是:分层softmax(hierarchical softmax)和采样法(sampling)。
1、Hierarchical Softmax 技术:
- 该模型使用一颗二叉树来表示整个词汇表的所有词,词汇表的所有词都在二叉树的叶节点,如下图所示:
- 根节点到每个词的路径用于估计单词的概率。用表示更节点到词路径上的第个节点。
- 在分层softmax模型中,每个单词的输出向量。树中的V − 1个中间节点都有一个输出向量,输出某个词的概率定义如下:表示节点的左子树;表示叶节点路径上第个内部节点的向量表示;是隐藏层的输出向量,函数定义如下:
- 现在假设我想计算输出页节点的概率,我们将这个概率定义为从根节点随机走到叶节点的概率,为此我们为每个内部节点定义一个向左和向右走的概率,下面是内部节点向左走的概率:其中是sigmoid函数定义如下:则向右走的概率为:
- 于是我们得到输出词的概率:形式化的定义就是上面上式子:并且有下面式子成立:
- 下面推导树内部节点向量的更新公式:
- 首先令(为了简化公式):
- 损失函数为:
- E对的导数为:当是其他情况都为0,可以理解为当前词的表示为其对应节点的哈夫曼编码。
- E对的导数为:
-
的更新等式为:
- 每个样本只需要更新其目标词路径上的内部节点的向量就可以了,这就大大减少更新向量的数目;我们可以将视作内部节点的误差。
- 对于CBOW可以直接使用该更新方程,对于skip-gram模型我们需要使用该方程到C个预测上下文词上。
- E对隐藏层输出h的导数:EH可以视作是当前样本预测词路径上每个内部节点对应向量的误差加权和。对于CBOW模型直接使用上面等式求出EH向量,对于skip-gram模型我们需要计算每个上下文输出词的EI向量再相加的得到最终的EI向量。
- 输入层到隐藏层链接矩阵更新公式为:
- 由上面的更新公式可以看出,我们预测每个词的更新参数复杂的由降低到这是一个巨大的提升。并且隐藏层到输出层的参数个数只减少了一个,从V(输出向量)个变成V-1(内部节点向量)个
- 首先令(为了简化公式):
2、 Negative Sampling 技术:
- Negative Sampling比Hierarchical Softmax直接很多,它直接对词汇表中的词进行采样,得到一个采样集合,集合中的词是需要更新的词,显然,预测的目标词必须在该集合中,因此我们需要采样的是非目标词,因此叫做负采样法(负样本采样)。
- 采样过程需要一个概率分布,我们称该分布为噪声分布,记为,该分布的依靠个人的经验进行设置。
- 定义损失函数为:其中是目标输出词,是目标输出词对于的输出向量;是隐藏层输出向量;是根据分布采样的集合。我们每次迭代都只更新与目标词和负采样集合中词对应的输出向量。
- 求E对采样集合中词对应的输出层单元的输入的导数:相当于目标词在采样集合内的one-hot编码值。
- 输出向量的更新等式:其中是负采样集合中的词,即,即我们每次迭代只需更新负采样集合对应的部分的参数向量。该更新公式能够直接应用到CBOW模型中去,对于skip-gram模型中需要将上面过程应用到C输出的上下文词上去。
- 求E对隐藏层输出向量的导数:对于CBOW模型我们直接使用上式计算EI向量,对于skip-gram模型我们需要对每个输出词计算一个EI向量再相加得到总的EI。
- 输出层到隐藏层链接矩阵的更新公式:
- 这样更新的复杂度由原来的O(V)变为O(K),K是负采样集合的大小。