第二周 自然语言处理与词嵌入(Course5/Natural Language Processing and Word Embeddings)

2.1 词汇表征(Word Representation)

one-hot向量表示:单词Man,Woman,King,Queen,Apple,Orange分别出现在词汇表的第5391,9853,4914,7157,456,6257的位置,则它们分别用O5391O_{5391},O9853O_{9853} 等表示,OO代表one-hot:

缺点是把每个词孤立起来,使得算法对相关词的泛化能力不强

因为任何两个one-hot向量的内积都是0,例如king和queen,词性相近,但是单从one-hot编码上来看,内积为零,无法知道二者的相似性

因此用特征表征(Featurized representation)的方法对每个单词进行编码。也就是使用一个特征向量表征单词,特征向量的每个元素都是对该单词某一特征的量化描述,量化范围可以是[-1,1]之间,而单词使用这种高维特征表示时,就叫做词嵌入(word embedding), 词嵌入可以让算法自动的理解一些类似的词,比如男人对女人,国王对王后:

以上举例的特征实际上并不是手工设计的,而是算法(word embedding)学习而来;而且这些学习的特征,可能并不具有良好的解释性,但无论如何,算法都可以快速找到哪些单词是类似的

特征向量的长度依情况而定,特征元素越多则对单词表征得越全面。这里的特征向量长度设定为300。使用特征表征之后,词汇表中的每个单词都可以使用对应的300 x 1的向量来表示,该向量的每个元素表示该单词对应的某个特征值。每个单词用e+词汇表索引的方式标记,例如e5391e_{5391}e9853e_{9853}e4914e_{4914}e7157e_{7157}e456e_{456}e6257e_{6257}

用这种表示方法来表示appleorange这些词,那么appleorange的这种表示肯定会非常相似,可能有些特征不太一样,如颜色口味,但总的来说appleorange的大部分特征实际上都一样,或者说都有相似的值。这样对于已经知道orange juice的算法很大几率上也会明白apple juice这个东西,这样对于不同的单词算法会泛化的更好

如果能够学习到一个300维的特征向量,或者说300维的词嵌入,把这300维的数据嵌入到一个二维空间里,就可以可视化了。常用的可视化算法是t-SNE算法,会发现manwoman这些词聚集在一块,kingqueen聚集在一块等等

在对这些概念可视化的时候,词嵌入算法对于相近的概念,学到的特征也比较类似,最终把它们映射为相似的特征向量

2.2 使用词嵌入(Using Word Embeddings)

之前Named entity识别的例子(即找出语句中的人名),每个单词采用的是one-hot编码。RNN模型能确定Sally Johnson是一个人名而不是一个公司名,是因为“orange farmer”是份职业,很明显“Sally Johnson”是一个人名(输出1)

如果用特征化表示方法,即用词嵌入作为输入训练好的模型,如果一个新的输入:“Robert Lin is an apple farmer.”,因为知道orangeapple很相近,那么算法很容易就知道Robert Lin也是一个人的名字

featurized representation的优点是可以减少训练样本的数目,前提是对海量单词建立特征向量表述。即使训练样本不够多,测试时遇到陌生单词,例如“durian cultivator”,根据之前海量词汇特征向量就判断出“durian”也是一种水果,与“apple”类似,而“cultivator”与“farmer”也很相似。从而得到与“durian cultivator”对应的应该也是一个人名。这种做法将单词用不同的特征来表示,即使是训练样本中没有的单词,也可以根据word embedding的结果得到与其词性相近的单词,从而得到与该单词相近的结果,有效减少了训练样本的数量

