Natural Language Processing with Deep Learning课程代号CS224N,是斯坦福大学的有关自然语言处理的课程,并且是世界上有关神经网络与自然语言处理方面优秀的课程。找遍了网络也没有找到有中文翻译的,所以我这个英语渣只能强行听英文课程。因此做一些笔记方便以后复习。记录得也比较混乱。
第一讲是一个总体介绍,就没有写了。
以下内容来自课程视频以及PPT
在处理自然语言的过程中,需要将语言进行表示,无论是什么学派,一般nlp研究者都将单词作为最小的单位。使用one-hot形式,语料越多,维度越大,直到非常大,非常巨大...并且两个one-hot形式是正交的,无法表示有关两个单词的相似度。
因此需要找到其他的办法来表示单词。
其中一个很有用的思想是——可以通过一个单词的上下文了解这个单词的意思,或者有一些其他的不同说法,但是思想都是统一的,就是在表示一个单词的时候,你可以根据其上下文得到很多有用的信息。如下图:
我们按照向量的形式来定义单词的意思。
每个单词一个dense vector, 为了便于预测其上下文出现的其他单词。这些单词也是用向量表示。形成一种递归。
word2vec
定义一个从某一个单词来预测上下文的模型,也需要有一个loss function,优化loss function来更好地预测上下文。
(注:-t表示的是除了t的内容,也就是t的上下文。)
如果loss为0了那就是完美的预测,可是我们无法做到,因此我们的目标是在一个大的语料库中不同位置得到训练实例,改变单词的表示来尽可能的最小化loss function。
word2vec的主要思想
通过上下文预测单词或者是通过单词预测上下文。
有两种算法:
Skip-grams 单词预测上下文
CBOW 上下文预测单词
两种(稍微有效率些的)训练方法:
Hierarchical Softmax
Negative sampling
以上四个内容,在课程中,将会讲到的只是Skip-grams。
这是Skip-grams的模型。我们要做的就是确定一个中心词,在图中是
bank
,来预测某个window size中的围绕中心词的上下文。模型定义了给定中心词后其上下文中出现某个单词的概率。我们选择单词的向量表示来最大化分布概率。也就是图中的P(wt - 2 | wt)这样的概率。
需要了解的是这里只有一个概率分布,而不是每个单词有一个。对上下文的单词只有一个作为output的概率分布。
word2vec的细节
目标函数
对于每一个t,也就是对于每一个中心词语,都要预测一个window size m的上下文。这就是上图中第一个式子的含义。也就是模型的目标,这个式子作为目标函数。我们要最大化上下文的概率也就是最大化这个目标函数。
将这个式子取log,因为这样会使所有的乘法变成加法,让计算变得简单一些。不是计算全部语料库的概率,而是可以对每一个位置都求平均,从而在某种意义上达到对每一个词的标准化。最后取负,从而可以最小化这个式子。如上图中第二个式子所示。我们得到了一个negative log likelihood作为可以用来最小化的目标函数。
而P( | )又是什么呢,使用softmax来定义,softmax的公式不再多说,见下图:
vc和uo分别是中心词和输出词的向量。
两个向量的点积,可以代表两者之间的相似度,点积越大越相似。而softmax函数可以得到数字到概率分布的映射,也就是说可以讲数字转化为概率。因此这里使用softmax将一堆相似度转化为概率。
(这是一个学生问的问题:)
answer:
你可能会认为一个单词应该只有一个向量表示,如果你想这么做你就可以这么做,但是如果一个单词有两个向量可以相当大地简化计算,其中一个表示单词,另一个表示单词的上下文。不仅简化了计算,也会在优化的过程中将两个向量分离,而不会存在联系。
Skip-gram模型总体叙述
下图是Skip-gram模型的样子。
从左向右看,先是一个中心单词的one-hot形式。W是中心词语representation的矩阵。(上方藕荷色文字已经标注了向量和矩阵的shape)。这两个相乘,得到我们所需要的那个中心词语的vector表示。中间的三个红色的框代表的是存储上下文单词的representation的矩阵。(这里作为例子只画出三个)
中心词语的vector表示
与上下文单词的representation的矩阵
相乘得到每个上下文备选词语与已经选定的中心词语的相似度,就是上文中提到的vc·uo。最相似的一个或几个我们就认为它们是中心词语的上下文。使用softmax得到的概率与真实上下文单词的one-hot形式作比较。还可以看出目前的预测并不准确。因此我们需要进行对模型进行训练,让模型的预测变得尽可能准确。
训练Skip-gram模型
将模型中所有的参数放到向量θ中。我们这里是容量为V的语料库 * 一个单词的d维。并且如前文所说,一个单词有两个向量表示(一个是上下文表示,一个是中心词表示)。具体见下图:
然后,优化:
就是梯度下降,对目标函数求偏导,如下图所示:
将原式变形成图中①②两个部分,然后分别求偏导,具体见图中。
两部分分别求完,然后再合到一起:
以上步骤只是对中心单词求偏导,我们也需要对其他的每一个上下文单词(window中的)做同样的计算。
最后,更新参数:
done