本文是吴恩达深度学习第五课:序列模型。本次课程将会学到如何为自然语言、语言和其他序列数据构建模型。会了解如何构建并训练一个循环神经网络,和常用的变体,比如GRU和LSTM。能应用序列模型到自然语音处理,包括情感分析。能应用序列模型到语音应用,包括语音识别和智能作曲。
第五课有以下三个部分,本文是第二部分。
我们已经使用字典中的单词来进行词表示,上次我们使用了10000个单词的字典。并且使用one-hot向量来表示具体的单词。
假设Man这个单词在5391索引的位置,那么它one-hot向量对应的5391维度的值就为1,其他为0。我们用 O 5391 O_{5391} O5391来表示这个one-hot向量。
这种表示方法的一个缺点是,它只考虑了单个单词在向量中的作用,没有考虑词与词之间的关系。假设你有一个训练好的语言模型可以预测一句话后面的单词。
它很可能是果汁(juice)。哪怕你的语言模型已经学习了"I want a glass of orange juice"这句话,它遇到"I want a glass of apple____."还是无法正确预测后面的单词。
我们知道apple和orange之间的关系并不必man/woman(king/queen)近。所以学习算法很能被训练去识别到orange juice(橙汁)到apple juice(苹果汁)。
这是因为one-hot向量间的乘积为0,同样也无法度量两个one-hot向量之间的距离。
所以如果只用one-hot向量并不是很好,我们可以尝试用这些词的一种特征化表示:词嵌入。
我们可以找到字典中每个词的每个特征和数值。下面举个例子:
比如对于性别这个特征,man和king都接近-1,而woman和queen都接近1。其他单词如apple和orange都没有性别一说,因此它们的数值接近于0。
这样你可以找到很多特征,这里我们假设找到了300个特征。这样对于每个单词都有一个300维度的(特征)向量去表示。
我们用 e 5391 e_{5391} e5391去表示man这个单词的特征向量。
如果我们用这种方式来表示单词orange或apple,我们就可以知道orange和apple是非常相似的,因为它们大部分特征都是一样的,或者说有相近的数值。
因此算法可以学到它们的相似性,就可以去联系orange juice和apple juice。
这使得算分具有更强的泛化能力,即使单词不同。在下文我们会学到一种词嵌入的表示方法。它可以比one-hot向量更好的表示不同的词。
如果我们能学习每个词的300维词嵌入,接下来我们就可以将它们映射到一个二维的空间去看它们的关系。这里用到的算法主要是t-SNE。
如果看词之间的距离,你会发现king和queen更像一组,man和woman更像一组。并且它们都可以被分成一组。
这里会用特征化的表示在一个300维的空间,它们被称为嵌入。
为了更好的可视化,使用t-SNE算法可以将它们画在二维空间。
本节我们来看如何把词嵌入这种方法应用到NLP应用中。
还是以例子来说明。这里用命名实体识别的例子。
如果我们读这个句子,我们会知道Sally Johnson是一个人名,因为我们知道orange farmer(果农)是表示人的。
我们可以用词嵌入来表示这些单词,在训练好语言模型后,我们可以用单词的词嵌入作为输入。
如果此时输入一个新的句子,算法就可以知道apple和orange很相近,因此可以学到这也是一个人名。
如果新的句子是Robert Lin is a durian cultivator(榴莲培育者),durian是一种比较罕见的水果(可能在峨眉瑞卡不太流行)。
如果你的训练集中都没有durian和cultivator这个单词,但是假如你有一个已经学好的词嵌入,它会告诉你durian是水果,cultivator是人。
那么你就有可能从你训练集里的orange farmer归纳出durian cultivator也是一个人。
能达到这种效果的原因是,学习词嵌入的算法会考察非常大的文本集(通常从网上获取,可能是含有10亿甚至100亿词语的文本集)。接下来你就可以把这个词嵌入应用到你的命名实体识别任务当中。
哪怕你的训练集很小,这使得你可以使用迁移学习把你从互联网上得到的文本集中学到的知识(能分辨orange,apple,durian都是水果的知识),迁移到你的任务当中。
总结一下这个迁移学习的过程:
词嵌入的好处是,你可以用更小维度的向量(300维)来代替之前很大维度的向量(10000维)来表示单词。
词嵌入和人脸编码其实有奇妙的关系,
对于人脸识别,我们用这个网络来学到不同人脸的一个128维表示(编码),然后通过比较编码的结果,来判断是否为同一个人脸。
词嵌入有个吸引人的特征是它能很好的进行类比推理。
假设这是你想用词嵌入来表示的单词。
如果
我们应该可以猜到,king对应queen。下面我们用一种算法来推导这种关系。
这里为了简单,我们只用了4个特征,这些向量有个有趣的特性是,如果用 e m a n − e w o m a n e_{man} -e_{woman} eman−ewoman这两个词嵌入向量相减,可以得到:
类似的,用 e k i n g − e q u e e n e_{king} - e_{queen} eking−equeen也能得到:
也就是性别这个特征上的差异,因此算法就可以推导出,king对应的应该是queen。
因此,算法要做的是,找到一个向量使得 e k i n g e_{king} eking减去这个向量的结果,要和 e m a n − e w o m a n e_{man}-e_{woman} eman−ewoman向量的结果越接近越好。
最终就可以得到queen。
下面我们总结一下,如何把这个算法写出来。
这里假设是在300维上,要做的就是找到一个向量 e w e_w ew,使得这个向量和 e k i n g − e m a n + e w o m a n e_{king} - e_{man} + e_{woman} eking−eman+ewoman最相似。
这里的sim
是计算相似度的函数,计算向量相似度通过是计算余弦相似度。
就是两个向量的内积除以两个向量模的乘积。如果两个向量越相似,则它们的余弦相似度越大。
余弦相似度其实就是通过计算两个向量的夹角余弦值来评估它们的相似度。
你还可以使用欧几里得距离来计算,距离越小相似度越大,因此计算相似度时要取个负号。不过还是建议使用余弦相似度。
所以词嵌入可以学习词语之间的类比关系。
本节我们将学习词嵌入这个问题具体化,当你应用算法来学习词嵌入时,
实际上是学习一个嵌入矩阵。
假设我们词典中有10000个单词,我们对每个单词都要学习一个300维的特征向量。
我们把这个矩阵用 E E E表示,对于orange这个单词,有一个one-hot向量 O 6257 O_{6257} O6257,它是10000维的。如果我们用 E E E乘以这个 O 6257 O_{6257} O6257,就可以得到一个300维的向量。
在计算这个300维的向量时,由于one-hot向量中只有6257维是1,其他都是0。所以这个300维的第一个元素其实就是词嵌入矩阵中orange所在列的第一个元素。
对于其他元素也是如此,这样我们就得到了这个 300 × 1 300 \times 1 300×1的向量。
更一般地,我们就可以通过词嵌入矩阵和one-hot向量得到任意单词的词嵌入向量。
现在的问题是如何学习这个词嵌入矩阵 E E E,我们下节来看。
本节从一些复杂的算法开始介绍,之后对这些算法进行简化。
假设你在构建一个语言模型,并用神经网络来实现这个模型,在训练的时候,你可能需要你的神经网络能够做到,比如输入
这句话,来预测下一个单词。单词下面的数字是其在字典中的索引。
实践证明,建立一个语言模型,是学习词嵌入的好方法。
A Neural Probabilistic Language Model
下面看如何构建神经网络来预测下一个单词,
首先我们有每个单词的one-hot向量,然后生成一个参数矩阵 E E E,用 E E E乘以 o j o_j oj就得到 e j e_j ej。
现在有很多300维的嵌入向量,然后把它们全部放入神经网络中,再通过softmax层, 这样就可以预测出一个单词。
我们这里输入的6个单词,每个单词都是300维的,因此我们就有1800维的输入向量,这里更常用的是一个固定的历史窗口,假设你想预测固定4个单词之后的单词。
这里的窗口大小就是4,是超参数。这样就可以适应很长的句子。我们只看预测单词前面4个单词。
如果我们用4个单词大小的窗口,那么输入的维度会变成4 * 300=1200。
所以这个模型的参数就是矩阵 E E E,对所有的单词用的都是同一个矩阵 E E E,
然后加上神经网路的参数 W , b W,b W,b,可以用反向传播的方法来进行梯度下降,来最大化训练集似然。
通过序列中给定的4个单词,去重复地预测出预料库中下一个单词是什么。
通过这个方法能很好地学习词嵌入。
下面以一个更长的句子来概括一下这个算法。
我们要预测的单词是juice,它叫目标词。通过之前的4个单词,叫上下文,推导而来。
如果要建立一个语言模型,那么一般选取目标词之前的几个单词作为上下文。
但如果你的目标不是学习语言模型本身的话,那么你可以选择其他的上下文,
比如你可以选择目标词前后4个词作为上下文。
这样也可以来学习词嵌入。
所以如果你想建立一个语言模型,那么常见的作法是用目标词的前几个单词作为上下文。
如果你的目标是学习词嵌入,那么就可以用这些其他类型的上下文。下面我们来看下如何做吧。
Efficient Estimation of Word Representations in Vector Space
假设在训练集中有一个这样的句子。
在Skip-gram模型中,我们要做的是,抽取上下文和目标词对。来构建一个监督学习问题。
上下文中的词不一定是目标词最近的四个单词这种,这里要随机选一个词作为上下文,比如随机选到orange这个单词。
接下来随机在一定词距内选另一个单词,比如上面我们选到的上下文词前后5个词内,选择目标词。假设刚好将juice选为目标词。
或者选到了其他词,这样我们就会有下面这种上下文词和目标词对。
于是我们将构造一个监督学习问题,它给定上下文词,要求你预测这个词正负10个词距随机选择的某个目标词。
构建这个监督学习问题的目的是学到一个号的词嵌入模型。
下面说一些模型的细节,假设我们继续使用10000词汇量的字典。
我们要解决的基本的监督学习问题是,从上下文C中学习一种映射关系,
比如单词orange到某个目标词t(juice)。
所以orange是输入 x x x,目标词juice是输出 y y y。
为了表示输入,我们可以从one-hot向量 o c o_c oc开始,
我们通过上面介绍过的内容得到词嵌入向量 e c e_c ec,然后把 e c e_c ec喂入神经网络的softmax单元,
在softmax中做得就是线性变换,用参数乘以 e c e_c ec。
然后损失函数为
这里的 y ^ \hat y y^是一个one-hot向量,其中表示每个单词的概率。
这就是skip-gram算法,实际上使用这个算法会遇到一些问题,比如计算速度过慢问题。
在softmax中计算10000个词的分母会有点耗时,它需要对整个词汇表进行计算并求和。
可以使用分级softmax来解决这个问题。
如何对上下文c进行采样呢,一旦选定了上下文c,那么目标词就会出现在c的(比如)正负10个词距内。
这里需要使用不同的启发式来平衡常见的词(the,of,a,and,to等)和不常见的词。
在负采样这个算法中要做的是构建一个新的监督学习问题,给定一対单词,
比如orange和juice,我们要判断这是否是一对上下文-目标词。
我们要做的是采样得到一个上下文词和一个目标词,先抽取一个上下文词,然后在一定的词距内,比如正负10个词距内,选一个目标词,这样就生成了上面这个表的第一行。
然后为了生成一个负样本,需要使用相同的上下文词,然后在字典中随机选一个词,假设这里随机选的是king,后面标记为0。
然后再多生成几个负样本,
总结一下,
生成这些数据的方式是我们选择一个上下文词,这里是orange,再选一个目标词,juice,就是上面的第一行。它是一个正样本,给定标签为1。
然后从字典中随机选取K次,生成K个负样本。它们的标签为0。
接下来我们构建一个监督学习问题,输入 x x x就是上面的词对,要预测的是标签 y y y。
关于K的选择问题,原作者推荐小数据集,K选5到20之间比较好。
而对于大一点的数据集,K就取2到5之间。
下面我们来看下学习从 x x x映射到 y y y的监督学习模型,
这是我们上节看到的softmax模型,
这是我们上面得到的训练集。对于每个正样本,都有k个对应的负样本。
我们要做的就是定义一个logistic回归模型,计算在给定 c , t c,t c,t词对的条件下, y = 1 y=1 y=1的概率。
我们把这个画成一个神经网络,如果输入是词orange,这里实际要输入的是这个词的one-hot向量,再传递给 E E E,通过两者相乘,得到嵌入向量 e 6257 e_{6257} e6257,然后得到10000个可能的logistic回归分类问题。
其中一个是用来判断目标词是否是juice的分类器,还有预测king是否是目标词的分类器,可以把这些看成是10000个二分类逻辑回归分类器。
但不是每次都训练全部10000个分类器,这我们只训练其中的5个,我们要训练对应真正目标词那一个分类器,然后训练我们随机选取的4个负样本分类器。
所以把巨大的10000维的softmax分类器,转换为10000个二分类问题,每个二分类问题都很容易计算。
因为k=4,每次迭代,我们只要训练其中的5个逻辑回归二分类器,这就是未设那么这个算法的计算成本很低。
这个算法还有一个细节是如何选取负样本,
一种方法是根据单词在语料库中出现的(经验)频率来进行采样,
但这种方法可能会导致你在the of and之类的停止词上进行采样,还有一种极端的方式是均匀采样,这杜宇英文单词的分布是非常没有代表性的。
Global Vectors forWord Representation
Glove的意思是用于词汇表征的全局向量。
在前面,我们成对抽样词语(上下文词和目标词对)的时候,采用的方法是选取两个在我们的文本中距离相近的词语。
而Glove让这个过程更加明确,
X i j X_{ij} Xij表示j出现在i的上下文中的次数,这里i和j代表了c和t。
要计算这个次数,取决于你对上下文词和目标词的定义。
在Glove算法里,我们可以定义上下文词和目标词为彼此出现在对方附近(比如)10个单词范围内。
因此 X i j X_{ij} Xij表示这两个词彼此接近的频繁程度。
Glove算法所做的实际上是如下的优化问题。
这里可以把i和j想成t和c,这个问题中还有一些其他式子没写出来,后面会补充。
你的目标就是让这个表达式告诉你这两个词关联程度有多大,即它们一起出现的频率有多大。
我们要做的是,利用梯度下降法接触参数 θ \theta θ和 e e e,从而最小化这个式子。
如果 X i j = 0 X_{ij}=0 Xij=0, log 0 \log 0 log0是没有定义的,或者说结果是负无穷。为了处理这个问题,我们要对 X i j X_{ij} Xij为0时进行求和,这里要添加一个额外的加权项 f ( X i j ) f(X_{ij}) f(Xij),如果 X i j = 0 X_{ij}=0 Xij=0,那么 f ( X i j ) = 0 f(X_{ij})=0 f(Xij)=0。
因为 0 log 0 = 0 0 \log 0 =0 0log0=0。
这意味着,如果 X i j = 0 X_{ij}=0 Xij=0,即它们没有一起出现过,那么就不要计算求和了。也就是求和运算只在它们至少出现过一次的词对中计算。
f ( X i j ) f(X_{ij}) f(Xij)实现的另一件事是,英文中的this,is,of,the这种停止词出现非常频繁。而有些罕见词,如durian(榴莲)。
这里要给常见的停止词一个合适大的权重,而给罕见词一个有意义的权重。
有许多方法来选择这个权重函数 f f f,使得它不给停止词多大的权重,也不给罕见词过低的权重。
θ \theta θ和 e e e的作用是完全对称的,它们的作用是一样的,因此训练这个算法的一种方式是随机均匀地初始化 θ \theta θ和 e e e,运用梯下降法来最小化目标函数,当你对每个单词完成这个过程后,然后取平均值。
在我们总结词嵌入学习算法之前,有一件事情值得指出来。
我们以这个特制的表格来阐述。
当使用我们了解过的算法来学习一个词嵌入时,常出现的情况,就是无法保证嵌入向量的单个元素是能解释的。
情感分类任务就是看一段文本,然后判断这个人是否喜欢它说的内容。
情感分类的一个挑战是标记的训练集没有那么多,但是有了词嵌入,即使只有中等大小的标记的训练集,你也能构建一个不错的情感分类器。
下面是情感分类的例子,
输入是一段文本,输出是你要预测的对应的情感,这里是满意度评价。
如果我们能训练一个从输入到输出的映射,基于这样的标记的数据集,那么就可以得到大家对某个餐馆的评价。 大家可能喜欢把评价放到朋友圈或微博上。
如果有一个情感分类器,就可以知道大家是正面评价还是负面评价。
下面讲一个简单的情感分类模型。
这个图和上面介绍过的类似,首先找到每个单词的one-hot向量,然后乘以词嵌入矩阵 E E E得到词嵌入向量 e e e。这里的 E E E可以是从1亿个单词组成的语料库中学到的。
这里假设词嵌入特征向量的维度是300D(300维),然后用对这几个向量进行求和,得到一个300D的向量,喂给softmax分类器,得到评分1-5的概率。
因为用到了平均值运算单元,所以这个算法适合于任意长度的评论,这个平均值运算效果不错,它实际上会把所有单词的意思给平均起来,然后就可以使用了。
但是这个算法有一个问题是没有考虑词序,尤其是这样一个负面评价:“完全没有好的味道、好的服务、好的环境”。
这里面“好的”出现了很多次,如果忽略词序,仅仅把所有单词的词嵌入平均起来,那么最后的特征向量会有很多“好的”的表示。那么你的分类器很可能会认为这是一个好的评价。
所以要有一个更复杂的模型,它不仅对你所有的词嵌入求和,还要考虑词序,所以可以使用RNN模型。
我们先拿到这个评论
找出每个单词的one-hot表示,
然后得到词嵌入向量,接着把它们喂给RNN,这个RNN模型的最后一步就是计算一个特征表示,用来预测 y ^ \hat y y^。 所以这是一个多对一网络结构的例子。
有了这样的算法,最终效果就更好了,它就能意识到“没有好的味道”是一个负面的评价。
并且利用词嵌入可以很好的泛化没见过的新词,这是迁移学习的典型应用。
所谓偏见,就是输入Man对应Computer Programmer,问Woman对应什么,结果机器输出Homemaker(操持家务者)。
这个结果是一个十分恶劣的性别歧视。
以及上面这个。所以根据训练模型所使用的的文本,词嵌入能反映出性别、种族、年龄和性取向等其他方面的偏见。
因为机器学习算法会应用到方方面面,所以消除这些偏见是很重要的。
为啥会有偏见呢,因为获取到的文本含有偏见。
Man is to Computer Programmer as Woman is to Homemaker? Debiasing Word Embeddings
这篇论文尝试消除偏见,其思想如下:
假设词嵌入如上图所示,要消除偏见趋势。为了阐述方面,这里主要讨论性别偏见。
在这个例子中,
第一步是要辨别出与性别偏见趋势。
就是用 e h e − e s h e e_{he}-e_{she} ehe−eshe这种性别属性的词语,把它们的结果平均起来,可以得到一个偏见趋势。
如果得到的是上图垂直的线,就无偏见趋势。
第二步是中和这些偏见。对于那些定义不确切的词,可以处理一下避免偏见。
有些词本身与性别有关,像grandmother,grandfather。而有些词应该在性别方面是中立的,如docter,babysitter,我们要使这些词在性别方面是中立的。
更通用的情况是,你可能需要使docter和babysitter这些词是种族中立和性取向中立的。
所以对于docter,babysitter这些词,我们要将它们在垂直方向这个轴进行处理,来消除它们的性别偏见趋势的成分。
最后一步称为均衡步,就是有可能有这些词对,比如grandmother和grandfather,或girl和boy。对于这些词,你只希望性别是其唯一的区别。
为什么要这样呢,在这个例子中,babysitter和grandmoter的距离,或者说相似度是小于与grandfather的距离的。
因此,这也会加重非预期的偏见。因此这这一步,我们需要确保grandmother和grandfather这样的词能有一致的相似度 和 babysitter与doctor。
做法是通过线性代数的知识将grandfather和grandmother移动到上图红点的位置,然后使得它们与babysitter的距离是一致的,即形成一个等腰三角形。
最后还有一个细节是,如何确定一个词是中立的呢。比如doctor看起来像是要保持中立的词,而grandfather和grandmother就应该是性别确定的词。
而有些词beard(胡须),男性相比女性更可能含有胡须,因此,beard与female相比,应该更靠近male一些。
论文的作者通过训练一个分类器来判断哪些词是有明确定义的,哪些词是性别确定的。