官术网_书友最值得收藏!

1.2 文本特征表示方法

文本特征表示就是把文字表示成計(jì)算機(jī)能夠運(yùn)算的數(shù)字或者向量。在機(jī)器學(xué)習(xí)問(wèn)題中,我們從訓(xùn)練數(shù)據(jù)集中學(xué)習(xí)到的其實(shí)就是一組模型的參數(shù),然后通過(guò)學(xué)習(xí)得到的參數(shù)確定模型的表示,最后用這個(gè)模型進(jìn)行后續(xù)的預(yù)測(cè)或分類等任務(wù)。在模型訓(xùn)練過(guò)程中,我們會(huì)對(duì)訓(xùn)練數(shù)據(jù)集進(jìn)行抽象、抽取大量特征,其中既有離散型特征,也有連續(xù)型特征。針對(duì)不同類型的數(shù)據(jù),常用的文本特征表示方法有離散型特征表示方法和分布型特征表示方法。

1.2.1 離散型特征表示方法

簡(jiǎn)單來(lái)看,離散型數(shù)據(jù)是可數(shù)的,其變量值可以按照一定的順序一一列舉。離散特征的數(shù)值只能用自然數(shù)表示,包括個(gè)數(shù)、人數(shù)、年齡、城市等。在機(jī)器學(xué)習(xí)中,對(duì)于離散型的數(shù)據(jù),我們常使用獨(dú)熱編碼、詞袋模型和TF-IDF進(jìn)行特征表示。

1.獨(dú)熱編碼特征表示

獨(dú)熱編碼(One-Hot Encoding)又稱一位有效編碼,其方法是使用N位狀態(tài)寄存器對(duì)N個(gè)狀態(tài)進(jìn)行編碼,每個(gè)狀態(tài)都有獨(dú)立的寄存器位,并且在任何時(shí)候,獨(dú)熱編碼都只有一位有效,即只有一位是一,其余都是零。獨(dú)熱編碼是機(jī)器學(xué)習(xí)中的“萬(wàn)金油”,任何非數(shù)值類型的數(shù)據(jù)都可以直接或間接地進(jìn)行獨(dú)熱編碼。下面結(jié)合具體例子對(duì)獨(dú)熱編碼進(jìn)行闡述。

對(duì)于性別特征,按照N位狀態(tài)寄存器對(duì)N個(gè)狀態(tài)進(jìn)行編碼后的結(jié)果為:男:[1, 0]女:[0, 1],這里N=2。

對(duì)下面的語(yǔ)料進(jìn)行獨(dú)熱編碼:

針對(duì)上述語(yǔ)料,我們要確認(rèn)該語(yǔ)料需要多少個(gè)狀態(tài)寄存器,實(shí)際上就是統(tǒng)計(jì)語(yǔ)料中出現(xiàn)過(guò)的單詞數(shù)。該案例的N=10,該語(yǔ)料構(gòu)造的詞典為:

該語(yǔ)料的獨(dú)熱編碼結(jié)果為:

具體可以采用sklearn(scikit-learn)中的OneHotEncoder實(shí)現(xiàn),代碼如下:

其結(jié)果如圖1-1所示。

圖1-1 獨(dú)熱編碼結(jié)果

獨(dú)熱編碼的優(yōu)缺點(diǎn)分析如下。

優(yōu)點(diǎn)如下:獨(dú)熱編碼為分類器處理離散型數(shù)據(jù)提供了方法,且能在一定程度上擴(kuò)充樣本特征數(shù)。

缺點(diǎn)如下:

1)當(dāng)類別數(shù)量很多時(shí),特征空間會(huì)很大,如當(dāng)整個(gè)語(yǔ)料庫(kù)中含有1000萬(wàn)個(gè)單詞時(shí),其獨(dú)熱編碼維度為1000萬(wàn),這就導(dǎo)致了維度爆炸,在這種情況下,一般可以使用PCA方法來(lái)減少特征維度;

2)該編碼方法無(wú)法衡量不同詞之間的相似關(guān)系,比如“i”和“me”的語(yǔ)義十分相似,但在獨(dú)熱編碼中表示為兩個(gè)完全不同的向量;

3)該編碼只能反映某個(gè)詞是否在句子中出現(xiàn),無(wú)法衡量不同詞在句子中的重要程度;

4)獨(dú)熱編碼不考慮詞與詞之間的順序;

5)獨(dú)熱編碼得到的結(jié)果是高維稀疏矩陣,會(huì)浪費(fèi)大量的計(jì)算資源和存儲(chǔ)空間。

2.詞袋模型特征表示

詞袋(Bag Of Word, BOW)模型是指假設(shè)文本中的每個(gè)詞都是獨(dú)立的,僅使用詞在文章中出現(xiàn)的頻率決定詞表達(dá),并將每個(gè)詞的表達(dá)進(jìn)行簡(jiǎn)單的組合后來(lái)表示整個(gè)文本。詞袋模型也稱為計(jì)數(shù)向量表示,它不考慮語(yǔ)序和詞法信息。接下來(lái)我們通過(guò)一個(gè)例子來(lái)詳細(xì)講解詞袋模型的原理。假設(shè)有如下3篇簡(jiǎn)短文章:

