作者: 大树先生
博客: http://blog.csdn.net/koala_tree
知乎:https://www.zhihu.com/people/dashuxiansheng
GitHub:https://github.com/KoalaTree
2018 年 4 月 4 日
完结撒花!以下为吴恩达老师 DeepLearning.ai 课程项目中,第五部分《序列模型》第三周课程“序列模型和注意力机制”关键点的笔记。
同时我在知乎上开设了关于机器学习深度学习的专栏收录下面的笔记,以方便大家在移动端的学习。欢迎关注我的知乎:大树先生。一起学习一起进步呀!_
序列模型 — 序列模型和注意力机制
1. 基础模型
sequence to sequence 模型:
sequence to sequence 模型最为常见的就是机器翻译,假如这里我们要将法语翻译成英文:
- 输入: x < 1 > , x < 2 > , ⋯ , x < T x > x^{<1>},x^{<2>},\cdots,x^{<T_{x}>} x<1>,x<2>,⋯,x<Tx>;这里每个 x < t > x^{<t>} x<t>均为对应法语句子中的每个单词;
- 输出: y < 1 > , y < 2 > , ⋯ , y < T y > y^{<1>},y^{<2>},\cdots,y^{<T_{y}>} y<1>,y<2>,⋯,y<Ty>;这里每个 y < t > y^{<t>} y<t>均为对应英语句子中的每个单词;
- 网络结构:many-to-many RNN网络结构。
对于机器翻译的序列对序列模型,如果我们拥有大量的句子语料,则可以得到一个很有效的机器翻译模型。模型的前部分使用一个编码网络来对输入的法语句子进行编码,后半部分则使用一个解码网络来生成对应的英文翻译。网络结构如下图所示:
相关论文:
- Sutskever et al., Sequence to sequence learning with neural networks, 2014;
- Cho et al., Learning phrase representation using RNN encoder-decoder for statistical machine translation, 2014;
image to sequence 模型:
与上面的这种编解码类似的还有就是图像描述的应用。
- 输入:图像;
- 输出:描述图像的句子;
- 网络结构:CNN结构学习图像的编码,RNN结构解码输出对应的句子。
对于图像描述的网络结构如下图所示:
相关论文:
- Mao et. al., 2014. Deep captioning with multimodal recurrent neural networks;
- Vinyals et. al., 2014. Show and tell: Neural image caption generator;
- Karpathy and Li, 2015. Deep visual-semantic alignments for generating image descriptions;
2. 挑选最可能的句子
机器翻译:条件语言模型
对于机器翻译来说和之前几节介绍的语言模型有很大的相似性但也有不同之处。
- 在语言模型中,我们通过估计句子的可能性,来生成新的句子。语言模型总是以零向量开始,也就是其第一个时间步的输入可以直接为零向量;
- 在机器翻译中,包含了编码网络和解码网络,其中解码网络的结构与语言模型的结构是相似的。机器翻译以句子中每个单词的一系列向量作为输入,所以相比语言模型来说,机器翻译可以称作条件语言模型,其输出的句子概率是相对于输入的条件概率。
二者对比如下图所示:
寻找最大的概率输出:
还是以法语翻译英语为例,通过输入的法语句子,模型将会告诉我们各种英文句子输出所对应的可能性,如下图中的句子所示。
对于各种可能的翻译结果,我们并不是要从得到的分布中进行随机取样,而是要找到一个使得条件概率最大化的英文句子作为输出。所以在设计机器翻译模型的时候,一个重要的步骤就是设计一个合适的算法,找到使得条件概率最大化的的结果。目前最通用的算法就是:束搜索(Beam Search)。
不使用贪心搜索的原因:
对于我们的机器翻译模型来说,使用贪心搜索算法,在生成第一个词的分布后,贪心搜索会根据我们的条件语言模型挑选出最有可能输出的第一个词语,然后再挑选出第二个最有可能的输出词语,依次给出所有的输出。
但是对于我们建立的机器翻译模型来说,我们真正需要的是通过模型一次性地挑选出整个输出序列: y < 1 > , y < 2 > , ⋯ , y < T y > y^{<1>},y^{<2>},\cdots,y^{<T_{y}>} y<1>,y<2>,⋯,y<Ty>,来使得整体的概率最大化。所以对于贪心搜索来说,这种方法对于机器翻译来说是不可行的。
另外对于贪心搜索算法来说,我们的单词库中有成百到千万的词汇,去计算每一种单词的组合的可能性是不可行的。所以我们使用近似的搜索办法,使得条件概率最大化或者近似最大化的句子,而不是通过单词去实现,虽然不能保证我们得到的就是条件概率最大化的结果,但是往往这已经足够了。
3. 集束搜索(Beam search)
Beam search 算法:
这里我们还是以法语翻译成英语的机器翻译为例:
- Step 1:对于我们的词汇表,我们将法语句子输入到编码网络中得到句子的编码,通过一个softmax层计算各个单词(词汇表中的所有单词)输出的概率值,通过设置集束宽度(beam width)的大小如3,我们则取前3个最大输出概率的单词,并保存起来。
- Step 2:在第一步中得到的集束宽度的单词数,我们分别对第一步得到的每一个单词计算其与单词表中的所有单词组成词对的概率。并与第一步的概率相乘,得到第一和第二两个词对的概率。有 3 × 10000 3\times 10000 3×10000个选择,(这里假设词汇表有10000个单词),最后再通过beam width大小选择前3个概率最大的输出对;
- Step 3~Step T:与Step2的过程是相似的,直到遇到句尾符号结束。
4. 集束搜索的改进
长度归一化:
对于集束搜索算法,我们的目标就是最大化下面的概率:
arg max y ∏ t = 1 T y P ( y < t > ∣ x , y < 1 > , … , y < t − 1 > ) = arg max y P ( y < 1 > , ⋯ , y < T y > ∣ x ) = arg max y P ( y < 1 > ∣ x ) P ( y < 2 > ∣ x , y < 1 > ) ⋯ P ( y < T y > ∣ x , y < 1 > , ⋯ , y < T y − 1 > ) \arg \max_{y} \prod\limits_{t = 1}^{ {T_y}} {P({y^{ < t > }}|x,{y^{ < 1 > }}, \ldots ,{y^{ < t - 1 > }})} = \arg \max_{y} P(y^{ < 1 > },\cdots,y^{ <T_{y} > }|x) = \arg \max_{y} P(y^{ < 1 > }|x) P(y^{ < 2> }|x,y^{ < 1 >})\cdots P(y^{ < T_{y}> }|x,y^{ < 1 >},\cdots, y^{ <T_{y}-1>}) argymaxt=1∏TyP(y<t>∣x,y<1>,…,y<t−1>)=argymaxP(y<1>,⋯,