目录
Seq2Seq
基础的 seq2seq = Encoder + Decoder + 语义编码c
语义编码c,是一个固定维度的向量,相当于被压缩的信息。
Encoder 和 Decoder 可以是 CNN RNN Transformer 三种结构,可以相同,也可以不同。
teacher forcing
训练时可以加入 teacher forcing,即在解码时使用正确答案作为输入,让模型收敛更快。如下图。
Attention
输入序列过长时,前面输入的信息会被稀释,导致Decoder准确度降低,类似于同声传译,你说10分钟,让人家去翻译,他很难记住前面说的内容。因此提出Attention 机制,Encoder不是把所有信息都编码到一个向量中,而是Encoder编码出来的向量根据Decoder要解码的内容动态变化。
内部具体操作是,Decoder 当前隐藏层状态 st-1 ,计算它与每一个输入位置hj的关联性,etj = α(st-1,hj),这里α表示相关性(相似度)计算,比如内积,它是一个向量,对它进行softmax,得到概率分布,其中 k = ( 1,2,…,T),T为当前时刻。
α
t
j
=
e
e
t
j
∑
k
=
1
T
e
e
t
k
α_{tj} = \frac{e^{e_{tj}}} { \sum_{k=1}^T e^{e_{tk}}}
αtj=∑k=1Teetkeetj
αtj 也可以理解为attention 的score。然后再利用 αtj 加权得到向量c,即
c
t
=
∑
j
=
1
T
a
t
j
h
j
c_t = \sum_{j=1}^T a_{tj} h_{j}
ct=j=1∑Tatjhj
所以下一时刻的隐藏层状态为 st = f(st-1,yt-1,ct)
我的理解就是,解码前面的时候,那向量c里面,肯定是先输入给编码器的部分权重占比大,也就是说,我的注意力放在了前面部分,同理,注意力逐步向后移动,每步骤c的维度相同,但是权重在变化。
通过Attention机制,让模型可以集中在所有对于当前目标单词重要的输入信息上,预测效果大大提升。
模型推理
模型使用阶段的方法。
贪心法 & Beam Search
比如机器翻译场景下,在模型预测时,输出结果条件概率最大的,一般是我们认为比较好的。在生成下一个词的概率分布后,贪心法:每次都去选择概率最大的词作为下一个的输出,但这个结果是局部最优。这种方法只有唯一解,但全局最优结果不可能每步只保留一个,为了保留更多的解的可能性,我们有了beam search 方法。
Beam Search:最优结果要保留多个,一般用B表示,代表集束宽的意思,B=3,B=10,如果B=1,就是贪心法了。实践证明,Beam search 可以比贪心法得到更好的结果。
beam search 可以看作是贪心法的加强版本。
机器翻译的评价
BLEU Bilingual Evaluation Understudy
BLEU:机器翻译的句子中的所有短语,在标准译文中出现的比例,即为BLEU分数。翻译的句子一共n个词,有m个出现在参考译文中,则得分为 m/n 。
使用n-gram划分单词,一般n = 1,2,3,4,称为1元,2元…
1元 准确率用以衡量单词翻译准确性,多元 准确率用以衡量句子流畅性。
B
L
E
U
=
B
P
∗
e
∑
n
=
1
N
W
n
∗
l
o
g
P
n
BLEU = BP * e^{\sum_{n=1}^N W_n*logP_n}
BLEU=BP∗e∑n=1NWn∗logPn
其中Wn为权重,一般为平均加权,即Wn=1/N
BP为长度惩罚因子,Brevity Penalty,过短惩罚
B
P
=
{
1
if c>r
e
1
−
r
c
if c≤r
BP=\begin{cases} 1 &\text{if c>r} \\ e^{1-\frac rc} &\text{if c≤r} \end{cases}
BP={1e1−crif c>rif c≤r
其中 c 为机器翻译句子长度,r 为参考译文长度。
举个栗子:
译文Candidate:Going to play basketball the afternoon ?
参考答案Reference:Going to play basketball in the afternoon ?
译文gram长度:6 参考答案gram长度:7
针对1-gram,机器的1-gram全部命中,所以
P1 = 6/6 = 1,同理计算得到
P2 = 4/5 = 0.8,P3 = 2/4 = 0.5,P4 = 1/3 = 0.3333
∑logPn和为-2.0149 ;再乘以Wn,也就是除以4,等于0.6043
BP = e^(1-7/6) 约等于 0.846
BLEU = 0.867 * e^((P1 + P2 + P3 + P4)/4) = 0.846*0.6043 = 0.5115
python 中实现:
from nltk.translate.bleu_score import sentence_bleu, corpus_bleu
reference = [['Going', 'to', 'play', 'basketball', 'in', 'the', 'afternoon']]
candidate = ['Going', 'to', 'play', 'basketball', 'the', 'afternoon']
score = sentence_bleu(reference, candidate, weights=(0.25, 0.25, 0.25, 0.25))
print(score)
Transformer
待更新…