本文記錄一下去年下半年參加的AI Challenger比賽的過程,有那麼一點意思,之所以說是奇遇,看完文章就明白了。

去年8月,由創新工場、搜狗、今日頭條聯合舉辦的「AI challenger全球AI挑戰賽」首屆比賽正式開賽。比賽共設6個賽道,包括英中機器同聲傳譯、英中機器文本翻譯、場景分類、圖像中文描述、人體骨骼關鍵點預測以及虛擬股票趨勢預測,一時彙集了眾多關注的目光:

「AI Challenger 全球AI挑戰賽」是面向全球人工智慧(AI)人才的開放數據集和編程競賽平臺,致力於打造大型、全面的科研數據集與世界級競賽平臺,從科研角度出發,滿足學術界對高質量數據集的需求,推進人工智慧在科研與商業領域的結合,促進世界範圍內人工智慧研發人員共同探索前沿領域的技術突破及應用創新。在2017年的首屆大賽中,AI Challenger發布了千萬量級的機器翻譯數據集、百萬量級的計算機視覺數據集,一系列兼具學術前沿性和產業應用價值的競賽以及超過200萬人民幣的獎金,吸引了來自全球65個國家的8892支團隊參賽,成為目前國內規模最大的科研數據集平臺、以及最大的非商業化競賽平臺。 AI Challenger以服務、培養AI高端人才為使命,打造良性可持續的AI科研新生態。

不過AI Challenger 最吸引我的不是每項比賽數十萬元的獎金(這個掂量一下也拿不到),而是英中機器翻譯提供的高達1千萬的中英雙語句對語料,這個量級,在開放的中英語料裏僅次於聯合國平行語料庫,相當的有誘惑力:

簡介

英中機器文本翻譯作為此次比賽的任務之一,目標是評測各個團隊機器翻譯的能力。本次機器翻譯語言方向為英文到中文。測試文本為口語領域數據。參賽隊伍需要根據評測方提供的數據訓練機器翻譯系統,可以自由的選擇機器翻譯技術。例如,基於規則的翻譯技術、統計機器翻譯及神經網路機器翻譯等。參賽隊伍可以使用系統融合技術,但是系統融合系統不參與排名。需要指出,神經網路機器翻譯常見的Ensemble方法,本次評測不認定為系統融合技術。

數據說明

我們將所有數據分割成為訓練集、驗證集和測試集合。我們提供了超過1000萬的英中對照的句子對作為數據集合。其中,訓練集合佔據絕大部分,驗證集合8000對,測試集A 8000條,測試集B 8000條。訓練數據主要來源於英語學習網站和電影字幕,領域為口語領域。所有雙語句對經過人工檢查,數據集從規模、相關度、質量上都有保障。一個英中對照的句子對,包含一句英文和一句中文文本,中文句子由英文句子人工翻譯而成。中英文句子分別保存到兩個文件中,兩個文件中的中英文句子以行號形成一一對應的關係。驗證集和測試集最終是以標準的XML格式發布給參賽方。訓練條件本次評測只允許參賽方使用使用評測方指定的數據訓練機器翻譯系統,並對其排名。參賽方需遵守以下關於訓練方式的說明。參賽方可以使用基本的自然語言處理工具,例如中文分詞和命名實體識別。

大概十年前我讀研期間做得是統計機器翻譯,那個時候能接觸到的中英句對最多到過2、3百萬,用得最多的工具是知名的開源統計機器翻譯工具Moses,也在這裡寫了不少相關的文章。後來工作先後從事過機器翻譯、廣告文本挖掘相關的工作,與機器翻譯漸行漸遠。這一兩年,我花了很多時間在專利數據挖掘上,深知專利數據翻譯的重要性,也瞭解到機器翻譯對於專利翻譯有天然的吸引力。加之這幾年來深度學習如火如荼,神經網路機器翻譯橫空出世,Google, 微軟,Facebook等公司關於機器翻譯的PR一浪高過一浪,大有「取代」人翻譯的感覺,這些都都給了我很大的觸動,但是一直沒有機會走進神經網路機器翻譯。剛好這個時候自己又在家裡重新組了一臺1080TI深度學習主機,加上AI Challenger提供的機器翻譯數據機會,我把這次參賽的目標定為:

  • 瞭解目前神經網路機器翻譯NMT的發展趨勢
  • 學習並調研相關的NMT開源工具
  • 將NMT應用在中英日三語之間的專利翻譯產品上