词嵌入能够达到这种效果,原因是学习词嵌入的算法会考察非常大的文本集

  1. 先从大量的文本集中学习词嵌入,或者下载网上预训练好的词嵌入模型

  2. 用这些词嵌入模型迁移到新的只有少量标注训练集的任务中,比如用300维的词嵌入来表示单词。好处就是可以用更低维度的特征向量代替原来的10000维的one-hot向量。尽管one-hot向量很快计算,但学到的用于词嵌入的300维的向量会更加紧凑

  3. 当在新的任务上训练模型,而在命名实体识别任务上只有少量的标记数据集,可以选择要不要继续微调,用新的数据调整词嵌入。但实际中只有第二步中有很大的数据集才会这样做,如果标记的数据集不是很大,通常不会在微调词嵌入上费力气

当任务的训练集相对较小时,词嵌入的作用最明显,所以它广泛用于NLP领域

词嵌入和人脸编码有很多相似性,训练了一个Siamese网络结构,这个网络会学习不同人脸的一个128维表示,然后通过比较编码结果来判断两个图片是否是同一个人脸,在人脸识别领域用编码指代向量f(x(i))f(x^{\left(i \right)})f(x(j))f(x^{\left( j\right)}),词嵌入的意思和这个差不多

人脸识别领域和词嵌入不同就是:

  • 在人脸识别中训练一个网络,任给一个人脸照片,甚至是没有见过的照片,神经网络都会计算出相应的一个编码结果

  • 学习词嵌入则是有一个固定的词汇表,比如10000个单词,学习向量e1e_{1}e10000e_{10000},学习一个固定的编码,即每一个词汇表的单词的固定嵌入

  • 人脸识别中的算法未来可能涉及到海量的人脸照片,而自然语言处理有一个固定的词汇表,没有出现过的单词就记为未知单词

2.3 词嵌入的特性(Properties of Word Embeddings)

该例中,假设用的是四维的嵌入向量,假如向量emane_{\text{man}}ewomane_{\text{woman}}ekinge_{\text{king}}equeene_{\text{queen}} 分别进行减法运算,相减结果表明,“Man”与“Woman”的主要区别是性别,“King”与“Queen”也是一样

所以当算法被问及manwoman相当于king对什么时,算法所做的就是计算emanewomane_{\text{man}}-e_{\text{woman}},然后找出一个向量也就是找出一个词,使得:

emanewomanekinge?e_{\text{man}}-e_{\text{woman}}\approx e_{\text{king}} - e_{?}

即当这个新词是queen时,式子的左边会近似地等于右边

emanewomanekingewe_{\text{man}}-e_{\text{woman}}\approx e_{\text{king}} - e_{w}

等式成立,即找到单词w来最大化ewe_{w}ekingeman+ewomane_{\text{king}} - e_{\text{man}} + e_{\text{woman}}的相似度,即

Find word w:argmax Sim(ew,ekingeman+ewoman)Find\ word\ w:argmax\ Sim(e_{w},e_{\text{king}} - e_{\text{man}} + e_{\text{woman}})

即把ewe_{w}全部放到等式的一边,另一边是ekingeman+ewomane_{\text{king}}- e_{\text{man}} + e_{\text{woman}}。应用相似度函数,通过方程找到一个使得相似度最大的单词,如果结果理想的话会得到单词queen

t-SNE算法所做的就是把这些300维的数据用一种非线性的方式映射到2维平面上,可以得知t-SNE中这种映射很复杂而且很非线性。在大多数情况下,由于t-SNE的非线性映射,不能总是期望使等式成立的关系会像左边那样成一个平行四边形

关于相似函数,比较常用的是余弦相似度,假如在向量uuvv之间定义相似度:

Sim(u,v)=uTvuvSim(u,v)=\frac{u^Tv}{||u||\cdot ||v||}

分子是uuvv的内积。如果uuvv非常相似,那么它们的内积将会很大,把整个式子叫做余弦相似度,是因为该式是uuvv的夹角的余弦值

参考资料: 给定两个向量uuvv,余弦相似度定义如下:

CosineSimilarity(u,v)=u.vu2v2=cos(θ){CosineSimilarity(u, v)} = \frac {u . v} {||u||_2 ||v||_2} = cos(\theta)

