如何建立一個以字母為基礎的語言模型

如何建立一個以字母為基礎的語言模型

自然語言處理的最小資訊單位有很多種可能。以字母做為基礎的語言模型是其中流行的一種,他的特色是模型參數量少、不需要複雜的前處理、而且訓練的過程較穩定。我將會介紹為什麼要使用字母訓練語言模型、前處理要做什麼、以及要怎麼訓練。

為什麼要使用字母?

使用字母作為基礎 (char-based) 的話有很多好處:第一點是不需要考慮更高級的文法問題,例如時態與單雙數。句子能直接用於訓練,也不會被輔助的語言模型影響發揮(e.g. 每當我開除一個語言學家,語音辨識系統就更精準了)。第二點是模型較為輕便,自然語言模型會有一層神經網路是用來輸入文字編碼、輸出高維向量的,我們稱之為嵌入層(Embedding Layer)。這層網路的目的是使用高維空間描述文字與文字之間的關係。在所有的自然語言模型中,字母語言模型的嵌入層是最簡單的,因為字母所承載的資訊量最少,任何在字母之上做變化的資訊處理方式,例如文字,他們的嵌入層都不可避免的變得複雜。

資料搜集與前處理

讓我們試著使用以字母為基礎的自然語言模型處理用中翻英任務吧!我們可以在這裡下載成對的中文與英文句子。我們的前處理包含三個部分:分配流水號給每一個字母、選取適當長度的句子做訓練、並且標記句子的起訖。我提供我的原始碼給大家做參考。

分配流水號

分配流水號給每一個字母這件事應該很好理解,因為在電腦上用數字去計算比使用字串快得多,反正電腦也沒有記憶上的困難,所以我們就使用流水號替代掉字母。

句子的長度

選取適當長度的句子做訓練這件事就比較奇妙了。理論上我們想要這個模型可以勝任任何的中翻英任務,但現實是為了有效率的訓練該模型,每一個輸入的句子的長度必須一樣長。我們可以在不夠長的句子後面加空格增加長度,但是太長的句子我們就只能捨棄了。選取適當的句子長度有助於訓練模型,換句話說,句子長度不能被亂定,通常會介於句子的平均長度到兩個標準差之間。

標記句子的起訖

這是序列序列模型( Sequence-to-Sequence Model) 的特色之一。模型總是根據輸入的資訊輸出下一個字。但是每一個句子的第一個字之前並沒有任何文字,該怎麼辦?當我們希望模型輸出第一個字的時候,我們就會在輸入端放上 Begin of Sequence (BOS)。BOS 說穿了就只是一個代號,我們希望模型每次看到這個代號的時候,輸出可能的第一個字。與之相對的是End of Sequence (EOS),用來標示句子已經結束。當輸入模型的是句子的最後一個字,我們希望模型輸出EOS,相當於告訴我們句子已經結束了。

訓練模型

我借鑒了讓機器能言善道的五個小訣竅的中翻英模型,在相同的架構下稍作修改,如圖一。我把我的模型的原始碼給大家參考。我們使用最容易實作的Maximize Likelihood Estimation訓練模型,不加額外的花招。這只是我閒來無事所做的玩具模型,裡頭的參數沒有經過微調,但即使如此,這個模型的損失函數還是很低、大約0.6,並且講出來的句子符合文法,可惜還沒有辦法講出具有正常文意的句子。

圖一:中翻英模型示意圖

小結

自然文字處理是出了名的困難,因為人類發明的語言缺少統一的邏輯又充滿了例外。更令人意外的是,儘管人類拼命解釋語言的架構,最強的自然語言處理方式卻是人類也無法解釋的深度學習模型。這讓自然語言處理充滿了魅力,希望這套以字母為基礎的自然語言模型能夠成為讀者的敲門磚、踏上這條路,用無法解釋的事情,解釋另一件無法解釋的事情。

所有文章分類

訂閱我吧

不再錯過每一篇新文章

*

Yi-Lung Chiu