首先,我們需要構(gòu)建詞袋,即將文章中的所有詞提取出來(lái)放在一個(gè)袋子中:

共得到包含8個(gè)詞的詞袋,所以把每篇文章的維度固定為8。接下來(lái)我們需要統(tǒng)計(jì)詞頻,對(duì)詞袋中的每個(gè)詞統(tǒng)計(jì)其在文章中出現(xiàn)的頻率,并按順序一一記錄,如文章1中,“今天”出現(xiàn)1次,“唱歌”出現(xiàn)1次,“喜歡”出現(xiàn)0次,“小明”出現(xiàn)0次,“我們”出現(xiàn)2次,“打球”出現(xiàn)0次,“明天”出現(xiàn)1次,“爬山”出現(xiàn)1次。因此,3篇文章的編碼結(jié)果為:

觀察得到的結(jié)果:橫向來(lái)看,我們將每條文本都表示成一個(gè)向量;縱向來(lái)看,不同文檔中單詞的個(gè)數(shù)可以構(gòu)成某個(gè)單詞的詞向量。可以采用sklearn中的CountVectorizer函數(shù)實(shí)現(xiàn),代碼如下所示:

詞袋模型表示方法的優(yōu)缺點(diǎn)分析如下。

優(yōu)點(diǎn)如下:詞袋模型除了考慮都有哪些詞在文本中出現(xiàn)外,還考慮了詞語(yǔ)出現(xiàn)的頻次,用出現(xiàn)詞語(yǔ)的頻次來(lái)突出文本主題,進(jìn)而表示文本的語(yǔ)義,簡(jiǎn)單快捷,易于理解。

缺點(diǎn)如下:

1)向量稀疏度較高,當(dāng)詞袋較大時(shí),容易產(chǎn)生維度爆炸現(xiàn)象。這主要是因?yàn)樵~袋模型表示方法是對(duì)整個(gè)文檔進(jìn)行編碼,但大多數(shù)情況下,一個(gè)文檔中所包含的單詞數(shù)是遠(yuǎn)小于整個(gè)語(yǔ)料庫(kù)中所含單詞數(shù)的;

2)詞袋模型表示方法忽略了詞的位置信息,而位置信息可以體現(xiàn)不同詞之間的前后邏輯性;

3)該表示方法只能統(tǒng)計(jì)詞語(yǔ)在文本中出現(xiàn)的頻次,不能衡量每個(gè)詞的重要程度,如存在大量的語(yǔ)氣助詞、虛詞等卻對(duì)語(yǔ)義理解沒(méi)有實(shí)質(zhì)性的幫助;

4)詞袋模型假設(shè)文本中詞與詞之間相互獨(dú)立,上下文沒(méi)有關(guān)聯(lián)性,有悖人類語(yǔ)言規(guī)律。

3.TF-IDF特征表示

TF-IDF(詞頻-逆文檔頻率)是文本處理中常用的一種統(tǒng)計(jì)方法,該方法可以評(píng)估一個(gè)單詞在文檔中的重要程度。單詞的重要性與它在當(dāng)前文本中出現(xiàn)的頻率成正比,與它在語(yǔ)料庫(kù)的其他文本中出現(xiàn)的頻率成反比。TF-IDF的分?jǐn)?shù)代表了單詞在當(dāng)前文檔和整個(gè)語(yǔ)料庫(kù)中的相對(duì)重要性。TF-IDF由兩部分組成:第一部分是詞頻(Term Frequency, TF),第二部分是逆文檔頻率(Inverse Document Frequency, IDF)。

T F:關(guān)鍵詞w在文檔Di中出現(xiàn)的頻率,公式如下。

其中,count(w)為關(guān)鍵詞w在文檔Di中出現(xiàn)的次數(shù),|Di|為文檔Di中所有詞的數(shù)量。

DF(Document Frequency,文檔頻率):表示關(guān)鍵詞w在其他文檔中出現(xiàn)的頻率。

IDF:反映關(guān)鍵詞的普遍程度,當(dāng)一個(gè)詞越普遍,也就是有大量文檔包含這個(gè)詞時(shí),其IDF值就會(huì)越低,這就意味著該單詞的重要性不高,反之,IDF值越高,該單詞的重要性越高。

注意,在IDF計(jì)算公式中,由于對(duì)數(shù)函數(shù)的底數(shù)無(wú)論是多少均不影響數(shù)值的變化趨勢(shì),所以書(shū)中不再標(biāo)注底數(shù),統(tǒng)一用log形式。其中,N為語(yǔ)料庫(kù)中的文檔總數(shù),Iw,Di)表示文檔Di是否包含關(guān)鍵詞,若包含則為1,不包含則為0。但在一些特殊情況下,IDF公式可能會(huì)有一些小問(wèn)題,比如某一個(gè)生僻詞在我們的語(yǔ)料庫(kù)中沒(méi)有出現(xiàn)過(guò),那么IDF公式中的分母就為0,IDF就沒(méi)有意義了。因此,需要對(duì)IDF進(jìn)行平滑處理,在分母位置加1,保證其不為0:

