一、基础知识

1.1 单词表征(one-hot表示)

上节我们学习了RNNGRU单元和LSTM单元。本节你会看到我们如何把这些知识用到NLP上,用于自然语言处理,深度学习已经给这一领域带来了革命性的变革。其中一个很关键的概念就是词嵌入(word embeddings),这是语言表示的一种方式,可以让算法自动的理解一些类似的词,比如男人对女人,比如国王对王后,还有其他很多的例子。通过词嵌入的概念你就可以构建NLP应用了,即使你的模型标记的训练集相对较小。最后我们会消除词嵌入的偏差,就是去除不想要的特性,或者学习算法有时会学到的其他类型的偏差。

怎么理解词汇表征???

首先建立一个较大的词汇表(例如10000),然后使用one-hot的方式对每个单词进行编码。例如单词Man,Woman,King,Queen,Apple,Orange分别出现在词汇表的第5391,9853,4914,7157,456,6257的位置,那么他们的独热编码就会在指定的位置为1 其他位置是0。分别用O5391,O9853,O4914,O7157,O456,O6257 表示他们的独热编码。
              深度学习(五)序列模型-循环神经网络(RNN)(2) -Andrew Ng

这中one-hot表征单词的方法最大的缺点就是每个单词都是独立的、正交的,无法知道不同单词之间的相似程度。例如Apple和Orange都是水果,词性相近,但是单从one-hot编码上来看,内积为零,无法知道二者的相似性。在NLP中,我们更希望能掌握不同单词之间的相似程度。

特征表征的理解(也称为词嵌入)???

因此,我们可以使用特征表征(Featurized representation)的方法对每个单词进行编码。也就是使用一个特征向量表征单词,特征向量的每个元素都是对该单词某一特征的量化描述,量化范围可以是[-1,1]之间。特征表征的例子如下图所示:

                                深度学习(五)序列模型-循环神经网络(RNN)(2) -Andrew Ng

特征向量的长度依情况而定,特征元素越多则对单词表征得越全面。这里的特征向量长度设定为300。使用特征表征之后,词汇表中的每个单词都可以使用对应的300 x 1的向量来表示,该向量的每个元素表示该单词对应的某个特征值。每个单词用e+词汇表索引的方式标记,例如e5391,e9853,e4914,e7157,e456,e6257。
 

这种特征表征的优点是根据特征向量能清晰知道不同单词之间的相似程度,例如Apple和Orange之间的相似度较高,很可能属于同一类别。这种单词“类别”化的方式,大大提高了有限词汇量的泛化能力。这种特征化单词的操作被称为Word Embeddings,即单词嵌入。

单词嵌入特征元素的如何决定???

接下来,我们会找到一个学习词嵌入的方式,这里只是希望你能理解这种高维特征的表示能够比one-hot更好的表示不同的单词。而我们最终学习的特征不会像这里一样这么好理解,没有像第一个特征是性别,第二个特征是高贵,第三个特征是年龄等等这些,新的特征表示的东西肯定会更难搞清楚。但是,这并不影响对每个单词的有效表征,同样能比较不同单词之间的相似性。接下来要学的特征表示方法却能使算法高效地发现appleorange会比kingorangequeenorange更加相似。

单词嵌入可视化???

每个单词都由高维特征向量表征,为了可视化不同单词之间的相似性,可以使用降维操作,例如t-SNE算法,将300D降到2D平面上。如下图所示:

                                                                深度学习(五)序列模型-循环神经网络(RNN)(2) -Andrew Ng

从上图可以看出相似的单词分布距离较近,从而也证明了Word Embeddings(单词嵌入)能有效表征单词的关键特征。

 嵌入的理解???

你可以想象一个300维的空间,现在取每一个单词比如orange,这个词就被嵌在这个300维空间里的一个点上。为了可视化,t-SNE算法把这个空间映射到低维空间,你可以画出一个2维图像然后观察,这就是这个术语嵌入的来源。

词嵌入已经是NLP领域最重要的概念之一了,在自然语言处理领域。

总结:

单词表征的两种方式:

  • one-hot
  • 特征表征(单词嵌入)

