这里先按吴恩达老师的课程讲解的softmax做一个笔记,和之前看的一个大神的文章,相对比,来方便我对word2vec的理解。
目的:学习一个词嵌入矩阵E。
手段:构建一个语言模型。
最老的方法:
预测一个句子(4个词)之后的下一个词是什么。
例如,下面是一个样本:
a glass of orange (juice).
样本输入: a glass of orange
样本输出:juice
实际上,我们会遍历一篇文章,然后文章中如果有这么一句话a glass of orange (juice).
它就可以作为一个样本了。
I want a glass of orange juice.
这样的句子,按照窗口为4来处理的话,可能会有如下的样本:
样本输入(样本输出)
want a glass of (orange)
want a glass of (apple)
want a glass of (mango)
这样, 经过训练之后,orange apple mango等词汇就会有相近的词向量。
(为什么?以后可以再思考解释一下。暂时没想通)
训练的模型为:
词嵌入矩阵E,随机初始化。假设one-hot表示有10000个词(实际更多),词向量维度是300,那么E大小为300*10000
开始:
(1)->4个词的one-hot
(2)-> 乘以E,得到4个词的词向量表示,合并成一个大的向量
(3)-> 输入到一个隐藏层
(4)-> 输出到一个softmax
(5)-> 输出为样本输出。
输入层:词向量维度为300,那么(2)得到的向量长度为4*300 = 1200,即输入层有1200个特征。
隐藏层:假设隐藏层的激活项有500个(可能没那么少,这里打个比方),那么隐藏层权重矩阵W1 是 1200*500的。不过这层的参数我们不关注。
softmax层:为了获得一个词库总量(本例为10000词)的分类器。所以softmax的权重为W2 = 500*10000.
分类器如下:
e_Vi是隐藏层的输出,i表示one-hot的第一个词。Si是样本输出表示的单词。
可以看到,分母有一个超大的求和,大小为one-hot词向量大小,这个例子是10000。
为了计算得到一个样本的损失函数,需要进行10000次求和。
这个计算简直不能忍的。
于是后面会有其他的模型来解决这个求和量过大的问题(还会解决这个模型的其他缺陷,这里不做过多讨论)。
第二部分
上面,语言模型是根据前面4个词,预测最后一个词。
但实际,我们的目标不是语言模型本身,所以可以用另一种方法来预测词的关系。
比如,用上下文。
I want a glass of orange juice to go ...
还是orange这个词,这时候,我们的样本就不一定是前面4个词了。可以是左边取几个,右边取几个。
比如如下是一个样本:(左右窗口是2)
glass of (orange) juice to
此外,还有其他方式,比如取上一个词作为输入,预测下一个词。
of (orange)
之类的。 这个就是skip-gram的思路。
接下来的例子,模型为:
一个上文->预测一个下文
开始:
(1)->one-hot 乘以 词嵌入矩阵E,得到词向量
(2)->词嵌入矩阵输入到一个softmaxt,直接预测下文
(3)没有了。
我们看到,吴恩达课程里,讲softmax层的计算公式时,为:
这个公式是直接把前面层所做的东西合并了。
这里的θ,就是softmax层的权重。小写t表示单词t在one-hot里的下表序号。
这个公式,实际上就是将softmax的输出做一个归一化,求得t分类的相对概率。