多語種神經機器翻譯

神經機器翻譯(Neural Machine Translation,NMT)建立源語言到目標語言的映射。多語種神經機器翻譯(Multilingual NMT)能夠實現一個模型在多個語言之間映射。本篇主要介紹神經機器翻譯,以及多語種神經機器翻譯的最新研究進展。

Does Multi-Encoder Help? A Case Study on Context-Aware Neural Machine Translation

來自金山AI Lab的一篇文章,探討機器翻譯中Context-Aware的作用。在編解碼器機器翻譯中,通常會使用額外的編碼器來表徵句子的上下文資訊,該文研究了這個上下文編碼器(context encoder)的工作機制:上下文編碼器不僅僅編碼句子的上下文,更重要的是扮演了一個雜訊生成器的角色。實驗證明,充滿雜訊的訓練對於多編碼器機器翻譯模型非常重要,特別是數據量較少的情況下尤甚。

程式碼地址:Context-Aware

簡介

目前有兩種普遍的方法將上下文資訊注入到機器翻譯模型中。

  1. 最簡單的方法就是,將上下文資訊和當前的句子做拼接,插入特殊的符號區分它們,組合成上下文感知的輸入序列,這種方法的缺陷在於需要編碼較長的輸入序列,計算效率低下;

  2. 更為普遍的方式是,利用額外的神經網路編碼上下文句子,這種方法又可以細分為兩種方式,一種是外部集成(Outside integration),一種是內部集成(Inside integration)。如圖所示。

    • 外部集成。如上圖1(a),外部集成將上下文和當前句子通過注意力網路融合成一種新的表徵,之後注意力網路的輸出和當前句子的表徵元素求和。

    • 內部集成。如上圖1(b),內部集成使用兩個編碼器,這兩個編碼器的輸出使用解碼器內部的門機制獲得融合向量。

幾個結論

  • 不使用Context-Aware的基準線模型(Sentence-Level Model)如果精調參數,比如調整Dropout率,相比於使用Context-Aware模型(Context-Aware/Multi-Encoder Model),兩者BLEU差距會降低。

  • 多編碼器系統對上下文輸入並不敏感。即使將隨機的句子作為上下文編碼器的輸入,也會得到顯著的性能提升。

  • 使用Context-Aware訓練的模型,在推斷時候沒有上下文輸入的情況下,相反會帶來更好的表現。實驗結果如下。

其中,Agnostic表示推斷時候忽略上下文輸入,Aware表示推斷時候的輸入和訓練時一致。

基於以上的結論,Context-Aware模型相比於基準線模型,主要是提供了一種正則化手段。該文在訓練時向編碼器輸出注入高斯雜訊,也能夠提供相似甚至超越的性能表現。實驗結果如下。

Multilingual Neural Machine Translation with Knowledge Distillation

使用訓練好的單語言機器翻譯模型作為老師,多語言機器翻譯模型作為學生,進行知識蒸餾。

程式碼地址:multilingual-kd-pytorch

簡介

  • 一個老師一個學生

\(D={(x,y)\in X\times Y}\)為雙語數據集,則翻譯模型\(\theta\)在語料\(D\)上的對數似然損失(one-hot標籤的交叉熵):

\[L_{NLL}(D;\theta)=-\sum_{(x,y)\in D} \mathop{log}P(y|x;\theta),\\
\mathop{log}P(y|x;\theta)=\sum_{t=1}^{T_y}\sum_{k=1}^{|V|}\mathbb{I}(y_t=k)\mathop{log}P(y_t=k|y_{<t},x;\theta)
\]

其中,\(T_y\)為目標序列的長度,\(|V|\)為目標語言的辭彙表大小,\(y_t\)是第\(t\)個目標token,\(\mathbb{I}(\cdot)\)是one-hot標籤的指示函數,\(P(\cdot|\cdot)\)是模型\(\theta\)的條件概率。