關(guān)鍵詞w在文檔Di中的TF-IDF值為:

一個(gè)單詞的TF-IDF值越大,意味著該單詞越重要。接下來(lái)通過(guò)一個(gè)簡(jiǎn)單的例子演示如何計(jì)算TF-IDF。

上述語(yǔ)料庫(kù)的詞典為[今天,上,NLP, 課程,的,有,意思,數(shù)據(jù),也],該詞典的長(zhǎng)度為9。由TF-IDF的公式求得每個(gè)句子的TF-IDF向量表示如下:

句子1:

句子2:

句子3:

當(dāng)然,我們也可以直接借助sklearn庫(kù)中的TfidfVectorizer實(shí)現(xiàn)TF-IDF的計(jì)算,其實(shí)現(xiàn)代碼如下:

TF-IDF的優(yōu)點(diǎn)如下:TF-IDF特征表示方法除了考慮有哪些詞在文本中出現(xiàn)外,還考慮單詞出現(xiàn)的頻率以及單詞在整個(gè)語(yǔ)料庫(kù)上的頻率倒數(shù)。單詞出現(xiàn)的詞頻可以突出文本的主題,單詞的逆文檔頻率可以突出文檔的獨(dú)特性,進(jìn)而反映文本的語(yǔ)義。此外,TF-IDF簡(jiǎn)單快速,結(jié)果比較符合實(shí)際。

TF-IDF的缺點(diǎn)如下:TF-IDF只考慮了單詞的詞頻,忽略了詞與詞的位置關(guān)系,例如在提取關(guān)鍵詞時(shí),詞的位置信息起到至關(guān)重要的作用,如文本的標(biāo)題、文本的首句和尾句等包含比較重要的內(nèi)容,應(yīng)該賦予較高的權(quán)重。TF-IDF假定詞與詞之間是相互獨(dú)立的,忽略了文本的上下文信息。此外,TF-IDF嚴(yán)重依賴語(yǔ)料庫(kù)的選取,很容易將生僻詞的重要性放大。同時(shí),TF-IDF得到的向量稀疏度較高,會(huì)浪費(fèi)大量的計(jì)算資源和存儲(chǔ)空間。

1.2.2 分布型特征表示方法

離散型特征表示方法雖然實(shí)現(xiàn)了文本的向量表示,但是離散型特征表示方法僅僅是對(duì)單詞進(jìn)行符號(hào)化,不包含任何語(yǔ)義信息。如何將語(yǔ)義信息融入詞表示中呢?Harris和Firth先后對(duì)分布假說(shuō)進(jìn)行定義和完善,提出上下文相似的詞的語(yǔ)義信息也是相似的,這也就是說(shuō)單詞的語(yǔ)義信息是由單詞的上下文決定的。基于該假說(shuō),研究者提出了分布型特征表示方法。分布型表示是指一種稠密的、低維度向量化的單詞表示方法。假設(shè)我們有蘋(píng)果、香蕉和梨三種水果,我們希望將這三個(gè)詞轉(zhuǎn)化為程序可以識(shí)別的向量。離散型特征表示方法會(huì)有如下轉(zhuǎn)換:蘋(píng)果=[1, 0, 0],香蕉=[0, 1, 0],梨=[0, 0, 1]。可以看出每種水果對(duì)應(yīng)了向量中的某一位,其余位是0。如果水果種類增加了,離散型特征表示方法需要增加向量的維度。而使用分布型特征表示方法表示三個(gè)詞的向量為:蘋(píng)果=[0.2, 0.3, 0.3],香蕉=[-0.9, 0.8, -0.2],梨=[0.9, 0.1, -0.1]。

在詳細(xì)介紹詞的分布型特征表示方法之前,我們需要先了解NLP中的一個(gè)關(guān)鍵概念:語(yǔ)言模型(Language Model, LM)。語(yǔ)言模型是一種基于概率的判別模型,它的輸入是一句話(單詞的順序序列),輸出是這句話出現(xiàn)的概率,即這些單詞的聯(lián)合概率。假設(shè)我們有一個(gè)由n個(gè)詞組成的句子S=(w1,w2, …, wn),如何衡量它的概率呢?我們假設(shè)每個(gè)單詞wi都依賴第一個(gè)單詞w1到它之前的一個(gè)單詞wi-1的影響:

P(S)=P(w1,w2, …, wn)=P(w1)P(w2|w1)…P(wn|wn-1, …, w2w1)

常見(jiàn)的分布型特征表示方法有N-gram、Word2Vec、GloVe、ELMo、BERT等,下面會(huì)進(jìn)行重點(diǎn)講解。

1.N-gram

