資料是訓練模型的必須品,但搜集資料可能不是一件容易的事,有時甚至需要花大錢。因此今天我要介紹省錢有效的方式擴增訓練資料。
資料能有多花錢?
如果資料只能用人工的方式主動生產就會很花錢。為了製作英文問答集SQuAD,史丹佛的Rajpurkar等人用每小時十塊半美金請一批工人用每篇7分鐘、閱讀超過500篇文章,並要求為每個人為一篇文章想出五題可回答或不可回答的題目,一共約有15萬題。又接著請了另一批工人,以每題一分鐘回答這些問題,每一個問題平均被回答4.8次。如果還要包含那些因為品質不佳而被剔除的問答,可能總花費超過台幣百萬,比八成台灣人的年薪還要多。
同樣很花錢的資料:翻譯
翻譯模型所需要的資料也是需要人工主動生產的,所以很貴。儘管網路上有好心人提供不同語言與情境的翻譯資料讓人免費下載,但是數量有限。其中一個有名的網站是Statistical Machine Translation,整理了數種不同語言間的翻譯資料。這些免費資料作為學習材料或模型效能量尺的話夠用,但是如果想要做出有競爭力的模型,更多的資料是必須的。畢竟做科學研究就像是在游泳跑步,你做什麼對方也跟著做什麼。你有的免費資料其他研究生也都有,如果沒點私貨,又怎麼能做出更出色的模型呢?
因為我們需要的是成對的雙語句子,所以才昂貴。每天都有成千上萬的人說著某種語言,也有成千上萬的人說著另一種。這些資料相當便宜,因為這是人們日常生活中的副產物。如果我們能夠用一堆沒有翻譯過的中文或英文句子訓練模型呢?這就是我今天想要跟大家討論的,如何從側面增加資料量。
模型是怎麼學翻譯的?
一位優秀的雙語人士應該要懂得在理解語句的意思後,用另一種語言說出來。當訓練模型的時候,模型也必須完美達成這項任務。「理解一段話,用另一種語言說出來」只能使用成對的句子訓練,我們無從下手。但是只想要使模型「理解一段話」,可以有另類的訓練方式。那就是請模型學習「詞語接龍」。
詞語接龍?跟翻譯有什麼關係?
這個詞語接龍跟台灣人平常玩得不一樣,並不是要用前一個詞的最後一個字作為下一個詞的開頭。而是要用一個合理的詞讓句子延續。就像在說話一樣,不斷的用適合的詞接續已經講過的話。因此詞語接龍的訓練資料非常容易取得,去各大社群網站、維基百科、部落格爬文章下來作為資料就可以了。透過詞語接龍,模型會學習到如何用前文推斷後文的可能性分佈,我們認為這有助於模型理解句子。
詞語接龍是一種「預訓練」
在中翻英的例子中,假設我們請模型先學習詞語接龍、再接著學中翻英,那麼「詞語接龍」就是該模型預訓練(pre-training) 、「中翻英」就是下游任務(downstream task)。預訓練的意思是使用不同於目標的方法訓練模型,使模型的參數可以調整到比較好的值,讓模型可以更好的學習下游任務。
順帶一提,使用「詞語接龍」作為預訓練最有名的團隊是OpenAI的GPT。他們的GPT-3極為龐大,有1750億個參數,用來預訓練的文字數大約是5000億(size ~ 50TB)。GPT-3厲害的地方在於它已經預訓練過太多資料了,當他想要學「翻譯」或是「為文章寫摘要」等等下游任務時,往往只需要少少的範例就可以學個七七八八。雖然GPT-3在各個自然語言任務上都比不上個別精調過(fine-tuned)的模型,但勝在泛用性高。
怎麼尋找適合的預訓練?
雖然沒有定理可證有預處理的模型一定比較好,但是目前學界與商用的模型都有經過一定程度的預訓練。預訓練是自然語言處理(Natural Language Processing) 及強化學習(Reinforcement Learning) 的一大工具。很有可能還有其他類型的模型可以透過預訓練學得更好。但是模型有千萬種可能,面對沒人嘗試過的模型,我們應該從哪裡下手呢?
問自己:這個模型的任務是什麼?
模型的任務等同於模仿兩組資料之間的轉換(Transform)。例如將$V$空間的資料$a$透過轉換$T$送到$W$空間的資料$b$,如式(1)。這樣的任務也稱為監督式學習(Supervised Learning),大部分的任務都是這副模樣,讀者可以試著想看看要怎麼用轉換來描述圖片辨識、翻譯與自駕車AI;如果$W$與$V$是同一個空間,則轉換變成式(2)。這下事情就有趣了,從一個空間的資料轉換到同一個空間的另一筆資料是什麼意思?其實也沒有什麼特別的,就只是輸入與輸出的資料來自於同一個資料集,我們先前提到的「詞語接龍」就是其中一種,這類任務稱為非監督式學習(Unsupervised Learning)。非監督式學習可以使模型更理解同一資料集內資料與資料的關係。
$T: V \rightarrow{} W$ (1)
$T: V \rightarrow{} V$ (2)
預訓練首選非監督式學習
非監督式學習的資料取得通常便宜得多、也不需要使用成對的資料,並且同一資料集的資料內部關係可能不是監督式學習能夠好好教給模型的,因此是非監督式學習是個很好的預訓練方式,補足監督式學習的缺點。舉個例子,如果是要做中翻英的模型,我會先讓負責讀取中文的神經元們了解中文,也讓負責讀取英文的神經元們了解英文,再接著讓這兩組神經元一起學中翻英;如果我今天要做自駕車AI模型,我可以先用非監督式學習教模型哪些感應器資訊是重要的,然後再用強化學習教模型開車,效果會比只用強化學習更好。相關的例子無法窮舉,只能留待讀者在實作中慢慢體會。
小結
成本、效能、效率都是訓練模型的時候必須要考慮的因素。我們的困境來自於資料的邊際成本會隨著資料量的增加而顯著增加。為了合理的使用成本,預訓練成為一種常用且泛用的解決方案。想要使用預訓練,就必須將主要的「下游任務拆解成數個小任務」,針對各個小任務設計相對應的預訓練。預訓練通常會採用非監督式學習。經驗上,預訓練過的模型有更好的參數,可以把下游任務學得又快又好。這裡有我在《讓機器能言善道的五個小訣竅》示範過的中翻英玩具模型還有前處理。讀者可以試試看用預訓練超越這個玩具模型喔!(應該挺簡單的吧)
參考
Know What You Don’t Know: Unanswerable Questions for SQuAD, Pranav Rajpurkar, Robin Jia, Percy Liang, 2020
Language Model are Few-Shot Learners, Brone et al., 2020
所有文章分類