在知識蒸餾中,學生模型(模型\(\theta\))不僅僅匹配真實one-hot標籤,而且擬合老師模型(模型\(\theta_T\))的概率輸出。記老師模型對於\(y_t\)的輸出分布\(Q(y_t|y_{<t},x;\theta_T)\),則學生模型和老師模型的輸出分布之間的交叉熵,作為蒸餾損失:

\[L_{KD}(D;\theta,\theta_T)=-\sum_{(x,y)\in D}\sum_{t=1}^{T_y}\sum_{k=1}^{|V|}Q(y_t=k|y_{<t},x;\theta_T)\mathop{log}P(y_t=k|y_{<t},x;\theta)
\]

\(L_{NLL}(D;\theta)\)\(L_{KD}(D;\theta,\theta_T)\)之間的差異主要是目標分布\(L_{KD}(D;\theta,\theta_T)\)不再是原始的one-hot標籤,而是老師的輸出分布,老師對標籤均分配一個非零概率,因而更平滑,計算出的梯度方差更小,因此整個的損失函數變為:

\[L_{ALL}(D;\theta,\theta_T)=(1-\lambda)L_{NLL}(D;\theta)+\lambda L_{KD}(D;\theta,\theta_T)
\]

其中,\(\lambda\)是平衡兩個損失項的係數。

  • 使用一個學生多個老師,進行多語種知識蒸餾

當多語種機器翻譯模型的準確率沒有超過某一閾值時,則使用損失函數\(L_{ALL}\)不僅僅擬合真實數據,而且學習老師的輸出,該閾值每\(\tau_{check}\)步檢查一次;否則,多語種機器翻譯模型使用對數似然損失\(L_{NLL}\)僅僅擬合真實數據。如下圖,是整個演算法的計算流程圖,注意在訓練過程中會動態切換損失函數。

多語種機器翻譯蒸餾的兩個技巧

  • 選擇性蒸餾

這裡考慮到,一個較差的老師模型,有可能會損害學生模型的表現,導致較差的準確率。因此採用上圖演算法1中15-19行,使用所謂的「選擇性蒸餾」的訓練策略。當多語種機器翻譯模型的準確率超過單語種模型某個閾值,則拋掉蒸餾損失。當然,如果後續準確率有降低了,蒸餾損失則又會加回來。

  • Top-K蒸餾

主要是在訓練之前,首先讓老師模型生成Top-K標籤,然後歸一化作為蒸餾的老師輸入。減少顯示記憶體佔用(將顯示記憶體佔用由詞表大小\(|V|\)降低為\(K\)),而且對最終的蒸餾效果還有所提升。

Multilingual Neural Machine Translation with Soft Decoupled Encoding

多語種機器翻譯有效提升了低數據資源語言上的準確率,本篇主要解決多語種機器翻譯中的詞表徵問題。不同於以字元、子詞(sub-word)、單詞為單位的輸入,軟解耦編碼(Soft Decoupled Encoding,SDE)多層次表徵一個單詞。

程式碼地址:SDE

簡介

SDE主要包括三個部分:1)使用字元N-gram的單詞編碼;2)針對字元編碼的特定語言轉換;3)字元編碼參與的,共享詞嵌入空間的詞嵌入。如圖所示。

多語種機器翻譯的辭彙表徵(Lexical Unit)

通常情況下,首先需要將一個句子分割成辭彙單元,目前主要有三種形式:

  • 單詞。根據空格或者發音,將序列分割成單詞。

  • 字元。將輸入序列分割為一個個字元。

  • 子詞(subword)。將語料中頻繁出現的字元單元,切分出來,作為辭彙表中的詞。

之後,利用詞嵌入(Emebdding)將這些辭彙單元,轉化為嵌入向量。

SDE的表徵方法

如圖,計算辭彙嵌入,語言特定的轉換和隱語義嵌入。

辭彙嵌入(Lexical Embedding)