N-gram是一種語(yǔ)言模型,也是一種生成型模型。N-gram是一種類似于聯(lián)想的方法,它的特點(diǎn)是:某個(gè)詞的出現(xiàn)依賴于其他若干個(gè)詞,且我們獲得的信息越多,預(yù)測(cè)越準(zhǔn)確。

假定文本中的每個(gè)詞wi和前面N-1個(gè)詞有關(guān),而與更前面的詞無(wú)關(guān),這種假設(shè)被稱為N-1階馬爾可夫假設(shè)。N-gram模型假設(shè)第n個(gè)詞的出現(xiàn)僅與前面的n-1個(gè)詞相關(guān),而與其他任何詞都不相關(guān),整句的概率就是各個(gè)詞出現(xiàn)概率的乘積。每個(gè)詞的概率都可以通過(guò)從語(yǔ)料庫(kù)中直接統(tǒng)計(jì)該詞出現(xiàn)的次數(shù)而得到。

如果僅依賴前一個(gè)詞,即N=2,就是Bi-gram(也被稱為一階馬爾可夫鏈):

P(S)=P(w1,w2,…,wn)=P(w1)P(w2|w1)…P(wn|wn-1)

如果僅依賴前兩個(gè)詞,即N=3,就是Tri-gram(也被稱為二階馬爾可夫鏈):

P(S)=P(w1,w2,…,wn)=P(w1)P(w2|w1)P(w3|w2,w1)…P(wn|wn-1,wn-2)

還有Four-gram、Five-gram等,不過(guò)N>5的應(yīng)用很少見(jiàn)。常用的是Bi-gram(N=2)和Tri-gram(N=3)。

N-gram與詞袋模型原理類似,詞袋模型利用一個(gè)字或者詞進(jìn)行裝袋,而N-gram利用滑動(dòng)窗口的方式選擇N個(gè)向量的字或者詞進(jìn)行裝袋。Bi-gram將相鄰兩個(gè)單詞編上索引,Tri-gram將相鄰三個(gè)單詞編上索引,N-gram將相鄰N個(gè)單詞編上索引,一般可以按照字符級(jí)別和詞級(jí)別進(jìn)行N-gram特征表示。

接下來(lái)說(shuō)說(shuō)它們的區(qū)別。舉個(gè)例子。

中文中的字詞與英語(yǔ)中的字詞有些區(qū)別。具體來(lái)說(shuō),在中文中,“今天”“天氣”“真不錯(cuò)”表示詞,“今”“天”“氣”表示字;在英語(yǔ)中,it、is、a、good、day表示詞,i、t、s、a等字符表示中文中的字。

針對(duì)這個(gè)案例,按照字符級(jí)別列出Bi-gram,可以得到如下內(nèi)容。

中文:今天、天天、天氣、氣真、真不、不錯(cuò)。英文:it、ti、is、sa、ag、go、oo、od、dd、da、ay。

按詞級(jí)別列出Bi-gram,可以得到如下內(nèi)容。

中文:今天天氣、天氣真不錯(cuò)。英文:it is、is a、a good、good day。

在實(shí)際應(yīng)用中,結(jié)果可能會(huì)出現(xiàn)細(xì)微的差距,比如本案例得出的結(jié)果會(huì)將空格包括進(jìn)去:it is。在字符級(jí)別上的Bi-gram表示結(jié)果就是:it、t空格、空格i、is。

N-gram特征表示可以借助sklearn庫(kù)中的CountVectorizer函數(shù)實(shí)現(xiàn)。詞級(jí)別如下:

輸出如下:

注意,N-gram產(chǎn)生的特征只是作為文本特征的候選集,后面可能需要用到信息熵、卡方統(tǒng)計(jì)、IDF等文本特征選擇方式篩選出比較重要的特征。

2.Word2Vec

語(yǔ)言模型不需要人工標(biāo)注語(yǔ)料(屬于自監(jiān)督模型),所以語(yǔ)言模型能夠從無(wú)限制的大規(guī)模語(yǔ)料中學(xué)習(xí)到豐富的語(yǔ)義知識(shí)。為了緩解N-gram模型估算概率時(shí)遇到的數(shù)據(jù)稀疏問(wèn)題,研究者們提出了神經(jīng)網(wǎng)絡(luò)語(yǔ)言模型(Neural Network Language Model, NNLM)。

Word2Vec作為神經(jīng)概率語(yǔ)言模型的輸入,其本身其實(shí)是神經(jīng)概率模型的副產(chǎn)品,是神經(jīng)網(wǎng)絡(luò)在學(xué)習(xí)語(yǔ)言模型時(shí)產(chǎn)生的中間結(jié)果。Word2Vec包含連續(xù)詞袋(Continuous Bag Of Word, CBOW)和Skip-gram兩種訓(xùn)練模型,如圖1-2所示。其中CBOW是根據(jù)上下文預(yù)測(cè)當(dāng)前值,相當(dāng)于一句話隨機(jī)刪除一個(gè)詞,讓模型預(yù)測(cè)刪掉的詞是什么;而Skip-gram是根據(jù)當(dāng)前詞預(yù)測(cè)上下文,相當(dāng)于給出一個(gè)詞,預(yù)測(cè)該詞的前后是什么詞。

