视频笔记
每个单词都用独热编码的向量表示会使得单词与单词之间没有联系。比如说如果用户想要搜索“Seattle motel” 那可能就和“Settle hotel”没什么关系,然而实际上这两者很相似。 而且,这样的两个向量是正交的,所以内积为0。无法计算出两个向量的相似度。为了改进这种情况,提出了词向量
基本原理
我们定义了这样一个模型,我们把损失函数定义为
,其中t表示某个单词,-t表示这个单词周围的单词。我们可以通过神经网络将J这个损失函数最小化。
word2vec
基础算法
- Skip-gram (SG,由单词预测上下文)
- Continuous Bag of Words (CBOW,由上下文预测单词)
进阶算法
- Hierarchical softmax
- Negative sampling
skip-gram算法
我们先选择一个半径m,作为窗口的大小,继而我们要最大化
转化成求最小化对数似然函数问题
具体的概率计算公式如下:
u,v分别表示两种不同类型的向量,v是中心词汇向量,u是上下文向量,这样的好处是可以使得两者独立,这样优化的时候不会耦合,实际上也可以更好操作。
关于神经网络的BP算法,摘取其中一小段从 到
的关于
的更新:
化简可以得出:
阅读笔记
Co-occurrence矩阵
假设选了三句语料,同时窗口大小为1,可以得到如下的对称矩阵
通过SVD变换可以得到
选取U的前k列特征向量作为word embedding矩阵
这种方法虽然有效,但是却存在如下问题:
- 矩阵的维度变化频繁
- 矩阵过度稀疏
- 维度太大
- 难于优化
CBOW算法
根据周围的文本预测中心单词出现的概率
- 对于某中心单词,将窗口大小内的单词改成独热编码的形式
- 得到嵌入矩阵的表示向量
-
对2中得到嵌入向量取均值记作
-
将3所得隐藏层向量与输出嵌入矩阵相乘,得到V维的向量z,这组向量反映其他单词与中心单词的相似
-
对z进行softmax操作得到
-
与 真实标记的独热编码
比较并计算误差,更新前面参数的权值
我们定义损失函数为:
skip-gram
给一个中心单词预测其周围单词分布
学习的参数同上CBOW算法,步骤如下:
- 生成中心词的独热编码
- 得到嵌入向量
- 将3所得隐藏层向量与输出嵌入矩阵相乘,得到V维的向量z,这组向量反映其他单词与中心单词的相似
- 根据实际预料周围的单词的独热编码与
计算误差,并且更新前面的参数
优化的函数如下:
上面的两种算法每一轮需要更新的参数太多,不常用,所以有如下的改进算法
负采样
并不是更新embedding matrix 的全部,而是每次更新一部分,而且通过采样正例和负例,使得正例出现的可能和负例不出现的可能性最大。 我们规定单词出现的概率采用sigmod函数
分层softmax
分层softmax树采用二叉树来表示所有单词,每一个叶子都是一个单词向量,从根到叶子只有唯一的路径,这个模型中没有输出表示的矩阵,但是树中的每一个结点都是一个需要学习的向量,每个单词w出现的概率等于从根结点出发到达叶子节点w的概率,这种算法的时间复杂度是log|V|的。