之前介紹的模型都是基于詞向量的, 那么能不能換一個角度來表示語言。說英文的時候, 每個單詞都是由音節(jié)構(gòu)成的, 而人們聽到了連續(xù)的音節(jié)就可以理解其中的含義, 而音節(jié)顯然比詞粒度更細(xì)。
首先,來梳理下word-level存在的幾個問題:
需要系統(tǒng)需要極大的詞匯量;
如果遇到了不正式的拼寫, 系統(tǒng)很難進(jìn)行處理;
做翻譯問題時, 音譯姓名比較難做到。
為了解決這些問題, 一開始想到的是采用character級別的模型,即對26個字母訓(xùn)練word2vec,每個詞由其字母的embedding拼接或者求平均得到。但這種方法梯度消失(爆炸)的問題也會更嚴(yán)重。
后來,人們就想用subword模型作為character和word的折中模型。subword模型主要有兩種,它們都能解決未登錄詞(OOV)的問題。第一種是模型結(jié)構(gòu)和word模型完全一樣,只不過把word換成了subword。第二種則是word和character模型的雜交模型。
一、人類語言聲音:語音學(xué)和音系學(xué)
語音學(xué)(Phonetics)是一種非常基本的理論,只要是正常人,有著相同的人體器官和相同的發(fā)聲結(jié)構(gòu),就會遵循著相同的發(fā)聲規(guī)則和原理。
語音體系(Phonology)是有語義的聲音的合集,各國各文明的人都會制定自己的語音體系。
音素(Phoneme)是語音中劃分出來的最小的語音單位,分為元音和輔音
國際音標(biāo)(由音素構(gòu)成)按理來說可以表示所有的語音,但是會發(fā)現(xiàn)好多語音是沒有語義的,這時我們采取的辦法就是看音素的下一級(part of words)。
詞法學(xué):一個n-grams的代替方案。在基于單詞的模型中存在一些問題:需要處理很大的詞匯表,在英語中單詞只要變個形態(tài)就是另一個單詞了,比如說:gooooood bye
二、字符級模型(Character-LevelModels)
通常針對字符級的模型有兩種處理思路:一種是把原有的詞向量分解處理,一種是把連接的語言分解成字符。
單詞嵌入可以由字符嵌入表示:
能為不知道的單詞生成嵌入
相似的拼寫有相似的嵌入
解決了oov問題
這兩種方法都被證明是成功的。后續(xù)也有很多的工作使用字符級的模型來解決NMT任務(wù)。但這些任務(wù)有一些共同的缺點(diǎn),由于從單詞替換成字符導(dǎo)致處理的序列變長,速度變慢;由于序列變長,數(shù)據(jù)變得稀疏,數(shù)據(jù)之間的聯(lián)系的距離變大,不利于學(xué)習(xí)。于是2017年,Jason等人發(fā)表了論文Fully Character-Level Neural MachineTranslation without Explicit Segmentation 解決了這些問題。
論文的模型結(jié)構(gòu)如圖所示:
首先是對輸入的character首先做一個embedding, 然后分別與大小為3,4,5的filter進(jìn)行卷積運(yùn)算,就相當(dāng)于3-grams, 4-grams和5-grams。之后進(jìn)行max-pooling操作,相當(dāng)與選出了有語義信息的segment-embedding。之后將這些embedding送入Highway Network(相當(dāng)于resnet, 解決了深層神經(jīng)網(wǎng)絡(luò)不容易訓(xùn)練的問題)后再通過一個單層的雙向GRU,得到最終的encoder的output。之后經(jīng)過一個character-level的GRU(作為decoder)得到最終結(jié)果。
還有一篇2018年的文章(Revisiting Character-Based Neural Machine Translation with Capacity andCompression. 2018.Cherry, Foster, Bapna, Firat, Macherey, Google AI)中展示了純字符級模型的效果。此論文表明在一些復(fù)雜的語言中(比如捷克語),character級別的模型會大幅提高翻譯準(zhǔn)確率,但在較為簡單的語言中(如英語法語),character級別的模型提升效果不顯著。同時,研究發(fā)現(xiàn)在模型較小時word-level的模型效果更好,在模型較大時character-level 的效果更好。如圖所示:
總之,現(xiàn)有的character-level的模型在NMT任務(wù)上可以更好的處理OOV的問題,可以理解為我們可以學(xué)習(xí)一些字符級別的語義信息幫助我們進(jìn)行翻譯。
三、子詞模型(Sub-word models)
所謂subword,就是取一個介于字符和單詞之間成分為基本單元建立的模型。而所謂Byte Pair Encoding(一下簡稱BPE),就是尋找經(jīng)常出現(xiàn)在一起的Byte對,合并成一個新的Byte加入詞匯庫中。即若給定了文本庫,若我們的初始詞匯庫包含所有的單個字符,則我們會不斷的將出現(xiàn)頻率最高的n-gram的pair作為新的n-gram加入詞匯庫中,直到達(dá)到我們的要求。
課程在這里介紹了介于word-level和char-leval之間的Sub-word models,主要一般有兩種結(jié)構(gòu),一種是仍采用和word-level相同的結(jié)構(gòu),只不過采用更小的單元word pieces來代替單詞;另一種是hybrid architectures, 主要部分依然是基于word, 但是其他的一些部分用characters。
Hybrid architectures:主要的模型含有單詞,一些其他的含有字符、字節(jié)對的編碼。使用的是一個壓縮算法:將大部分頻繁出現(xiàn)的字節(jié)對標(biāo)記為新的字節(jié)對。
3.1 Byte Pair Encoding(BPE)
Byte Pair Encoding,簡稱BPE,是一種壓縮算法。
給定了文本庫,我們的初始詞匯庫僅包含所有的單個的字符,然后不斷的將出現(xiàn)頻率最高的n-gram pair作為新的n-gram加入到詞匯庫中,直到詞匯庫的大小達(dá)到我們所設(shè)定的某個目標(biāo)為止。如圖所示:
上述例子是,比如有一個初始的文本庫和詞匯庫。首先,可見此時出現(xiàn)頻率最高的n-gram pair是“e,s”,出現(xiàn)了9次,因此我們將“es”作為新詞加入到詞匯庫中同時更新文本庫。然后,這時詞匯庫中出現(xiàn)頻率最高的n-gram pair是“es,t”,出現(xiàn)了9次,因此我們將“est”加入詞匯庫中同時更新文本庫。依次類推,可以逐漸的通過增加新的n-gram的方式達(dá)到我們的目標(biāo)。對于現(xiàn)實(shí)生活中有很多詞匯量非常大的task,這種通過BPE逐步建立詞匯庫的方式就顯得非常有用了。
使用這種方法可以自動生成vocab。
谷歌的NMT模型有兩個版本,版本一采用的是BPE模型,版本二對BPE模型進(jìn)行了改進(jìn),稱為wordpiece mode。這種方法不在使用n-gram的計(jì)算來算,而是使用搜索算法搜索最大化的該語言模型的片段去選擇pieces。
另外還有一種模型叫sentencepiece,它直接從raw text中獲取,同時把空格視為一種特殊的token(_)
課程介紹了幾篇在這方面發(fā)展的論文,有用Character-level去產(chǎn)生詞向量的(LearningCharacter-level Representations for Part-of Speech Tagging),還有用char-level結(jié)合high-way網(wǎng)絡(luò)進(jìn)行機(jī)器翻譯的。
課程分析用char-level得到詞向量的特點(diǎn),經(jīng)由他們直接輸出的word-embedding更傾向于在形狀上相似,輸入high-way之后,形狀上的相似會朝含義上的相似發(fā)展。如圖所示:
使用char-level的可以輕易解決,此沒有出現(xiàn)在詞庫的情況,如圖所示:
四、混合字符和詞級模型
4.1 Hybrid NMT
核心思想:大部分時候都使用word-level的模型來做translate,只有在遇到rare or unseen的words的時候才會使用character-level的模型協(xié)助。這種做法產(chǎn)生了非常好的效果。
混合模型即兩種方式并存的模型,在正常處理時采用word-level的模型,當(dāng)出現(xiàn)奇怪的詞的后,使用char-level級的模型。
一篇論文的結(jié)構(gòu)如圖所示:
可以看到輸入未知的單詞時,采用char-level進(jìn)行編碼,輸出《 unk 》時也采用char-level級的進(jìn)行解碼。同時訓(xùn)練跟beam-search也時要同時對兩個結(jié)構(gòu)進(jìn)行。
4.2 Chars for word embeddings
采用subword的方式長生詞向量,課程中提到了FastText。主要思路如圖所示:
字符的卷積來生成詞嵌入
使用pos標(biāo)記固定的窗口
五、FastText
使用n-grams和整個單詞來代表單詞。我們知道在word2vec方法中我們基于word-level的模型來得到每一個單詞的embedding,但是對于含有許多OOV單詞的文本庫word2vec的效果并不好。由此很容易聯(lián)想到,如果將subword的思想融入到word2vec中是不是會產(chǎn)生更好的效果呢?
FastText embeddings是一個word2vec like embedding。用where舉例, 它把單詞表示成了: “where = 《wh, whe, her,ere, re》, 《where》”這樣的形式。 注意這里的“《》”符號是表達(dá)了開始和結(jié)束。 這樣就可以有效地解決OOV的問題, 并且速度依然很快。
然后把它們加起來:
于是,就可以使用原有的word2vec算法來訓(xùn)練得到對應(yīng)單詞的embedding。其保證了算法速度快的同時,解決了OOV的問題,是很好的算法。
5.1 FastText和word2vec的區(qū)別
1. 相似處:
圖模型結(jié)構(gòu)很像,都是采用embedding向量的形式,得到word的隱向量表達(dá)。
都采用很多相似的優(yōu)化方法,比如使用Hierarchicalsoftmax優(yōu)化訓(xùn)練和預(yù)測中的打分速度。
2. 不同處:
模型的輸出層:word2vec的輸出層,對應(yīng)的是每一個term,計(jì)算某term的概率最大;而fasttext的輸出層對應(yīng)的是分類的label。不過不管輸出層對應(yīng)的是什么內(nèi)容,起對應(yīng)的vector都不會被保留和使用。
模型的輸入層:word2vec的輸出層,是 context window 內(nèi)的term;而fasttext 對應(yīng)的整個sentence的內(nèi)容,包括term,也包括 n-gram的內(nèi)容。
3. 兩者本質(zhì)的不同,體現(xiàn)在 h-softmax的使用:
Word2vec的目的是得到詞向量,該詞向量 最終是在輸入層得到,輸出層對應(yīng)的 h-softmax也會生成一系列的向量,但最終都被拋棄,不會使用。
fastText則充分利用了h-softmax的分類功能,遍歷分類樹的所有葉節(jié)點(diǎn),找到概率最大的label(一個或者N個)
FastText是一個能用淺層網(wǎng)絡(luò)取得和深度網(wǎng)絡(luò)相媲美的精度,并且分類速度極快的算法。按照作者的說法“在標(biāo)準(zhǔn)的多核CPU上,能夠訓(xùn)練10億詞級別語料庫的詞向量在10分鐘之內(nèi),能夠分類有著30萬多類別的50多萬句子在1分鐘之內(nèi)”。但是它也有自己的使用條件,它適合類別特別多的分類問題,如果類別比較少,容易過擬合。
六、寫到最后
本文介紹了Subword Model的兩種模型。對于第一種模型,其關(guān)鍵點(diǎn)在于怎樣得到subword,在此采用BPE算法來提取高頻Subword的形式。第二種被稱為雜交模型的方法相對簡單,是在文本中有這個word時就用word embedding,沒有的時候就用char embedding來學(xué)習(xí)word embedding,非常簡單。
-
Model
+關(guān)注
關(guān)注
0文章
339瀏覽量
25061
原文標(biāo)題:【NLP入門】通俗講解Subword Models
文章出處:【微信號:zenRRan,微信公眾號:深度學(xué)習(xí)自然語言處理】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論