吴恩达 序列模型_学习笔记2 词嵌入 word2vec

我也是一个nlp新手,在这里将自己的学习心得总结下来,希望可以帮助到也在共同学习的同志们。

1、词嵌入是什么?

词汇表示
one-hot,假设词汇表有10,000个单词,构建一个10,000维向量,在这个词的位置设为1,其余为0.
在这里插入图片描述
问题:
1、这是一组互相正交的向量,就是任意两个词的余弦相关性都是0,但是这个显然是不对的,因为词和词是存在相关性的。
2、维数太高,不利于计算
词嵌入
用一个维数更低并且不全为0或1的向量表示一个词汇。如何做到这一点呢?这个是会在后面的内容中讲一个通用的方法。这里介绍一种容易理解的方式。就是假设我们把所有词汇分为300类(向量维数),然后看每一个词和这一类之间的相关关系。如下图所示。
https://img-blog.csdnimg.cn/20200607123932531.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjIxNzQ4OA==,size_16,color_FFFFFF,t_70
通过对300维的数据降维可视化如下:
在这里插入图片描述
可以看到接近的词聚集在了一起。
为什么叫做词嵌入(word embeddings )呢?
因为根据上面的例子来看,我们相当于把每一个词当做一个点,嵌入到了一个300维空间的某个位置。300维如果难以理解的话,可以想象,我们只把这些词分为3类,那就是在3维空间上了。

2.使用词嵌入

2.1、迁移学习与词嵌入

通过前面的例子,我们可以猜测,要想把词嵌入做的好,我们需要用到很大的语料库。就是能用到的句子之类的越多越好。但是在我们进行一些nlp任务的时候,没有很多的数据,这里就要用到迁移学习。
在这里插入图片描述
具体来说就是先用一个很大的语料库计算出词向量表示,再直接使用到自己只有少量数据的任务中。如果你自己的训练数据很小,基本不用更改词嵌入。一般需要词嵌入的数据量要大于自己的任务。
适合这样做的任务:人名识别;文本摘要;文本解析;指代消解;等训练数据小的情况
用的少的情况:机器翻译等需要大训练量的任务。

2.2 与face encoding的关联

在这里插入图片描述
很像,都是获得一个编码
不同之处在于:face encoding需要很强的可延展性,因为会有新的数据不断进入;而词嵌入不需要。

3. 词嵌入应用在类比推理

词嵌入可以看成得到一个可以描述词特征的低维向量,那么自然而然的,我们就可以计算这些向量之间的夹角和距离,本节内容告诉我们通过上述计算来实现词的类比推理。比如:我们根据women:man之间的关系,找到girl对应的那个词。如果读者您还没有看到视频,可以自己思考一下我们要怎么做到。
具体的做法如下图所示:
在这里插入图片描述
在这里我们计算相似度的方法采用余弦相似度,因为我们更关心是要在同一个方向,而不是距离。
在这里插入图片描述

4,5,6 如何获得词嵌入

4.1 目标概述

首先我们要获取的是目标是一个词嵌入矩阵,这个矩阵长相如下,是一个词向量维数(d) × \times ×词汇数(n)的矩阵,并且嵌入矩阵具有右乘一个单词的onehot向量得到该单词嵌入向量的性质
在这里插入图片描述

4.2 如何得到嵌入矩阵

