3.1 基础模型
sequence to sequence
sequence to sequence:两个序列模型组成,前半部分叫做编码,后半部分叫做解码。用于机器翻译。

image to sequence
sequence to sequence:一个卷积神经网络和一个序列模型组成,前半部分叫做编码,后半部分叫做解码。用于图片描述。

3.2 选择最可能的句子
- 语言模型:根据输入的零向量根据概率预测输出,一个单词一个单词的生成。 P(y<1>,y<2>,...,y<n>) P ( y < 1 > , y < 2 > , . . . , y < n > )
- 机器翻译:前半部分编码网络将输入的句子进行编码,后半部分解码网络输出整个句子的翻译的多种可能的概率,然后选取最可能的一种。 P(y<1>,y<2>,...,y<n>|P(x<1>,x<2>,...,x<m>)) P ( y < 1 > , y < 2 > , . . . , y < n > | P ( x < 1 > , x < 2 > , . . . , x < m > ) )
最通用的选取最合适翻译的算法是:集束搜索(Beam Search)
3.3 集束搜索(Beam search)
基本原理: 每次找出集束宽度(beam width)个词,往下进行,预测以 X 和已经预测的 Y 的元素为前提下的下一个词的概率,仍然保留最可能的集束宽度个词,以此类推,直到完成整个句子的翻译。
如果集束宽度为1,那么就是贪婪算法了,集束搜索只不过是每次保留三个而不是一个而已。
以法语翻译成英语的机器翻译为例
有: P(y<1>,y<2>|X)=P(y<1>|X)∗P(y<2>|X,y<1>) P ( y < 1 > , y < 2 > | X ) = P ( y < 1 > | X ) ∗ P ( y < 2 > | X , y < 1 > )
- Step 1:输入 X 编码网络,通过softmax层计算各个单词(词汇表中的所有单词)输出的概率值 P(y<1>|X) P ( y < 1 > | X ) ,通过设置集束宽度(beam width)的大小如3,则取前3个最大输出概率的单词,并保存起来。

- Step 2:分别对第一步得到的每一个单词计算其与单词表中的所有单词组成词对的概率 P(y<2>|X,y<1>) P ( y < 2 > | X , y < 1 > ) 。有3×10000个选择,(这里假设词汇表有10000个单词),最后再通过beam width大小选择前3个概率最大的输出对。

- Step 3~Step T:与Step2的过程是相似的,直到遇到句尾符号结束。

