隨便說說,錯誤之處大家指正。
目前的無監督,或者說極弱監督機器翻譯模型主要做了兩件事:
1. 學一個雙語的word embedding 對映,即對齊兩個語言的詞向量空間。
做這個工作的有大量論文,但是名字不太一樣,有的叫multilingual embedding transforming,有的叫bilingual lexicon induction 。言而總之就是先在各自語言的大規模單語資料上訓embedding,然後利用數量極少的種子詞庫(比如雙語中的阿拉伯數字是肯定對應的),基於的假設是雙語對應的詞周圍經常出現的詞也是對應的,用self-learning去不斷地迭代,不斷訓練。
2. 有了一個對映的還不錯的詞向量空間了,那麼此時無監督翻譯模型就有一定效能了,畢竟翻譯最簡單的case就是有一個詞典,一個詞一個詞地mapping,有一個還不錯的模型對於無監督翻譯是非常重要的,因為不能指望從真正的隨機裡學習到什麼東西。
現在就可以採用一些看著很像梯雲縱的方法去翻譯,左腳踩右腳,然後爬的很高,當然能這麼做是有前提的,這裡面用到attention based seq2seq model的一個重要的sense,或者說經驗,此話先按下不表,先說模型。
模型大致結構可見上圖,結構很簡單,就是兩個語言L1,L2 共享一個encoder,用這個encoder把L1語言的某句話 L1_sent 編碼成向量vector1,然後在用L2的decoder根據vector1生成L2_sent, 此時我們是不是有一個偽平行語料了?是不是感覺事情有了一點點轉機?但是此時是不能直接用這個訓練的,還得用L2 encoder --- L2 sent 編碼成vector2,然後強制vector2 用L1 decoder生成最初始的句子L1_sent, 此時<x = L2_sent, y = L1_sent>就是我們要用來訓練的instance。
Note:
1. 為什麼要轉換兩次?因為得和所有的引數都相關啊,不然監督訊號咋傳遞到所有的引數上面。2. 為什麼是<x = L2_sent, y = L1_sent>,而不是反過來?因為y必須是gold的,不然會引入大量噪聲,x有點噪音沒關係,因為x端資訊在seq2seq裡是被attention抽取的,有點噪音也過濾掉了。其次就是y端的句子還有一個重要的目標就是訓練decoder裡面的language model,如果你是有噪音的資料,會導致language model生成的句子不流暢,這個很致命。x可以有點噪音也是我們前面按下不表的前提,要是沒有這個特性,應該很難訓好!
3. 作者用了一個類似加噪音的encoder-decoder去train shared encoder,這件事聽著就很靠譜。
4. FAIR的工作和這個差不多,只是他們用了一種自己提出的word mapping,居然也投了ICLR,但個人覺得不能算salami slicing。
5. MSRA的nips17的dual learning我猜也想做的這件事,但是沒有word mapping先把translation space搞的稍微好一點,想無監督應該是非常難的。
隨便說說,錯誤之處大家指正。
目前的無監督,或者說極弱監督機器翻譯模型主要做了兩件事:
1. 學一個雙語的word embedding 對映,即對齊兩個語言的詞向量空間。
做這個工作的有大量論文,但是名字不太一樣,有的叫multilingual embedding transforming,有的叫bilingual lexicon induction 。言而總之就是先在各自語言的大規模單語資料上訓embedding,然後利用數量極少的種子詞庫(比如雙語中的阿拉伯數字是肯定對應的),基於的假設是雙語對應的詞周圍經常出現的詞也是對應的,用self-learning去不斷地迭代,不斷訓練。
2. 有了一個對映的還不錯的詞向量空間了,那麼此時無監督翻譯模型就有一定效能了,畢竟翻譯最簡單的case就是有一個詞典,一個詞一個詞地mapping,有一個還不錯的模型對於無監督翻譯是非常重要的,因為不能指望從真正的隨機裡學習到什麼東西。
現在就可以採用一些看著很像梯雲縱的方法去翻譯,左腳踩右腳,然後爬的很高,當然能這麼做是有前提的,這裡面用到attention based seq2seq model的一個重要的sense,或者說經驗,此話先按下不表,先說模型。
模型大致結構可見上圖,結構很簡單,就是兩個語言L1,L2 共享一個encoder,用這個encoder把L1語言的某句話 L1_sent 編碼成向量vector1,然後在用L2的decoder根據vector1生成L2_sent, 此時我們是不是有一個偽平行語料了?是不是感覺事情有了一點點轉機?但是此時是不能直接用這個訓練的,還得用L2 encoder --- L2 sent 編碼成vector2,然後強制vector2 用L1 decoder生成最初始的句子L1_sent, 此時<x = L2_sent, y = L1_sent>就是我們要用來訓練的instance。
Note:
1. 為什麼要轉換兩次?因為得和所有的引數都相關啊,不然監督訊號咋傳遞到所有的引數上面。2. 為什麼是<x = L2_sent, y = L1_sent>,而不是反過來?因為y必須是gold的,不然會引入大量噪聲,x有點噪音沒關係,因為x端資訊在seq2seq裡是被attention抽取的,有點噪音也過濾掉了。其次就是y端的句子還有一個重要的目標就是訓練decoder裡面的language model,如果你是有噪音的資料,會導致language model生成的句子不流暢,這個很致命。x可以有點噪音也是我們前面按下不表的前提,要是沒有這個特性,應該很難訓好!
3. 作者用了一個類似加噪音的encoder-decoder去train shared encoder,這件事聽著就很靠譜。
4. FAIR的工作和這個差不多,只是他們用了一種自己提出的word mapping,居然也投了ICLR,但個人覺得不能算salami slicing。
5. MSRA的nips17的dual learning我猜也想做的這件事,但是沒有word mapping先把translation space搞的稍微好一點,想無監督應該是非常難的。