Dzmitry Bahdanau, KyungHyun Cho, Yoshua Bengio, “neural machine translation by jointly learning to align and translate”, 3rd International Conference on Learning Representations, ICLR 2015
下面说下为什么看这个论文吧,其实这个是看LAS的论文,感觉理解没那么透彻,所以才来看这个论文的,理论是一样的,但是这里写得比较通俗易懂。下面直接进入技术的介绍啦。
在语音识别 (speech recognition) 或基于神经网络的机器翻译 (neural machine translation) 领域,常用的是encoder-decoder系列方法,编码器encoder将源句子编码成一个固定长度的向量,解码器decoder用于将固定长度的向量翻译成所需向量。但是,模型在处理长句子时,性能不佳。所以,本文提出一种新的模型,这种模型可以搜索句子中与输出有关的部分,是encoder-decoder模型的一种扩展,能学习对齐和翻译 (learn to align and translate jointly)。
在encoder-decoder框架中,将输入序列的特征 x = ( x 1 , . . . , x T x ) x=(x_1,...,x_{T_x}) x=(x1,...,xTx) 输入encoder模块,然后经过encoder模块的处理,输出上下文向量 c c c。最常用的方法是使用RNN网络,如下所示:
h t = f ( x t , h t − 1 ) (1) h_t=f(x_t,h_{t-1}) \tag{1} ht=f(xt,ht−1)(1)
c = q ( { h 1 , . . . , h T x } ) c=q(\{h_1,...,h_{T_x}\}) c=q({h1,...,hTx})
其中, h t ∈ R n h_t \in R^n ht∈Rn是时间 t t t的隐藏状态 (hidden state), c c c 可由隐藏状态序列计算得到。这里, f f f 和 q q q 都是某些非线性函数。在很多文献中, f f f 和 q ( { h 1 , . . . , h T } ) q(\{h_1,...,h_T\}) q({h1,...,hT}) 都是用LSTM网络。
解码器decoder,主要是在已知上下文向量 c c c 和前面预测的文字序列 { y 1 , . . . , y t ′ − 1 } \{y_1,...,y_{t'-1} \} {y1,...,yt′−1}。也就是说,解码器的翻译功能就是定义了一个概率的计算方法,这个方法是将联合概率分解为条件概率,如下所示:
p ( y ) = ∏ t = 1 T p ( y t ∣ { y 1 , . . . , y t − 1 , c ) (2) p(y)=\prod_{t=1}^Tp(y_t|\{y_1,...,y_{t-1},c)\tag{2} p(y)=t=1∏Tp(yt∣{y1,...,yt−1,c)(2)
在RNN网络中,每个条件概率可以表示为:
p ( y t ∣ { y 1 , . . . , y t − 1 } , c ) = g ( y t − 1 , s t , c ) (3) p(y_t|\{y_1,...,y_{t-1}\},c)=g(y_{t-1},s_t,c)\tag{3} p(yt∣{y1,...,yt−1},c)=g(yt−1,st,c)(3)
其中, g g g 是非线性功能的函数,函数的输出是 y t y_t yt, s t s_t st 是RNN网络的隐藏状态。
对上述的结构作一个总结,就是将数据输入到编码器,编码器会输出上下文向量
在本文提出的模型中,(2)式的条件概率可以写成:
p ( y i ∣ y 1 , . . . , y i − 1 , x ) = g ( y i − 1 , s i , c i ) (4) p(y_i|y_1,...,y_{i-1},\bold x)=g(y_{i-1},s_i,c_i)\tag{4} p(yi∣y1,...,yi−1,x)=g(yi−1,si,ci)(4)
s i s_i si是时间 i i i 里RNN的隐藏状态,可以有下式计算得到:
s i = f ( s i − 1 , y i − 1 , c i ) s_i=f(s_{i-1},y_{i-1},c_i) si=f(si−1,yi−1,ci)
在本式中,每个目标字符 y i y_i yi,其概率都是用上下文向量 c i c_i ci 计算。
上下文向量 c i c_i ci 根据编码器输出的标记 ( h 1 , . . . , h T x ) (h_1,...,h_{T_x}) (h1,...,hTx) 来计算。每个 h i h_i hi 表示整个句子中,第 i i i个单词中的重要程度。上下文向量 c i c_i ci可以看成是 h i h_i hi的权重之和,计算方法如下:
c i = ∑ j = 1 T x = α i j h j (5) c_i=\sum ^{T_x}_{j=1}=\alpha_{ij}h_j \tag{5} ci=j=1∑Tx=αijhj(5)
h i h_i hi的权重参数 α i j \alpha_{ij} αij 计算方法如下:
α i j = e x p ( e i j ) ∑ k = 1 T x e x p ( e i k ) (6) \alpha_{ij}=\frac{{\rm{exp}}(e_{ij})}{\sum_{k=1}^{T_x}{\rm{exp}}(e_{ik})}\tag{6} αij=∑k=1Txexp(eik)exp(eij)(6)
其中 e i j = a ( s i − 1 , h j ) e_{ij}=a(s_{i-1},h_j) eij=a(si−1,hj) 是对齐模型,其数值大小表示输入位置 j j j 与输出位置 i i i 之间的匹配程度。这个值的大小与RNN的隐藏状态 s i − 1 s_{i-1} si−1 和 h j h_j hj 有关。
对齐模型 (alignment model) a a a 可以看成是一个前向的神经网络,与系统的其他模块一起训练,但是我们没有认为对齐是隐藏变量 (latent variable)。对齐模型可以直接计算soft alignment,也就是说loss函数的梯度值可以后向传播,用于训练模型。
计算编码器的标记 h h h 的权重和,当做是期望的标记 (虽然可能超过想要的对齐)。假设 α i j \alpha_{ij} αij 是输出目标字 y i y_i yi 与输入字 x j x_j xj 对齐的概率。然后,上下文向量 c i c_i ci 表示其是期望标记 (expected annotation) 的概率是 α i j \alpha_{ij} αij。
概率 α i j \alpha_{ij} αij 或能量 e i j e_{ij} eij 表示用 s i − 1 s_{i-1} si−1 计算 s i s_i si 和 y i y_i yi 时, h j h_j hj 的重要程序。直观理解,就是解码器的注意力机制。解码器觉得句子哪个部分要注意。因为解码器有注意力机制,所以编码器就不需要将整个句子编码成固定长度的向量。
如公式(1)中使用的RNN,将输入句子x按顺序读取,从 x 1 x_1 x1到 x x T x_{x_T} xxT。但是,本文使用双向的RNN (BiRNN)。其主要包括前向和后向的RNN,前向RNN f → \overrightarrow f f 按照从 x 1 x_1 x1到 x T x x_{T_x} xTx的顺序读取输入序列,并计算隐藏状态( h 1 → , . . . , h t x → \overrightarrow {h_1},...,\overrightarrow{h_{t_x}} h1,...,htx)。反向RNN f ← \overleftarrow f f以相反的顺序读取输入序列,即从 x T x x_{T_x} xTx到 x 1 x_1 x1,计算出反向隐藏状态序列( h 1 ← , . . . , h T x ← \overleftarrow {h_1},...,\overleftarrow{h_{T_x}} h1,...,hTx)。
每个字 x j x_j xj的标注可以通过连接前向隐藏状态 h j → \overrightarrow{h_j} hj和反向隐藏状态 h j ← \overleftarrow{h_j} hj得到,可表示如下:
h j = [ h → j T ; h ← j T ] T h_j={[\overrightarrow h_j^T;\overleftarrow h_j^T]}^T hj=[hjT;hjT]T
从上式可以看出, h j h_j hj包含前向和后向的字符,并且更关注字符 x j x_j xj附近的字符。
下图是本文所提方法的框图。
第4部分介绍的模型的架构,读者可以用符合条件的模型实现都可获得文中所述的结果。以下将具体介绍本文使用的具体模型,主要包括RNN和对齐模型 a a a。
RNN的激活函数为gated hidden unit,与LSTM类似。这使得它在展开RNN上获取计算路径。其导数的乘积接近1,所以易于反向传播。(当然,这里使用LSTM也有类似的结果)
RNN的 s i s_i si可以用 n n n个gated hidden units来计算,具体如下:
s i = f ( s i − 1 , y i − 1 , c i ) = ( 1 − z i ) ∘ s i − 1 + z i ∘ s ~ i s_i=f(s_{i-1},y_{i-1},c_i)=(1-z_i)\circ s_{i-1}+z_i\circ \widetilde s_i si=f(si−1,yi−1,ci)=(1−zi)∘si−1+zi∘s i
其中, ∘ \circ ∘表示逐点相乘, z i z_i zi表示更新门update gates的输出。更新状态 s ~ i \widetilde s_i s i的计算方法如下:
s ~ i = t a n h ( W e ( y i − 1 + U [ r i ∘ s i − 1 ] + C c i ) ) \widetilde s_i={\rm tanh}(W e(y_{i-1}+ U[r_i\circ s_{i-1}]+Cc_i)) s i=tanh(We(yi−1+U[ri∘si−1]+Cci))
其中, e ( y i − 1 ) ∈ R m e(y_{i-1})\in \mathbb R^m e(yi−1)∈Rm是字 y i − 1 y_{i-1} yi−1的 m m m维嵌入特征, r i r_i ri是重置门reset gates的输出。当 y i y_i yi是 K K K个向量中的一个, e ( y i ) e(y_i) e(yi)是嵌入矩阵 E ∈ R m ∗ k E\in\mathbb R^{m*k} E∈Rm∗k中的一列,本文不考虑偏移bias的影响。
更新门 z i z_i zi允许每个隐藏状态保持其原来的状态,重置门reset gates r i r_i ri控制以前的状态有多少信息和哪些信息需要重置。具体计算方法如下:
z i = δ ( W z e ( y i − 1 ) + U z s i − 1 + C z c i ) z_i=\delta(W_ze(y_{i-1})+U_zs_{i-1}+C_zc_i) zi=δ(Wze(yi−1)+Uzsi−1+Czci)
r i = δ ( W r e ( y i − 1 ) + U r s i − 1 + C r c i ) r_i=\delta(W_re(y_{i-1})+U_rs_{i-1}+C_rc_i) ri=δ(Wre(yi−1)+Ursi−1+Crci)
其中, δ ( . ) \delta (.) δ(.)是逻辑sigmoid函数。
alignment model设计时,需要考虑每对句子(长度为 T x T_x Tx和 T y T_y Ty),模型需要检测 T x ∗ T y T_x*T_y Tx∗Ty次。为了减少计算量,本文使用单层多层感知机,具体如下所示:
a ( s i − 1 , h j ) = v a T t a n h ( W a s i − 1 + U a h j ) a(s_{i-1},h_j)=v_a^T{\rm tanh}(W_as_{i-1}+U_ah_j) a(si−1,hj)=vaTtanh(Wasi−1+Uahj)
其中, W a ∈ R n ∗ n , U a ∈ R n ∗ 2 n W_a\in\mathbb R^{n*n},U_a\in\mathbb R^{n*2n} Wa∈Rn∗n,Ua∈Rn∗2n为权重矩阵。因为 U a h j U_ah_j Uahj不依赖 i i i,所有本文提前计算好,这样可以减小计算量。
以下的讨论,不考虑偏置项的影响。模型的输入是K分之一的编码字向量,如下所示:
x = x 1 , . . . , x T x , x i ∈ R K x {\rm x}=x_1,...,x_{T_x}, x_i\in\mathbb R^{K_x} x=x1,...,xTx,xi∈RKx
输出是一个包含K分之一编码字向量的句子,如下所示:
y = ( y 1 , . . . , y T y ) , y i ∈ R K y {\rm y}=(y_1,...,y_{T_y}), y_i \in \mathbb R^{K_y} y=(y1,...,yTy),yi∈RKy
其中, K x K_x Kx 和 K y K_y Ky 分别是原序列和目标序列的大小。 T x T_x Tx 和 T y T_y Ty 表示原序列和目标序列的句子长度。
首先,前向BiLSTM的前向状态计算方法如下:
h → i = { ( 1 − z → i ) ∘ h → i − 1 + z → i ∘ h i , i f i > 0 0 , i f i = 0 \overrightarrow h_i =\left \{ \begin{aligned} (1-\overrightarrow z_i)\circ\overrightarrow h_{i-1}+\overrightarrow z_i \circ h_i, {\rm if} i>0 \\ 0, {\rm if} i=0 \end{aligned} \right. hi=⎩⎨⎧(1−zi)∘hi−1+zi∘hi,ifi>00,ifi=0
其中
h → i = t a n h ( W → E ‾ x i + U → [ r → i ∘ h → i − 1 ] ) \overrightarrow h_i={\rm tanh}(\overrightarrow W \overline E x_i+\overrightarrow U[\overrightarrow r_i \circ \overrightarrow h_{i-1}]) hi=tanh(WExi+U[ri∘hi−1])
z → i = δ ( W → z E ‾ x i + U → z h → i − 1 ) \overrightarrow z_i=\delta(\overrightarrow W_z \overline E x_i+\overrightarrow U_z \overrightarrow h_{i-1}) zi=δ(WzExi+Uzhi−1)
r → i = δ ( W → r E ‾ x i + U → r h → i − 1 ) \overrightarrow r_i=\delta(\overrightarrow W_r \overline E x_i+\overrightarrow U_r \overrightarrow h_{i-1}) ri=δ(WrExi+Urhi−1)
其中, E ‾ ∈ R m ∗ K x \overline E\in\mathbb R^{m*K_x} E∈Rm∗Kx 是字嵌入矩阵。 W → , W → z , W → r ∈ R n ∗ m \overrightarrow W, \overrightarrow W_z,\overrightarrow W_r\in\mathbb R^{n*m} W,Wz,Wr∈Rn∗m 和 U → , U → z , U → r ∈ R n ∗ n \overrightarrow U,\overrightarrow U_z,\overrightarrow U_r\in\mathbb R^{n*n} U,Uz,Ur∈Rn∗n都是权重矩阵。 m m m和 n n n分别是字的嵌入维度和隐藏单元的数量。 δ ( . ) \delta(.) δ(.)是逻辑sigmoid函数。
后向状态 ( h ← 1 , . . . , h ← T x ) (\overleftarrow h_1,...,\overleftarrow h_{T_x}) (h1,...,hTx)的计算方法类似。在前向RNN和后向RNN中,网络共享字嵌入矩阵word embedding matrix: E ‾ \overline E E,但是权重矩阵不共享。
本文将前向和后行的标记连接起来,得到 ( h 1 , h 2 , . . , h T X ) (h_1,h_2,..,h_{T_X}) (h1,h2,..,hTX),如下所示:
h i = [ h → i h ← i ] (7) h_i=\left[ \begin{aligned} \overrightarrow h_i \\ \overleftarrow h_i \end{aligned} \right] \tag{7} hi=⎣⎡hihi⎦⎤(7)
已知编码器标记annotation,解码器的隐藏状态 s i s_i si计算方法如下:
s i = ( 1 − z i ) ∘ s i − 1 + z i ∘ s ~ i s_i=(1-z_i)\circ s_{i-1}+z_i\circ \tilde s_i si=(1−zi)∘si−1+zi∘s~i
其中
s ~ i = t a n h ( W E y i − 1 + U [ r i ∘ s i − 1 ] + C c i ) \tilde s_i={\rm tanh}(WEy_{i-1}+U[r_i\circ s_{i-1}]+Cc_i) s~i=tanh(WEyi−1+U[ri∘si−1]+Cci)
z i = δ ( W z E y i − 1 + U z s i − 1 + C z c i ) z_i=\delta(W_zEy_{i-1}+U_zs_{i-1}+C_zc_i) zi=δ(WzEyi−1+Uzsi−1+Czci)
r i = δ ( W r E y i − 1 + U r s i − 1 + C r c i ) r_i=\delta(W_rEy_{i-1}+U_rs_{i-1}+C_rc_i) ri=δ(WrEyi−1+Ursi−1+Crci)
其中, E E E是目标语言的字嵌入矩阵, W , W z , W r ∈ R n ∗ m W,W_z,W_r\in\mathbb R^{n*m} W,Wz,Wr∈Rn∗m, U , U z , U r ∈ R n ∗ n U,U_z,U_r\in \mathbb R^{n*n} U,Uz,Ur∈Rn∗n 和 C , C z , C r ∈ R n ∗ 2 n C,C_z,C_r\in\mathbb R^{n*2n} C,Cz,Cr∈Rn∗2n都是权重。 m m m和 n n n分别是字嵌入的维度和隐藏层的数量。初始的隐藏状态 s 0 s_0 s0计算方法如下:
s 0 = t a n h ( W s h ← 1 ) , W s ∈ R n ∗ n s_0={\rm tanh}(W_s\overleftarrow h_1), W_s\in \mathbb R^{n*n} s0=tanh(Wsh1),Ws∈Rn∗n
上下文向量 c i c_i ci可以通过对齐模型来计算,具体方法如下所示:
c i = ∑ j = 1 T x α i j h j c_i=\sum_{j=1}^{T_x}\alpha_{ij}h_j ci=j=1∑Txαijhj
其中
α i j = e x p ( e i j ) ∑ k = 1 T x e x p ( e i k ) \alpha_{ij}=\frac{{\rm exp}(e_{ij})}{\sum_{k=1}^{T_x}{\rm exp}(e_{ik})} αij=∑k=1Txexp(eik)exp(eij)
e i j = v a T t a n h ( W a s i − 1 + U a h j ) e_{ij}=v^T_a{\rm tanh}(W_as_{i-1}+U_ah_j) eij=vaTtanh(Wasi−1+Uahj)
其中, h j h_j hj是原序列的第 j j j个标记。 v a ∈ R n ′ , W a ∈ R n ′ ∗ n v_a\in\mathbb R^{n'},W_a\in\mathbb R^{n'*n} va∈Rn′,Wa∈Rn′∗n和 U a ∈ R n ′ ∗ 2 n U_a\in\mathbb R^{n'*2n} Ua∈Rn′∗2n都是权重矩阵。如果将 c i c_i ci固定到 h → T x \overrightarrow h_{T_x} hTx时,模型则变成RNN Encoder-Decoder。
一直解码器状态 s i − 1 s_{i-1} si−1,上下文向量 c i c_i ci和最后一个字 y i y_i yi时,目标字的概率可以定义如下:
p ( y i ∣ s i , y i − 1 , c i ) ∝ e x p ( y i T W o t i ) p(y_i|s_i,y_{i-1},c_i)\propto {\rm exp}(y^T_iW_ot_i) p(yi∣si,yi−1,ci)∝exp(yiTWoti)
其中
t i = [ m a x { t ~ i , 2 j − 1 , t ~ i , 2 j } ] j = 1 , . . . , l T t_i={[max\{\tilde t_{i,2j-1},\tilde t_{i,2j} \}]}^T_{j=1,...,l} ti=[max{t~i,2j−1,t~i,2j}]j=1,...,lT
t ~ i , k \tilde t_{i,k} t~i,k是向量 t ~ i \tilde t_i t~i的第 k k k个元素,计算方法如下:
t ~ i = U 0 s i − 1 + V o E y i − 1 + C o c i \tilde t_i=U_0s_{i-1}+V_oEy_{i-1}+C_oc_i t~i=U0si−1+VoEyi−1+Coci
W o ∈ R K y ∗ l , U o ∈ R 2 l ∗ n , V o ∈ R 2 l ∗ m W_o\in\mathbb R^{K_y*l},U_o\in\mathbb R^{2l*n},V_o\in\mathbb R^{2l*m} Wo∈RKy∗l,Uo∈R2l∗n,Vo∈R2l∗m和 C o ∈ R 2 l ∗ 2 n C_o\in\mathbb R^{2l*2n} Co∈R2l∗2n都是权重矩阵。