Addressing Troublesome Words in Neural Machine Translation

# 書誌情報
<img src="https://qiita-image-store.s3.amazonaws.com/0/140539/507ad2bf-26eb-7444-0611-eaedbdd763d3.png" width=60%>

- EMNLP 2018


# 概要
- 出現頻度が少なかったり，翻訳候補が複数考えられる（生成確率のエントロピーが高い）ような，翻訳が難しい単語を troublesome word と定義し，これらを正しく翻訳するための Contextual memory を提案
    - ベースライン翻訳モデルで一度翻訳させた際の結果を元に troublesome word を定義
    - troublesome word が学習データ内で出現した際の Context と対応する正解訳の単語を Contextual memory に記録
    - 翻訳時に troublesome word が出現した場合に Contextual memory を用いて翻訳をサポート
- 既存の翻訳語彙集を用いて troublesome word に対応する手法に比べて 1pt 程 BLEU スコア改善

# 先行研究
- 単語を subword 単位に分割し，subword 単位で翻訳  Sennrich et al. (2016) 
    - 低頻度単語 が 高頻度subword の組み合わせで表現される
    - 低頻度 subword への対応は未だに残る問題
- 翻訳語彙集とNMTを組み合わせて，低頻度単語を翻訳 Feng et al. (2017)
    - コンテキストを考えずに語彙集を用いているのが欠点

# 対応例

<img src="https://qiita-image-store.s3.amazonaws.com/0/140539/a9c91674-2ffd-54eb-9cf5-82b7bb4d84b3.png" width=50%>

- ベースラインNMT モデルは 低頻度単語の aerkate の翻訳に失敗 (正：aerkate, 誤：he)
- 翻訳語彙集を用いるモデル(Arthur) を用いるモデルは chengzhang の翻訳に失敗 (正：grew, 誤：growth)
- 提案モデル(Baseline+MEM) は上記２つのケースに対して間違えずに翻訳に成功

# 提案モデルにおける処理の流れ
1. baseline 翻訳モデルで訓練データ source sentence を全て翻訳
2. 推定された単語と正しい単語の0間の距離に応じて troublesome source word を特定
3. 正しい翻訳と，対応するcontext 情報を記憶するメモリーに troublesome word と周辺コンテキストベクトルを格納
4. 翻訳時に，troublesome words が出てきたらメモリーを使用
    5. contextual similarity で正しい訳を選択する


# Troublesome Word の定義
- baseline NMTモデルで翻訳に失敗してしまった出力単語と対応関係のある入力側の単語を troublesome word と定義
    - 対応関係 (alignment) は fast-align (Dyer et al., 2013) で抽出

![スクリーンショット 2018-11-27 22.47.21.png](https://qiita-image-store.s3.amazonaws.com/0/140539/7337d18a-28ae-a061-f4f7-a0677bac35e9.png)

1. baseline 翻訳モデルで翻訳し，正解翻訳単語の生成確率 $p(y_i)$ を計算
2. fast align を用いて正解翻訳単語 $x_i$ に対応する単語 $y_i$ を求める $(x_i, y_i)$
3. $p(y_i)$ が exception criteria を満たした場合,対応関係のある $x_i$ を exception とする
    - exception criteria には３種類存在
4. 各$x_i$ 毎に exception rate $r(x_i)$ を計算
    - 全学習データ中に $x_i$ が $N$ 回出現し，$M$ 回 exception となった場合 $r(x_i)=M/N$
5. $r(x_i) > \epsilon$ であれば $x_i$ を troublesome word とする

### exception criteria 3パターン

- Asolute Criterion
    - 正解単語$y_i$の確率 $p(y_i)$ が一定確率以下 $p(y_i) < p_0$
- Gap Criterion
    - 生成確率最大の単語と正解単語の生成確率の差 g(y_i) が一定以上
    - $g(y_i) = max(p(V)) - p(y_i)$
        - V は語彙集合
- Ranking Criterion
    - 正解単語$y_i$の確率 $p(y_i)$ の大きさが全単語の中で一定 rank 以下

# Contextual Memory
各Troublesome word に対して 式(6) の形式でメモリーを作成・保持する
<img src="https://qiita-image-store.s3.amazonaws.com/0/140539/61113252-4675-7df9-27db-c21745958864.png" width=60%>

- $s_m$ : troublesome とされた単語
- $t_n$ : $s_m$ に対応する訳語
- $c(s_m, t_n)$ : 単語ペアが出現したときの単語$s_m$ の encoder 隠れ状態の平均ベクトル
- $p^L(s_m, t_n)$ : 訓練データに対して，source-to-target, target-to-source 翻訳モデルで計算された一方からも一方へ翻訳される確率の平均値
- $r(s_m)$ : exception rate

### memory からのノイズ削減
- source-to-target, target-to-source 両方向で対応関係（alignment) を計算し，両方が一致しする組み合わせの memory のみ用いる
- 翻訳確率 $p^L(s_m, t_n)$ が 0.01 以下の組み合わせは除外


# Contextual Memory と NMT の結合

<img src="https://qiita-image-store.s3.amazonaws.com/0/140539/0a2107fd-792a-2b8d-39eb-4e39e21eb8fe.png" width=60%>

