本文的標(biāo)題是《一文看懂自然語(yǔ)言處理:word 表示技術(shù)的變遷》來(lái)源于:由作者:陳琦采編而成,主要講述了原創(chuàng):冷血狂魔一、背景
自然語(yǔ)言處理就是要讓計(jì)算機(jī)理解人類(lèi)的語(yǔ)言,至于到目前為止,計(jì)算機(jī)是否真的理
原創(chuàng):冷血狂魔
一、背景
自然語(yǔ)言處理就是要讓計(jì)算機(jī)理解人類(lèi)的語(yǔ)言,至于到目前為止,計(jì)算機(jī)是否真的理解的人類(lèi)的語(yǔ)言,這是一個(gè)未知之?dāng)?shù),我的理解是目前為止并沒(méi)有懂得人類(lèi)語(yǔ)言,只是查表給出一個(gè)最大概率的回應(yīng)而已。那么自然語(yǔ)言處理(NLP)包括哪些領(lǐng)域的東西呢?文本分類(lèi)(如:垃圾郵件分類(lèi)、情感分析)、機(jī)器翻譯、摘要、文法分析、分詞、詞性標(biāo)注、實(shí)體識(shí)別(NER)、語(yǔ)音識(shí)別等等,都是NLP要解的問(wèn)題。那么這些解了這些問(wèn)題,計(jì)算機(jī)是否真的懂得人類(lèi)語(yǔ)言的含義,現(xiàn)在還未知,本片文章不過(guò)多的展開(kāi)討論。語(yǔ)言的單位是詞,那么計(jì)算機(jī)是如何來(lái)表示詞的,用什么技術(shù)來(lái)表示一個(gè)詞,就可以讓計(jì)算機(jī)理解詞的含義呢?本篇博客將進(jìn)行詳細(xì)的討論,從Bool模型,到向量空間模型、到各種word embedding(word2vec、elmo、GPT、BERT)
二、原始時(shí)代
在Deeplearning之前,表示一個(gè)詞,并沒(méi)有一個(gè)約定俗成的辦法,如何表示,取決于想解決的任務(wù)。
1、Bool模型
下面有兩句話,求文本相似度。
我喜歡張國(guó)榮
你喜歡劉德華
那么,布爾模型比較簡(jiǎn)單粗暴,出現(xiàn)了詞所在維度為1,沒(méi)出現(xiàn)的所在維度為0,如下圖:
然后求兩個(gè)向量的cosine即可。
在bool模型中,由于特征值只有1和0兩個(gè)取值,不能很好的反應(yīng)特征項(xiàng)在文本中的重要程度。
2、V**(向量空間模型)
Bool模型其實(shí)可以看做是V**的特例,只不過(guò)V**每個(gè)維度填進(jìn)去的值是用了一些特殊的規(guī)則處理罷了,V**如下圖:
t表示特征項(xiàng),d表示一個(gè)Document,那么D可表示為D={t1,t2,t3……tN}的N維向量,w的值怎么填呢?只好的做法是TF*IDF,TF表示詞頻、IDF表示反詞頻,公式如下:
TF(t)=特征詞在文檔中出現(xiàn)次數(shù)/文檔總詞數(shù)
IDF(t)=log(N/(n+1)),其中N為文本集文本總數(shù),n為包含特征詞t的文檔數(shù)量
當(dāng)然TF*IDF也有他的缺陷,忽略了類(lèi)中分布情況和忽略了類(lèi)間分布情況,那么也有一些改進(jìn),例如:TF*IDF*IG,IG表示信息增益。
這些詞/文檔的表示方法,非常機(jī)械,反映不出詞與詞之間的上下文之間的關(guān)系、相似的關(guān)系等等。
三、深度學(xué)習(xí)時(shí)代
首先不得不提語(yǔ)言模型,語(yǔ)言模型在估測(cè)一個(gè)句子出現(xiàn)的概率,概率越大,越合理。
P(w1,w2,w3,……wn)=P(w1)*P(w2|w1)*P(w3|w1,w2)…P(wn|w1,w2….wn-1)
通常上面的式子沒(méi)辦法估測(cè),于是會(huì)做一個(gè)馬爾科夫假設(shè),假設(shè)后面的詞只和前面的一個(gè)詞有關(guān),那么就簡(jiǎn)化為下面的式子:
P(w1,w2,w3,……wn)=P(w1)*P(w2|w1)*P(w3|w2)…P(wn|wn-1)
當(dāng)然也可以假設(shè)后面的詞和前面的N個(gè)詞有關(guān),這就是常說(shuō)的N-gram。語(yǔ)言模型在elmo和gpt中有大用處。
1、word2vec
word2vec,其實(shí)是一個(gè)單隱層的神經(jīng)網(wǎng)絡(luò),的思想很簡(jiǎn)單,請(qǐng)看下圖
上圖中李雷和韓梅梅,都跟著“在教室”這個(gè)詞,當(dāng)向神經(jīng)網(wǎng)絡(luò)輸入李雷或者韓梅梅,希望神經(jīng)網(wǎng)絡(luò)output“在教室”這個(gè)詞的幾率越高越好,那么神經(jīng)網(wǎng)絡(luò)的權(quán)重進(jìn)行調(diào)節(jié),把兩個(gè)不同的詞映射到了相同的空間,那么說(shuō)明李雷和韓梅梅存在某種聯(lián)系,這就是word2vec的思想。word2vec有兩種,cbow和skip-gram,cbow是由上下文推出一個(gè)詞,skip-gram是由一個(gè)詞推出上下文,如下圖所示。我實(shí)踐的結(jié)果是cbow效果要更好一點(diǎn)。
這個(gè)代碼怎么實(shí)現(xiàn)呢?其實(shí)自己實(shí)現(xiàn)一個(gè)單隱層的神經(jīng)網(wǎng)絡(luò)就搞定了,output層激活函數(shù)為softmax,用cross entropy Loss,梯度下降即可。事實(shí)上,我們完全不用這么麻煩,DL4J已經(jīng)提供了**解決方案,幾行代碼就搞定了,代碼如下:
Word2Vec vec = new Word2Vec.Builder()
.minWordFrequency(5)
.iterations(1)
.layerSize(100)
.seed(42)
.windowSize(5)
.iterate(iter)
.tokenizerFactory(t)
.build();
vec.fit();
2、ELMO
ELMO取至Embeddings from Language Model的首寫(xiě)字母,論文地址:https://arxiv.org/abs/1802.05365
Embeddings 是從語(yǔ)言模型中得到的。在講ELMO之前,先來(lái)說(shuō)說(shuō)word2vec有什么問(wèn)題,word2vec固然可以表示詞與詞之間的語(yǔ)義以及相互之間的關(guān)系,但是word2vec是一個(gè)完全靜態(tài)的,也就是把所有信息都?jí)嚎s到一個(gè)固定維度的向量里。那么對(duì)于一詞多意,是表現(xiàn)力是比較有限的。請(qǐng)看下面的例子,
在 “欲信大義于天下”中 ,“信”是動(dòng)詞,“伸張”的意思
在 “信義著于四海”中,“信”是名詞,“信用”的意思
如果“信”字壓縮成一個(gè)100維的向量,將很難區(qū)分這兩種意思的差別,那么這就需要Contextualized Word Embedding,根據(jù)不同的語(yǔ)境,對(duì)詞進(jìn)行編碼,于是ELMO來(lái)了。
EMLO的結(jié)構(gòu)很簡(jiǎn)單,用了雙向的LSTM來(lái)訓(xùn)練一個(gè)語(yǔ)言模型。如下圖(圖片來(lái)至于臺(tái)大李宏毅的ppt)
模型training的過(guò)程很簡(jiǎn)單,讀入一個(gè)詞,一詞下一個(gè)詞,反向讀一個(gè)詞,預(yù)測(cè)上一個(gè)詞,以此訓(xùn)練下去,直到收斂。中間紅框處的藍(lán)色和橙色的向量就是Embedding的向量,最后接起來(lái)就是我們所要的向量了,當(dāng)然這個(gè)bi-lstm也可以疊很多層。每一層都得到一個(gè)Embedding向量。
那么,使用的時(shí)候怎么用這個(gè)編碼值呢?這取決于下游任務(wù),比方說(shuō)可以把每一層的Embedding向量求和取平均,或者加權(quán)求和等等,這個(gè)權(quán)重可以跟著任務(wù)一起train出來(lái)。
3、GPT
ELMO實(shí)現(xiàn)了對(duì)word進(jìn)行動(dòng)態(tài)編碼,但是他用了LSTM,LSTM并不能記住很長(zhǎng)的信息,且不利于并行計(jì)算。GPT用self attention改變這一結(jié)果,當(dāng)然這一切得益于google神作《Attention Is All You Need》論文地址:https://arxiv.org/pdf/1706.03762.pdf
GPT是怎么樣的運(yùn)作流程呢?其實(shí)就是用self attention訓(xùn)練一個(gè)語(yǔ)言模型,請(qǐng)看下圖:
每個(gè)詞之和前面的詞做attention,預(yù)測(cè)下一個(gè)詞,例如讀入開(kāi)始標(biāo)記BOS,然后自己和自己做attention,預(yù)測(cè)“潮水”,讀入BOS、潮水,然后和BOS、潮水做attention,預(yù)測(cè)“退了”,類(lèi)推下去,直到結(jié)束。在很多語(yǔ)料上train下去,就得到了一個(gè)非常強(qiáng)大的語(yǔ)言模型,可以動(dòng)態(tài)的進(jìn)行編碼。使用的時(shí)候可以固定住這些attention層的參數(shù),然后訓(xùn)練其他的下游任務(wù),例如做情感分類(lèi)問(wèn)題,可以把這些attention層放在幾個(gè)全連接層前面,固定參數(shù),只訓(xùn)練后面的全連接層,通過(guò)softmax或者sigmoid進(jìn)行分類(lèi)。
4、Bidirectional Encoder Representations from Transformers (BERT)
GPT有個(gè)缺陷,就是編碼只依賴(lài)上文信息,沒(méi)有加入下文信息,那么BERT很好的解決了這個(gè)問(wèn)題。BERT其實(shí)是transformer的encoder部分,如下圖
train BERT有兩種方法,Masked LM和Next Sentence Prediction,Masked LM是隨機(jī)掩蓋住一些詞,讓BERT猜測(cè)蓋住的詞什么。Next Sentence Prediction是讓BERT推斷兩個(gè)句子是不是有上下文關(guān)系。
BERT充分考慮了上下文,對(duì)word進(jìn)行編碼,于是很好的體現(xiàn)語(yǔ)義和上下文的關(guān)系,在很多比賽中遙遙領(lǐng)先。
四、總結(jié)
自然語(yǔ)言處理從原始的布爾模型,到向量空間模型,再到word2vec,再到ELMO,再到GPT,再到BERT,一路走來(lái),技術(shù)的更替。目前為止,BERT依然是比較領(lǐng)先的word Embedding方法,在大部分自然語(yǔ)言處理任務(wù)中,作為預(yù)訓(xùn)練任務(wù),是我們首先應(yīng)該嘗試的辦法。也許,用不了多久,又會(huì)有新的技術(shù)出來(lái),刷新成績(jī),我們拭目以待。但即便是現(xiàn)在為止,機(jī)器是否真的理解了人類(lèi)的語(yǔ)言,這還是一個(gè)尚待論證的問(wèn)題。路漫漫其修遠(yuǎn)兮,吾將上下而求索。
最后,我自己是一名從事了多年開(kāi)發(fā)的Python老程序員,辭職目前在做自己的Python私人定制課程,今年年初我花了一個(gè)月整理了一份最適合2019年學(xué)習(xí)的Python學(xué)習(xí)干貨,可以送給每一位喜歡Python的小伙伴,想要獲取的可以關(guān)注我的頭條號(hào)并在后臺(tái)私信我:01,即可免費(fèi)獲取。
本文原作者為陳琦,轉(zhuǎn)載請(qǐng)注明:出處!如該文有不妥之處,請(qǐng)聯(lián)系站長(zhǎng)刪除,謝謝合作~
原創(chuàng)文章,作者:陳琦,如若轉(zhuǎn)載,請(qǐng)注明出處:http://www.uuuxu.com/20220513317883.html