下面是閱讀 "TensorFlow 自然語言處理" 第 10 章 "Seq2seq 序列轉序列-NMT 神經機器翻譯" 的摘要筆記 :
- 序列轉序列 seq2seq 是學習兩個任意長度序列之間的對應關係, 這種多對多對應關係的學習是最複雜的任務之一, 其應用例如神經機器翻譯 (NMT, Neural Machine Translation) 與聊天機器人 (chatbot) 等, Google 翻譯就是 NMT 的典型應用, 可將來源語言翻譯成目標語言. 人類的語言超過 5000 種, NMT 技術可大幅降低不同語群交流溝通的障礙.
- 機器翻譯最早可追溯到 1950 年代的 Geogetown-IBM 實驗, 早期以雙語辭典為基礎進行單詞轉單詞翻譯, 但此方式沒有考慮前後文, 故錯誤率, 比人工翻譯更慢. 後來演進為以語料庫為基礎 (copora-based) 的機器翻譯, 此法以來源句子與相對應的目標句子組成一個 tuple 來進行訓練, 大量的這些對應句 tuple 組成了平行語料庫, 此法比單詞轉單詞結果要來得正確. 還有一種技術叫做語際 (Interlingual) 機器翻譯, 是先將來源句翻譯成一種中性的元語言 (meta language), 然後再生成目標語言. 它基本上是由分析器 (analyzer) 與合成器 (synthesizer) 構成, 前者會辨識來源句裡的主體與所進行之互動, 並以語際詞素 (interlingual lexicon) 來表示, 後者則將這些語際詞素依據目標語言之句法規則生成目標句子.
- 在 NMT 系統出現之前, 統計機器翻譯 (SMT, Statistical Machine Translation) 技術已存在半個世紀之久, 它是利用語言的相關統計數字來生成另外一種語言的翻譯. 以片語為基礎 (phrase-based) 的翻譯模型會根據給定的來源片語學習不同候選目標片語的機率分布, 但這種作法的成本很高 (因為所需之片語資料庫非常大), 故又進化為以語法為基礎 (syntax-based) 的 SMT 技術, 此法將來源句以語法樹 (syntax tree) 表示, 它首先會依據目標語言語法的 r-table 將語法樹重新排序 (re-ordering), 調整主詞, 動詞, 與受詞之順序, r-table 是紀錄語法樹重排序的機率表. 接下來是插入 (insertion) 程序, 它會將一個單詞根據 n-table 的機率表隨機插入到語法樹的每個節點中生成目標單詞. 最後將語法樹的每個葉節點逐一轉換成目標單詞, 再從語法樹中讀出目標句即完成翻譯.
- NMT 大約是在 2014 年左右問世, 它是一種端對端 (end-to-end) 翻譯系統, 只要輸入完整的來源句就會轉換出相應的目標句, 完全不需要進行特徵工程 (例如構建片與翻譯模型與語法樹等), 在短短兩三年內超越 SMT 技術成為機器翻譯的新主流. NMT 主要是由編碼器 (encoder) 與解碼器 (decoder) 構成, 所以也是一種 encoder-decoder 架構, 這與傳統的語際 (interlingual) 機器翻譯概念類似. 編碼器會先讀取來源句, 生成時間序列模型的前後文向量 (context vector), 此向量對應人類讀完後心中所形成的思維或概念 (稱為思維向量), 然後由解碼器將其轉成目標句, 解碼器會為詞彙表的每個單字輸出一個分數, 然後用 softmax 層將其轉成機率, 機率最高者即為輸出. 前後文向量是連結編碼器與解碼器以形成端對端系統一連串計算的關鍵. 不論是來源句或目標句在進入 LSTM 網路前都會使用到詞彙內嵌層 (word embedding layer) 將單詞轉成內嵌向量, 以作為時間序列模型的輸入, 編碼器與解碼器使用兩組不同的 LSTM 網路來實作, 如此可增加模型中參數的數量, 提升翻譯效率.
- NMT 的編碼器在將前後文向量送進解碼器之前可能還會執行一項特殊的操作, 就是將來源句的語序顛倒, 例如 I love you 變成 you love I, 這麼做可顯著改善模型的表現, 特別是來源句與目標句的語序是相同的語言時 (例如都是 SVO 語言). 但這是具有主觀性的預處理步驟, 並不一定要進行.
- 注意力機制 (attention mechanism) 是機器翻譯上非常關鍵的突破之一, 它有效地提高了 NMT 系統的表現, 因為前後文向量其實不足以提供良好翻譯所需的完整資訊, 這會導致解碼器的表現不佳 (雖然 LSTM 具有長期記憶, 但對於很長的句子還是力有未逮), 無法得出良好的翻譯, 注意力的做法則突破了前後文向量這個瓶頸, 它可讓解碼器存取編碼器的完整狀態歷史, 存取到來源句非常豐富的表達方式, 而且解碼器使用的 softmax 層可讓解碼器根據過去所觀察到的編碼器計算加權平均以作為解碼器的前後文向量, 因此可在不同的解碼步驟中對不同單詞給予不同的注意力.
以下是看 "精通機器學習 (第二版)" 這本書第 16 章關於 NMT 的筆記 :
- 當輸出字彙表很大時, 輸出每個單字的機率會大幅將低運算速度, 如果目標詞彙表含有 5 萬個單字, 解碼器就須輸出 5 萬維的向量, 用 softmax 計算這麼大的向量會耗費巨大計算資源. 解決辦法是在訓練期間使用抽樣式 softmax 技術, 在 TensorFlow 有提供 tf.nn.sampled_softmax_loss() 函數可用, 但要注意, 抽樣式 softmax 只能在訓練時用, 在推論時必須使用一般的 softmax, 因為它要知道目標. 在 TensorFlow Addon 裡提供了許多 sequence-to-sequence 工具, 可讓使用者輕鬆建立準生產的 encoder-decoder 模型.
- Dzmitry Bahdanau 等人在 2014 年發表了專注力機制這個開創性論文 "NMT by Jointly Learning to Align and Translate", 他們提出的技術可讓解碼器在每個時步專注於編碼器輸出的適當的單字, 使從輸入的單字到它的翻譯之路徑短很多, 所以 RNN 短期記憶的影響就少很多, 專注力機制徹底改變了 NMT 與 NLP 的面貌, 特別是超過 30 個字的長句翻譯.
- NMT 最常見的評量標準是 BLEU (BiLingual Evaluation Understudy) 分數, 它是將模型產書的譯文與人類的優質譯文做比較, 計算出現在目標譯文裡面的 n-grams (有 n 個單字的序列) 數量, 以及在目標譯文中產生 n-grams 的頻率來調整分數.
- 專注機制不是只將編碼器的最後一個隱藏狀態傳給解碼器, 而是將所有輸出傳給解碼器, 在每一個時步, 解碼器的記憶細胞會計算所有編碼器的輸出之加權總和, 以此結果決定在此時步要專注哪個單字. 專注機制的目的是評量其中一個編碼器的輸出與解碼器上一個隱藏狀態的相似度.
沒有留言:
張貼留言