\(W_c\in \mathbb{R}^{C\times D}\),其中,\(D\)為嵌入維度,\(C\)為辭彙表中的\(n\)-gram大小,\(W_c\)在所有語言中共享。計算\(w\)的字元\(n\)-gram詞袋,記作BoN(\(w\))。如上圖2,是詞”puppy”當\(n=1,2,3,4\)時的\(n\)-gram。最終,計算辭彙嵌入的公式如下:

\[c(w)=\mathop{tanh}(\mathop{BoN}(w)\cdot W_c)
\]

其中,\(W_c\)\(C\times D\)大小的嵌入矩陣。

特定語言轉換(Language-specific Transformation)

特定語言轉換主要是為了消除不同語言之間的拼寫不同,比如「你好」和「hello」,拼寫不同,但是含義相同。利用一個簡單的全連接層進行這樣的轉換,對於語言\(L_i\)

\[c_i(w)=\mathop{c(w)\cdot W_{L_i}}
\]

其中,\(W_{L_i}\in \mathbb{R}^{D\times D}\)針對語言\(L_i\)的變換矩陣

潛在語義嵌入(latent Semantic Embedding)

主要是為了建模不同語言間共享的語義,這裡又用到一個嵌入矩陣\(W_s\in \mathbb{R}^{S\times D}\),其中,\(S\)是假設一個語言可以表達核心語義的數量。和辭彙嵌入矩陣\(W_c\)一樣,語義嵌入矩陣\(W_S\)也在不同語言之間共享。在這一部分,使用一種簡單的注意力機制計算潛在語義嵌入:

\[e_{latent}(w)=\mathop{Softmax}(c_i(w)\cdot W_s^T)\cdot W_s
\]

其中,\(c_i(w)\)為上述對於詞\(w\)的特定語言轉換向量。

最後,為了簡化模型優化,將特定語言轉換向量\(c_i(w)\)作為跳連加入到\(e_{latent}(w)\)中,也就是對於詞\(w\)的軟解耦編碼為:

\[e_{SDE}(w)=e_{latent}(w)+c_i(w)
\]

實驗

在該文實驗沒有什麼好說的,使用的是幾個較低和較高數據資源的數據集。如下:

其中,aze、bel等均為語種代號,LRL表示低數據資源語料,HRL表示高數據資源語料。

A Compact and Language-Sensitive Multilingual Translation Method

在多語種機器翻譯模型中,兼顧參數共享的同時,引入語言敏感嵌入、注意力和判別器,以增強模型表現。如下圖。

一個統一的特徵表徵器

骨架仍然是Transformer,self-attention、feed-forward和normalization模組權重共享,共享的表徵器參數記作\(\theta_{rep}\),因此損失函數為:

\[L_{m-1}(D;\theta)=\sum_{l=1}^L\sum_{d=1}^{|D_l|}\sum_{t=1}^M\mathop{log}P(y^l_t|x^l,y_{<t}^l;\theta_{rep},\theta_{attn})
\]

其中,\(L\)是平行語料的對數,\(P(y_t^l|x^l,y^l_{<t};\theta)\)表示第\(l\)個平行語料對的第\(d\)句話的第\(t\)個詞的翻譯概率(the probability of t-th word of the d-th sentence in l-th translation pair)。

語種敏感模組

  • 語種敏感嵌入

該文中,對每個token加上一個表徵語種的嵌入向量,該嵌入矩陣記作\(E_{lang}\in \mathbb{R}^{|K|*d_{model}}\),其中,\(K\)為參與訓練的語種數量,\(d_{model}\)為模型中隱向量的維度。

  • 語種敏感注意力

在Transformer中,除了自注意力之外,還有一個用於橋接編碼器和解碼器的跨注意力(cross-attention),這種注意力用於解碼器選擇最相關的編碼器輸入。該文的所謂「語種敏感注意力」,就是每個語種都有各自對應的跨注意力參數。

  • 語種敏感判別器

使用一個神經網路\(f_{dis}\)在表徵器\(h_{top}^{rep}\)的頂層,神經網路的輸出就是一個語種的判別分數\(P_{lang}\)

