word2vec 学习和理解

这里先按吴恩达老师的课程讲解的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层的计算公式时,为:

P(t|C) = \frac{e^{\theta _t^T \cdot e_c}}{\sum_{j=1}^{10000} e^{ \theta _j^T \cdot e_c}}

这个公式是直接把前面层所做的东西合并了。

这里的θ,就是softmax层的权重。小写t表示单词t在one-hot里的下表序号。

这个公式,实际上就是将softmax的输出做一个归一化,求得t分类的相对概率。

猜你喜欢

转载自blog.csdn.net/a274767172/article/details/84447411