一、为什么要使用word2vec
- 可以降低维度
一般会使用one-hot编码,而这种编码额维度等于词汇量,所以在词汇量增大到上万维的时候,会发生维度灾难,其中one-hot编码中很多都是0,没有被利用。所以就提出使用Word2Vec,把维度降到百位。
2. 词语之间的相似性
one-hot任意两个词之间的相似性都是一样的,这显然不符合我们实际的规律。"我"和"你"的相似性显然高于"我"和"正确"的相似性。而word2vec经过训练,就可以体现出这种差距。
二、word2vec的两种实现方法
1.CBOW模型——给定上下文,预测目标词
输入context,共C个词,将输入的词
经过第一个隐藏层
之后相加,得到一个向量1xN,再乘以
,得到一个1xV大小的向量,经过softmax,得到每一个吃的向量。
2. skip-gram模型——给定目标词,预测上下文
给定目标词,1xV,乘以
,得到1xN,然后再乘以
,得到1xV,再做softmax,得到概率分布。最后的损失函数包含上下文个词(C)的损失。
三、简化模型
由于以上两种softmax太费时间,所以提出了两种优化方法。
1.Hierarchical Softmax
使用HuffmanTree来表示,最终的词汇(词汇量V)都是放在了叶子节点上,非叶子节点的个数为V-1个,最后只是需要log(V)次二分类便可达到终点,而每个词汇都有一个不一样的前缀。所以复杂度从V降为log(V),再加上高频词汇路径会更短,所以复杂度会更小,但是实现起来比较麻烦。
2. Negative Sampling
为了解决每次更新所有的节点,浪费时间,所以提出了这个方案。就是负采样一些样本,而后在这个里边选出目标词,这样就省去了很多的计算量。
四、对于输入是某个词,是否会影响到其他的词向量?比如输入是
,是否会影响
的词向量更新。
1. 假设
假设输入一段序列是
,输入词汇是
,one-hot编码是[0,1,0,0],而目标词汇是
,one-hot编码是[1,0,0,0],假设V=4,N=3,其中第一行为第一个词对应的词向量。
矩阵
矩阵
2. 输入序列
3. 经过隐藏层输出
这里使用损失函数使用交叉熵,对应
,这里y=[1,0,0,0],所以
,由于
对应的标签为0,所以只有
会影响参数的更新。
4. 更新
参数
其中
经过一次的运行,可以得到如下更新,对于
参数的更新类似。
5. 结论
对于W中的
的此项量由于其输入是0,所以不会更改。因此只会更改输入是
对应的词向量。