3.4 改进集束搜索
长度归一化
对于集束搜索算法,我们的目标就是最大化下面的概率:
argmaxy∏t=1TyP(y<t>|X,y<1>,y<2>,...,y<t−1>)=argmaxyP(y<1>|X)∗P(y<2>|X,y<1>)∗...∗P(y<t>|X,y<1>,y<2>,...,y<t−1>) a r g m a x y ∏ t = 1 T y P ( y < t > | X , y < 1 > , y < 2 > , . . . , y < t − 1 > ) = a r g m a x y P ( y < 1 > | X ) ∗ P ( y < 2 > | X , y < 1 > ) ∗ . . . ∗ P ( y < t > | X , y < 1 > , y < 2 > , . . . , y < t − 1 > )
每一项都是小于1的概率值,大量很小的概率值进行相乘,可能会造成数值下溢。
所以在实践中,一般不会最大化上面这个公式的乘积,而是取log值,变成log求和最大值,得到一个数值上更加稳定的算法:
argmaxy∑t=1TylogP(y<t>|X,y<1>,y<2>,...,y<t−1>) a r g m a x y ∑ t = 1 T y l o g P ( y < t > | X , y < 1 > , y < 2 > , . . . , y < t − 1 > )
由于越多的概率相乘,得到的概率越小,所以算法倾向于选择较短的翻译结果。为了平衡这种情况,需要加一个归一化,用概率除以翻译输出的长度。
1Tyargmaxy∑t=1TylogP(y<t>|X,y<1>,y<2>,...,y<t−1>) 1 T y a r g m a x y ∑ t = 1 T y l o g P ( y < t > | X , y < 1 > , y < 2 > , . . . , y < t − 1 > )
通常实践中,不直接除以翻译输出的长度,而是使用更加柔和的方式:在Ty上加上一个指数α,如α=0.7,通过调整其大小获得更加好的效果。
1Tαyargmaxy∑t=1TylogP(y<t>|X,y<1>,y<2>,...,y<t−1>) 1 T y α a r g m a x y ∑ t = 1 T y l o g P ( y < t > | X , y < 1 > , y < 2 > , . . . , y < t − 1 > )
- 当 alpha = 0 相当于没有归一化
- 当 alpha = 1 相当于用长度完全归一化
- 当 0 < alpha < 1 相当于灵活调整归一化幅度
通过上面的目标,选取得分最大的句子,即为我们的模型最后得到的输出结果。
集束宽度的选择
- Beam Width 越大,计算量越大,结果越准确
- Beam Width 越小,计算量越小,结果越不准确
- 一般工作中设置为 3-10 即可,研究领域为了追求极致有的设置为100-1000
相比于传统搜索算法广度优先搜索(BFS)和深度优先搜索(DFS)这些精确的搜索算法,Beam Search 算法运行的速度很快,但是不能保证找到目标准确的最大值。
3.5 集束搜索的误差分析
集束搜索算法是一种近似搜索算法,也被称为启发式搜索算法。而不是一种精确的搜索。
如果我们的集束搜素算法出现错误了要怎么办呢?如何确定是算法出现了错误还是模型出现了错误呢?此时集束搜索算法的误差分析就显示出了作用。
模型分为两个部分:
- RNN 部分:编码网络 + 解码网络
- Beam Search 部分:选取最大的几个值
误差分析
计算人类翻译的概率P(y∗|x)以及模型翻译的概率P(ŷ |x)
- P(y∗|x) > P(ŷ |x):Beam search算法选择了ŷ ,但是y∗
却得到了更高的概率,所以Beam search 算法出错了;
- P(y∗|x) <= P(ŷ |x) 的情况:翻译结果y∗相比ŷ 要更好,但是RNN模型却预测P(y∗|x)
3.6 Bleu 得分(选修)
机器翻译系统(或者图片描述系统)常常有多种正确且合适的翻译,所以针对不同的翻译结果,往往很难评估那一个结果是更好的。
Bleu score 提供了一个单一评估指标来评估翻译系统的准确性。(Bleu:bilingual evaluation understudy)
0 假设对于一个样本,人工翻译有三种,用于校验机器翻译
- 计算机器翻译中的连续k元词组(1<=k<=n)(比如 k=2)在三种翻译中出现的上限(max)除以在翻译中出现的次数。
- 比如:”the cat” 在机器翻译中出现7次,在三种人工翻译中分别出现3次,4次,5次,则在人工翻译中出现的上限是5次,结果为 5/7
- term_k_ratio = term_k_times_in_MT/max(term_k_times_in_trans1, term_k_times_in_trans2, term_k_times_in_trans3)
- 将m个 k 元词组的分子之和除以分母之和,得到 k 元词组的准确率。
- 比如句子长度为10,可以拆分出9个2元词组,每个词组的上限之和除以每个词组在翻译中出现的次数之和
- Pk = sum(term_k_times_in_MT)/sum(max(term_k_times_in_trans1, term_times_k_in_trans2, term_k_times_in_trans3))
- 将1 <= k <= length 个不同的准确率取平均值,则 e 的平均值次幂为该句子的翻译准确率
- 1元词组,2元词组,。。。,n元词组的准确率求均值avg, 然后计算 e^avg
- e^avg(P1, P2, … , Pn)
- 乘以调节因子 BP(brevity penalty),对太短的翻译进行惩罚,得到最后的结果
- 当翻译长度 > 参考长度时,BP = 1,否则 BP = e^(1-MT_length/reference_length)
- BP * e^avg(P1, P2, … , Pn)
- 评估多个样本的准确率。
3.7 注意力模型直观理解
之前我们的翻译模型分为编码网络和解码网络,先记忆整个句子再翻译,这对于较短的句子效果不错,但是对于很长的句子,翻译结果就会变差。
回想当我们人类翻译长句子时,都是一部分一部分的翻译,翻译每个部分的时候也会顾及到该部分周围上下文对其的影响。同理,引入注意力机制,一部分一部分的翻译,每次翻译时给该部分及上下文不同的注意力权重以及已经译出的部分,直至翻译出整个句子。