圖1-2 Word2Vec的兩種模型

Word2Vec的優(yōu)勢(shì)在于它會(huì)考慮到詞語(yǔ)的上下文,可以學(xué)習(xí)到文本中的語(yǔ)義和語(yǔ)法信息,并且得到的詞向量維度小,可以節(jié)省存儲(chǔ)空間和計(jì)算資源。此外,Word2Vec的通用性強(qiáng),可以應(yīng)用到各種NLP任務(wù)中。

但Word2Vec也存在一定的不足。具體來(lái)說(shuō),Word2Vec的詞和向量是一對(duì)一的關(guān)系,無(wú)法解決多義詞的問(wèn)題;且Word2Vec是一種靜態(tài)模型,雖然通用性強(qiáng),但無(wú)法針對(duì)特定任務(wù)做動(dòng)態(tài)優(yōu)化。Word2Vec可以借助Gensim庫(kù)實(shí)現(xiàn):

3.GloVe

GloVe(Global Vectors for word representation)是斯坦福大學(xué)的Jeffrey、Richard等提出的一種詞向量表示算法。總體來(lái)看,GloVe模型是一種對(duì)“詞-詞”矩陣進(jìn)行分解從而得到詞表示的方法,它可以把一個(gè)單詞表達(dá)成一個(gè)由實(shí)數(shù)組成的向量,該向量可以捕捉單詞之間的語(yǔ)義和語(yǔ)法特性,如相似性、類比性等。

在使用GloVe模型時(shí),首先需要基于語(yǔ)料庫(kù)構(gòu)建詞的共現(xiàn)矩陣,然后基于共現(xiàn)矩陣和GloVe模型學(xué)習(xí)詞向量。接下來(lái),我們通過(guò)一個(gè)簡(jiǎn)單的例子說(shuō)明如何構(gòu)建共現(xiàn)矩陣。假設(shè)有語(yǔ)料庫(kù):

該語(yǔ)料庫(kù)涉及7個(gè)單詞:i、love、you、but、him、am、sad。如果我們采用窗口寬度為5(左右長(zhǎng)度為2)的統(tǒng)計(jì)窗口,可以得到如表1-3所示的窗口內(nèi)容。

表1-3 該語(yǔ)料窗口為5時(shí)的窗口內(nèi)容

(續(xù))

窗口0、1、8、9長(zhǎng)度小于5,因?yàn)橹行脑~左側(cè)或右側(cè)內(nèi)容少于2個(gè)。以窗口5為例,如何構(gòu)造共現(xiàn)矩陣呢?假設(shè)共現(xiàn)矩陣為X,其元素為Xi,j,矩陣中的每一個(gè)元素Xij代表單詞i和上下文單詞j在特定大小的上下文窗口內(nèi)共同出現(xiàn)的次數(shù)。中心詞為love,上下文詞為but、you、him、i,則執(zhí)行Xlove, but+=1,Xlove, you+=1,Xlove, him+=1,Xlove, i+=1,依次使用窗口將整個(gè)語(yǔ)料庫(kù)遍歷一遍,即可得到共現(xiàn)矩陣X,如表1-4所示。

表1-4 共現(xiàn)矩陣

GloVe算法可以借助Gesim庫(kù)來(lái)實(shí)現(xiàn),其代碼實(shí)現(xiàn)如下:

GloVe與Word2Vec的關(guān)鍵區(qū)別在于,GloVe不只依賴于附近的單詞,還會(huì)結(jié)合全局統(tǒng)計(jì)數(shù)據(jù)(即跨語(yǔ)料庫(kù)的單詞的出現(xiàn)情況)來(lái)獲得詞向量。與Word2Vec相比,GloVe更容易并行化,且在訓(xùn)練數(shù)據(jù)較大時(shí)速度更快。

4.ELMo

Word2Vec和GloVe模型得到的詞向量都是靜態(tài)詞向量,靜態(tài)詞向量會(huì)對(duì)多義詞的語(yǔ)義進(jìn)行融合,訓(xùn)練結(jié)束之后不會(huì)根據(jù)上下文進(jìn)行改變,無(wú)法解決多義詞的問(wèn)題。例如:“我今天買(mǎi)了7斤蘋(píng)果”和“我今天買(mǎi)了蘋(píng)果7”中的“蘋(píng)果”就是一個(gè)多義詞。而ELMo模型訓(xùn)練過(guò)的詞向量可以解決多義詞的問(wèn)題。

ELMo是一種雙向語(yǔ)言模型,如圖1-3所示,該模型的特點(diǎn)是每一個(gè)詞語(yǔ)的特征表示都是整個(gè)輸入語(yǔ)句的函數(shù)。具體做法是先在大語(yǔ)料上以語(yǔ)言模型為目標(biāo)訓(xùn)練出BiLSTM模型,然后利用LSTM模型產(chǎn)生詞語(yǔ)的特征表示。關(guān)于LSTM模型和BiLSTM模型的更多內(nèi)容,請(qǐng)參見(jiàn)本書(shū)第3章,這里不再詳述。

