2.1 Word Representation
我们上周构建了词汇表,然后用one-hot向量来表示单词。它有一大缺点,那就是它使每个词孤立了,使得算法对相关词的泛化能力不强。比如当你看到“I want a glass of orange _”,下一个词会是什么?很可能是juice。如果算法已经学到这个关系,再看到“I want a glass of apple ”呢?
由于算法不知道apple和orange的关系很接近,它很难从已经知道的orange juice推断出apple juice也是很常见的搭配。
所以我们要用特征化的表示,来表示每个词,比如man,woman,king,queen,apple,orange或者词典里的任何一个单词,我们学习这些词的特征或者数值。
比如我们想知道这些词与Gender(性别)的关系,另一个特征可以是这些词有多Royal,Age,是否是 food,还有很多的其他特征,从Size(尺寸大小),Cost(花费多少),这个东西是不是alive(活的),是不是一个Action(动作),或者是不是Noun(名词)或者是不是Verb(动词),还是其他的等等。
所以你可以想很多的特征。我们假设有300个不同的特征,这样的话你就有了一个300维的向量来表示每个词。现在,在这种表示方法下,apple和orange的词向量肯定会非常相似,可能有些特征不太一样,比如颜色口味或者其他的一些特征不太一样,但总的来说大部分特征都有相似的值。那么,已经知道orange juice的算法很大几率上也会明白apple juice这个东西,这样对于不同的单词算法会泛化的更好。
后面我们会找到一个学习词嵌入的方式,这里只是希望你能理解这种高维特征的表示能够比one-hot更好的表示不同的单词。我们最终学习的特征不会像这里一样这么好理解,没有像第一个特征是性别,第二个特征是高贵,第三个特征是年龄等等这些,新的特征表示的东西肯定会更难搞清楚。但接下来要学的特征表示方法却能使算法高效地发现apple和orange会比king和orange,queen和orange更加相似。
学到300维的特征向量(或者说300维的词嵌入)之后,通常我们会把这些数据嵌入到一个二维空间里,这样就可以可视化了。常用的可视化算法是t-SNE算法,来自于Laurens van der Maaten 和 Geoff Hinton的论文。如果观察这种词嵌入的表示方法,你会发现特征相似的词会聚集在一块。
在网上你可能会看到300维或者更高维度的嵌入,之所以叫嵌入(embeddings)的原因是,你可以想象一个3维的空间(300维有点难想),取每一个单词比如orange,它对应一个3维的特征向量,所以这个词就被嵌在这个3维空间里的一个点上,apple这个词就被嵌在这个3维空间的另一个点上了。为了可视化,t-SNE算法把这个空间映射到低维空间,你可以画出一个2维图像然后观察,这就是这个术语嵌入的来源。
尽管one-hot向量计算很快,但学到的用于词嵌入的300维的向量会更加紧凑,维度降低很多。
2.2 Using Word Embeddings
上一个视频中,你已经了解不同单词的特征化表示了。这节你会看到我们如何把这种表示方法应用到NLP应用中。
我们继续用命名实体识别的例子,如果你要找出人名,假如有一个句子:“Sally Johnson is an orange farmer.”,你会发现Sally Johnson就是一个人名,所以这里的输出为1。之所以能确定Sally Johnson是一个人名而不是一个公司名,是因为你知道种橙子的农民一定是一个人。
用词嵌入作为输入训练好的模型,如果你看到一个新的输入:“Robert Lin is an apple farmer.”,因为知道orange和apple很相近,那么你的算法很容易就知道Robert Lin也是一个人名。
如果出现不太常见的词怎么办?比如你看到:“Robert Lin is a durian cultivator.”,榴莲(durian)是一种在新加坡和其他一些国家流行的水果。如果对于一个命名实体识别任务,你只有一个很小的标记的训练集,你的训练集里甚至可能没有durian(榴莲)或者cultivator(培育家)这两个词。但是如果你有一个已经学好的词嵌入,它会告诉你durian(榴莲)是水果,就像orange(橙子)一样,并且cultivator(培育家),做培育工作的人其实跟farmer(农民)差不多,那么你就有可能从你的训练集里的“an orange farmer”(种橙子的农民)归纳出“a durian cultivator”(榴莲培育家)也是一个人。
词嵌入能够达到这种效果,其中一个原因就是学习词嵌入的算法会考察非常大的文本集,也许是从网上获取的很大的数据集。你可以把这个词嵌入应用到你的命名实体识别任务当中,尽管你只有一个很小的训练集,但也可以使用迁移学习。
如果你从某一任务A迁移到某个任务B,只有A中有大量数据,而B中数据少时,迁移的过程才有用。这是如何用词嵌入做迁移学习的步骤:
- 先从大量的文本集中学习词嵌入。获取一个非常大的文本集,或者直接下载预训练好的词嵌入模型;
- 使用词嵌入模型,把它迁移到你的新的只有少量标注训练集的任务中;
- 当你在新的任务上训练模型时,如果只有少量的标记数据集,你可以自己选择要不要继续微调,用新的数据调整词嵌入。如果你标记的数据集不是很大,通常我不会在微调词嵌入上费力气。
当你的任务的训练集相对较小时,词嵌入的作用最明显,所以它广泛用于NLP领域,比如命名实体识别、文本摘要、文本解析、指代消解等非常标准的NLP任务上。
词嵌入在语言模型、机器翻译领域用的少一些,尤其是你做语言模型或者机器翻译任务时,这些任务你有大量的数据。
最后,词嵌入和人脸编码之间有奇妙的关系。之前我们训练了一个Siamese网络结构,它会学习不同人脸的一个128维表示,然后通过比较编码结果来判断两个图片是否是同一个人脸,这个向量常被称为编码,和词嵌入的意思差不多。
不同的是,在人脸识别中我们训练一个网络,任给一个人脸照片,甚至是没有见过的照片,神经网络都会计算出相应的一个编码结果。而学习词嵌入则是有一个固定的词汇表,比如10000个单词,我们学习向量到
,学习一个固定的编码,每一个单词的固定嵌入。
也就是说,人脸识别中的算法未来可能涉及到海量的人脸照片,而自然语言处理有一个固定的词汇表,而像一些没有出现过的单词我们就记为未知单词。
2.3 Properties of Word Embeddings
到现在,你应该明白了词嵌入是如何帮助你构建自然语言处理应用的。词嵌入还有一个迷人的特性就是它能帮助实现类比推理,尽管类比推理可能不是自然语言处理应用中最重要的,不过它能帮助人们理解词嵌入做了什么,以及词嵌入能够做什么。
假如我提出一个问题,man如果对应woman,那么king应该对应什么?你们应该都能猜到king应该对应queen。能否有一种算法来自动推导出这种关系,下面就是实现的方法。
简单起见,我们用一个四维向量表示单词。
我们对向量和
进行减法运算,即
类似的,如果用减去
,最后也会得到一样的结果,即
这个结果表示,man和woman主要的差异是gender(性别)上的差异,而king和queen之间的主要差异也是gender(性别)上的差异。所以得出这种类比推理的结论的方法就是,当算法被问及man对woman相当于king对什么时,算法所做的就是计算,然后找出一个向量也就是找出一个词,使得
≈
。
这种思想首先是被Tomas Mikolov 和 Wen-tau Yih还有Geoffrey Zweig提出的,这是词嵌入领域影响力最为惊人和显著的成果之一,这种思想帮助研究者们对词嵌入领域建立了更深刻的理解。
[Mikolov T, Yih W T, Zweig G. Linguistic regularities in continuous space word representations[J]. In HLT-NAACL, 2013.]
如何把这种思想写成算法?通过方程可以找到一个使得相似度最大的单词:
#card=math&code=Find%5C%20word%5C%20w%3Aargmax%20%5C%20Sim%28e%7Bw%7D%2Ce%7B%5Ctext%7Bking%7D%7D%20-%20e%7B%5Ctext%7Bman%7D%7D%20%2B%20e%7B%5Ctext%7Bwoman%7D%7D%29&id=aRqhP)
在继续下一步之前,我想再说明一下。在之前我们谈到过用t-SNE算法来将单词可视化。t-SNE算法所做的就是把这些300维的数据用一种非线性的方式映射到2维平面上,可以得知t-SNE中这种映射很复杂而且很非线性。
在进行t-SNE映射之后,你不能总是期望使等式成立的关系,会像左边那样成一个平行四边形。在大多数情况下,由于t-SNE的非线性映射,很多这种平行四边形的类比关系在t-SNE映射中都会失去原貌。
再快速地列举一个最常用的相似度函数,叫做余弦相似度。在余弦相似度中,假如在向量和
之间定义相似度:
%20%3D%20%5Cfrac%7Bu%5E%7BT%7Dv%7D%7B%5Cleft%7C%20%5Cleft%7C%20u%20%5Cright%7C%20%5Cright%7C%7B2%7D%5Cleft%7C%20%5Cleft%7C%20v%20%5Cright%7C%20%5Cright%7C%7B2%7D%7D#card=math&code=%5Ctext%7Bsim%7D%5Cleft%28%20u%2Cv%20%5Cright%29%20%3D%20%5Cfrac%7Bu%5E%7BT%7Dv%7D%7B%5Cleft%7C%20%5Cleft%7C%20u%20%5Cright%7C%20%5Cright%7C%7B2%7D%5Cleft%7C%20%5Cleft%7C%20v%20%5Cright%7C%20%5Cright%7C%7B2%7D%7D&id=kyzGC)
我们先不看分母,分子其实就是和
的内积。如果u和v非常相似,那么它们的内积将会很大。把整个式子叫做余弦相似度,其实就是因为该式是
和
的夹角Φ的余弦值。你应该还记得在微积分中,Φ角的余弦图像是这样的,所以夹角为0度时,余弦相似度就是1,当夹角是90度角时余弦相似度就是0,当它们是180度时,图像完全跑到了相反的方向,这时相似度等于-1,这就是为什么余弦相似度对于这种类比工作能起到非常好的效果。
如果你想的话,相似度函数也可以用平方距离或者欧氏距离来表示:
不过我觉得余弦相似度用得更多一点,这两者的主要区别是它们对和
之间的距离标准化的方式不同。
词嵌入的一个显著成果就是,可学习的类比关系的一般性。举些例子,
- Man:Woman as Boy:Girl
- Ottawa:Canada as Nairobi:Kenya (首都:国家)
- Big:Bigger as Tall:Taller
- Yen:Japan as Ruble:Russia(钱币单位:国家)
这些类比都能够学习。只要你在大型的文本语料库上实现一个词嵌入学习算法,只要从足够大的语料库中进行学习,它就能自主地发现这些模式。
在本节视频中,你见到了词嵌入是如何被用于类比推理的,还知道了余弦相似度可以作为一种衡量两个词嵌入向量间相似度的办法,我们谈了许多有关这些嵌入的特性,以及如何使用它们。下节视频中,我们来讨论如何真正的学习这些词嵌入。
2.4 Embedding Matrix
学习词嵌入,实际上是学习一个嵌入矩阵。
假设我们的词汇表含有10,000个单词,orange 的单词编号是6257,代表词汇表中第6257个单词,我们用符号来表示这个one-hot向量,这个向量除了第6527个位置上是1,其余各处都为0。
我们要学习的嵌入矩阵将是一个300×10,000的矩阵。
如果用 去乘以右边的one-hot向量(上图编号3所示),也就是
,那么就会得到一个300维的向量,其实就是单词 orange 的 embedding 向量
。也就是说,
。
实际上,用大量的矩阵和向量相乘效率是很低下的,因为one-hot向量是一个维度非常高的向量,并且几乎所有元素都是0,所以矩阵向量相乘效率太低。在实践中你会使用一个专门的函数来单独查找矩阵的某列,而不是用通常的矩阵乘法来做,但是在画示意图时(上图所示),这样写比较方便。
2.5 Learning Word Embeddings
在深度学习应用于学习词嵌入的历史上,人们一开始使用的算法比较复杂,但随着时间推移,研究者们不断发现他们能用更加简单的算法来达到一样好的效果,特别是在数据集很大的情况下。所以今天我们从稍微复杂一些的算法开始讲,然后对这些算法进行简化。
实践证明,建立一个语言模型是学习词嵌入矩阵的好方法。
[Bengio et. al., 2003. A neural probabilistic language model]
假如你在构建一个语言模型,你可能想要你的神经网络能够做到比如输入:“I want a glass of orange _.”,然后预测这句话的下一个词。在每个单词下面,我都写上了这些单词对应词汇表中的索引。
现在你有许多300维的嵌入向量,把它们放进神经网络,最后通过softmax层输出预测的单词。
这里把隐藏层的参数用和
来表示,softmax层的参数用
和
表示。如果它们用的是300维大小的嵌入向量,而这里有6个词,所以这个输入会是一个6×300=1800 维的向量,这是通过将这6个嵌入向量堆在一起得到的。
如何适应很长或者很短的句子?方法就是使用固定的历史窗口,我们总是只看前k个单词,k是这个历史窗口的大小,是个超参。用一个固定的历史窗口就意味着你可以处理任意长度的句子,因为输入的维度总是固定的。
所以这个模型的参数就是矩阵,对所有的单词用的都是同一个矩阵
,而不是对应不同的位置上的不同单词用不同的矩阵。然后
和
、
和
这些权重也都是算法的参数,你可以用反向传播来进行梯度下降来最大化似然函数,通过序列中给定的k=4个单词去重复地预测出语料库中下一个单词什么。
这就是早期最成功的学习词嵌入矩阵的算法之一。算法预测出了某个单词 juice,我们把它叫做目标词,它是通过一些上下文contenxt,在本例中也就是这前4个词推导出来的。研究人员尝试过很多不同类型的上下文,如果你要建立一个语言模型,那么一般选取目标词之前的几个词作为上下文。但如果你的目标不是学习语言模型本身的话,那么你可以选择其他的上下文,比如把目标词左右各4个词作为上下文,预测中间这个词;或者上下文是附近一个单词,虽然只有1个,但这种算法能工作得很好。
在下节视频,你将看到如何用更简单的上下文和更简单的算法来建立从上下文到目标词的映射,这将让你能够更好地学习词嵌入,一起进入下节视频学习Word2Vec模型。
2.6 Word2Vec
Word2Vec算法是一种简单而且计算更加高效的学习词嵌入的方式。
[Mikolov et. al., 2013. Efficient estimation of word representations in vector space.]
Skip-Gram模型
假设在训练集中给定了一个这样的句子:“I want a glass of orange juice to go along with my cereal.”,在Skip-Gram模型中,我们要做的是抽取上下文和目标词配对,来构造一个监督学习问题。
我们要的做的是,先随机选择一个词作为上下文词,然后在它的一定词距内比如在上下文词前后k个词的范围内,选择另一个词作为目标词。
于是我们将构造一个监督学习问题,它给定上下文词,要求你预测在这个词正负k个词距内随机选择的某个目标词。显然,这不是个简单的学习问题,因为在单词orange的正负10个词距之间,可能会有很多不同的单词。但是构造这个监督学习问题的目标并不是想要解决这个监督学习问题本身,而是想要使用这个学习问题来学到一个好的词嵌入模型。
接下来说说模型的细节。我们要解决的基本的监督学习问题,是学习一种映射关系,从上下文c,比如单词orange,到某个目标词,记为t,可能是单词juice或者glass或者my。在我们的词汇表中,orange是第6257个单词,juice是10,000个单词中的第4834个,这就是你想要的映射到输出的输入
。
为了表示输入,比如单词orange,你可以先从one-hot向量开始,我们将其写作,这就是上下文词的one-hot向量(上图编号1所示)。用嵌入矩阵
乘以向量
,得到输入的上下文词的嵌入向量
。
在这个神经网络中(上图编号2所示),我们将把向量喂入一个softmax单元。我通常把softmax单元画成神经网络中的一个节点(上图编号3所示),它输出
。
然后我们再写出模型的细节,这是softmax模型(上图编号4所示),预测不同目标词的概率:
%20%3D%20%5Cfrac%7Be%5E%7B%5Ctheta%7Bt%7D%5E%7BT%7De%7Bc%7D%7D%7D%7B%5Csum%7Bj%20%3D%201%7D%5E%7B10%2C000%7De%5E%7B%5Ctheta%7Bj%7D%5E%7BT%7De%7Bc%7D%7D%7D#card=math&code=Softmax%3Ap%5Cleft%28%20t%20%5Cmiddle%7C%20c%20%5Cright%29%20%3D%20%5Cfrac%7Be%5E%7B%5Ctheta%7Bt%7D%5E%7BT%7De%7Bc%7D%7D%7D%7B%5Csum%7Bj%20%3D%201%7D%5E%7B10%2C000%7De%5E%7B%5Ctheta%7Bj%7D%5E%7BT%7De%7Bc%7D%7D%7D&id=j2UbR)
这里是一个与输出
有关的参数,即某个词
和标签相符的概率是多少。我省略了softmax中的偏差项,想要加上的话也可以加上。我们这里的
是用one-hot表示的,于是损失函数就会是:
%20%3D%20-%20%5Csum%7Bi%20%3D%201%7D%5E%7B10%2C000%7D%7By%7Bi%7D%5Clog%20%5Chat%20y%7Bi%7D%7D#card=math&code=L%5Cleft%28%20%5Chat%20y%2Cy%20%5Cright%29%20%3D%20-%20%5Csum%7Bi%20%3D%201%7D%5E%7B10%2C000%7D%7By%7Bi%7D%5Clog%20%5Chat%20y%7Bi%7D%7D&id=pDNwk)
是一个从softmax单元输出的10,000维的向量,这个向量是所有可能目标词的概率。
总结一下,这大体上就是一个可以找到词嵌入的简化模型和神经网络(上图编号2所示),其实就是个softmax单元。矩阵有对应所有嵌入向量
的参数(上图编号6所示),softmax单元也有
的参数。优化这个关于所有这些参数的损失函数,你就会得到一个较好的嵌入向量集,这个就叫做Skip-Gram模型。它把一个像orange这样的词作为输入,预测这个词的前面某个位置或者后面某个位置是什么词。
使用这个算法会遇到一些问题,首要的问题就是计算速度。尤其是在softmax模型中,每次你想要计算这个概率,你需要对你词汇表中的所有10,000个词做求和计算,可能10,000个词的情况还不算太差。如果你用了一个大小为100,000或1,000,000的词汇表,那么这个分母的求和操作是相当慢的,实际上10,000已经是相当慢的了,所以扩大词汇表就更加困难了。
这里有一些解决方案,如分级(hierarchical)的softmax分类器和负采样(Negative Sampling)。
分级softmax分类器
hierarchical softmax classifier
想象如果你有一个分类器(上图左树),第一层,它告诉你目标词是在词汇表的前5000个中还是在词汇表的后5000个词中,假设是在前5000个词中,然后第二个分类器会告诉你这个词在词汇表的前2500个词中还是2500~5000的范围内,诸如此类,直到最终你找到一个准确的位置,也就是到达了这棵树的一个叶子节点。
像这样的一个树形的分类器,每一个节点都可以是一个二分类器,比如逻辑回归分类器,所以你不需要再对词汇表中所有的10,000个词求和了。
在实践中分级softmax分类器不会使用一棵完美平衡的分类树,它会被构造成常用词在顶部,不常用的词像durian会在树的更深处(上图右树)。所以有不同的经验法则可以帮助构造分类树形成分级softmax分类器。
在下个视频中,我们会讲到另一个方法叫做负采样,我感觉这个会更简单一点,对于加速softmax和解决需要在分母中对整个词汇表求和的问题也很有作用。
那么,如何选择上下文c?
一种方法是你可以对语料库均匀且随机地采样。如果你这么做,你会发现有一些词,像the、of、a、and、to诸如此类是出现得相当频繁的,但这些词没有意义,你想要的是花时间来更新像durian这些更少出现的词的嵌入。实际上词#card=math&code=p%28c%29&id=jTBoD)的分布并不是单纯的在训练集语料库上均匀且随机的采样得到的,而是采用了不同的heuristic(启发)来平衡更常见的词和不那么常见的词。
CBOW
如果你读过我提到的论文原文,你会发现有两个不同版本的Word2Vec模型,Skip-Gram只是其中的一个,另一个叫做CBOW,即连续词袋模型(Continuous Bag-Of-Words Model),它获得中间词两边的的上下文,然后用周围的词去预测中间的词,这个模型也很有效。
Skip-Gram模型的关键问题在于softmax这个步骤的计算成本非常昂贵,因为它需要在分母里对词汇表中所有词求和。但通常情况下,Skip-Gram模型用得更多。
总结下:CBOW是从原始语句推测目标字词;而Skip-Gram正好相反,是从目标字词推测出原始语句。CBOW对小型数据库比较合适,而Skip-Gram在大型语料中表现更好。 (下图左边为CBOW,右边为Skip-Gram)
在下个视频中,我会展示给你一个算法,它修改了训练目标使其可以运行得更有效,因此它可以让你应用在一个更大的训练集上面,也可以学到更好的词嵌入。
2.7 Negative Sampling
负采样的目标与Skip-Gram模型相似,但是更加高效。
Mikolov T, Sutskever I, Chen K, et al. Distributed Representations of Words and Phrases and their Compositionality[J]. 2013, 26:3111-3119.
目标:构造一个新的监督学习问题,给定一对单词,比如orange和juice,预测这是否是上下文词-目标词(context-target)对。
在这个例子中,orange和juice就是个正样本,标为1,orange和king是负样本,标为0。
正样本跟上个视频中生成的方式一模一样,先抽取一个上下文词,在一定词距内比如说正负10个词距内选一个目标词,这就是生成这个表的第一行,即orange– juice -1的过程。然后生成负样本,用相同的上下文词,再在字典中随机选一个词,跟orange没关联,就是负样本,记为orange–book–0。如果我们从字典中随机选到的词正好出现在了词距内,这也没关系,还是记为负样本。一共选出 K 个负样本。
接下来我们将构造一个监督学习问题,其中学习算法输入context-target词对,去预测目标的标签是0还是1。举例来说,问题就是给定一对词,像orange和juice,你觉得它们会一起出现么?你觉得这两个词是通过对靠近的两个词采样获得的吗?或者你觉得我是分别在文本和字典中随机选取得到的?这个算法就是要分辨这两种不同的采样方式,这就是如何生成训练集的方法。
那么如何选取?Mikolov等人推荐小数据集的话,
从5到20比较好。如果你的数据集很大,
就选的小一点。对于更大的数据集
就等于2到5,数据集越小
就越大。在这个例子中,我们用
。
现在学习从映射到
的监督学习模型。符号定义:
表示上下文词,
表示可能的目标词,
表示0和1,表示是否是一对上下文-目标词。定义一个逻辑回归模型,给定输入的
-
对的条件下,
的概率,即:
%20%3D%20%5Cfrac%7Be%5E%7B%5Ctheta%7Bt%7D%5E%7BT%7De%7Bc%7D%7D%7D%7B%5Csum%7Bj%20%3D%201%7D%5E%7B10%2C000%7De%5E%7B%5Ctheta%7Bj%7D%5E%7BT%7De%7Bc%7D%7D%7D#card=math&code=Softmax%3Ap%5Cleft%28%20t%20%5Cmiddle%7C%20c%20%5Cright%29%20%3D%20%5Cfrac%7Be%5E%7B%5Ctheta%7Bt%7D%5E%7BT%7De%7Bc%7D%7D%7D%7B%5Csum%7Bj%20%3D%201%7D%5E%7B10%2C000%7De%5E%7B%5Ctheta%7Bj%7D%5E%7BT%7De%7Bc%7D%7D%7D&id=kxgO1)
%20%3D%20%5Csigma(%5Ctheta%7Bt%7D%5E%7BT%7De%7Bc%7D)#card=math&code=P%5Cleft%28%20y%20%3D%201%20%5Cmiddle%7C%20c%2Ct%20%5Cright%29%20%3D%20%5Csigma%28%5Ctheta%7Bt%7D%5E%7BT%7De%7Bc%7D%29&id=wV03T)
sigmoid函数作用于,一个参数向量
和嵌入向量
。每一个正样本你都有
个对应的负样本来训练一个类似逻辑回归的模型。
我们把这个画成一个神经网络,如果输入词是orange,即词6257,你要做的就是输入one-hot向量,再传递给,通过两者相乘获得嵌入向量
,你就得到了10,000个可能的逻辑回归分类问题,预测词汇表中这些单词是目标词的概率。
把这些看作10,000个二分类逻辑回归分类器,但并不是每次迭代都训练全部10,000个,我们只训练其中的5个,也就是1个正样本和K=4个负样本对应的分类器。这也是为什么这个算法计算成本更低,因为只需更新个逻辑单元,而不是更新10,000维的softmax分类器。
这个算法有一个重要的细节就是如何选取负样本。
一个办法是对上下文问附近的词进行采样,即候选的目标词,你可以根据其在语料中的经验频率进行采样,就是通过词出现的频率对其进行采样。但问题是这会导致你在like、the、of、and诸如此类的词上有很高的频率。另一个极端就是用1除以词汇表总词数,即,均匀且随机地抽取负样本,这对于英文单词的分布是非常没有代表性的。
所以论文的作者Mikolov等人根据经验,发现采用以下方式的效果最好:
%20%3D%20%5Cfrac%7Bf%5Cleft(%20w%7Bi%7D%20%5Cright)%5E%7B%5Cfrac%7B3%7D%7B4%7D%7D%7D%7B%5Csum%7Bj%20%3D%201%7D%5E%7B10%2C000%7D%7Bf%5Cleft(%20w%7Bj%7D%20%5Cright)%5E%7B%5Cfrac%7B3%7D%7B4%7D%7D%7D%7D#card=math&code=P%5Cleft%28%20w%7Bi%7D%20%5Cright%29%20%3D%20%5Cfrac%7Bf%5Cleft%28%20w%7Bi%7D%20%5Cright%29%5E%7B%5Cfrac%7B3%7D%7B4%7D%7D%7D%7B%5Csum%7Bj%20%3D%201%7D%5E%7B10%2C000%7D%7Bf%5Cleft%28%20w_%7Bj%7D%20%5Cright%29%5E%7B%5Cfrac%7B3%7D%7B4%7D%7D%7D%7D&id=aypIQ)
#card=math&code=f%28w%7Bi%7D%29&id=qPl9q)是词的词频,通过
次方的计算,使其处于完全独立的分布和训练集的观测分布两个极端之间。我并不确定这是否有理论证明,但是很多研究者现在使用这个方法,似乎也效果不错。
总结一下,你已经知道了在softmax分类器中如何学到词向量,但是计算成本很高。在这个视频中,你见到了如何通过将其转化为一系列二分类问题使你可以非常有效的学习词向量。
Skip-Gram模型就介绍到这里,在下个视频中,我会跟你分享另一个版本的词嵌入学习算法GloVe,而且这可能比你之前看到的都要简单。
2.8 GloVe Word Vectors
Pennington J, Socher R, Manning C. Glove: Global Vectors for Word Representation[C]// Conference on Empirical Methods in Natural Language Processing. 2014:1532-1543.
GloVe代表用词表示的全局变量(global vectors for word representation)。定义是单词
在单词
附近出现的次数。如果你将上下文和目标词的范围定义为出现于左右各10词以内的话,那么就会有一种对称关系,即
。
GloVe模型做的就是最小化下面这个式子:
%5Cleft(%20%5Ctheta%7Bi%7D%5E%7BT%7De%7Bj%7D%20%2B%20b%7Bi%7D%20%2B%20b%7Bj%7D%5E%7B’%7D%20-%20logX%7B%7Bij%7D%7D%20%5Cright)%5E%7B2%7D%7D%7D#card=math&code=%5Ctext%7Bmini%7D%5Ctext%7Bmize%7D%5Csum%7Bi%20%3D%201%7D%5E%7Bn%7D%7B%5Csum%7Bj%20%3D%201%7D%5E%7Bn%7D%7Bf%5Cleft%28%20X%7B%7Bij%7D%7D%20%5Cright%29%5Cleft%28%20%5Ctheta%7Bi%7D%5E%7BT%7De%7Bj%7D%20%2B%20b%7Bi%7D%20%2B%20b%7Bj%7D%5E%7B%27%7D%20-%20logX_%7B%7Bij%7D%7D%20%5Cright%29%5E%7B2%7D%7D%7D&id=PACYX)
其中的,想一下
和
与
和
(目标词和上下文词)的功能一样,这就和之前的
类似了。对于
来说,你想要知道的是
和
之间联系程度如何,换句话说就是他们同时出现的频率是多少,这是由这个
影响的。你只想要学习一些向量,这样他们的输出能够对这两个单词同时出现的频率进行良好的预测。
加权项#card=math&code=f%5Cleft%28X_%7B%7Bij%7D%7D%5Cright%29&id=c5gxY),2个作用。
- 如果
,那么
就是未定义的,是负无穷大的。我们添加一个额外的加权项
#card=math&code=f%5Cleft%28X%7B%7Bij%7D%7D%5Cright%29&id=AjGhn),并约定
,意思是如果,先不要进行求和,所以这个
项就成了不相关项。求和公式表明,这个和仅是一个上下文和目标词关系里连续出现至少一次的词对的和。
- 有些词在英语里出现十分频繁,比如说this,is,of,a等等,这叫做停止词,但是在频繁词和不常用词之间也会有一个连续统(continuum)。同时也有一些不常用的词,你想将其考虑在内。因此,这个加权因子
#card=math&code=f%5Cleft%28X_%7B%7Bij%7D%7D%5Cright%29&id=dZNQD)就可以是一个函数,像durion这样不常用的词,它能给予有意义的权重,同时也能够给频繁出现的停用词更大但不至于过分的权重。如果你想要知道
f
是怎么完成这个功能的话,你可以看一下GloVe算法的论文。
所以我们要做的是解决参数和
的问题,然后用梯度下降来最小化上面的公式。
最后,一件有关这个算法有趣的事是和
的功能是完全对称的。如果你只看数学式的话,你可以将
和
颠倒或者将它们进行排序,实际上他们都输出了同样的最佳结果。因此一种训练算法的方法是,一致地初始化
和
,然后使用梯度下降来最小化输出,当每个词都处理完之后取平均值。所以给定一个词
,你就会有
%7D%3D%20%5Cfrac%7Be%7Bw%7D%20%2B%5Ctheta%7Bw%7D%7D%7B2%7D#card=math&code=e%7Bw%7D%5E%7B%28final%29%7D%3D%20%5Cfrac%7Be%7Bw%7D%20%2B%5Ctheta_%7Bw%7D%7D%7B2%7D&id=cgiG5)。因为
和
在这个特定的公式里是对称的。
这就是GloVe算法的内容。
现在简单讨论一下嵌入向量的特征化。我们前面以这个特制的表格作为例子来开始学习词向量,
但实际上,学习词嵌入的算法不能保证嵌入向量的独立组成部分是能够理解的。为什么呢?
假设说有个空间,里面的第一个轴是Gender,第二个轴是Royal,,第三个轴…它们可能是正交的,也可能不是。我们来看,如果有某个可逆矩阵
,那么这项就可以简单地替换成
%5E%7BT%7D(A%5E%7B-%20T%7De%7Bj%7D)#card=math&code=%5Cleft%28A%5Ctheta%7Bi%7D%20%5Cright%29%5E%7BT%7D%28A%5E%7B-%20T%7De_%7Bj%7D%29&id=eWfec),因为我们将其展开:
%5E%7BT%7D%5Cleft(%20A%5E%7B-%20T%7De%7Bj%7D%20%5Cright)%20%3D%20%5Ctheta%7Bi%7D%5E%7BT%7DA%5E%7BT%7DA%5E%7B-%20T%7De%7Bj%7D%20%3D%20%5Ctheta%7Bi%7D%5E%7BT%7De%7Bj%7D#card=math&code=%5Cleft%28%20A%5Ctheta%7Bi%7D%20%5Cright%29%5E%7BT%7D%5Cleft%28%20A%5E%7B-%20T%7De%7Bj%7D%20%5Cright%29%20%3D%20%5Ctheta%7Bi%7D%5E%7BT%7DA%5E%7BT%7DA%5E%7B-%20T%7De%7Bj%7D%20%3D%20%5Ctheta%7Bi%7D%5E%7BT%7De_%7Bj%7D&id=B6fX5)
所以你不能保证这些用来表示特征的轴能够等同于人类可能简单理解的轴,具体而言,第一个特征可能是个Gender、Roya、Age、Food Cost和Size的组合,它也许是名词或是一个行为动词和其他所有特征的组合,所以很难看出独立组成部分,即这个嵌入矩阵的单行部分,然后解释出它的意思。但是在类比其他问题时,特征向量也是行得通的。因此尽管存在特征量潜在的任意线性变换,你最终还是能学习出解决类似问题的平行四边形映射。
2.9 Sentiment Classification
情感分类一个最大的挑战就是可能标记的训练集没有那么多,但是有了词嵌入,即使只有中等大小的标记的训练集,你也能构建一个不错的情感分类器。
先来看一个简单的情感分类模型,任务是从评价中预测星级,一星到五星。
取一条评论中每个词的嵌入向量,比如是300维度的向量,然后把它们求和或者求平均得到一个新的300维向量。把这个特征向量送进softmax分类器,然后输出,即一星到五星这5个可能结果的概率值。
这里用的平均值运算单元,使得算法适用于任何长度的评论。但是对于这种负面评价,”Completely lacking in good taste, good service, and good ambiance.”,good 这个词出现了很多次,仅仅把所有单词的词嵌入加起来或者平均下来,最后的特征向量会有很多 good 的表示,以致于分类器认为这是一个好的评论。
我们用一个RNN来做情感分类。
将每个词的嵌入向量送进RNN里,在最后一步计算一个特征表示,用来预测
,显然,这是一个多对一的网络结构的例子。
有了这样的算法,考虑词的顺序效果就更好了,它就能意识到”things are lacking in good taste”,这是个负面的评价,“not good”也是一个负面的评价。而不像原来的算法一样,只是把所有的加在一起得到一个大的向量,根本意识不到“not good”和 “good”不是一个意思,”lacking in good taste”也是如此,等等。
以上就是情感分类的问题,我希望你能大体了解。一旦你学习到或者从网上下载词嵌入,你就可以很快构建一个很有效的NLP系统。
2.10 Debiasing Word Embeddings
本节的 bias 这个词指的是在性别、种族、性取向等方面的偏。由于现在机器学习和人工智能算法正渐渐地被信任用以辅助或是制定极其重要的决策,我们想要尽可能地确保它们不受非预期形式的偏见影响。
一些性别偏见示例:
至于词嵌入,它们能够轻易学会用来训练模型的文本中的偏见内容。本节视频里我想要与你们分享 Bolukbasi 的一篇论文,它是研究减少词嵌入中偏见问题的。
[Bolukbasi et. al., 2016. Man is to computer programmer as woman is to homemaker? Debiasing word embeddings]
假设说我们已经完成一个词嵌入的学习,那么babysitter就是在这里,doctor在这里,grandmother在这里,grandfather在这里,也许girl嵌入在这里,boy嵌入在这里,也许she嵌在这里,he在这里(上图编号1所示的区域内),所以首先我们要做的事就是辨别出我们想要减少或想要消除的特定偏见的趋势。
为了便于说明,我会集中讨论性别歧视,其他类型的偏见也都是通用的。主要有以下三个步骤:
- Identify bias direction.
对于性别歧视这种情况来说,我们计算,以及
,然后将这些差简单地求平均。
上图横轴看起来就是性别偏见的趋势,而竖轴则与我们想要尝试处理的特定偏见并不相关,因此竖轴是个无偏见趋势。在这种情况下,偏见趋势可以将它看做1D子空间,那么无偏见趋势就会是299D的子空间。我这里略微简化了,原文章中的描述这个偏见趋势可以比1维更高,同时相比于取平均值,它用的是更加复杂的算法叫做SVU奇异值分解,如果你对主成分分析(Principle Component Analysis)很熟悉的话,奇异值分解这个算法的一些方法和主成分分析 (PCA)其实很类似。 - Neutralize: For every word that is not definitional, project to get rid of bias. 中和。
有些词本质上就和性别有关,像grandmother、grandfather、girl、boy,也有一些词像doctor和babysitter我们想使之在性别方面是中立的。对于那些定义里没有性别含义的词,我们就可以将它们在竖轴上进行处理,来减少或是消除他们的性别歧视趋势的成分,也就是说减少他们在这个水平方向上投影的距离。 - Equalize pairs. 均衡。
举例来说,对于grandmother和grandfather、girl和boy这类词嵌入,你希望只有性别是他们之间的区别。因为在特征可视化图上,babysitter和grandmother之间的距离(相似度)小于babysitter和grandfather之间的距离(下图紫线),这可能会加重非预期的偏见。
我们想要确保的是像grandmother和grandfather这样的词都能够有一致的相似度,或者说是和babysitter或是doctor这样性别中立的词有着相等的距离。这其中会有一些线性代数的步骤,主要是将grandmother和grandfather移至与中间轴线等距的一对点上,如下图所示。
现在两个词与babysitter的距离就完全相同了。
最后,你需要平衡的词对的数实际上是很小的,至少对于性别歧视这个例子来说,用手都能够数出来你需要平衡的大部分词对。完整的算法会比我在这里展示的更复杂一些,你可以去看一下这篇论文了解详细内容,你也可以通过编程作业来练习一下这些想法。
总结一下,减少或者是消除学习算法中的偏见问题是个十分重要的问题,因为这些算法会用来辅助制定越来越多的社会中的重要决策,在本节视频中分享了一套如何尝试处理偏见问题的办法,不过这仍是一个许多学者正在进行主要研究的领域。