\[h^{dis}=f_{dis}(h_{top}^{rep})\\
P_{lang}(d)=\mathop{softmax}(W_{dis}*h_{d}^{dis}+b_{dis})
\]

其中,對於句子對\(d\)的語種判別分為\(P_{lang}(d)\)\(W_{dis},b_{dis}\)均為參數,可以統一記作\(\theta_{dis}\)。在這裡可以採用兩種神經網路:帶有最大池化的卷積和兩層全連接層。因此,可以獲得判別目標函數:

\[L_{dis}(\theta_{dis})=\sum_{k\in K}\sum_{d=1}^{|D|}\mathbb{I}\{g_d=k\}*\mathop{log}P_{lang}(d)
\]

其中,\(\mathbb{I}\{\cdot\}\)為指示函數,\(g_d\)屬於語種\(k\)

因此整個多語種機器翻譯模型的損失函數為:

\[L(D;\theta)=L(D;\theta_{rep},\theta_{attn},\theta_{dis})=(1-\lambda)L_{m-1}(\theta_{rep},L_{attn})+\lambda L_{dis}(\theta_{dis})
\]

其中,\(\lambda\)是預先定義的,用於平衡翻譯任務和語種判別任務的平衡係數。

Parameter Sharing Methods for Multilingual Self-Attentional Translation Models

一個單語種機器翻譯模型如果不加修改地訓練為多語種模型,所有模型參數直接在多個語種之間共享,通常會導致準確率的下降。該文就是在Transformer模型的基礎上,討論多語種機器翻譯模型的參數共享策略。實驗發現,所有參數共享的方法,帶來BLEU的提升主要是因為目標語言屬於相似的語言族(language family),而如果目標語言屬於不同的語言族中,所有參數共享則會帶來顯著的BLEU的降低。

程式碼地址:multilingual_nmt

簡介

一翻多機器翻譯任務是多語種機器翻譯的典型任務,如上圖1,之前的多任務學習(Multi-Task Learning,MTL)模型有兩種方法:(a)一個共享編碼器和每個語種特定的解碼器,這種方法優勢在於能夠針對每一個目標語言建模,但缺陷也很明顯,就是訓練速度減慢,並且增加記憶體要求。(b)一個統一的,對所有語言對共享的編解碼器,優點在於無論多少語種,參數量恆定,但這種方法大大加重了解碼器的負擔。因此該文中提出了一種折中方案:(c)一個共享編碼器和部分參數共享的解碼器。因此,選擇哪些參數共享成為最重要的問題。

參數共享策略

將共享參數的集合記作\(\Theta\),則:

  • 共享前饋網路(Fully-Forward Network,FFN)參數,也即:\(\Theta=\{W_E,\theta_{ENC},W_{L_1},W_{L_2}\}\)

  • 共享自注意力層的參數,也即:\(\Theta=\{W_E,\theta_{ENC},W_K^1,W_Q^1,W_V^1,W_F^1\}\)

  • 共享編解碼器注意力參數,也即:\(\Theta=\{W_E,\theta_{ENC},W_K^2,W_Q^2,W_V^2,W_F^2\}\)

  • 注意力參數的共享僅僅局限在key和query的權重參數(\(\Theta=\{W_E,\theta_{ENC},W_K^1,W_Q^1,W_K^2,W_Q^2\}\))或者key和value的權重參數(\(\Theta=\{W_E,\theta_{ENC},W_K^1,W_V^1,W_K^2,W_V^2\}\))。這樣做的主要動機是,共享的注意力層可以建模目標語言的相似資訊,而獨立的前饋層參數則可以建模各個語言之間的不同方面。

  • 共享解碼器的所有參數。

上述各種策略的實驗結果如下:

  • 目標語言均屬同一語言族的一翻多(one-to-many)翻譯。