对于如何获得嵌入矩阵,论文Tomas Mikolov,2014介绍了两种方法,此外还有一些其他的。我们这里聚焦于吴老师讲的skip-gram。得到嵌入矩阵的过程可以这样理解:我们对一个词的理解主要根据它的上下文(C),那么我们是不是就可以通过上下文预测这个单词(w)了呢?肯定可以。这个时候我们回到我们最初的目的,获取嵌入矩阵。这里有一个非常巧妙但是却十分简单的设计,利用一个全连接神经网络的变体做中心的这个词的预测。如果我们用这个词前后两个词(共4个)来预测中间的词,下面是一个自己画的网络结构图:
在这里插入图片描述
其中输入层有40000个神经元,对应4个one-hot向量,第二层是1200个神经元,对应4个嵌入向量。这样这个 W 1 W^{1} W1就是一个1200 × \times × 40000的矩阵。不同于全连接的地方是我们没有偏置和激活函数。接着我们第三层就是10000个神经元了,对应词汇表的单词个数。这里的 W 2 W^{2} W2就是一个10000 × \times × 1200的矩阵。通过softmax,我们预测中心单词是每个单词的概率。上述就是一个简单的根据上下文预测中心单词的方法。
再次回到我们的目标,计算嵌入矩阵。结合嵌入矩阵的特点(乘以onehot向量找到该单词的嵌入向量),我们自然而然得会发现,我们预测中心单词的时候只用上下文中的一个单词不就可以把 W 1 W^{1} W1变成嵌入矩阵。这样神经网络就会变成如下:
在这里插入图片描述
这样令 W 1 W^{1} W1 W 2 W^{2} W2共享参数,即:
W 2 = ( W 1 ) T W^{2}=(W^{1})^{T} W2=(W1)T
结合嵌入矩阵的特点(乘以onehot向量找到该单词的嵌入向量), W 1 W^{1} W1就是嵌入矩阵了。并且:
P ( w i ∣ c ) = e e i T e c ∑ j = 1 10000 e e j T e c P(w_{i}|c)=\frac{e^{e_{i}^{T}e_{c}}}{\sum_{j=1}^{10000}e^{e_{j}^{T}e_{c}}} Pwic=j=110000eejTeceeiTec
是不是很有意思呀。这里的 e i T e c {e_{i}^{T}e_{c}} eiTec不就正比于单词i和j的余弦相似性。但是一般我们并不会让 W 2 W^{2} W2就简单是 W 1 W^{1} W1的转置,而是让 W 2 W^{2} W2包涵两个 W 1 W^{1} W1,因为上下文对中心单词有影响,中心单词同样对上下文同样有影响。
那么现在的问题就只剩下了我们如何选择这个上下文里的一个单词。这个我们一般在一个特定的窗口内(比如中心单词前后10个单词)随机选择一个单词。因为随机选,所以这种方法叫做skip-gram。
至此,我们生成词嵌入的模型构建成功,我们只需要将模型优化(梯度下降),就可以得到嵌入矩阵。

4.3 负采样

观察上面的神经网络,有两个问题、
1、第一层到第二次,那么大的矩阵相乘,太费算力了。我们一般直接做直接选择嵌入矩阵的特定列就可以了。大大节省算力
2、最后一层有10000(词汇表数目)个神经元,这个造成的运算量实在太大了。为了解决这个方法,负采样的方法就应运而生了。
我们先直接看负采样之后的网络结构:
在这里插入图片描述
观察这个网络结构,我们会发现,负采样的精髓在于把根据上下文预测生成词汇表每一个词的概率变成了预测根据上下文是否生成一些随机采样的词。主要改动的是网络的最后一层和网络的输出。
大家仔细体会,我们的负采样是什么呢?
在这里插入图片描述
相信读者已经理解了负采样,就是输出先选择真实样本,其值记为1,再随机在词汇表中选择k个负样本记为0。一般k值的选取远小于词汇表数目。
现在的问题是我们怎么随机选择这k个负样本呢?
1、认为每一个词被选择的概率是平均的,即随机选。但是这失去了对词频的考虑。
2、加权每个词的频率,就是高频词容易备选,低频词不容易被选择。这会导致常见词如冠词,经常被选择,无法优化稀有词之间的关系
一般的我们采用两者结合的套路。如下:
在这里插入图片描述
根据概率 P ( w i ) P(w_{i}) Pwi选择。但值得注意的是,这个概率只是经验所得,而非数学推导而来的。

5 全局词向量表示(Global vectors for word representation :GloVe)