圖1-3 ELMo結(jié)構(gòu)圖

如圖1-3所示,ELMo主要使用一個(gè)兩層雙向的LSTM模型。給定一個(gè)長(zhǎng)度為N的詞匯序列(t1,t2,t3, …, tN),在每個(gè)時(shí)間步,前向語(yǔ)言模型會(huì)根據(jù)前面的詞匯預(yù)測(cè)當(dāng)前詞匯的概率,最終對(duì)每個(gè)時(shí)間步的輸出概率進(jìn)行累積,將累積結(jié)果作為整個(gè)序列的預(yù)測(cè)概率,并期望該概率越大越好,即:

前向語(yǔ)言模型可能會(huì)包含多層單向LSTM,但在進(jìn)行概率預(yù)測(cè)時(shí),我們利用最后一層LSTM的每個(gè)時(shí)間步的隱藏狀態(tài)向量進(jìn)行預(yù)測(cè)。

后向語(yǔ)言模型與前向語(yǔ)言模型相反,后向語(yǔ)言模型將詞匯序列進(jìn)行逆排序,每個(gè)時(shí)間步是根據(jù)后面的詞匯信息預(yù)測(cè)之前的分詞,具體如下:

雙向語(yǔ)言模型將前向語(yǔ)言模型和后向語(yǔ)言模型進(jìn)行結(jié)合,直接最大化前向和后向語(yǔ)言模型的對(duì)數(shù)概率,即:

ELMo是雙向語(yǔ)言模型內(nèi)部中間層的組合,對(duì)于每個(gè)詞來(lái)說(shuō),一個(gè)L層的雙向語(yǔ)言模型要計(jì)算出2L+1個(gè)表示,為了應(yīng)用到其他模型中,ELMo需要將所有層的輸出結(jié)果整合為一個(gè)向量。

相比之前的模型,ELMo可以更好地捕捉文本中的語(yǔ)義和語(yǔ)法信息。此外,ELMo是基于詞級(jí)別的特征表示,對(duì)詞匯量沒(méi)有限制,但相應(yīng)的每個(gè)詞的編碼都需要語(yǔ)言模型計(jì)算得到,計(jì)算速度較慢。

ELMo該怎么使用呢?這里介紹3種可以使用預(yù)訓(xùn)練好的ELMo模型的方法:

1)ELMo官方allenNLP發(fā)布的基于PyTorch實(shí)現(xiàn)的版本;

2)ELMo官方發(fā)布的基于TensorFlow實(shí)現(xiàn)的版本;

3)TensorFlow-Hub發(fā)布的基于TensorFlow實(shí)現(xiàn)的ELMo版本。本節(jié)內(nèi)容通過(guò)該版本實(shí)現(xiàn)。

在上述代碼中,使用hub.Module第一次加載模型時(shí)會(huì)非常慢,因?yàn)橐螺d模型。該模型是訓(xùn)練好的模型,即LSTM中的參數(shù)都是固定的。

如果要將上面生成的embedding轉(zhuǎn)換成Numpy向量,可以使用下面的代碼實(shí)現(xiàn)。

5.BERT

從Word2Vec到ELMo,模型的性能得到了極大的提升。這說(shuō)明預(yù)訓(xùn)練模型的潛力無(wú)限,不是只能為下游任務(wù)提供一份精準(zhǔn)的詞向量。那我們可不可以直接預(yù)訓(xùn)練一個(gè)“龍骨級(jí)”的模型呢?如果它里面已經(jīng)充分地描述了字符級(jí)、詞級(jí)、句子級(jí)甚至句間關(guān)系的特征,那么在不同的NLP任務(wù)中,只需要為特定任務(wù)設(shè)計(jì)一個(gè)輕量級(jí)的輸出層(比如分類任務(wù)的一個(gè)分類層)。BERT是目前最強(qiáng)的預(yù)訓(xùn)練模型,其性能在NLP領(lǐng)域刷新了多個(gè)記錄。

BERT(Bidirectional Encoder Representations from Transformer)是一種預(yù)訓(xùn)練的語(yǔ)言表示模型。它強(qiáng)調(diào)不再像以往一樣采用傳統(tǒng)的單向語(yǔ)言模型或者把兩個(gè)單向語(yǔ)言模型進(jìn)行淺層拼接的方法進(jìn)行預(yù)訓(xùn)練,而是采用新的掩碼語(yǔ)言模型(MLM)生成深層的雙向語(yǔ)言表示。MLM是指,我們不是像傳統(tǒng)的語(yǔ)言模型那樣給定已經(jīng)出現(xiàn)過(guò)的詞,去預(yù)測(cè)下一個(gè)詞,而是直接把整個(gè)句子的一部分詞蓋住,讓模型去預(yù)測(cè)這些蓋住的詞是什么。這個(gè)任務(wù)其實(shí)最開(kāi)始叫作cloze test(可以理解為“完形填空測(cè)驗(yàn)”)。該模型有以下主要優(yōu)點(diǎn)。

