CS224n笔记(二)

143 阅读3分钟

视频笔记

每个单词都用独热编码的向量表示会使得单词与单词之间没有联系。比如说如果用户想要搜索“Seattle motel” 那可能就和“Settle hotel”没什么关系,然而实际上这两者很相似。 而且,这样的两个向量是正交的,所以内积为0。无法计算出两个向量的相似度。为了改进这种情况,提出了词向量

基本原理

我们定义了这样一个模型p(context|w_t),我们把损失函数定义为J = 1-p(w_{-t}|w_t),其中t表示某个单词,-t表示这个单词周围的单词。我们可以通过神经网络将J这个损失函数最小化。

word2vec

基础算法

  • Skip-gram (SG,由单词预测上下文)
  • Continuous Bag of Words (CBOW,由上下文预测单词)

进阶算法

  • Hierarchical softmax
  • Negative sampling

skip-gram算法

我们先选择一个半径m,作为窗口的大小,继而我们要最大化

J'(\theta) = \prod^T_{t=1} \prod_{-m \leq j \leq m, j \not= 0}p(w_{t+j}|w_t;\theta)

转化成求最小化对数似然函数问题

J(\theta) = -\frac{1}{T}\sum_{t = 1}^T\sum_{-m \leq j \leq m, j \not= 0 } log\  p(w_{t+j}|w_t)

具体的概率计算公式如下:

u,v分别表示两种不同类型的向量,v是中心词汇向量,u是上下文向量,这样的好处是可以使得两者独立,这样优化的时候不会耦合,实际上也可以更好操作。

关于神经网络的BP算法,摘取其中一小段从softmax(u_o^Tv_{c})u_o^Tv_{c}的关于v_c的更新: \frac{\partial}{\partial v_c}[log\quad\frac{exp(u_o^Tv_c)}{\sum^V_{w=1}exp(u_w^Tv_c)}] = 0 化简可以得出:

u_o -\sum^v_{w=1} p(w|c)u_w = 0

阅读笔记

Co-occurrence矩阵

假设选了三句语料,同时窗口大小为1,可以得到如下的对称矩阵

通过SVD变换可以得到 X = USV^T 选取U的前k列特征向量作为word embedding矩阵

这种方法虽然有效,但是却存在如下问题:

  • 矩阵的维度变化频繁
  • 矩阵过度稀疏
  • 维度太大
  • 难于优化

CBOW算法

根据周围的文本预测中心单词出现的概率

对于每个单词w_i我们需要学习两个向量u_i, v_i 具体学习过程如下:

  1. 对于某中心单词,将窗口大小内的单词改成独热编码的形式
  2. 得到嵌入矩阵的表示向量

  1. 对2中得到嵌入向量取均值记作

  2. 将3所得隐藏层向量与输出嵌入矩阵相乘,得到V维的向量z,这组向量反映其他单词与中心单词的相似

  3. 对z进行softmax操作得到\hat y

  4. \hat y 与 真实标记的独热编码y比较并计算误差,更新前面参数的权值

我们定义损失函数为:

因为标签采用独热编码,所以求和符号可以去掉

skip-gram

给一个中心单词预测其周围单词分布

学习的参数同上CBOW算法,步骤如下:

  1. 生成中心词的独热编码
  2. 得到嵌入向量
  3. 将3所得隐藏层向量与输出嵌入矩阵相乘,得到V维的向量z,这组向量反映其他单词与中心单词的相似
  4. 根据实际预料周围的单词的独热编码与\hat y计算误差,并且更新前面的参数

CBOW的算法有一个条件是中心单词周围的单词相互独立

优化的函数如下:

上面的两种算法每一轮需要更新的参数太多,不常用,所以有如下的改进算法

负采样

并不是更新embedding matrix 的全部,而是每次更新一部分,而且通过采样正例和负例,使得正例出现的可能和负例不出现的可能性最大。 我们规定单词出现的概率采用sigmod函数

分层softmax

分层softmax树采用二叉树来表示所有单词,每一个叶子都是一个单词向量,从根到叶子只有唯一的路径,这个模型中没有输出表示的矩阵,但是树中的每一个结点都是一个需要学习的向量,每个单词w出现的概率等于从根结点出发到达叶子节点w的概率,这种算法的时间复杂度是log|V|的。