相對於統計機器翻譯,神經網路機器翻譯的開源工具更加豐富,這也和最近幾年深度學習開源平臺遍地開花有關,每個深度學習平臺基本上都附有一兩個典型的神經網路機器翻譯工具和例子。不過需要說明的是,以下這些關於NMT工具的記錄大多數是去年9月到12月期間的調研,很多神經網路機器翻譯工具還在不斷的迭代和演進中,下面的一些描述可能都有了變化。

雖然之前也或多或少的碰到過一些NMT工具,但是這一次我的神經網路機器翻譯開源工具之旅是從OpenNMT開啟的,這個開源NMT工具由哈佛NLP組推出,誕生於2016年年末,不過主版本基於Torch, 默認語言是Lua,對於喜愛Python的我來說還不算太方便。所以首先嘗試了OpenNMT的Pytorch版本: OpenNMT-py,用AI Challenger官方平臺提供中英翻譯句對中的500萬句對迅速跑了一個OpenNMT-py的默認模型:

Step 2: Train the model

python train.py -data data/demo -save_model demo-modelThe main train command is quite simple. Minimally it takes a data file and a save file. This will run the default model, which consists of a 2-layer LSTM with 500 hidden units on both the encoder/decoder.

然後走了一遍AI Challenger的比賽流程,第一次提交記錄如下:

2017.09.26 第一次提交:訓練數據500萬, opennmt-py, default,線下驗證集結果:0.2325,線上提交測試集結果:0.22670

走完了比賽流程,接下來我要認真的審視這次英中機器翻譯比賽了,在第二輪訓練模型開始前,我首先對數據做了標準化的預處理:

  1. 數據shuf之後選擇了8000句對作為開發集,8000句對作為測試集,剩下的980多萬句對作為訓練集;
  2. 英文數據按照統計機器翻譯工具Moses 的預處理流程進行了tokenize和truecase;中文數據直接用Jieba中文分詞工具進行分詞;

這一次我將目光瞄準了Google的NMT系統:GNMT, Google的Research Blog是一個好地方: Building Your Own Neural Machine Translation System in TensorFlow,我從這篇文章入手,然後學習使用Tensorflow的NMT開源工具: Tensorflow-NMT,第一次使用subword bpe處理數據,訓練了一個4層的gnmt英中模型,記錄如下:

2017.10.05 第二次提交:訓練集988萬句對, tf-nmt, gnmt-4-layer,bpe16000, 線下驗證集結果0.2739,線上提交測試集結果:0.26830

這次的結果不錯,BLEU值較第一次提交有4個點的提升,我繼續嘗試使用bpe處理,一週後,做了第三次提交:

2017.10.12 第三次提交:訓練集988萬句對,tf-nmt, gnmt-4-layer,bpe32000, 線下驗證集結果0.2759,線上提交測試集結果:0.27180

依然有一些提高,不過幅度不大。這一次,為了調研各種NMT開源工具,我又把目光鎖定到OpenNMT,事實上,到目前為止,接觸到的幾個神經網路機器翻譯開源工具中,和統計機器翻譯開源工具Moses最像的就是OpenNMT,有自己獨立的官網,文檔相當詳細,論壇活躍度很高,並且有不同的分支版本,包括主版本 OpenNMT-lua, Pytorch版本 OpenNMT-py, TensorFlow版本 OpenNMT-tf 。所以為了這次實驗我在深度學習主機中安裝了Torch和OpenNMT-lua版本,接下來半個月做了兩次OpenNMT訓練英中神經網路翻譯模型的嘗試,不過在驗證集的結果和上面的差不多或者略低,沒有實質性提高,所以我放棄了這兩次提交。