1)采用MLM對(duì)雙向的Transformer結(jié)構(gòu)進(jìn)行預(yù)訓(xùn)練,以生成深層的雙向語(yǔ)言表示。

2)預(yù)訓(xùn)練后,只需要添加一個(gè)額外的輸出層進(jìn)行微調(diào),就可以在各式各樣的下游任務(wù)中取得最優(yōu)的表現(xiàn),且整個(gè)過(guò)程不需要對(duì)BERT結(jié)構(gòu)進(jìn)行修改。

BERT是如何實(shí)現(xiàn)的呢?BERT模型的大體結(jié)構(gòu)如圖1-4所示。

圖1-4 BERT結(jié)構(gòu)圖

如圖1-4所示,BERT由兩層Transformer編碼器(Encoder)組成,該編碼器的結(jié)構(gòu)如圖1-5所示。

圖1-5 Transformer結(jié)構(gòu),左側(cè)是編碼器,右側(cè)是解碼器

Transformer的核心思想是使用注意力(Attention)機(jī)制,在一個(gè)序列的不同位置之間建立距離為1的平行關(guān)系,從而解決循環(huán)神經(jīng)網(wǎng)絡(luò)的長(zhǎng)距離依賴問(wèn)題。Transformer與大多數(shù)Seq2Seq(序列到序列)模型一樣由編碼器和解碼器(Decoder)兩部分組成。編碼器負(fù)責(zé)把自然語(yǔ)言序列映射為隱藏層的數(shù)學(xué)表達(dá);而解碼器負(fù)責(zé)把隱藏層映射回自然語(yǔ)言序列。

1)Transformer的編碼器:編碼器由N個(gè)相同的層(Layer)組成,Layer就是圖1-5中左側(cè)的單元,最左邊有個(gè)Nx,這里x是6。每個(gè)Layer由兩個(gè)子層(Sublayer)組成,分別是多頭自注意力機(jī)制(Multi-Head Self-Attention Mechanism)和全連接前饋網(wǎng)絡(luò)(Fully Connected Feed-Forward Network)。其中每個(gè)子層都使用了殘差連接(Residual Connection)和歸一化(Normalisation),因此子層的輸出可以表示為:

sub_layer_output=layerNorm(x+(sublayer(x)))

接下來(lái)我們按順序解釋一下編碼器中的這兩個(gè)子層:

多頭自注意力機(jī)制可以表示為:

Attention_output=Attention(Q,K ,V )

多頭自注意力機(jī)制則是通過(guò)h個(gè)不同的線性變換對(duì)QKV進(jìn)行投影,之后將不同的注意力機(jī)制的結(jié)果拼接起來(lái):

Transformer中的注意力機(jī)制采用的是縮放的點(diǎn)積(Scaled Dot-Product)運(yùn)算,即:

位置前饋網(wǎng)絡(luò)實(shí)際上是一個(gè)全連接前饋網(wǎng)絡(luò),每個(gè)位置的詞都經(jīng)過(guò)這個(gè)前饋網(wǎng)絡(luò)進(jìn)行運(yùn)算。該層包含兩個(gè)線性變換,即兩個(gè)全連接層,第一個(gè)全連接層的激活函數(shù)為ReLU,該層可以表示為:

FFN(x)=max(0,xW1+b1)W2+b2

注意:每個(gè)編碼器和解碼器中的前饋網(wǎng)絡(luò)結(jié)構(gòu)是相同的,但它們不共享參數(shù)。

2)Transformer的解碼器:如圖1-5右側(cè)部分所示,解碼器除了包含與編碼器中相同的多頭自注意力層和前饋網(wǎng)絡(luò)層外,還有一個(gè)編碼器層和解碼器層之間的注意力層,該注意力層用來(lái)關(guān)注輸入信息的重要部分。

解碼器的輸入、輸出和解碼過(guò)程如下:

輸出:對(duì)應(yīng)i位置的輸出詞的概率分布。

輸入:編碼器的輸出和對(duì)應(yīng)i-1位置解碼器的輸出。中間的注意力層不是自注意力層,它的KV來(lái)自編碼器,Q來(lái)自上一位置解碼器的輸出。

解碼:訓(xùn)練時(shí),將輸出一次全部解碼出來(lái),用上一步的真實(shí)值(Ground Truth)來(lái)預(yù)測(cè);如果預(yù)測(cè)過(guò)程中沒(méi)有真實(shí)值,則需要一個(gè)一個(gè)預(yù)測(cè)。

