深度学习笔记(32):word2vec模型简介

前因

与使用ASCII或者其他编码方式编码的字符能表达万物,但是对于nlp来讲,处理的最小单元是词汇而不是字符。所以我们必须建立一个字典集合,将所有的出现的词汇放到其中,然后将他们映射成onehot,但是这么做的话,每个单词的维度都是字典集合的大小那么大,而且一堆零一个一纯粹是简单的先后顺序问题,并没有什么语义上的实际意义。所以我们需要做若干件事:降维,信息量增大。
要做到这两点,一个直观的想法就是去重新设置特征,然后去编码,比如对于[‘man’,‘woman’,‘apple’,‘banana’,‘queen’,‘king’]这些词汇,我们设置[‘gender’,‘food’,‘royal’]这些维度,并且分别为他们标记,这样的话,我们就可以得到一个3×8的表格,也就是说我们可以将每一个词用一个三维向量来表征,用这个向量去取代onehot的向量,来进行相似度抑或是其他的词嵌入探究。而这就达到了降维的作用(比如一共有一百万个词,那可能也就只有500个特征就可以了),而且势必信息量更大,更加准确。但是并不现实,因为这个二维数组要是人工标注的话未免代价过大,所以我们要找到一种,机器读入大量文本,自己去找规律的方式,而这就是我们word2vec以及类似机器学习算法的的初衷。

过程

有CBOW和k-gram,时间有限不细述了,可以去看其他资料去学习haffman优化的细节。其实这个训练过程就是基于一个词的特征是靠着周围的此来决定的这一个原则(事实如此),我们这里谈谈优化目标和一些细节:
一定要在心里清楚,我们想要的是一种词汇到向量,也就是高维的onehot到低维的特征向量的映射方式,就和人脸识别一样,我们真正想要的是权重矩阵。
训练过程其实还是比较简单的,比如说我们读入了一个词,随机在他周围的词里面选一个(我们先简单举例),比如
“I love you but it hurts”,输入x为love,输入应该是you,然后使用反向传播更新两边的矩阵。(两个矩阵都是训练出来的,但我们最后需要的是左边的去做word2vec映射)
深度学习笔记(32):word2vec模型简介
对于k-gram,我们的思想是想训练出用一个词推测出周围关系的矩阵,注意我们使用的W‘是同一个
深度学习笔记(32):word2vec模型简介
而对于CBOW,则是利用使用多个词去推测一个词的准确性,去训练权重矩阵的准确性,注意我们使用的W是同一个。

深度学习笔记(32):word2vec模型简介
但是值得注意的一点是:当我们将中间的特征向量映射回到onehot的这个过程实际上是一个softmax层,需要计算高纬度的e指数和求和,这样的话实际上计算代价是很昂贵的,而这也是其他词嵌入的优化点所在。

参考资料

https://zhuanlan.zhihu.com/p/26306795
https://blog.****.net/yu5064/article/details/79601683