1. 入力センテンス X の全ての入力単語 $x_j$ に対して， Contextual Memory $M$から該当する memory を取得
    - $x_j$ が troublesome word でメモリーに含まれる場合には memory を取得
2. 入力センテンス X 内での単語 $x_j$ のコンテキスト(encoder 隠れ状態) と memory 内のコンテキスト $c(x_j, t_n)$ の類似度 $d_j(t_n)$ を算出

    <img src="https://qiita-image-store.s3.amazonaws.com/0/140539/0b9c467d-42a9-9c97-08a0-7671f8f56a1a.png" width=60%>
3. i 番目の翻訳単語 $y_i$ を生成する際に，計算した attention $a_{i,j}$, 類似度$d_j(t_n)$, 語彙ペア確率 $p^L(x_j, t_n)$ を用いてmemory predicted probability $p^M_i$ (単語$t_n$を生成する確率) を計算

    <img src="https://qiita-image-store.s3.amazonaws.com/0/140539/1053f69f-2441-be0b-e82a-48a59c8f2b6c.png" width=60%>
4. memory predicted probability $p^M_i$ と NMY predicted probability $p^N_i$ を重み付き足し合わせすることで 単語 $t_n$ を生成する確率 $p^F_i(t_n)$を求める
    
- 重みは exception rate が高い場合は $p^M_i$ の比率が大きくなるように設定

    <img src="https://qiita-image-store.s3.amazonaws.com/0/140539/88532226-6ecf-3bee-1de6-2648c2d97819.png" width=60%>
    <img src="https://qiita-image-store.s3.amazonaws.com/0/140539/c640ea8d-e1eb-3267-a025-b145a0aa15ee.png" width=40%>

### NMTのパラメータを固定した状態で,memory 側のパラメータを学習
   <img src="https://qiita-image-store.s3.amazonaws.com/0/140539/b41b4659-6885-fafd-d38a-4c8e4b369f8e.png" width=60%>

# 実験設定
- Chinese to English
    - training: LDC corpus 2.1M pair
    - validation:  NIST 2003 dataset 
    - test: NIST04-06 and 08 datasets
- English to German
    - training: WMT2014 4.5M sentence
    - validation: WMT2012, 2013
    - test:  WMT2014
モデル
- 2層LSTM encoder, decoder
- 単語埋め込み，隠れ状態は共に 1000次元


# 実験結果

- CH-EN 翻訳では，既存の翻訳語彙集をそのまま適用する手法(Arthur)に比べて，提案手法はより高いパフォーマンスを示した
    - sub-word を用いた場合でもい提案手法を適用することでパフォーマンス改善

![スクリーンショット 2018-12-02 11.33.31.png](https://qiita-image-store.s3.amazonaws.com/0/140539/508057a4-d1df-1d2d-120b-8a96f0082b3c.png)


- 提案手法の要素ごとのパフォーマンスへの寄与を調べたところ，Contextを用いること，memory の単語生成確率への寄与重みを動的に変更すること両方がパフォーマンス改善に寄与していた
    - troublesome word に対してのみ memory を作成した場合と，全単語に対して memory を適用した場合でパフォーマンスに優位な差は無かった (Tword + Context と All + Contex を比較)

   <img src="https://qiita-image-store.s3.amazonaws.com/0/140539/97d0d20c-e72a-5173-b89e-ef61b4f2c5c6.png" width=60%>

- troublesome word を決めるための指標を(Gap, Absolute, Ranking)を，用いるメモリサイズに対して比較したところ，Gap が最も良いパフォーマンスを示した．
    - メモリが小さいときは absolute が比較的良い
    - 現在は単一の指標で troublesome word を決めているが，他の指標と組み合わせることも考えられる

   <img src="https://qiita-image-store.s3.amazonaws.com/0/140539/2ac1d47a-bc32-104c-e394-f54bceb4412e.png" width=60%>
 
- 翻訳するセンテンスの種類毎にパフォーマンスの改善幅を解析したところ，troublesome word を含むセンテンスでの改善幅が大きかった (0.8 ~ 1.6 pt)
    - Low : 出現回数が 100以下の単語を含むセンテンス
    - Amb : 翻訳候補単語生成確率のエントロピーが $E_0$ が $E_0 > 1.5$ である単語が存在するセンテンス

   <img src="https://qiita-image-store.s3.amazonaws.com/0/140539/48e2ef36-badf-5718-52a7-5c244af008e5.png" width=60%>
 
- ランダムに200センテンスを選択し，troublesome word の翻訳結果を評価したところ，ベースライン手法では翻訳を誤ってしまう単語のうち，50%程度は提案手法で改善できていた
    - 一方でベースラインは正解しているのに，提案手法では間違えてしまったケースも少数存在 (Deterio)

   <img src="https://qiita-image-store.s3.amazonaws.com/0/140539/9ef82de5-85fc-d71f-2b6e-cc6ee8b67582.png" width=60%>

# 参考

[Philip Arthur, Graham Neubig, and Satoshi Nakamura. 2016. Incorporating discrete translation lexicons into neural machine translation.](https://arxiv.org/abs/1606.02006)

- 比較対象論文
- 低頻度単語に翻訳語彙集を適用して翻訳