3)位置編碼(Positional Encoding):Transformer結(jié)構(gòu)中除了最重要的編碼器和解碼器,還包含數(shù)據(jù)預(yù)處理部分。Transformer拋棄了循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN),而RNN最大的優(yōu)點(diǎn)就是在時(shí)間序列上對(duì)數(shù)據(jù)的抽象。為了捕獲數(shù)據(jù)中序列的順序,Transformer設(shè)計(jì)了位置編碼,為每個(gè)輸入的詞嵌入添加了一個(gè)向量,這些向量遵循模型學(xué)習(xí)的特定模式,有助于模型確定每個(gè)詞的位置,或序列中不同詞之間的距離。位置編碼的公式為:

至此,BERT的主體結(jié)構(gòu)就介紹完了,接下來(lái)我們看一看BERT的輸入和輸出。

BERT的輸入為每一個(gè)token對(duì)應(yīng)的特征表示(圖1-6下方的梯形塊是token,中間的矩形塊是token對(duì)應(yīng)的特征表示),BERT的單詞字典由WordPiece算法構(gòu)建。為了實(shí)現(xiàn)具體的分類任務(wù),除了單詞的token之外,還需要在輸入的每一個(gè)序列開(kāi)頭插入特定的分類token([CLS]),該token對(duì)應(yīng)最后一個(gè)Transformer層的輸出,起到聚集整個(gè)序列特征表示信息的作用。

圖1-6 BERT預(yù)訓(xùn)練流程圖

由于BERT是一個(gè)預(yù)訓(xùn)練模型,為了適應(yīng)各種各樣的自然語(yǔ)言任務(wù),模型所輸入的序列需要包含一句話(如文本情感分類、序列標(biāo)注任務(wù)的數(shù)據(jù))甚至兩句話以上(如文本摘要、自然語(yǔ)言推斷、問(wèn)答任務(wù)的數(shù)據(jù))。如何讓模型去分辨哪個(gè)范圍屬于句子A,哪個(gè)范圍屬于句子B呢?BERT采用了兩種解決方法。

1)在序列token中把分割token([SEP])插入每個(gè)句子,以分開(kāi)不同的句子token。

2)為每一個(gè)token表征都添加一個(gè)可學(xué)習(xí)的嵌入(Embedding),來(lái)表示它是屬于句子A還是屬于句子B。

BERT的輸入為每一個(gè)token對(duì)應(yīng)的表示,但實(shí)際上該表示是由三部分組成的,分別是對(duì)應(yīng)的token(Token Embedding)、分割嵌入(Segment Embedding)和位置嵌入(Position Embedding),如圖1-7所示。

圖1-7 token的組成

了解了BERT的輸入,那它的輸出是什么呢?Transformer的特點(diǎn)是有多少個(gè)輸入就對(duì)應(yīng)多少個(gè)輸出,所以BERT的輸出如圖1-6上半部分圓角矩形所示。

C為分類token([CLS])對(duì)應(yīng)的最后一個(gè)Transformer的輸出,Ti則代表其他token對(duì)應(yīng)最后一個(gè)Transformer的輸出。對(duì)一些token級(jí)別的任務(wù)來(lái)說(shuō)(如序列標(biāo)注和問(wèn)答任務(wù)),需要把Ti輸入額外的輸出層中進(jìn)行預(yù)測(cè)。對(duì)一些句子級(jí)別的任務(wù)來(lái)說(shuō)(如自然語(yǔ)言推斷和情感分類任務(wù)),需要把C輸入額外的輸出層中,這里也就解釋了為什么需要在每一個(gè)token序列前插入特定的分類token。

到此為止,BERT的結(jié)構(gòu)和原理介紹完了,那如何使用BERT呢?

首先,需要安裝server和client兩個(gè)工具包:

然后,下載BERT預(yù)訓(xùn)練模型,比如我們下載中文版本BERT模型——BERT-Base,并解壓到本地某個(gè)目錄下。例如:/bert-base-chinese。

然后,打開(kāi)終端,輸入以下命令啟動(dòng)服務(wù):

其中,參數(shù)model_dir為解壓得到的BERT預(yù)訓(xùn)練模型路徑,num_worker為進(jìn)程數(shù)。需要說(shuō)明的是,num_worker必須小于CPU的核心數(shù)或GPU設(shè)備數(shù)。

最后,編寫(xiě)客戶端代碼:

除了bert-as-service這種使用方式外,當(dāng)然也可以利用TensorFlow、Keras等深度學(xué)習(xí)框架重建BERT預(yù)訓(xùn)練模型,然后利用重建的BERT模型去獲取文本的向量表示。

主站蜘蛛池模板: 盱眙县| 麟游县| 乌兰浩特市| 资源县| 胶州市| 芮城县| 兖州市| 秀山| 洪泽县| 双城市| 瓦房店市| 桂阳县| 江安县| 铁岭县| 福鼎市| 新化县| 石台县| 渝北区| 神池县| 富锦市| 米脂县| 从江县| 简阳市| 休宁县| 邻水| 新安县| 元谋县| 乌苏市| 枣强县| 大邑县| 于都县| 辽宁省| 大城县| 安国市| 石楼县| 绵阳市| 三台县| 顺昌县| 安徽省| 中卫市| 莱西市|