下个小节将会给出模型的更多细节。
3.8 注意力模型
以一个双向的RNN模型来对法语进行翻译,得到相应的英语句子。其中的每个RNN单元均是LSTM或者GRU单元。
对于双向RNN,通过前向和后向的传播,可以得到每个时间步的前向激活值和反向激活值,我们用一个符号来表示前向和反向激活值的组合。
a<t′>=(a⃖ <t′>,a→<t′>) a < t ′ > = ( a ← < t ′ > , a → < t ′ > )
α<t,t′> α < t , t ′ > : 表示输出 y<t> y < t > 需要在每个输出激活值 a<t′> a < t ′ > 上付出的注意力权重,其中 sum( α<t,t′>)=1 α < t , t ′ > ) = 1 , 其中 1 <= t’ <= Tx,上下文为权重乘以相应的输入激活函数,c=sum( α<t,t′>∗a<t′>) α < t , t ′ > ∗ a < t ′ > ) , 其中 1 <= t’ <= Tx

计算注意力权重
α<t,t′> α < t , t ′ > : 表示输出 y<t> y < t > 需要在每个输出激活值 a<t′> a < t ′ > 上付出的注意力大小。为保证和唯一,需要使用 softmax 计算:
α<t,t′>=exp(e<t,t′>)∑Txt′=1exp(e<t,t′>) α < t , t ′ > = exp ( e < t , t ′ > ) ∑ t ′ = 1 T x exp ( e < t , t ′ > )
其中
e<t,t′> e < t , t ′ > 则是通过一层神经网络来进行计算得到的,其值取决于输出RNN中前一步的激活值
s<t−1> s < t − 1 > 以及输入RNN当前步的激活值
a<t′> a < t ′ > 。我们可以通过训练这个小的神经网络模型,使用反向传播算法来学习一个对应的关系函数。

缺点: 时间复杂度较高,具有O(TxTy) = (Tx)^3 的复杂度。
但是在机器翻译的应用中,输入和输出的句子一般不会太长,这样的复杂度是可以接受的。
3.9 语音识别
语音识别就是将一段音频转化为相应文本。
之前用音位来识别,现在 end-to-end 模型中已经不需要音位了,但是需要大量的数据常见的语音数据大小为300h、3000h或者更大。
注意力模型的语音识别

CTC 损失函数的语音识别
另外一种效果较好的就是使用CTC损失函数的语音识别模型(CTC,Connectionist temporal classification)
模型会有很多个输入和输出,对于一个10s的语音片段,我们就能够得到1000个特征的输入片段,而往往我们的输出仅仅是几个单词。
在CTC损失函数中,允许RNN模型输出有重复的字符和插入空白符的方式,强制使得我们的输出和输入的大小保持一致。

3.10 触发字检测
触发字检测:关键词语音唤醒。
一种可以简单应用的触发字检测算法,就是使用RNN模型,将音频信号进行声谱图转化得到图像特征或者使用音频特征,输入到RNN中作为我们的输入。而输出的标签,我们可以以触发字前的输出都标记为0,触发字后的输出则标记为1。
一种简单应用的触发字检测算法,就是使用RNN模型,将音频信号进行声谱图转化音频特征,输入到RNN中作为我们的输入。而输出的标签,非触发字的输出都标记为0,触发字的输出则标记为1。

上面方法的缺点就是0、1标签的不均衡,0比1多很多。一种简单粗暴的方法就是在触发字及其之后多个目标标签都标记为1,在一定程度上可以提高系统的精确度。
3.11 结论和致谢
Andrew NG, 希望我们乐在其中并可以利用所学知识让世界更美好!