u.vu.v 是两个向量的点积(或内积),u2||u||_2是向量uu的范数(或长度), θ\theta 是向量uuvv之间的角度。这种相似性取决于角度在向量uuvv之间。如果向量uuvv非常相似,它们的余弦相似性将接近1; 如果它们不相似,则余弦相似性将取较小的值

两个向量之间角度的余弦是衡量它们有多相似的指标,角度越小,两个向量越相似

还可以计算Euclidian distance来比较相似性,即uv2||u-v||^2。距离越大,相似性越小

2.4 嵌入矩阵(Embedding Matrix)

当应用算法来学习词嵌入时,实际上是学习一个嵌入矩阵

假设某个词汇库包含了10000个单词,每个单词包含的特征维度为300,那么表征所有单词的embedding matrix维度为300 x 10000,用EE来表示。某单词ww的one-hot向量表示为OwO_w,维度为10000 x 1

则该单词的嵌入向量(embedding vector)表达式为:

ew=EOwe_w=E\cdot O_w

只要知道了embedding matrixEE,就能计算出所有单词的embedding vector ewe_w

不过上述这种矩阵乘积运算EOwE\cdot O_w效率并不高,矩阵维度很大,且OwO_w大部分元素为零。通常做法是直接从EE中选取第ww列作为ewe_w

2.5 学习词嵌入(Learning Word Embeddings)

embedding matrix EE可以通过构建自然语言模型,运用梯度下降算法得到。若输入样本是:

I want a glass of orange (juice).

通过这句话的前6个单词,预测最后的单词“juice”。EE未知待求,每个单词可用embedding vector ewe_w表示。构建的神经网络模型结构如下图所示:

神经网络输入层包含6个embedding vectors,每个embedding vector维度是300,则输入层总共有1800个输入。Softmax层有10000个概率输出,与词汇表包含的单词数目一致。正确的输出label是“juice”。其中E,W[1],b[1],W[2],b[2]E,W^{[1]},b^{[1]},W^{[2]},b^{[2]}为待求值。对足够的训练例句样本,运用梯度下降算法,迭代优化,最终求出embedding matrixEE

这种算法的效果还不错,能够保证具有相似属性单词的embedding vector相近

为了让神经网络输入层数目固定,可以选择只取预测单词的前4个单词作为输入,例如该句中只选择“a glass of orange”四个单词作为输入。这里的4是超参数,可调

把输入叫做context,输出叫做target。对应到上面这句话里:

  • context: a glass of orange

  • target: juice

关于context的选择有多种方法:

  • target前n个单词或后n个单词,n可调

  • target前1个单词

  • target附近某1个单词(Skip-Gram)EE

事实证明,不同的context选择方法都能计算出较准确的embedding matrix EE

2.6 Word2Vec

选择context和target的方法中,比较流行的是采用Skip-Gram模型

Skip-Gram模型的做法是:首先随机选择一个单词作为context,例如“orange”;然后使用一个宽度为5或10(自定义)的滑动窗,在context附近选择一个单词作为target,可以是“juice”、“glass”、“my”等等。最终得到了多个context—target对作为监督式学习样本:

训练的过程是构建自然语言模型,经过softmax单元的输出为:

y^=eθtTecj=110000eθjTec\hat y=\frac{e^{\theta_t^T\cdot e_c}}{\sum_{j=1}^{10000}e^{\theta_j^T\cdot e_c}}

θt\theta_t为target对应的参数,ece_c为context的embedding vector,且ec=EOce_c=E\cdot O_c

相应的loss function为:

L(y^,y)=i=110000yilog y^iL(\hat y,y)=-\sum_{i=1}^{10000}y_ilog\ \hat y_i

由于 yy 是一个one-hot向量,所以上式实际上10000个项里面只有一项是非0的

然后,运用梯度下降算法,迭代优化,最终得到embedding matrix EE