单词表征时候,特征元素的如何决定?


1.2 使用词嵌入

上节,已经了解不同单词的特征化表示了。这节你会看到我们如何把这种表示方法应用到NLP应用中。

之前我们介绍过Named entity识别的例子,每个单词采用的是one-hot编码。如下图所示,因为“orange farmer”是份职业,很明显“Sally Johnson”是一个人名。

                        深度学习(五)序列模型-循环神经网络(RNN)(2) -Andrew Ng

如果采用featurized representation对每个单词进行编码,再构建该RNN模型。对于一个新的句子:

Robert Lin is an apple farmer

由于这两个句子中,“apple”与“orange”特征向量很接近,很容易能判断出“Robert Lin”也是一个人名。这就是featurized representation的优点之一。
 

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

featurized representation的特性使得很多NLP任务能方便地进行迁移学习。方法是:

  • 从海量词汇库中学习word embeddings,即所有单词的特征向量。或者从网上下载预训练好的word embeddings。
  • 使用较少的训练样本,将word embeddings迁移到新的任务中。
  • (可选):继续使用新数据微调word embeddings。

建议仅当训练样本足够大的时候,再进行上述第三步。
 

1.3 词嵌入的特性

Word embeddings可以帮助我们找到不同单词之间的相似类别关系。如下图所示:

                          深度学习(五)序列模型-循环神经网络(RNN)(2) -Andrew Ng

上例中,特征维度是4维的,分别是[Gender, Royal, Age, Food]。常识地,“Man”与“Woman”的关系类比于“King”与“Queen”的关系。而利用Word embeddings可以找到这样的对应类比关系。

我们将“Man”的embedding vector与“Woman”的embedding vector相减:

                                                           深度学习(五)序列模型-循环神经网络(RNN)(2) -Andrew Ng

类似地,我们将“King”的embedding vector与“Queen”的embedding vector相减:

                                                          深度学习(五)序列模型-循环神经网络(RNN)(2) -Andrew Ng

相减结果表明,“Man”与“Woman”的主要区别是性别,“King”与“Queen”也是一样。

一般地,A类比于B相当于C类比于“?”,这类问题可以使用embedding vector进行运算。

                                      深度学习(五)序列模型-循环神经网络(RNN)(2) -Andrew Ng

如上图所示,根据等式eman−ewoman≈eking−e?得:

                                                                   深度学习(五)序列模型-循环神经网络(RNN)(2) -Andrew Ng

利用相似函数,计算与eking−eman+ewoman 相似性最大的e?,得到e?=e queen。

关于相似函数,比较常用的是cosine similarity。其表达式为:

                                                                             深度学习(五)序列模型-循环神经网络(RNN)(2) -Andrew Ng

 

还可以计算Euclidian distance来比较相似性,即深度学习(五)序列模型-循环神经网络(RNN)(2) -Andrew Ng。距离越大,相似性越小。 

1.4 嵌入矩阵

当你应用算法来学习词嵌入时,实际上是学习一个嵌入矩阵,我们来看一下这是什么意思。

假设某个词汇库包含了10000个单词,每个单词包含的特征维度为300,那么表征所有单词的embedding matrix维度为300 x 10000,用E来表示。某单词w的one-hot向量表示为Ow,维度为10000 x 1,则该单词的embedding vector表达式为:
                                                                     深度学习(五)序列模型-循环神经网络(RNN)(2) -Andrew Ng

因此,只要知道了embedding matrix E,就能计算出所有单词的embedding vector ew。后面我们将重点介绍如何求出E。

值得一提的是,上述这种矩阵乘积运算E⋅Ow 效率并不高,矩阵维度很大,且Ow大部分元素为零。通常做法是直接从E中选取第w列作为ew即可。 

1.5 学习词嵌入 

embedding matrix E 可以通过构建自然语言模型,运用梯度下降算法得到。举个简单的例子,输入样本是下面这句话:

I want a glass of orange (juice).

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

                       深度学习(五)序列模型-循环神经网络(RNN)(2) -Andrew Ng

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

这种算法的效果还不错,能够保证具有相似属性单词的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)

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

1.6 Word2Vec