也在這個階段,從不同途徑瞭解到Google新推的Transformer模型很牛,依然從Google Research Blog入手:Transformer: A Novel Neural Network Architecture for Language Understanding ,學習這篇神文:《Attention Is All You Need》 和嘗試相關的Transformer開源工具 TensorFlow-Tensor2Tensor。一圖勝千言,谷歌AI博客上給得這個圖片讓人無比期待,不過實際操作中還是踩了很多坑:

還是和之前學習使用開源工具的方法類似,我第一次的目標主要是走通tensor2tensor,所以跑了一個 wmt32k base_single 的英中transformer模型,不過結果一般,記錄如下:

2017.11.03 第六次實驗:t2t transformer wmt32k base_single, 線下驗證集BLEU: 0.2605,未提交

之後我又換為wmt32k big_single的設置,再次訓練英中transformer模型,這一次,終於在線下驗證集的BLEU值上,達到了之前GNMT最好的結果,所以我做了第四次線上提交,不過測試集A的結果還略低一些,記錄如下:

2017.11.06 第七次實驗:t2t transformer wmt32k big_single,線下驗證集結果 0.2759, 線上測試集得分:0.26950

不過這些結果和博客以及論文裏宣稱的結果相差很大,我開始去檢查差異點,包括tensor2tensor的issue以及論文,其實論文裏關於實驗的部分交代的很清楚:

On the WMT 2014 English-to-German translation task, the big transformer model (Transformer (big) in Table 2) outperforms the best previously reported models (including ensembles) by more than 2.0 BLEU, establishing a new state-of-the-art BLEU score of 28.4. The configuration of this model is listed in the bottom line of Table 3. Training took 3.5 days on 8 P100 GPUs. Even our base model surpasses all previously published models and ensembles, at a fraction of the training cost of any of the competitive models.

On the WMT 2014 English-to-French translation task, our big model achieves a BLEU score of 41.0, outperforming all of the previously published single models, at less than 1/4 the training cost of the previous state-of-the-art model. The Transformer (big) model trained for English-to-French used dropout rate Pdrop = 0.1, instead of 0.3.For the base models, we used a single model obtained by averaging the last 5 checkpoints, which were written at 10-minute intervals. For the big models, we averaged the last 20 checkpoints. We used beam search with a beam size of 4 and length penalty α = 0.6 . These hyperparameters were chosen after experimentation on the development set. We set the maximum output length during inference to input length + 50, but terminate early when possible.

總結起來有2個地方可以改進:第一,是對checkpoints進行average, 這個效果立竿見影:

2017.11.07 第八次實驗:t2t transformer wmt32k big_single average model, 線下驗證集得分 0.2810 , 提交測試集得分:0.27330

第二,要有高性能的深度學習伺服器。谷歌實驗中最好的結果是在8塊 P100 GPU的機器上訓練了3.5天,對我的單機1080TI深度學習主機來說,一方面訓練時對參數做了取捨,另一方面用時間換空間,嘗試增加訓練步數,直接將訓練步數增加到100萬次,結果還是不錯的:

2017.11.15 第九次實驗:t2t transformer wmt32k big_single 1000k 10beam,線下驗證集得分0.2911,線上提交測試集得分0.28560

然後繼續average checkpoints:

2017.11.16 第十次提交: t2t transformer wmt32k big_single 1000k average 10beam, 線下驗證集得分0.2930,線上提交測試集得分0.28780

這兩個方法確實能有效提高BLEU值,所以我繼續沿用這個策略,按著訓練時間推算了一下,估計這臺機器在12月初比賽正式結束前大概可以訓練一個250萬次的模型,當然,這個給自己預留了最後提交比賽結果的時間。不過在11月27日,我在英中機器翻譯比賽測試集A結束提交前提交了一個訓練了140萬次,並做了模型average的提交,算是這個賽道Test A關閉前的最後一次提交:

2017.11.27 第十一次提交 t2t transformer wmt32k big_single 1400k.beam10.a0.9.average, 驗證集 0.2938 測試集 0.28950

12月1日凌晨測試集B正式放出,這個是最終排名的重要依據,只有2次提交機會,並且結果不會實時更新,只有等到12月3號之後才會放出最終排名。我的英中2500k Transformer模型大概在12月2號訓練完畢,我做了Test B的第一次提交:

2017.12.2 average b10 a0.9: 0.2972(驗證集)

之後,我逐一檢查了保留的20個checkpoint在驗證集上的得分,最終選擇了高於平均值的11個checkpoint的average又做了第二次提交,雖然驗證集只高了0.0001, 但是在這樣的比賽中,「蚊子肉也是肉啊」:

2017.12.3 average select 11 b10 a0.9: 0.2973(驗證集)

這就是我在英中機器文本翻譯比賽中的整個歷程,在Test A的最終排名大概在二十幾名,但是最後一次模型的結果應該還能提高,所以預期是前20,剩下的就是等待TEST B的最終排名結果了。做到這個份上,其實我還挺滿意的,不過故事如果真的到此就結束了,那算不上奇遇,有意思的事情才剛開始。

AI Challenger 2017有兩個賽道和機器翻譯有關,一個是英中機器文本翻譯比賽(最高獎金30萬),另外一個是英中機器同聲傳譯比賽(最高獎金40萬),一開始報名的時候,直觀上覺得後者比較複雜,一方面獎金部分說明瞭問題,另外賽題描述部分也讓人覺得涉及到語音處理,比較複雜:

簡介

隨著最近深度學習在語音、自然語言處理裡面的應用,語音識別的錯誤率在不斷降低,機器翻譯的效果也在不斷提高。語音處理和機器翻譯的進步也推動機器同聲傳譯的進步。如果競賽任務同時考慮語音識別、機器翻譯和語音合成這些項目,參賽隊伍遇到的難度會很大。所以本次評測重點也在語音識別後的文本處理和機器翻譯任務。翻譯語言方向為英文到中文。

語音識別後處理模塊:語音識別後的文本與書面語有很多不同。識別後文本具有(1)包含有識別錯誤;(2)識別結果沒有標點符號;(3)源端為比較長的句子,例如對40~50s的語音標註後的文本,沒有斷句;(4)口語化文本,夾雜語氣詞等特點。由於本次比賽沒有提供錯誤和正確對照的文本用於訓練糾錯模塊。本次比賽提供的測試集合的源端文本是人工對語音標註後的文本,不包含識別錯誤。針對其它的特點,參賽隊伍可以這幾個方面考慮優化,但不限於以下幾個方面:1. 針對無標點的情況,參賽方可以利用提供的英文單語數據訓練自動標點模塊。用自動標點模塊對測試集合文本進行添加標點。自動標點也屬於序列標註任務,選手可以使用統計模型或是神經網路的模型進行建模。2. 針對斷句:源端文本都是比較長的文本,不利於機器翻譯,參賽者可以設定斷句策略。例如,參賽者可以依據標點來進行斷句,將每個小的分句送入機器翻譯系統。3. 針對口語化:參賽隊伍可以制定一些去除口語詞的規則來處理測試集合。機器翻譯模塊:將識別後處理的文本翻譯成目標語言。參賽隊伍需要根據評測方提供的數據訓練機器翻譯系統,可以自由的選擇機器翻譯技術。例如,基於規則的翻譯技術、基於實例的翻譯技術、統計機器翻譯及神經網路機器翻譯等。參賽隊伍可以使用系統融合技術,但是系統融合系統不參與排名。數據說明機器翻譯訓練集。我們提供了1000萬左右英中對照的句子對作為訓練集合。訓練數據領域為口語領域。所有雙語句對經過人工檢查,數據集從規模、相關度、質量上都有保障。一個英中對照的句子對,包含一句英文和一句中文文本,中文句子由英文句子人工翻譯而成。自動標點訓練數據。選手可以利用提供的1000萬文本訓練自動標點系統。驗證集和測試集。我們會分別選取多個英語演講的題材的音頻,總時長在3~6小時之間,然後按照內容切分成30s~50s不等長度的音頻數據,人工標註出音頻對應的英文文本。人工標註的文本不翻譯識別錯誤、無標點、含有語氣詞等。人工標註的好的英文文本會由專業譯員翻譯成中文文本,就形成了英中對照的句子對。抽取的英中對照的句子對會被分割為驗證集和測試集。驗證集和測試集最終是以標準的XML格式提供給選手。

