CS224n NLP with Deep Learning(2)词向量表示 word2vec

引言

youtube观看链接:youtube列表

bilibili观看链接:斯坦福CS224n

本讲主要简述以下7个方面:

  • Word meaning
  • Word2vec introduction
  • Research highlight:前沿研究
  • Word2vec objective function gradients:目标函数的梯度
  • Optimization refresher
  • Assignment 1 notes
  • Usefulness of word2vec

1. Word meaning

计算机中是如何获取单词可用的词义的呢?

在过去很长的时间里,一直通过分类词典来处理词义。对于英文来说,通常的方法是使用WordNet。它根据单词层次关系和同义词关系构成单词网络。著名自然语言处理库NLTK中就包含了WordNet,下面是使用WordNet的两个例子:
在这里插入图片描述
左边的例子是获取单词“good”各个词义的近义词,右边例子是获取单词“panda”的上位词(is a的关系,例如”熊猫“是”动物“,”熊猫“是”哺乳动物“)。

从symbolic representations到distributed representations

然而WordNet存在着一些缺陷,例如无法反映出同义词的一些细微差别;词汇的含义存在一定的主观倾向;需要大量人力来维护;难以量化单词的相似度等。

此前,无论是规则学派,还是统计学派,绝大多数NLP work都将词语作为最小单位。这相当于将词语离散化表示,即「one-hot」表示,例如我们有一个一共有5个单词的词汇表,其中单词“hotel”和“motel”分别是第2、第4个,那么它们可以用如下向量表示:
h o t e l = [ 0 , 1 , 0 , 0 , 0 ] hotel = [0,1,0,0,0] hotel=[0,1,0,0,0] m o t e l = [ 0 , 0 , 0 , 1 , 0 ] motel = [0,0,0,1,0] motel=[0,0,0,1,0]
在不同的语料中,词表大小不同。Google的1TB语料词汇量是1300万,这个向量的确太长了。

one-hot 形式虽然简单,但是也存在许多问题,比如:

  • 维度灾难,这样稀疏的向量,存储和训练都会造成巨大的开销。
  • 每个向量都是正交的(点积为0),欧式距离也都相等,无法直接衡量每个单词的相似度。例如motel 与 hotel 应有一定的相似性。

通过上下文来表征词义

针对上面的相似度的问题,实际上后面有人想到了使用「构建词语相似度表」(word-similarity table)的方式来解决,这样首先需要人工得确定每两个词的相似性程度,这显然是不可能完成的任务,那通过WordNet来获取相似度呢?这样可以小范围的实现,但是明显WordNet是很不完整的。

于是人们想根据单词的特性(比如一起出现的上下文)来构造稠密(dense)的向量来表示单词,使其具有表征词义的能力。

在这里插入图片描述

最后得到的向量与下图类似。这种表示单词的方法称作词向量(Word Vectors),也称做词嵌入(Word Embeddings)或词表示(Word Representations)。这样的词向量既可以较为容易地得到,也可以利用余弦相似度等方法计算单词的相似度。

2. Word2vec introduction

学习神经网络word embeddings的基本思路

定义一个以预测某个单词的上下文的模型:
p ( c o n t e x t ∣ w t ) = … p(context|w_{t})=… p(contextwt)=
损失函数定义如下:表示准确率是25%,损失则为75%,准确为100%,损失为0
J = 1 − p ( w − t ∣ w t ) J=1-p(w_{-t}|w_{t}) J=1p(wtwt)
其中 w − t w_{-t} wt表示 w t w_{t} wt的上下文(负号通常表示除了某某之外),如果完美预测,损失函数为零。

然后在一个大型语料库中的不同位置得到训练实例,调整词向量,最小化损失函数。

Then you just pray and depend on the magic of deep learning
在这里插入图片描述

word2vec 根据输入输出关系定义了两个重要的模型:

  • CBOW:已知上下文预测当前词
  • skip-gram:已知当前词预测上下文

两种较为高效的训练方法:

  • Hierarchical Softmax
  • Negative Sampling

2.1 ship-gram

在这里插入图片描述
上图即为skip-gram模型。skip-gram的思路是:每一个步都取一个词作为中心词汇 (center word),接着我们用这个词来预测给定窗口(window)大小内的上下文单词 (context word) 。即通过中心词去预测上下文,给定一个中心词汇,预测某个单词在它上下文中出现的概率。学习的是输入输出词的向量。

对于中心词汇左右两边都有相同的概率分布。