Word2Vec算法,是一种简单而且计算时更加高效的方式来学习这种类型的嵌入。

                                           深度学习(五)序列模型-循环神经网络(RNN)(2) -Andrew Ng

上节我们介绍了context和target的选择方法,比较流行的是采用Skip-Gram模型。以下面这句话为例:

I want a glass of orange juice to go along with my cereal.

Skip-Gram模型中,我们要做的是抽取上下文和目标词配对,来构造一个监督学习问题。

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

Note:

于是我们将构造一个监督学习问题,它给定上下文词,要求你预测在这个词正负10个词距或者正负5个词距内随机选择的某个目标词。显然,这不是个非常简单的学习问题,因为在单词orange的正负10个词距之间,可能会有很多不同的单词。但是构造这个监督学习问题的目标并不是想要解决这个监督学习问题本身,而是想要使用这个学习问题来学到一个好的词嵌入模型。

模型的细节:

假设使用一个10,000词的词汇表,有时训练使用的词汇表会超过一百万词。但我们要解决的基本的监督学习问题是学习一种映射关系,从上下文c,比如单词orange,到某个目标词,记为t,可能是单词juice或者单词glass或者单词my。在我们的词汇表中,orange是第6257个单词,juice是10,000个单词中的第4834个,这就是你想要的映射到输出y的输入x

                             深度学习(五)序列模型-循环神经网络(RNN)(2) -Andrew Ng

为了表示输入,比如单词orange,你可以先从one-hot向量开始,我们将其写作Oc,这就是上下文词的one-hot向量(上图编号1所示)。然后你可以拿嵌入矩阵E乘以向量Oc,然后得到了输入的上下文词的嵌入向量,于是这里ec=EOc。在这个神经网络中(上图编号2所示),我们将把向量ec喂入一个softmax单元。我通常把softmax单元画成神经网络中的一个节点(上图编号3所示),这不是字母O,而是softmax单元,softmax单元要做的就是输出y。然后我们再写出模型的细节,这是softmax模型(上图编号4所示),预测不同目标词的概率。

                                                        深度学习(五)序列模型-循环神经网络(RNN)(2) -Andrew Ng

这里θt是一个与输出t有关的参数,ec为context的embedding vector,且ec=E⋅Oc。我省略了softmax中的偏差项,想要加上的话也可以加上。

相应的loss function为:

                                               深度学习(五)序列模型-循环神经网络(RNN)(2) -Andrew Ng

这是常用的softmax损失函数,y 就是只有一个1其他都是0的one-hot向量,如果目标词是juice,那么第4834个元素就是1,其余是0(上图编号5所示)。类似的 深度学习(五)序列模型-循环神经网络(RNN)(2) -Andrew Ng是一个从softmax单元输出的10,000维的向量,这个向量是所有可能目标词的概率。

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

Skip-Gram模型:

总结一下,这大体上就是一个可以找到词嵌入的简化模型和神经网络(上图编号2所示),其实就是个softmax单元。矩阵E将会有很多参数,所以矩阵E有对应所有嵌入向量ec的参数(上图编号6所示),softmax单元也有θt的参数(上图编号3所示)。如果优化这个关于所有这些参数的损失函数,你就会得到一个较好的嵌入向量集,这个就叫做Skip-Gram模型。它把一个像orange这样的词作为输入,并预测这个输入词,从左数或从右数的某个词,预测上下文词的前面一些或者后面一些是什么词。

使用Skip-Gram存在的问题:

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

解决方案:

分级(hierarchical)的softmax分类器和负采样Negative Sampling)。

 深度学习(五)序列模型-循环神经网络(RNN)(2) -Andrew Ng

意思就是说不是一下子就确定到底是属于10,000类中的哪一类。想象如果你有一个分类器(上图编号1所示),它告诉你目标词是在词汇表的前5000个中还是在词汇表的后5000个词中,假如这个二分类器告诉你这个词在前5000个词中(上图编号2所示),然后第二个分类器会告诉你这个词在词汇表的前2500个词中,或者在词汇表的第二组2500个词中,诸如此类,直到最终你找到一个词准确所在的分类器(上图编号3所示),那么就是这棵树的一个叶子节点。