我在一開始的時候考慮到這個比賽同樣提供上千萬句對的語料,所以當時順手報名了這個同聲傳譯比賽,但是直到最後一刻,我還沒有仔細看過或者準備過這個任務。不過12月2號當我第一次完成英中機器翻譯比賽的測試集B提交後,以完成作業的心態瞭解了一下這個英中機器同傳比賽的題意以及數據集,發現這裡提供的訓練集和英中機器翻譯比賽的數據是一致的,也就是說機器翻譯模塊可以復用之前訓練的英中Transformer模型,而真正需要解決的,是標點符號自動標註模塊以及斷句模塊。

感謝Google、Github和開源世界,在測試了幾個自動標點標註模塊後,我把目光鎖定在 punctuator2(A bidirectional recurrent neural network model with attention mechanism for restoring missing punctuation in unsegmented text), 一個帶attention機制的雙向RNN無標點文本標點符號還原工具,通過它很快的構建了英文文本自動標點標註模塊,並且用在了英中機器同聲傳譯比賽的驗證集和測試集上,驗證集結果不算太差,所以對應英中機器翻譯的模型,我也做了兩次測試集B的提交,但是至於結果如何,我根本無法判斷,因為在測試集A上,我沒有提交過一次,所以無法判斷測試集和驗證集的正相關性。但是完成了 AI Challenger 的相關「作業「,我基本上心滿意足了,至於結果如何,Who Care?

大約一個周之後測試集B上的結果揭曉,我在英中機器翻譯文本比賽上進了前20,英中同聲傳譯比賽上進了前10,不過前者的參數隊伍有150多支,後者不足30支,特別是測試集B的提交隊伍不到15支,有點詭異。原本以為這就結束了,不過到了12月中旬的某個週末,我微信突然收到了AI Challenger小助手的催收信息,大意是需要提交什麼代碼驗證,問我為什麼一直沒有提交?我一臉錯愕,她讓我趕緊查看郵件,原來早在一個周之前的12月9號,AI Challenger發了一封郵件,主題是這樣的:「AI Challenger 2017 TOP10 選手通知」

親愛的AI Challenger,

恭喜你,過五關斬六將進入了TOP10,進入前十的機率是0.56%,每一位都是千里挑一的人才。非常不容易也非常優秀!為了保證競賽公平公正性,您還需要在12月10日中午12點前按如下格式提交您的代碼至大賽核驗郵箱[email protected]郵件格式:主題:AI ChallengerTOP10代碼提交-隊伍名稱-賽道正文:隊伍名稱全體隊員信息:姓名-AI Challenger暱稱-電話-郵箱-所在機構-專業&年級

附件:(文件名稱)

1- 代碼非常感謝您的合作。

原來測試集B上的前10名同學需要提交代碼複核,我原來以為只有前5名需要去北京現場答辯的同學要做這個,沒想到前10名都需要做,趕緊和AI Challenger小助手溝通了一下,因為自己幾乎都是通過開源工具完成的比賽,就簡單的提交了一份說明文檔過去了。正是在參加AI Challenger比賽的同一時期,我們的專利機器翻譯產品也馬不停蹄的開展了,出於對兩個賽道前幾名隊伍BLEU值的仰望,我準備去北京旁聽一下現場答辯,所以當天還和AI Challenger小助手溝通了一下現場觀摩的問題,小助手說,前十名可以直接來,所以我覺得進入前十名還是不錯的。

沒想到第二天一早又收到Challenger小助手的微信留言,大意是:你不用自己買票來觀摩比賽了,因為前面有幾支隊伍因種種原因放棄現場答辯,你自動遞補為第5名,需要來北京參加12月21日的現場決賽答辯和頒獎禮,我們給你買機票和定酒店。喫不喫驚?意不意外?我當時的第一反應這真是2017年本人遇到最奇特的一件事情。。。然後很快收到了一封決賽邀請函:

親愛的AI Challenger,