既然每个词 w t w_{t} wt都决定了相邻的词 w t + j w_{t+j} wt+j,基于极大似然估计的方法,希望所有样本的条件概率 p ( w t + j ∣ w t ) p(w_{t+j}|w_{t}) p(wt+jwt)之积最大。因此word2vec的目标函数定义为所有位置的预测结果的乘积:
J ′ ( θ ) = ∏ t = 1 T ∏ − m ⩽ j ⩽ m , j ≠ 0 p ( w t + j ∣ w t ; θ ) J^{'}(\theta)=\prod_{t=1}^{T}\prod_{-m\leqslant j\leqslant m,j\neq 0}p(w_{t+j}|w_{t};\theta ) J(θ)=t=1Tmjm,j=0p(wt+jwt;θ)
其中的theta也是参数,是词汇的向量表示,也就是每个词汇向量的唯一表示参数。m表示窗口半径。

要最大化目标函数,对其取个负对数,得到损失函数——对数似然函数的相反数,然后对其最小化,机器学习人员喜欢最小化。
J ( θ ) = − 1 T ∑ t = 1 T ∑ − m ⩽ j ⩽ m , j ≠ 0 l o g p ( w t + j ∣ w t ) J(\theta)=-\frac{1}{T}\sum_{t=1}^{T}\sum_{-m\leqslant j\leqslant m,j\neq 0}logp(w_{t+j}|w_{t}) J(θ)=T1t=1Tmjm,j=0logp(wt+jwt)

图片中上面的目标函数表示的是,假设现在我们有一段很长的文本,其中包含足够的词汇序列和真正的行文(行文,指完整的句子)。接下来,遍历文中的所有位置,对于文本中的每个位置,我们都会定义一个围绕中心词汇的大小为2m的窗口,中心词前后各m个单词。这样就得到一个概率分布,可以根据中心词汇给出其上下文词汇出现的概率。然后我们就设置模型的参数,让上下文中所有词汇出现的概率,都尽可能地高。

2.1.1 word2vec细节

预测到的某个上下文条件概率 p ( w t + j ∣ w t ) p(w_{t+j}|w_{t}) p(wt+jwt)可由softmax得到:
在这里插入图片描述
c和o分布代表单词在词汇表空间中的索引(我认为这里表述的是在词汇表中的序号),以及它的类型。Uo是索引为o的单词所对应的向量,Vc是中心词汇对应的向量。

softmax 是一种将数值转为概率的标准方法。
在这里插入图片描述
这是一种粗糙衡量相似性的方法,两个向量的相似性越大,那么这个点积就越大。一旦我们得出了两个单词向量的点积,我们就把他们转换成softmax形式。softmax形式是一种将数值转换为概率的标准方法。

2.1.2 skip-gram 示意图

每个单词有两个词向量。

skip-gram 模型如下图所示:
在这里插入图片描述

  1. 现在有一个中心词汇 w t w_{t} wt,它是 one-hot 向量
  2. W W W 是包含所有中心词汇表示的向量矩阵
  3. 如果将 one-hot 向量和矩阵相乘,选出矩阵的列,即为中心词汇的表示 W w t W_{w_{t}} Wwt
  4. 接下来要构造上下文词汇的矩阵 W ′ W^{'} W (上下文词汇的个数有很多,仅展示3个)存储上下文词汇的表示。
  5. 将这个中心词向量 W w t W_{w_{t}} Wwt和上下文词汇表示的矩阵 W ′ W^{'} W相乘,取 softmax,数值最大的即为上下文词汇。
  6. 同时与答案对比计算损失。

从图中可以看出,最后一列有没有预测准的,说明产生了误差。

还有一个问题是:词向量是否存在唯一解?如下图所示:
在这里插入图片描述

答:是有多个解,每个词有两个词向量表示,但最终会决定一个确切的解,比如让两个词向量相加 / 2

2.3 目标函数的梯度

把所有参数写进向量 θ \theta θ,对d维的词向量和大小V的词表来讲,有:
在这里插入图片描述

2.3.1 训练模型:计算参数向量的梯度

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
梯度有了,参数减去梯度就能朝着最小值走了。

2.4 目标函数的梯度

下面介绍了梯度下降法:
在这里插入图片描述
在这里插入图片描述
但是实际中,采用了随机梯度下降(????其实我也解释不清楚)。

(???其实我很好奇,在 tensorflow 中是怎么样找梯度的?)

在 skip-gram 里面即为,选取文本中的一个位置。就有了一个中心词汇,以及它周围的词汇,移动一个位置(移动是什么意思),对所有的参数求梯度

——————

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值