目录链接:吴恩达Deep Learning学习笔记目录
1.循环序列模型
2.自然语言处理与词嵌入
3.序列模型和注意力机制
1. 循环序列模型
序列模型所要解决的问题是,如何来处理具有序列化特点的数据。如下图,是序列化数据及我们需要从序列化数据中所获取的结果。如在一段音频中,音频是按时序播放的,无论是音频中的单词还是音调,都是有序的,如果希望从一段音频中,将其说说的话转化为一个文字性的描述,这是一个序列化到序列化的过程。1.1 符号约定
如下图是一个最简单的序列描述:
一种最粗暴的方法是,如下图所示,构建一个词表(现假设10000词),通过one-hot对每个单词进行编码,将单词数字化。这样的编码简单有效,但存在几个问题,①每个单词的编码长度与词表长度等长,而且非常稀疏,计算代价太高;②通过one-hot编码后,相邻单词之间距离相同,每个单词独立,这将造成语义相近的单词之间毫无关联。
1.2 循环神经网络基础
如果采用一个标准的神经网络来处理文本序列,如下图,相对于将每个词向量作为一个特征,将整个句子作为一个样本作为输入,而输出是一个与句子等长的向量。这样的模型存在两个问题:①输入和输出长度恒等,但在实际的文本序列中,基本上每个样本的长度是不等的;②在文本的不同位置特征是不共享的,而在标准网络中统计的位置信息,而这些位置上的特征类似(如可能在标准网络中输出是在2-5,10-15等这些位置上大概率是人名,但在实际文本中,人名可能出现在任何主语、宾语的位置,而标准网络无法推断语义结构及其语义)。
1.3 循环神经网络反向传播
首先,在前向传播过程中,将相同的参数Wa、Wy都赋予给每一步的计算,向前依次计算每个词的预测结果和loss,然后将每个词的loss求和得到Loss。反向时,通过Loss反向传递给每个loss,每个loss传递给每个预测值,每个预测值再传递给Wa和Wy。1.4 不同类型循环神经网络
前述过程中,是输出一个与输入序列等长的输出,而在实际问题中,输出的长很可能与输入序列长度不同。如文本情感评价中,文本是一个长序列,而输出只是一个评分。又如将一句英语翻译为一句汉语,输入序列长度一般与输出不等。在人名识别中是一种多对多的结构,而在文本评分中则是一个多对一的结构(如输入影评,对该影评预测一个评分作为对电影的评分),此外还有一对一,一对多的情况。而多对多的还有一种情况,如翻译过程:1.5 语言模型和序列生成
给出一个语料库(包含很多句子),基于语料库的训练,在输入一个词后,如何自动生成文本?通过RNN可以实现这个功能。首先对句子的标记进行处理,对于未出现在词表中的单词通过<UNK>来标记,句子结束通过<EOS>来标记。句子的单词通过yt标记。模型在t时刻的输入为上一时刻的输出a和上一时刻输出的y(y为在此位置出现概率最大的词)。在训练过程中输入的y为训练样本中上一个单词,在预测过程则为上一时刻预测输出。每一时刻的输出是基于前面所有出现单词的条件概率。
1.6 对新序列采样
前述方法中,对于每一个单词,预测的输出是词表中每个单词出现的概率分布,而此时我们选择了概率值最大作为输出,那么输出只有一种情况。另一种方法是在每一时刻的输出的概率分布中进行随机抽样作为该时刻的预测输出,随后作为下一时刻的输入,此时生成的文本将会有很多可能性:另一种文本生成时采用的词表将不再是以单词为一个预测单位,而是将字符作为预测单位,这样做的好处是,将不用处理未知的单词或字符串,但缺点是可能会得到太多太长的序列,且基于字符的模型在捕捉前后文的关系上不如基于词汇的模型。
1.7 GRU单元
RNN虽然可以处理序列问题,并在处理过程中来捕捉其他时刻的信息,但其只能捕捉到近期的信息,对于更远的信息难以捕捉(难以记忆下来),而且随着序列长度的增加,如同深层神经网络一般,容易出现梯度消失问题。而采用门控单元(GRU)可以有效增加捕捉信息的深度、改善梯度消失问题。
GRU是通过一个增加一个记忆单元来作为门控,控制是否更新输入到t时刻的上一时刻的输出。如下图所示,将a替换为c,作为记忆细胞,在当前时刻,①根据公式(1)计算新的c;②根据公式(2)计算门控值(输出为1或0);③根据公式(3),通过门控值来决定这一时刻计算的输出信息是新的c还是上一时刻的c。比如在句子The cat,which already ate...,was full.
中,在cat位置处门控值为1,表示更新c(相当于将cat的信息记录下来,擦除之前的信息),在中间部分,门控值均为0,表示不更新c(在这一过程中,一直记录的是cat的信息),直到was位置(在此处需要使用到cat是否为单复数的信息,此后不再需要),门控值为1,表示更新信息c。实际上Γ的计算值并不实际为0和1,而是逼近这两个值,但也能起到类似的效果,同时避免了梯度消失的问题。
1.8 LSTM
在GRU中含两个门控(更新门及在前述基础上增加更相关性门Γr)和一个输出单元,而在LSTM中含三个门控(跟新门、遗忘门和输出门)和输出单元,其中,遗忘门代替了GRU中的(1-Γu),同时通过输出门来进一步控制了输出信息。这解决GRU仅记忆某时刻信息的问题(实际上门控值不严格为0,那么实际上其他时刻的信息也会被记录),在LSTM中通过更新门和遗忘门将不同时刻的信息记录下来(有选择的记忆)。1.9 双向RNN
前述的RNN是单向的,其存在一个问题,仅能够参考前面时刻的信息来作出预测,而对于后续的信息没有加入预测。即仅处理了上文,未处理下文,这是不合理的。如下两个句子:
He said,"Teddy bears are on sale"
He said,"Teddy Roosevelt was a great President"
显然第一个句子中Teddy不是一个人名,而在第二个句子中则是一个人名,但是仅仅通过前三个单词,实际上是无法对Teddy是不是人名分别对两个句子作出准确预测的。而双向RNN则是将后续信息也加入到预测过程中来,从而解决这个问题。
1.10 深层RNN
类似深层神经网络,RNN也可以进行堆叠来实现深层的RNN:2.自然语言处理与词嵌入
2.1 词汇表征
前述中词汇的表征是通过one-hot来表示,其存在一个缺点就是将每个单词孤立起来了,对于相关性的词泛化能力很弱,比如无法推断男人和女人具有相关性,如句子I want a glass of orange _____?
,空格处如果学习到填juice
,但是如果将orange
替换为apple
,可能模型就不知道空格处需要填写juice
。因为在one-hot编码中,如果要计算两个词的相关性,两个向量的内积总是为0,所有词汇之间相关性都为0,或者说都没有相关性。
现在,如果我们采用其他表征,以使得具有相关性的词表达之间的内积较大,而不具相关性的词表达之间内积较小,那么就可以改善上述问题,如下图,倘若,将一个词在300个特性上进行赋值来表达一个词(特征化):
2.1 词汇表征
(1)词嵌入的特性:学习类比关系
词嵌入的方法可以另模型基于词的相关性进行推理,如,基于学习了man和woman之间的关系,能否推导出king对应什么?如下图,设词嵌入维度为4,man和woman两个词向量之差约为[-2,0,0,0],而我们发现king和queen之差,在各个维度上与man—woman相近,那么根据man-woman关系,推导出king对应queen:
(2)词嵌入矩阵
词嵌入矩阵是一个二维的矩阵,第一个维度是特征化数量,第二个维度是词数量,将一个词嵌入矩阵乘以一个词的one-hot的编码,即得到该词汇的词嵌入表达:
(3)学习词嵌入
学习词嵌入就是学习词嵌入矩阵。通过构建语言模型,抽取上下文与目标词进行监督学习以获得词嵌入矩阵,能够达到较好的效果。通过one-hot编码乘以词嵌入矩阵E得到词向量,一般截取需预测词前几个词,将其词向量输入神经网络进行训练,来优化E。
(4)Word2vec
NNLM
(生成连续词向量后输出一个非线性隐层和softmax层,将连续词向量映射为长度为V(词表数量)的概率分布向量,从而计算上下文条件概率)
存在一些问题:①只能处理定长的序列(截取的上下文词数量固定);②训练速度太慢。在NNLM模型中,首先是通过简单的模型来训练出连续的词向量,随后将连续的词向量输入到神经网络中进行训练,模型的计算耗时主要在第二步中。由于我们只想得到连续的词向量,那么对于第二步中的神经网络则可进行简化。word2vec思想中,移除了NNLM中的非线性隐层,直接将连续词向量与softmax层连接(如上图),忽略上下文序列信息,将所有词汇总得到一个Embedding layer,将特征词纳入上下文环境(选取几个词),这得到的是CBow模型。CBow仍然是通过以context预测target word的过程来学习词向量的表达。
而skip-gram模型则是计算输入word的词向量表达与目标词的输出向量之间的余弦相似度并归一化。个人理解为,θTt是目标词通过softmax输出的向量,与ec等长,即计算了target word输出词向量与context输入词向量之间的相似度:
参见NLP之——Word2Vec详解
(5)负采样
前述模型中还是存在softmax计算过慢的问题,在负采样算法中,首先构造context-target词对,如orange-juice将会被标记为正样本1,而orange-其他词,则会被标记为负样本0.
(6)GloVe词向量
不同于word2vec,GloVe是基于全局词频统计的。Xij表示单词i和congtext单词j在特定大小context window内共同出现的次数,对于距离越远的两个单词所占的总计算的权重越小。词向量和共现矩阵之间的近似关系如下:
GloVe希望实现的是:
①
共现次数很多的词的权重要大于很少共现的词;
②
但这个权重不应过大,应达到一定程度后不再增加;
③
如果两个单词没有共现,即Xij=0,那么将不参与loss计算,即f(x)=0。
GloVe作者采样了下述分段函数来满足上述条件:
(7)情绪分类
(8)词嵌入除偏
根据语料库来学习词嵌入,实际上是一个学习单词语义类比的过程(个人认为,错误求改)。基于语料库的词嵌入表达会造成很明显的偏见,如Man对应computer programmer,Woman对应homemaker。明显的反应了现实中的性别、种族、年龄等偏见歧视:
3. 序列模型和注意力机制
3.1 基础模型
(1)Seq2Seq
在机器翻译中采用的模型就是Seq2Seq,通过编码→解码的方式来进行序列到序列的转换:
3.2 选择最可能的句子
相对于语言模型,Seq2Seq中的Decoder与语言模型相近,不同之处是初始输入的a被替换为Encoder的输出,所以Seq2Seq是计算一个句子基于被翻译句子的条件概率。在语言模型的生成文本中,希望的是生成各种各样的文本,而在机器翻译中则希望翻译足够准确,所以在Seq2Seq模型中不是随机采样输出,而是输出概率最大的句子。
贪心搜索法
。但是在机器翻译中贪心法
不一定是最优解,如下图going
在英语中出现的频率一般高于visiting
,所以在贪心法中很可能会得到下图第二个句子的翻译(相比第一个较差):3.3 Beam search
既然不能使用贪心法,也不能使用随机法,也不可能将所有可能的组合都计算一遍(计算量太大)。那么。在第一时刻的输出的词,选取概率top B的词,在第二时刻输出时,将这B个词与词表中其他词配对,再计算其概率,输出其中概率top B的组合,重复下去,如下图,B=3:
in september
、jane is
、jane visiting
那么,第一时刻中以September结尾的所有组合都抛弃。
3.4 改善Beam search
如果直接采用条件概率累乘的方式来最大化整个序列的概率,会存在两个问题:①通常每一个条件概率都很小,累乘后得到的整体概率值将会非常小,会造成数值下溢问题;②由于每个条件概率都小于1,那么随着序列长度增加,整体概率是减小的,所以翻译会倾向于较短的翻译;
解决第一个问题的方法是将概率取对数求和,以避免上述两个问题,但依然存在倾向短翻译问题:由于每一条件概率都小于1,取对数后的值将为负数,且随序列增长,值越来越小,对数值越负,所以得到的整体结果是越来越负。
3.5 Beam search误差分析
3.5 注意力模型
在翻译过程中,如果是人工翻译,并不会像机器一样通读整个句子,然后记忆里面的东西,再去从0开始翻译。而是会通过记忆句子部分,然后翻译一部分。在前述的翻译模型中,对于所需翻译序列长度,其性能如下:
注意力机制,将不再单独使用Encoder的输出直接整体输入到Decoder中,如下图,将会使Decoder中每一单元与Encoder中邻近的一些单元相连,并添加注意力权重α:
完结。