恭喜你,過五關斬六將走到了決賽,進入決賽的機率是0.28%,每一位都是千里挑一的人才。非常不容易也非常優秀!「AI Challenger 全球AI挑戰賽」面向人工智慧領域科研人才,致力於打造大型、全面的科研數據集與世界級競賽平臺。由創新工場、搜狗、今日頭條聯合創建,旨在從科研角度出發,滿足學術界對高質量數據集的需求,推進人工智慧在科研與商業領域的結合,促進世界範圍內人工智慧研發人員共同探索前沿領域的技術突破及應用創新。2017年是AI Challenger的誕生年,我們公佈了百萬量級的計算機視覺數據集、千萬量級的機器翻譯數據集,並主辦多條細分賽道的AI競賽。本次英中機器同傳競賽主要任務為集中優化語音識別後處理和機器翻譯模塊,旨在解決機器同聲傳譯中的技術問題。......恭喜所有的入圍選手!所有的入圍者將在12月21日到中國北京進行現場答辯,本次大賽將以最終榜單排名結合答辯表現,加權計算總成績,決出最終的大獎。

在答辯之前,我們需要Top5團隊於12月18日下午17點前提交包括:

1-答辯PPT、2-隊員情況(個人姓名、個人高清半身照片、個人學校-年級-專業/公司-部門-職務、是否有指導老師-如有,請附上老師150字內簡介)3-團隊出席名單(涉及報銷事宜)4-代碼(供審查,如有作弊情況將按大賽規則處理)5-150字內個人簡介-選手手冊素材(建議為三段話,第一段話是背景介紹,包括你的學校、實驗室、師從老師等信息;第二段話可以介紹你的技術優勢,包括Paper、競賽履歷、實習履歷、項目經歷;第三段話支持自由發揮,個人主頁、你的愛好,讓我們發現一個獨一無二的你)......

雖然去北京參加現場決賽也只是陪太子讀書,不過最終還是決定去參加現場答辯,當然這裡還有一關需要驗證,前10名只需要提交代碼或者代碼描述即可,前5名參加決賽的同學還要復現整個流程,我很快被小助手拉入一個小羣,裡面有來自搜狗的工程師同學,他們給我提供了一臺深度學習機器,讓我復現整個過程以及最終核驗比賽結果。當然,留給我的時間比較緊張,12月21號要去北京參加現場答辯,當時已經是12月18號了,所以Challenger小助手特地給我將時間留到了最後一刻。準備PPT和復現整個流程同時進行(復現並不是等於重新訓練一遍,譬如機器翻譯模型可以直接上傳之前訓練好的),終於趕在最後時刻完工。不過我自己答辯現場的感覺匆匆忙忙,效果也一般,但是學習了一圈其他獲獎隊伍的思路,很有收穫:Transformer是主流獲獎模型,但是很多功夫在細節,包括數據預處理階段的篩選,數據 & 模型後處理的比拼,當然,牛逼的深度學習機器也是不可或缺的。

附上當時現場答辯PPT上寫得幾點思考,拋磚引玉,歡迎大家一起探討機器翻譯特別是神經網路機器翻譯的現狀和未來:

  • NMT開源工具的生態問題,這個過程中我們嘗試了OpenNMT, OpenNMT-py, OpenNMT-tf, Tensorflow-nmt, Tensor2Tensor等工具, 總體感覺OpenNMT的生態最完備,很像SMT時代的Moses
  • NMT的工程化和產品化問題,從學術產品到工程產品,還有很多細節要打磨
  • 面向垂直領域的機器翻譯:專利機器翻譯是一個多領域的機器翻譯問題
  • 由衷感謝這些從idea到開源工具都無私奉獻的研究者和從業者們,我們只是站在了你們的肩膀上

當然,參加完AI Challenger比賽之後我們並沒有停止對於神經網路機器翻譯應用的探索,也有了一些新的體會。這半年來我們一直在打磨AIpatent機器翻譯引擎,目標是面向中英專利翻譯、中日專利翻譯、日英專利翻譯提供專業的專利翻譯引擎,歡迎有這方面需求的同學試用我們的引擎,目前還在不斷迭代中。

註:原創文章,轉載請註明出處及保留鏈接「我愛自然語言處理」:http://www.52nlp.cn

本文鏈接地址:AI Challenger 2017 奇遇記 52nlp.cn/?


推薦閱讀:
查看原文 >>
相關文章