像这样有一个树形的分类器,意味着树上内部的每一个节点都可以是一个二分类器,比如逻辑回归分类器,所以你不需要再为单次分类,对词汇表中所有的10,000个词求和了。实际上用这样的分类树,计算成本与词汇表大小的对数成正比(上图编号4所示),而不是词汇表大小的线性函数,这个就叫做分级softmax分类器。

加速softmax分类的方法

深度学习(五)序列模型-循环神经网络(RNN)(2) -Andrew Ng

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

数据采样问题:

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

Word2Vec的两种模型:

  • Skip-Gram
  • CBOW(连续词袋模型

                         深度学习(五)序列模型-循环神经网络(RNN)(2) -Andrew Ng 

1.7 负采样

上面Skip-Gram模型在于softmax计算起来很慢。接下来,你会看到一个改善过的学习问题叫做负采样,它能做到与你刚才看到的Skip-Gram模型相似的事情,但是用了一个更加有效的学习算法,让我们来看看这是怎么做到的。

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

                           深度学习(五)序列模型-循环神经网络(RNN)(2) -Andrew Ng

Negative sampling是另外一种有效的求解embedding matrix EE的方法。它的做法是判断选取的context word和target word是否构成一组正确的context-target对,一般包含一个正样本和k个负样本。例如,“orange”为context word,“juice”为target word,很明显“orange juice”是一组context-target对,为正样本,相应的target label为1。若“orange”为context word不变,target word随机选择“king”、“book”、“the”或者“of”等。这些都不是正确的context-target对,为负样本,相应的target label为0。一般地,固定某个context word对应的负样本个数k一般遵循:

  • 若训练样本较小,k一般选择5~20;

  • 若训练样本较大,k一般选择2~5即可。

Negative sampling的数学模型为:

                                                                       深度学习(五)序列模型-循环神经网络(RNN)(2) -Andrew Ng

其中,σσ表示sigmoid**函数。

很明显,negative sampling某个固定的正样本对应k个负样本,即模型总共包含了k+1个binary classification。对比之前介绍的10000个输出单元的softmax分类,negative sampling转化为k+1个二分类问题,计算量要小很多,大大提高了模型运算速度。

最后提一点,关于如何选择负样本对应的target单词,可以使用随机选择的方法。但有资料提出一个更实用、效果更好的方法,就是根据该词出现的频率进行选择,相应的概率公式为:
                                                                             深度学习(五)序列模型-循环神经网络(RNN)(2) -Andrew Ng

其中,f(wi) 表示单词wi在单词表中出现的概率。 

 

1.8 GloVe 词向量

GloVe算法引入了一个新的参数:

  • Xij : 表示i出现在j之前的次数,即i和j同时出现的次数。

其中,i表示context,j表示target。一般地,如果不限定context一定在target的前面,则有对称关系Xij=Xji;如果有限定先后,则Xij≠Xji 。接下来的讨论中,我们默认存在对称关系Xij=Xji。

GloVe模型的loss function为:

                                                    深度学习(五)序列模型-循环神经网络(RNN)(2) -Andrew Ng

从上式可以看出,若两个词的embedding vector越相近,同时出现的次数越多,则对应的loss越小。

为了防止出现“log 0”,即两个单词不会同时出现,无相关性的情况,对loss function引入一个权重因子f(Xij):

                                                    深度学习(五)序列模型-循环神经网络(RNN)(2) -Andrew Ng

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

出现频率较大的单词相应的权重因子f(Xij)较大,出现频率较小的单词相应的权重因子f(Xij)较小一些。具体的权重因子f(Xij)选取方法可查阅相关论文资料。

一般地,引入偏移量,则loss function表达式为:

                                   深度学习(五)序列模型-循环神经网络(RNN)(2) -Andrew Ng

值得注意的是,参数θi 和ej 是对称的。使用优化算法得到所有参数之后,最终的ew可表示为:

                                                                   深度学习(五)序列模型-循环神经网络(RNN)(2) -Andrew Ng

最后提一点的是,无论使用Skip-Gram模型还是GloVe模型等等,计算得到的embedding matrix E的每一个特征值不一定对应有实际物理意义的特征值,如gender,age等。

1.9 情感分类

情感分类一般是根据一句话来判断其喜爱程度,例如1~5星分布。如下图所示:

深度学习(五)序列模型-循环神经网络(RNN)(2) -Andrew Ng

情感分类问题的一个主要挑战是缺少足够多的训练样本。而Word embedding恰恰可以帮助解决训练样本不足的问题。

首先介绍使用word embedding解决情感分类问题的一个简单模型算法。

深度学习(五)序列模型-循环神经网络(RNN)(2) -Andrew Ng

如上图所示,这句话的4个单词分别用embedding vector表示。e8928,e2468,e4694,e3180 计算均值,这样得到的平均向量的维度仍是300。最后经过softmax输出1~5星。这种模型结构简单,计算量不大,不论句子长度多长,都使用平均的方式得到300D的embedding vector。该模型实际表现较好。

但是,这种简单模型的缺点是使用平均方法,没有考虑句子中单词出现的次序,忽略其位置信息。而有时候,不同单词出现的次序直接决定了句意,即情感分类的结果。例如下面这句话:

Completely lacking in good taste, good service, and good ambience.

虽然这句话中包含了3个“good”,但是其前面出现了“lacking”,很明显这句话句意是negative的。如果使用上面介绍的平均算法,则很可能会错误识别为positive的,因为忽略了单词出现的次序。

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

                                           深度学习(五)序列模型-循环神经网络(RNN)(2) -Andrew Ng

该RNN模型是典型的many-to-one模型,考虑单词出现的次序,能够有效识别句子表达的真实情感。

值得一提的是使用word embedding,能够有效提高模型的泛化能力,即使训练样本不多,也能保证模型有不错的性能。

1.10 词嵌入除偏

Word embeddings中存在一些性别、宗教、种族等偏见或者歧视。例如下面这两句话:

Man: Woman as King: Queen

Man: Computer programmer as Woman: Homemaker

Father: Doctor as Mother: Nurse

很明显,第二句话和第三句话存在性别偏见,因为Woman和Mother也可以是Computer programmer和Doctor。

以性别偏见为例,我们来探讨下如何消除word embeddings中偏见。
                                              深度学习(五)序列模型-循环神经网络(RNN)(2) -Andrew Ng

首先,确定偏见bias的方向。方法是对所有性别对立的单词求差值,再平均。上图展示了bias direction和non-bias direction。

                                         深度学习(五)序列模型-循环神经网络(RNN)(2) -Andrew Ng

然后,单词中立化(Neutralize)。将需要消除性别偏见的单词投影到non-bias direction上去,消除bias维度,例如babysitter,doctor等。

                                                 深度学习(五)序列模型-循环神经网络(RNN)(2) -Andrew Ng

最后,均衡对(Equalize pairs)。让性别对立单词与上面的中立词距离相等,具有同样的相似度。例如让grandmother和grandfather与babysitter的距离同一化。

 

                                                 深度学习(五)序列模型-循环神经网络(RNN)(2) -Andrew Ng

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

 

二、测验

1、假设你为10000个单词学习词嵌入,为了捕获全部范围的单词的变化以及意义,那么词嵌入向量应该是10000维的。

  • 【 】 正确
  • 】 错误 

2、什么是t-SNE?

  • 】 一种非线性降维算法。
  • 【 】 一种能够解决词向量上的类比的线性变换。
  • 【 】 一种用于学习词嵌入的监督学习算法。
  • 【 】 一个开源序列模型库。

3、假设你下载了一个已经在一个很大的文本语料库上训练过的词嵌入的数据,然后你要用这个词嵌入来训练RNN并用于识别一段文字中的情感,判断这段文字的内容是否表达了“快乐”。

那么即使“欣喜若狂”这个词没有出现在你的小训练集中,你的RNN也会认为“我欣喜若狂”应该被贴上$y = 1$的标签。

  • 】 正确
  • 【 】 错误

4、对于词嵌入而言,下面哪一个(些)方程是成立的?

深度学习(五)序列模型-循环神经网络(RNN)(2) -Andrew Ng

5、

三、编程