一些結論:

  1. 僅僅共享嵌入層效果最差;

  2. 共享編碼器參數在有些任務上可以獲得較好的提升,有些不行;

  3. 共享編解碼器注意力的key-query或者key-value權重參數,可以帶來一個較為平衡的表現;

  4. 共享編解碼器注意力全部參數,或者編碼器-注意力-解碼器參數全部共享,有時可以帶來最優表現。

  • 目標語言屬於不同語言族的一翻多(one-to-many)翻譯。

一些結論:

  1. 在目標語言屬於不同語言族的實驗中,共享編解碼器的全部參數將會帶來非常明顯的BLEU分數下降,表現降低明顯;

  2. 共享編碼器和解碼器的key-query的權重參數可以有效建模各語言的普遍共性,而各語言獨立的前饋層可以建模各語言的特性,這種策略在該任務中取得最好的表現。

  • 當然也做了一個整體的比較,在GNMT和Transformer上,不共享(No Sharing)、全部共享(Full Sharing),共享部分(Partial Sharing)參數的表現。其中,共享部分參數指的是共享嵌入層,編碼器和編解碼器的key-value權重參數。這裡不明白,上面一張圖明明共享編解碼器的key-query權重參數的效果最好,在這裡做整體比較卻是用了共享編解碼器的key-value權重係數。

當然,部分參數共享的方法都能取得比較好的表現。有時候目標語言是相同語言族時,參數全共享可以得到比較好的BLEU值。

Contextual Parameter Generation for Universal Neural Machine Translation

和上面一篇討論多語種機器翻譯的參數共享不同,該文新增一個部件上下文參數生成器(Contextual Parameter Generator,CPG)為編解碼器生成參數,該參數生成器輸入是語言嵌入(Language Embeddings)張量,輸出語言特定的模型參數,其餘部分保持不變。該方法使得單一的統一模型在多個語言間進行互翻時,利用同樣的網路結構,但使用語言特定的參數(language specific parameterization)。該方法同樣可以用於領域自適應和零次學習等方面。

使用該方法進行多語種語音合成的程式碼地址:Multilingual_Text_to_Speech

簡介

對一個給定的句子對,源語言記作\(l_s\),目標語言記作\(l_t\)。當使用上下文參數生成器(Contextual Parameter Generator)時,將編碼器的參數記作\(\theta^{(enc)}=g^{(enc)}(I_s)\),其中,\(g^{(enc)}\)為編碼器參數生成函數,\(I_s\)記作語言\(l_s\)的語言嵌入張量。相似地,\(\theta^{(dec)}=g^{(dec)}(I_t)\)為函數\(g^{(dec)}\)使用語言\(I_t\)的語言嵌入張量\(I_t\)作為輸入,為解碼器生成參數。在該文的實驗中,參數生成器被定義為一個簡單的線性變換,並且在淺層網路中不使用偏置項:

\[g^{(enc)}(I_s)=W^{(enc)}I_s\\
g^{(dec)}(I_t)=W^{(dec)}I_t
\]

其中,\(I_s,I_t\in \mathbb{R}^M,W^{(enc)}\in \mathbb{R}^{P(enc)\times M},W^{(dec)}\in \mathbb{R}^{P(dec)\times M}\)\(M\)是語言嵌入維度,\(P^{(enc)}\)是編碼器的參數數量,\(P^{(dec)}\)是解碼器的參數數量。當然該文並沒有限制參數生成器的具體形式。由上式可以看出,該模型也可看作對參數的低階約束(參見原文3.2節的具體解釋)。

總結

本文主要討論了機器翻譯,特別是多語種機器翻譯的進展。可以看到,實際上不加任何修改,利用多語種語料訓練單語種翻譯模型,也有可以立即將其轉變為多語種翻譯模型,這種方法的優點在於沒有增加任何參數量,而且在語言族相同的情況下效果蠻好,缺點在於會給模型帶來極大的負擔。因此,有較多的方法在參數共享方面瘋狂試探,一方面最大限度地共用語言特性無關的模組,另一方面加入一些能夠表達語言特性的模組或者資訊。

最後,推薦一份機器翻譯論文列表。

清華大學機器翻譯小組的推薦論文列表:MT-Reading-List