然而,这种算法计算量大,影响运算速度。主要因为softmax输出单元为10000个,y^\hat y计算公式中包含了大量的求和运算

解决的办法之一是使用hierarchical softmax classifier,即树形分类器

这种树形分类器是一种二分类。它在每个数节点上对目标单词进行区间判断,最终定位到目标单词。最多需要log2N\log_2 N步就能找到目标单词,N为单词总数

实际应用中,对树形分类器做了一些改进。改进后的树形分类器是非对称的,通常选择把比较常用的单词放在树的顶层,而把不常用的单词放在树的底层。这样更能提高搜索速度

关于context的采样:如果使用均匀采样,那么一些常用的介词、冠词,例如the, of, a, and, to等出现的概率更大一些。但是这些单词的embedding vectors通常不是最关心的,更关心的例如orange, apple, juice等这些名词。所以实际应用中一般不选择随机均匀采样的方式来选择context,而是使用其它算法来处理这类问题

2.7 负采样(Negative Sampling)

算法要做的是构造一个新的监督学习问题:给定一对单词,比如orangejuice,去预测这是否是一对上下文词-目标词(context-target

在这个例子中orangejuice就是个正样本,用1作为标记,orangeking就是个负样本,标为0。要做的就是采样得到一个上下文词和一个目标词,中间列叫做词(word)。然后:

  • 生成一个正样本,先抽取一个context,在一定词距内比如说正负10个词距内选一个target,生成这个表的第一行,即orange– juice -1的过程

  • 生成一个负样本,用相同的context,再在字典中随机选一个词,如king、book、the、of,标记为0。因为如果随机选一个词,它很可能跟orange没关联

如果从字典中随机选到的词,正好出现在了词距内,比如说在上下文词orange正负10个词之内,也没关系,如of被标记为0,即使of的确出现在orange词的前面

接下来将构造一个监督学习问题,学习算法输入xx,即输入这对词(编号7),要去预测目标的标签(编号8),即预测输出yy

如何选取KK

  • 小数据集的话,KK从5到20,数据集越小KK就越大

  • 如果数据集很大,KK就选的小一点。对于更大的数据集KK就从2到5

学习从xx映射到yy的监督学习模型:

编号2是新的输入xx,编号3是要预测的值yy。记号cc表示context,记号tt表示可能的target,yy表示0和1,即是否是一对context-target。要做的是定义一个逻辑回归模型,给定输入的cctt对的条件下,y=1y=1的概率,即:

P(y=1|c,t)=σ(θtTec)P\left( y = 1 \middle| c,t \right) = \sigma(\theta_{t}^{T}e_{c})

如果输入词是orange,即词6257,要做的就是输入one-hot向量,和EE相乘获得嵌入向量e6257e_{6257},最后得到10,000个可能的逻辑回归分类问题,其中一个(编号4)将会是用来判断目标词是否是juice的分类器,其他的词比如下面的某个分类器(编号5)是用来预测king是否是目标词

negative sampling中某个固定的正样本对应kk个负样本,即模型总共包含了k+1k+1binary classification。对比之前10000个输出单元的softmax分类,negative sampling转化为k+1k+1个二分类问题,每次迭代并不是训练10000个,而仅训练其中k+1k+1个,计算量要小很多,大大提高了模型运算速度

这种方法就叫做负采样(Negative Sampling): 选择一个正样本,随机采样kk个负样本

选取了context orange之后,如何选取负样本:

  • 通过单词出现的频率进行采样:导致一些类似a、the、of等词的频率较高

  • 均匀随机地抽取负样本:没有很好的代表性

(推荐)

P(wi)=f(wi)34j=110,000f(wj)34P(w_{i}) = \frac{f( w_{i})^{\frac{3}{4}}}{\sum_{j = 1}^{10,000}{f( w_{j} )^{\frac{3}{4}}}}

这种方法处于上面两种极端采样方法之间,即不用频率分布,也不用均匀分布,而采用的是对词频的34\frac{3}{4}除以词频34\frac{3}{4}整体的和进行采样的。其中,f(wj)f(w_j)是语料库中观察到的某个词的词频

2.8 GloVe 词向量(GloVe Word Vectors)

GloVe代表用词表示的全局变量(global vectors for word representation

假定XijX_{ij}是单词ii在单词jj上下文中出现的次数,iijjttcc的功能一样,可以认为XijX_{ij}等同于XtcX_{tc}。根据context和target的定义,会得出XijX_{ij}等于XjiX_{ji}

  • 如果将context和target的范围定义为出现于左右各10词以内的话,就有对称关系Xij=XjiX_{ij}=X_{ji}

  • 如果对context的选择是context总是目target前一个单词,那么XijXjiX_{ij}\neq X_{ji}

对于GloVe算法,可以定义context和target为任意两个位置相近的单词,假设是左右各10词的距离,那么XijX_{ij}就是一个能够获取单词ii和单词jj彼此接近的频率计数器

GloVe模型做的就是进行优化,将差距进行最小化处理:

minimizei=110,000j=110,000f(Xij)(θiTej+bi+bjlogXij)2\text{mini}\text{mize}\sum_{i = 1}^{10,000}{\sum_{j = 1}^{10,000}}{f\left( X_{ij} \right)\left( \theta_{i}^{T}e_{j} + b_{i} + b_{j}^{'} - \log X_{ij} \right)^{2}}

θiTej\theta{i}^{T}e{j}θtTec\theta_{t}^{T}e_{c}。对于θtTec\theta_{t}^{T}e_{c},这两个单词同时出现的频率是多少受XijX_{ij}影响,若两个词的embedding vector越相近,同时出现的次数越多,则对应的loss越小

Xij=0X_{ij}=0时,权重因子f(Xij)=0f(X_{ij})=0。这种做法直接忽略了无任何相关性的context和target,只考虑Xij>0X_{ij}>0的情况

出现频率较大的单词相应的权重因子f(Xij)f(X_{ij})较大,出现频率较小的单词相应的权重因子f(Xij)f(X_{ij})较小一些

因为θ\thetaee是完全对称的,所以θi\theta_{i}eje_{j}是对称的。因此训练算法的方法是一致地初始化θ\thetaee,然后使用梯度下降来最小化输出,当每个词都处理完之后取平均值:

ew(final)=ew+θw2e_{w}^{(final)}= \frac{e_{w} +\theta_{w}}{2}

GloVe算法不能保证嵌入向量的独立组成部分:

通过上面的很多算法得到的词嵌入向量,无法保证词嵌入向量的每个独立分量是能够理解的。但能够确定是每个分量和所想的一些特征是有关联的,可能是一些我们能够理解的特征的组合而构成的一个组合分量

使用上面的GloVe模型,从线性代数的角度解释如下:

ΘiTej=ΘiTATATej=(AΘi)T(ATej)\Theta_{i}^{T}e_{j} = \Theta_{i}^{T}A^{T}A^{-T}e_{j}=(A\Theta_{i})^{T}(A^{-T}e_{j})

加入的AA项,可能构成任意的分量组合

2.9 情感分类(Sentiment Classification)

情感分类任务就是看一段文本,然后分辨这个人是否喜欢他们在讨论的这个东西,最大的挑战就是可能标记的训练集没有那么多,但是有了词嵌入,即使只有中等大小标记的训练集,也能构建一个不错的情感分类器

输入xx是一段文本,输出yy是要预测的相应情感。比如一个餐馆评价的星级

情感分类一个最大的挑战就是可能标记的训练集没有那么多。对于情感分类任务来说,训练集大小从10,000到100,000个单词都很常见,甚至有时会小于10,000个单词,采用了词嵌入能够带来更好的效果,尤其是只有很小的训练集

给定四个词("dessert is excellent"),通常用10,000个词的词汇表,找到相应的one-hot向量,再乘以嵌入矩阵EEEE可以从一个很大的文本集里学习到,比如它可以从一亿个词或者一百亿个词里学习嵌入,然后用来提取单词the的嵌入向量e8928e_{8928},对dessertisexcellent做同样的步骤

然后取这些向量(编号2),如300维度的向量,通过平均值计算单元(编号3),求和并平均,再送进softmax分类器,然后输出y^\hat y。这个softmax能够输出5个可能结果的概率值,从一星到五星

这个算法适用于任何长短的评论,因为即使评论是100个词长,也可以对这一百个词的特征向量求和取平均,得到一个300维的特征向量,然后送进softmax分类器

但问题是没考虑词序,如负面的评价,"Completely lacking in good taste, good service, and good ambiance.",good这个词出现了很多次,但算法忽略词序,仅仅把所有单词的词嵌入加起来或者平均下来,最后的特征向量会有很多good的表示,分类器很可能认为这是一个好的评论,尽管事实上这是一个差评,只有一星的评价

为了解决这一问题,情感分类的另一种模型是RNN:

首先取这条评论,"Completely lacking in good taste, good service, and good ambiance.",找出每一个one-hot向量,乘以词嵌入矩阵EE,得到词嵌入表达ee,然后把它们送进RNN

RNN的工作就是在最后一步(编号1)计算一个特征表示,用来预测y^\hat y。这样的算法考虑词的顺序效果更好,能意识到"things are lacking in good taste"是个负面的评价,“not good”也是一个负面的评价。而不像原来的算法一样,只是把所有的加在一起得到一个大的向量,根本意识不到“not good”和 “good”不是一个意思,"lacking in good taste"也是如此,等等

如果训练一个这样的算法,最后会得到一个很合适的情感分类的算法。由于词嵌入是在一个更大的数据集里训练的,这样会更好的泛化一些没有见过的新的单词。比如"Completely absent of good taste, good service, and good ambiance.",即使absent这个词不在标记的训练集里

如果是在一亿或者一百亿单词集里训练词嵌入,它仍然可以正确判断,并且泛化的很好,甚至这些词是在训练集中用于训练词嵌入,但不在专门做情感分类问题标记的训练集

2.10 词嵌入除偏(Debiasing Word Embeddings)

根据训练模型所使用的文本,词嵌入能够反映出性别、种族、年龄、性取向等其他方面的偏见:

假设已经完成一个词嵌入的学习,各个词的位置如图:

首先做的事就是辨别出想要减少或想要消除的特定偏见的趋势

怎样辨别出偏见相似的趋势:

一、对于性别歧视,对所有性别对立的单词求差值,再平均:

bias direction=1N((eheeshe)+(emaleefemale)+)bias\ direction=\frac1N ((e_{he}-e_{she})+(e_{male}-e_{female})+\cdots)

二、中和步骤,对于定义不确切的词可以将其处理一下,避免偏见。像doctorbabysitter使之在性别方面中立。将它们在这个轴(编号1)上进行处理,减少或是消除他们的性别歧视趋势的成分,即减少在水平方向上的距离(编号2方框内所示的投影)

三、均衡步,babysittergrandmother之间的距离或者说是相似度实际上是小于babysittergrandfather之间的(编号1),因此这可能会加重不良状态,或者非预期的偏见,也就是说grandmothers相比于grandfathers最终更有可能输出babysitting。所以在最后的均衡步中,想要确保的是像grandmothergrandfather这样的词都能够有一致的相似度,或者说是相等的距离,做法是将grandmothergrandfather移至与中间轴线等距的一对点上(编号2),现在性别歧视的影响也就是这两个词与babysitter的距离就完全相同了(编号3)

最后,掌握哪些单词需要中立化非常重要。一般来说,大部分英文单词,例如职业、身份等都需要中立化,消除embedding vector中性别这一维度的影响

Last updated