基本假设:
单词 e i e_{i} ei与单词 e j e_{j} ej之间的关系等价于 e i e_{i} ei与单词 e j e_{j} ej在一个窗口内共同出现的次数取log。
有了这个假设之后我们可以把这个问题看成一个解方程的问题:
已知: ( e i ) T e j = l o g ( x i j ) , x i j 为 w i 与 单 词 w j 在 一 个 窗 口 内 共 同 出 现 的 次 数 (e_{i})^{T}e_{j}=log(x_{ij}), x_{ij}为w_{i}与单词w_{j}在一个窗口内共同出现的次数 (ei)Tej=log(xij),xijwiwj
共有10000 × \times × 10000个方程。求解 e i e_{i} ei e j e_{j} ej。这个方程显然是没法解的。因此我们对其进行转化,用一种类似最小二乘的方法来求最优解。转化如下:
在这里插入图片描述
我们如何理解这个模型呢?如果您对最小二乘有足够的的理解,那么这个模型会比较好理解。其中的 b i , b j b_{i},b_{j} bi,bj可以视为截距,就像线性回归模型中的 β 0 \beta_{0} β0。比较难理解的是这个 f ( x i j ) f(x_{ij}) f(xij),这个函数主要是因为如果没有 f ( x i j ) f(x_{ij}) f(xij),这个模型的最小值是不收敛的,当 x i j = 0 x_{ij}=0 xij=0,趋于负无穷。此外,比较难理解的是为什么要对 x i j x_{ij} xij取log,类比线性的方程组,我猜测当取完log之后,模型的残差更符合正态分布。至此,我们就可以用各种各样的二次优化方法(梯度下降)求解最优值以获得嵌入矩阵。

6 情感分类

这一节比较好理解,结合第二节的知识,再使用RNN的many2one的模型去进行情感分类。
在这里插入图片描述

7 词嵌入造成的偏见与去除

7.1偏见的产生

回到第三节词嵌入的应用,这个应用就会产生性别歧视的问题。
在这里插入图片描述

7.2 偏见的消除

参考Rolukbasi et.al 2016。这部分视频中的解说比较少,有兴趣可以看原文。这里只针对吴老师讲得部分进行感性理解。
以性别歧视为例:

  1. 找到性别歧视的方向。其实就是找到性别的方向。这一步的做法就是用那些有明显性别差异的词如“he”“she”等的词嵌入向量相减,然后取平均。所谓性别歧视,就是某个单词偏向某一个性别,比如医生偏向男性,护士偏向女性。所以我们要找到性别方向的正交向量以区分性别。这里找到正交向量的时候,因为很多时候我们的方向都不是一维的,所以会有好多个的正交方向。比如三维空间的一个向量就有两个正交向量,就会形成一个平面。所以我们要进行正交分解,也就是奇值分解,找到正交向量,形成可以区分性别的超平面。
  2. 中和:这一步的作用就是消除某些词的性别差别,具体做法就是把这个词向量投影到之前找到的超平面上。这一步的关键在于选择哪些有歧视的词,论文作者对这些词训练了一个二分类的模型,吴老师认为,这些歧视的词其实人工数也很快能数出来。
  3. 均衡步。因为我们在选择超平面的时候,有性别差异的点到超平面的距离不是相等的(可以回想SVM),但是我们对歧视词汇是将其移动到了这个超平面上。所以就要将这些不歧视的但有性别区分的每一对单词做同方向移动,使得其到超平面的距离相等。如果不做这一步,我们之前中和到这个超平面的歧视词汇会一起偏向于某一个性别,比如之前医生偏向男性,护士偏向女性,现在会都偏向男性或者女性。
    在这里插入图片描述

8 结语

我也是一个nlp新手,在这里将自己的学习心得总结下来,希望可以帮助到也在共同学习的同志们,如果我上述的有任何错误,欢迎留言交流,我都将虚心接受。

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值