【GNN】圖神經(jīng)網(wǎng)絡(luò)學習小結(jié) and 筆記匯總
1154
2025-03-31
一、學習NLP背景介紹:
從2019年4月份開始跟著華為云ModelArts實戰(zhàn)營同學們一起進行了6期關(guān)于圖像深度學習的學習,初步了解了關(guān)于圖像標注、圖像分類、物體檢測,圖像都目標物體檢測等,基本了解了卷積神經(jīng)網(wǎng)絡(luò)(CNN)原理及相關(guān)常用模型,如:VGG16、MaxNet等。之后從9月份開始在華為云AI專家的帶領(lǐng)指引下,對AI深度學習的另外一個重要領(lǐng)域:自然語言處理(NLP)的學習,到目前為止學習了:命名實體識別、文本分類、文本相似度分析、問答系統(tǒng)、人臉檢測。在這一個多月對NLP的處理流程,常用模型及原理進行了初步了解及理解,到目前還只是部分理解,不能全部吃透,感覺比前期圖像領(lǐng)域的深度學習理論知識復(fù)雜及難理解很多,主要是體現(xiàn)在圖像領(lǐng)域有很多圖像架構(gòu)暫時原理及公司推導;而NLP這方面比較少,為了在這1個多月對NLP的理解及后期幫助復(fù)習鞏固,以下對NLP領(lǐng)域的相關(guān)只是根據(jù)自己的理解及網(wǎng)上相關(guān)知識做整理和歸納。
二、自然語言處理NLP數(shù)學基礎(chǔ):
1、基礎(chǔ)概率簡介:
概率論是統(tǒng)計自然語言處理的理論基礎(chǔ),有些知識我們在中學或者是大學已經(jīng)學過了,在這里就不在做過多的贅述。比如,概率空間( Probability spaces )、條件概率和獨立性(Conditional probability and independence)、隨機變量、期望和方差。
在這里我只是介紹一下條件概率,因為這個概率模型以后會很多次提到,并且用途也很廣。比如最大熵問題,HMM模型,語言模型中求字符串的概率。用的比較多的是多參數(shù)的鏈式法則。 在機器翻譯中這個模型是語言模型。
例如,S表示特定排列的詞串w1,w2,w3,w4,w5...wn。如果要求出S在文中出現(xiàn)的概率,即用P(S)表示S的概率,利用條件概率這個S的概率等于S中各個詞的概率乘積,于是P(S)可以展開為:P(S)=P(w1*w2*w3...wn)=P(w1)P(w2|w1)P(w3|w1w2)...P(wn|w1w2w3...wn-1),其中P(w1)表示詞w1在文中出現(xiàn)的頻率,P(w2|w1)表示已知第一個詞的前提下,第二個詞出現(xiàn)的頻率,以后的一次類推。
在實際應(yīng)用中,如果詞串太長后面的計算量太大,用 N 元語法模型或者是 馬爾可夫假設(shè) ,即任意一個詞 wi 出現(xiàn)的概率只有前一個 wi-1 詞決定 , 這樣前面的公式就變得簡單多了,P(S)=P(w1)P(w2|w1)P(w3|w2)...P(wn|wn-1)? ,這里用的是二元語法模型,也可以用三元,四元模型,不過隨著數(shù)量的增加計算的復(fù)雜度也相應(yīng)的增加。接下來的問題是,如果計算 P(wi|wi-1) , 只要數(shù)一數(shù)這對詞( wi-1,wi)? 在統(tǒng)計的文本中出現(xiàn)了多少次,以及? wi-1? 本身在同樣的文本中前后相鄰出現(xiàn)了多少次 ,然后用兩個數(shù)一除就可以了 ,P(wi|wi-1) = P(wi-1,wi)/ P (wi-1) 。
2、貝葉斯定理 (Bayes’theorem):
簡單地說 Bayes 是個逆概率問題, 比如,我們要可以把求P(A/B) ,的問題轉(zhuǎn)換為求 P(B/A) 的問題。 當正向概率很復(fù)雜時,這個公式就顯示出他的作用,以后我們會經(jīng)常用到的。他由條件概率的定義引出。
Bayes定理:P(B|A)=P(AB)/P(A) = P(A|B)P(B)/P(A)
這樣在給定A的條件下,求P(B|A),我們可以忽略A的只,因為他在所有的情況下都是常數(shù)。所以,argmax(P(A|B)P(B)/P(A)) = argmax(P(A|B)P(B)),這個公式在機器翻譯中用的很廣泛,比如用在 翻譯模型 。
3、 Bayes 貝葉斯網(wǎng)絡(luò):
我們在以前提到馬爾科夫鏈(MarkovChain),它描述了這樣的一個 狀態(tài) 序列,每個狀態(tài)值取決于其前面的有限的狀態(tài)。 這種模型,對很多實際問題來講是一種很粗略的簡化。在現(xiàn)實生活中,很多事物相互的關(guān)系并不能用一條鏈來串起來。它們之間的關(guān)系可能是交叉的、錯綜復(fù)雜的。 不能用一條鏈來描述。 如下圖:
我們可以把上述的 有向圖看成一個網(wǎng)絡(luò), 它就是貝葉斯網(wǎng)絡(luò)。其中每個圓圈表示一個狀態(tài)。狀態(tài)之間的連線表示它們的因果關(guān)系。比如從心血管疾病出發(fā)到吸煙的弧線表示心血管疾病可能和吸煙有關(guān)。當然,這些關(guān)系可以有一個量化的可信度(belief),用一個概率描述。我們可以通過這樣一張網(wǎng)絡(luò)估計出一個人的心血管疾病的可能性。在網(wǎng)絡(luò)中每個節(jié)點概率的計算,可以用貝葉斯公式來進行,貝葉斯網(wǎng)絡(luò)因此而得名。由于網(wǎng)絡(luò)的每個弧有一個可信度,貝葉斯網(wǎng)絡(luò)也被稱作信念網(wǎng)絡(luò)(belief networks)。和馬爾可夫鏈類似,貝葉斯網(wǎng)絡(luò)中的每個狀態(tài)值取決于前面有限個狀態(tài)。不同的是,貝葉斯網(wǎng)絡(luò)比馬爾可夫鏈靈活,它不受馬爾可夫鏈的鏈狀結(jié)構(gòu)的約束,因此可以更準確地描述事件之間的相關(guān)性。可以講,馬爾可夫鏈是貝葉斯網(wǎng)絡(luò)的特例,而貝葉斯網(wǎng)絡(luò)是馬爾可夫鏈的推廣。
4、全概率公式:
我們在處理NLP中,我們對一個句子的處理實際是獲得這個文本序列的聯(lián)合概率,如:假定 S是一個有意義的句子,它由一串排序確定的詞組成,即
S=w1,w2,…,wn。這里每個 wk表示一個詞語,n是句子包含詞語的數(shù)量,即句子的長度。顯而易見,把 S 放在從古至今所有的語境里去檢查概率是不可行的,因此我們需要做一個模型來估算。我們把 P(S) 展開,得到(2)中的條件概率形式。
其中 P(wk∣w1,w2,…,wi),(i=k?1)表示 wk接在序列 w1,w2,…,wi? 之后的條件概率。不難看出,wk 的概率,取決于它本身在整個語言中出現(xiàn)的概率,以及它前面 i=k?1 個詞順序出現(xiàn)的概率。
學過概率論的讀者應(yīng)該知道,計算三元的條件概率(即計算類似 P(w3∣w1,w2)已經(jīng)很困難了,更別說計算整個句子最后一個詞的條件概率。因此,我們需要對模型進行簡化。
數(shù)學專業(yè)的讀者可能會發(fā)現(xiàn),這樣的條件概率,實際上是一個隨機過程的概率。在隨機過程中,為了簡化分析,對此類過程有一個馬爾科夫假設(shè)(Markov Hypothesis),即假設(shè) wk
wk的概率只和 wi,(i=k?1)有關(guān)。即假設(shè)
這樣一來,我們就有
以上P(S)即為全概率公式
三、自然語言處理NLP步驟:
四、自然語言處理NLP主要研究方向:
4.1、信息抽取(命名實體識別):從給定文本中抽取重要的信息,比如時間、地點、人物、事件、原因、結(jié)果、數(shù)字、日期、貨幣、專有名詞等等。通俗說來,就是要了解誰在什么時候、什么原因、對誰、做了什么事、有什么結(jié)果。
4.2、文本生成:機器像人一樣使用自然語言進行表達和寫作。依據(jù)輸入的不同,文本生成技術(shù)主要包括數(shù)據(jù)到文本生成和文本到文本生成。數(shù)據(jù)到文本生成是指將包含鍵值對的數(shù)據(jù)轉(zhuǎn)化為自然語言文本;文本到文本生成對輸入文本進行轉(zhuǎn)化和處理從而產(chǎn)生新的文本。
4.3、問答系統(tǒng):對一個自然語言表達的問題,由問答系統(tǒng)給出一個精準的答案。需要對自然語言查詢語句進行某種程度的語義分析,包括實體鏈接、關(guān)系識別,形成邏輯表達式,然后到知識庫中查找可能的候選答案并通過一個排序機制找出最佳的答案。
4.4、對話系統(tǒng):系統(tǒng)通過一系列的對話,跟用戶進行聊天、回答、完成某一項任務(wù)。涉及到用戶意圖理解、通用聊天引擎、問答引擎、對話管理等技術(shù)。此外,為了體現(xiàn)上下文相關(guān),要具備多輪對話能力。
4.5、文本挖掘:包括文本聚類、分類、情感分析以及對挖掘的信息和知識的可視化、交互式的表達界面。目前主流的技術(shù)都是基于統(tǒng)計機器學習的。
4.6、語音識別和生成:語音識別是將輸入計算機的語音符號識別轉(zhuǎn)換成書面語表示。語音生成又稱文語轉(zhuǎn)換、語音合成,它是指將書面文本自動轉(zhuǎn)換成對應(yīng)的語音表征。
4.7、信息過濾:通過計算機系統(tǒng)自動識別和過濾符合特定條件的文檔信息。通常指網(wǎng)絡(luò)有害信息的自動識別和過濾,主要用于信息安全和防護,網(wǎng)絡(luò)內(nèi)容管理等。
4.8、輿情分析:是指收集和處理海量信息,自動化地對網(wǎng)絡(luò)輿情進行分析,以實現(xiàn)及時應(yīng)對網(wǎng)絡(luò)輿情的目的。
4.9、信息檢索:對大規(guī)模的文檔進行索引。可簡單對文檔中的詞匯,賦之以不同的權(quán)重來建立索引,也可建立更加深層的索引。在查詢的時候,對輸入的查詢表達式比如一個檢索詞或者一個句子進行分析,然后在索引里面查找匹配的候選文檔,再根據(jù)一個排序機制把候選文檔排序,最后輸出排序得分最高的文檔。
4.10、機器翻譯:把輸入的源語言文本通過自動翻譯獲得另外一種語言的文本。機器翻譯從最早的基于規(guī)則的方法到二十年前的基于統(tǒng)計的方法,再到今天的基于神經(jīng)網(wǎng)絡(luò)(編碼-解碼)的方法,逐漸形成了一套比較嚴謹?shù)姆椒w系。
五、自然語言處理NLP語言模型預(yù)訓練方法(ELMo、GPT和BERT):
5.1、?引言
在介紹論文之前,我將先簡單介紹一些相關(guān)背景知識。首先是語言模型(Language Model),語言模型簡單來說就是一串詞序列的概率分布。具體來說,語言模型的作用是為一個長度為m的文本確定一個概率分布P,表示這段文本存在的可能性。在實踐中,如果文本的長度較長,P(wi?| w1, w2, . . . , wi?1)的估算會非常困難。因此,研究者們提出使用一個簡化模型:n元模型(n-gram model)。在?n?元模型中估算條件概率時,只需要對當前詞的前n個詞進行計算。在n元模型中,傳統(tǒng)的方法一般采用頻率計數(shù)的比例來估算n元條件概率。當n較大時,機會存在數(shù)據(jù)稀疏問題,導致估算結(jié)果不準確。因此,一般在百萬詞級別的語料中,一般也就用到三元模型。
為了緩解n元模型估算概率時遇到的數(shù)據(jù)稀疏問題,研究者們提出了神經(jīng)網(wǎng)絡(luò)語言模型。代表性工作是Bengio等人在2003年提出的神經(jīng)網(wǎng)絡(luò)語言模型,該語言模型使用了一個三層前饋神經(jīng)網(wǎng)絡(luò)來進行建模。其中有趣的發(fā)現(xiàn)了第一層參數(shù),用做詞表示不僅低維緊密,而且能夠蘊涵語義,也就為現(xiàn)在大家都用的詞向量(例如word2vec)打下了基礎(chǔ)。其實,語言模型就是根據(jù)上下文去預(yù)測下一個詞是什么,這不需要人工標注語料,所以語言模型能夠從無限制的大規(guī)模單語語料中,學習到豐富的語義知識。
接下來在簡單介紹一下預(yù)訓練的思想。我們知道目前神經(jīng)網(wǎng)絡(luò)在進行訓練的時候基本都是基于后向傳播(BP)算法,通過對網(wǎng)絡(luò)模型參數(shù)進行隨機初始化,然后通過BP算法利用例如SGD這樣的優(yōu)化算法去優(yōu)化模型參數(shù)。那么預(yù)訓練的思想就是,該模型的參數(shù)不再是隨機初始化,而是先有一個任務(wù)進行訓練得到一套模型參數(shù),然后用這套參數(shù)對模型進行初始化,再進行訓練。其實早期的使用自編碼器棧式搭建深度神經(jīng)網(wǎng)絡(luò)就是這個思想。還有詞向量也可以看成是第一層word embedding進行了預(yù)訓練,此外在基于神經(jīng)網(wǎng)絡(luò)的遷移學習中也大量用到了這個思想。
接下來,我們就具體看一下這幾篇用語言模型進行預(yù)訓練的工作。
5.2、 ELMo
5.2.1?引言
《Deep Contextualized Word Representations》這篇論文來自華盛頓大學的工作,最后是發(fā)表在今年的NAACL會議上,并獲得了最佳論文。其實這個工作的前身來自同一團隊在ACL2017發(fā)表的《Semi-supervised sequence tagging with bidirectional language models》?[4],只是在這篇論文里,他們把模型更加通用化了。首先我們來看看他們工作的動機,他們認為一個預(yù)訓練的詞表示應(yīng)該能夠包含豐富的句法和語義信息,并且能夠?qū)Χ嗔x詞進行建模。而傳統(tǒng)的詞向量(例如word2vec)是上下文無關(guān)的。例如下面"apple"的例子,這兩個"apple"根據(jù)上下文意思是不同的,但是在word2vec中,只有apple一個詞向量,無法對一詞多義進行建模。
所以他們利用語言模型來獲得一個上下文相關(guān)的預(yù)訓練表示,稱為ELMo,并在6個NLP任務(wù)上獲得了提升。
5.2.2?方法
在EMLo中,他們使用的是一個雙向的LSTM語言模型,由一個前向和一個后向語言模型構(gòu)成,目標函數(shù)就是取這兩個方向語言模型的最大似然。
在預(yù)訓練好這個語言模型之后,ELMo就是根據(jù)下面的公式來用作詞表示,其實就是把這個雙向語言模型的每一中間層進行一個求和。最簡單的也可以使用最高層的表示來作為ELMo。
然后在進行有監(jiān)督的NLP任務(wù)時,可以將ELMo直接當做特征拼接到具體任務(wù)模型的詞向量輸入或者是模型的最高層表示上。總結(jié)一下,不像傳統(tǒng)的詞向量,每一個詞只對應(yīng)一個詞向量,ELMo利用預(yù)訓練好的雙向語言模型,然后根據(jù)具體輸入從該語言模型中可以得到上下文依賴的當前詞表示(對于不同上下文的同一個詞的表示是不一樣的),再當成特征加入到具體的NLP有監(jiān)督模型里。
5.2.3?實驗
這里我們簡單看一下主要的實驗,具體實驗還需閱讀論文。首先是整個模型效果的實驗。他們在6個NLP任務(wù)上進行了實驗,首先根據(jù)目前每個任務(wù)搭建了不同的模型作為baseline,然后加入ELMo,可以看到加入ELMo后6個任務(wù)都有所提升,平均大約能夠提升2個多百分點,并且最后的結(jié)果都超過了之前的先進結(jié)果(SOTA)。
在下面的分析實驗中,我們可以看到使用所有層的效果要比只使用最后一層作為ELMo的效果要好。在輸入還是輸出上面加EMLo效果好的問題上,并沒有定論,不同的任務(wù)可能效果不一樣。
5.3、 Open AI GPT
5.3.1?引言
我們來看看第二篇論文《Improving Language Understanding by Generative Pre-Training》,這是OpenAI?團隊前一段時間放出來的預(yù)印版論文。他們的目標是學習一個通用的表示,能夠在大量任務(wù)上進行應(yīng)用。這篇論文的亮點主要在于,他們利用了Transformer網(wǎng)絡(luò)代替了LSTM作為語言模型來更好的捕獲長距離語言結(jié)構(gòu)。然后在進行具體任務(wù)有監(jiān)督微調(diào)時使用了語言模型作為附屬任務(wù)訓練目標。最后再12個NLP任務(wù)上進行了實驗,9個任務(wù)獲得了SOTA。
5.3.2?方法
首先我們來看一下他們無監(jiān)督預(yù)訓練時的語言模型。他們?nèi)匀皇褂玫氖菢藴实恼Z言模型目標函數(shù),即通過前k個詞預(yù)測當前詞,但是在語言模型網(wǎng)絡(luò)上他們使用了google團隊在《Attention is all your need》論文中提出的Transformer解碼器作為語言模型。Transformer模型主要是利用自注意力(self-attention)機制的模型,這里我就不多進行介紹,大家可以看論文或者參考我之前的博客(https://www.cnblogs.com/robert-dlut/p/8638283.html)。
然后再具體NLP任務(wù)有監(jiān)督微調(diào)時,與ELMo當成特征的做法不同,OpenAI GPT不需要再重新對任務(wù)構(gòu)建新的模型結(jié)構(gòu),而是直接在transformer這個語言模型上的最后一層接上softmax作為任務(wù)輸出層,然后再對這整個模型進行微調(diào)。他們額外發(fā)現(xiàn),如果使用語言模型作為輔助任務(wù),能夠提升有監(jiān)督模型的泛化能力,并且能夠加速收斂。
由于不同NLP任務(wù)的輸入有所不同,在transformer模型的輸入上針對不同NLP任務(wù)也有所不同。具體如下圖,對于分類任務(wù)直接講文本輸入即可;對于文本蘊涵任務(wù),需要將前提和假設(shè)用一個Delim分割向量拼接后進行輸入;對于文本相似度任務(wù),在兩個方向上都使用Delim拼接后,進行輸入;對于像問答多選擇的任務(wù),就是將每個答案和上下文進行拼接進行輸入。
5.3.3?實驗
下面我簡單的列舉了一下不同NLP任務(wù)上的實驗結(jié)果。
語言推理任務(wù):
問答和常識推理任務(wù):
語義相似度和分類任務(wù):
可以看到在多項任務(wù)上,OpenAI GPT的效果要比ELMo的效果更好。從下面的消除實驗來看,在去掉預(yù)訓練部分后,所有任務(wù)都大幅下降,平均下降了14.8%,說明預(yù)訓練很有效;在大數(shù)據(jù)集上使用語言模型作為附加任務(wù)的效果更好,小數(shù)據(jù)集不然;利用LSTM代替Transformer后,結(jié)果平均下降了5.6%,也體現(xiàn)了Transformer的性能。
5.4.、BERT
5.4.1引言
上周Google放出了他們的語言模型預(yù)訓練方法,瞬時受到了各界廣泛關(guān)注,不少媒體公眾號也進行了相應(yīng)報道,那我們來看看這篇論文《BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding》。這篇論文把預(yù)訓練語言表示方法分為了基于特征的方法(代表ELMo)和基于微調(diào)的方法(代表OpenAI GPT)。而目前這兩種方法在預(yù)訓練時都是使用單向的語言模型來學習語言表示。
5.4.2方法
在語言模型上,BERT使用的是Transformer編碼器,并且設(shè)計了一個小一點Base結(jié)構(gòu)和一個更大的Large網(wǎng)絡(luò)結(jié)構(gòu)。
而在模型的輸入方面,BERT做了更多的細節(jié),如下圖。他們使用了WordPiece embedding作為詞向量,并加入了位置向量和句子切分向量。并在每一個文本輸入前加入了一個CLS向量,后面會有這個向量作為具體的分類向量。
對于第一點他們采用了下面的技巧來緩解,即不是總是用[MASK]去替換擋住的詞,在10%的時間用一個隨機詞取替換,10%的時間就用這個詞本身。
在微調(diào)階段,不同任務(wù)的模型如下圖,只是在輸入層和輸出層有所區(qū)別,然后整個模型所有參數(shù)進行微調(diào)。
5.4.3?實驗
下面我們列出一下不同NLP上BERT的效果。
GLUE結(jié)果:
QA結(jié)果:
實體識別結(jié)果:
SWAG結(jié)果:
可以看到在這些所有NLP任務(wù)上,BERT都取得了SOTA,而且相比EMLo和GPT的效果提升還是比較大的。
在預(yù)訓練實驗分析上,可以看到本文提出的兩個目標任務(wù)的作用還是很有效的,特別是在MLM這個目標任務(wù)上。
5.5.?總結(jié)
最后進行簡單的總結(jié),和傳統(tǒng)的詞向量相比,使用語言模型預(yù)訓練其實可以看成是一個句子級別的上下文的詞表示,它可以充分利用大規(guī)模的單語語料,并且可以對一詞多義進行建模。而且從后面兩篇論文可以看到,通過大規(guī)模語料預(yù)訓練后,使用統(tǒng)一的模型或者是當成特征直接加到一些簡單模型上,對各種NLP任務(wù)都能取得不錯的效果,說明很大程度上緩解了具體任務(wù)對模型結(jié)構(gòu)的依賴。在目前很多評測上也都取得了SOTA。ELMo也提供了官網(wǎng)供大家使用。但是這些方法在空間和時間復(fù)雜度上都比較高,特別是BERT,在論文中他們訓練base版本需要在16個TGPU上,large版本需要在64個TPU上訓練4天,對于一般條件,一個GPU訓練的話,得用上1年。還有就是可以看出這些方法里面都存在很多工程細節(jié),一些細節(jié)做得不好的話,效果也會大大折扣。
六、預(yù)訓練語言模型-BERT原理詳解:
在華為云ModelArts實戰(zhàn)營中對NLP的學習案例中均采用了Goole公司的BERT雙向語言預(yù)訓練模型,并且在:命名實體識別、文本分類、文本相似度分析、問答系統(tǒng)、人臉檢測等案例中,模型均有突出的表現(xiàn),結(jié)合第五大點中對自然語言預(yù)訓練模型ElMo、GPT、BERT中性能比較,得出BERT模型在多方面均表現(xiàn)了突出的能力,因此本節(jié)重點針對BERT模型進行全訪問的剖析,其它模型,感興趣的可以自己去閱讀。以下為對Bert模型幾個方面做闡述:
6.1、Bert模型的主要特點:
第一:是這個模型非常的深,12層,并不寬(wide),中間層只有1024,而之前的Transformer模型中間層有2048。這似乎又印證了計算機圖像處理的一個觀點——深而窄 比 淺而寬 的模型更
第二:MLM(Masked Language Model),同時利用左側(cè)和右側(cè)的詞語,這個在ELMo上已經(jīng)出現(xiàn)了,絕對不是原創(chuàng)。其次,對于Mask(遮擋)在語言模型上的應(yīng)用,已經(jīng)被Ziang Xie提出了(我很有幸的也參與到了這篇論文中):[1703.02573] Data Noising as Smoothing in Neural Network Language Models。這也是篇巨星云集的論文:Sida Wang,Jiwei Li(香儂科技的創(chuàng)始人兼CEO兼史上發(fā)文最多的NLP學者),Andrew Ng,Dan Jurafsky都是Coauthor。但很可惜的是他們沒有關(guān)注到這篇論文。用這篇論文的方法去做Masking,相信BRET的能力說不定還會有提升。
6.2、BERT 的五個關(guān)鍵詞 Pre-training、Deep、Bidirectional、Transformer、Language Understanding :
《A Neural Probabilistic Language Model》這篇論文講的 Language Model,嚴格講是語言生成模型(Language Generative Model),預(yù)測語句中下一個將會出現(xiàn)的詞匯。語言生成模型能不能直接移用到其它 NLP 問題上去?
譬如,淘寶上有很多用戶評論,能否把每一條用戶轉(zhuǎn)換成評分?-2、-1、0、1、2,其中 -2 是極差,+2 是極好。假如有這樣一條用戶評語,“買了一件鹿晗同款襯衫,沒想到,穿在自己身上,不像小鮮肉,倒像是廚師”,請問這條評語,等同于 -2,還是其它?
語言生成模型,能不能很好地解決上述問題?進一步問,有沒有 “通用的” 語言模型,能夠理解語言的語義,適用于各種 NLP 問題?BERT 這篇論文的題目很直白,《BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding》,一眼看去,就能猜得到這篇文章會講哪些內(nèi)容。
這個模型的核心是聚焦機制,對于一個語句,可以同時啟用多個聚焦點,而不必局限于從前往后的,或者從后往前的,序列串行處理。不僅要正確地選擇模型的結(jié)構(gòu),而且還要正確地訓練模型的參數(shù),這樣才能保障模型能夠準確地理解語句的語義。BERT 用了兩個步驟,試圖去正確地訓練模型的參數(shù)。第一個步驟是把一篇文章中,15% 的詞匯遮蓋,讓模型根據(jù)上下文全向地預(yù)測被遮蓋的詞。假如有 1 萬篇文章,每篇文章平均有 100 個詞匯,隨機遮蓋 15% 的詞匯,模型的任務(wù)是正確地預(yù)測這 15 萬個被遮蓋的詞匯。通過全向預(yù)測被遮蓋住的詞匯,來初步訓練 Transformer 模型的參數(shù)。
然后,用第二個步驟繼續(xù)訓練模型的參數(shù)。譬如從上述 1 萬篇文章中,挑選 20 萬對語句,總共 40 萬條語句。挑選語句對的時候,其中 210 萬對語句,是連續(xù)的兩條上下文語句,另外 210 萬對語句,不是連續(xù)的語句。然后讓 Transformer 模型來識別這 20 萬對語句,哪些是連續(xù)的,哪些不連續(xù)。
6.3、Bert模型架構(gòu):
BERT的模型架構(gòu)是基于Vaswani et al. (2017) 中描述的原始實現(xiàn)multi-layer bidirectional Transformer編碼器,并在tensor2tensor庫中發(fā)布。由于Transformer的使用最近變得無處不在,論文中的實現(xiàn)與原始實現(xiàn)完全相同,因此這里將省略對模型結(jié)構(gòu)的詳細描述。
在這項工作中,論文將層數(shù)(即Transformer blocks)表示為L,將隱藏大小表示為H,將self-attention heads的數(shù)量表示為A。在所有情況下,將feed-forward/filter 的大小設(shè)置為 4H,即H = 768時為3072,H = 1024時為4096。論文主要報告了兩種模型大小的結(jié)果:
為了進行比較,論文選擇了BERT LARGE ,它與OpenAI GPT具有相同的模型大小。然而,重要的是,BERT Transformer 使用雙向self-attention,而GPT Transformer 使用受限制的self-attention,其中每個token只能處理其左側(cè)的上下文。研究團隊注意到,在文獻中,雙向 Transformer 通常被稱為“Transformer encoder”,而左側(cè)上下文被稱為“Transformer decoder”,因為它可以用于文本生成。BERT,OpenAI GPT和ELMo之間的比較如圖1所示。
圖1:預(yù)訓練模型架構(gòu)的差異。BERT使用雙向Transformer。OpenAI GPT使用從左到右的Transformer。ELMo使用經(jīng)過獨立訓練的從左到右和從右到左LSTM的串聯(lián)來生成下游任務(wù)的特征。三個模型中,只有BERT表示在所有層中? 共同依賴于左右上下文。
輸入表示(input representation)
論文的輸入表示(input representation)能夠在一個token序列中明確地表示單個文本句子或一對文本句子(例如, [Question, Answer])。對于給定token,其輸入表示通過對相應(yīng)的token、segment和position embeddings進行求和來構(gòu)造。圖2是輸入表示的直觀表示:
圖2:BERT輸入表示。輸入嵌入是token embeddings, segmentation embeddings 和position embeddings 的總和。
具體如下:
(1)使用WordPiece嵌入(Wu et al., 2016)和30,000個token的詞匯表。用##表示分詞。
(2)使用學習的positional embeddings,支持的序列長度最多為512個token。
每個序列的第一個token始終是特殊分類嵌入([CLS])。對應(yīng)于該token的最終隱藏狀態(tài)(即,Transformer的輸出)被用作分類任務(wù)的聚合序列表示。對于非分類任務(wù),將忽略此向量。
(3)句子對被打包成一個序列。以兩種方式區(qū)分句子。首先,用特殊標記([SEP])將它們分開。其次,添加一個learned sentence A嵌入到第一個句子的每個token中,一個sentence B嵌入到第二個句子的每個token中。
(4)對于單個句子輸入,只使用 sentence A嵌入。
6.4、預(yù)訓練任務(wù)(關(guān)鍵創(chuàng)新):
與Peters et al. (2018) 和 Radford et al. (2018)不同,論文不使用傳統(tǒng)的從左到右或從右到左的語言模型來預(yù)訓練BERT。相反,使用兩個新的無監(jiān)督預(yù)測任務(wù)對BERT進行預(yù)訓練。
任務(wù)1: Masked LM
從直覺上看,研究團隊有理由相信,深度雙向模型比left-to-right 模型或left-to-right and right-to-left模型的淺層連接更強大。遺憾的是,標準條件語言模型只能從左到右或從右到左進行訓練,因為雙向條件作用將允許每個單詞在多層上下文中間接地“see itself”。
為了訓練一個深度雙向表示(deep bidirectional representation),研究團隊采用了一種簡單的方法,即隨機屏蔽(masking)部分輸入token,然后只預(yù)測那些被屏蔽的token。論文將這個過程稱為“masked LM”(MLM),盡管在文獻中它經(jīng)常被稱為Cloze任務(wù)(Taylor, 1953)。
在這個例子中,與masked token對應(yīng)的最終隱藏向量被輸入到詞匯表上的輸出softmax中,就像在標準LM中一樣。在團隊所有實驗中,隨機地屏蔽了每個序列中15%的WordPiece token。與去噪的自動編碼器(Vincent et al., 2008)相反,只預(yù)測masked words而不是重建整個輸入。
雖然這確實能讓團隊獲得雙向預(yù)訓練模型,但這種方法有兩個缺點。首先,預(yù)訓練和finetuning之間不匹配,因為在finetuning期間從未看到[MASK]token。為了解決這個問題,團隊并不總是用實際的[MASK]token替換被“masked”的詞匯。相反,訓練數(shù)據(jù)生成器隨機選擇15%的token。例如在這個句子“my dog is hairy”中,它選擇的token是“hairy”。然后,執(zhí)行以下過程:
數(shù)據(jù)生成器將執(zhí)行以下操作,而不是始終用[MASK]替換所選單詞:
80%的時間:用[MASK]標記替換單詞,例如,my dog is hairy → my dog is [MASK]
10%的時間:用一個隨機的單詞替換該單詞,例如,my dog is hairy → my dog is apple
10%的時間:保持單詞不變,例如,my dog is hairy → my dog is hairy. 這樣做的目的是將表示偏向于實際觀察到的單詞。
Transformer encoder不知道它將被要求預(yù)測哪些單詞或哪些單詞已被隨機單詞替換,因此它被迫保持每個輸入token的分布式上下文表示。此外,因為隨機替換只發(fā)生在所有token的1.5%(即15%的10%),這似乎不會損害模型的語言理解能力。
使用MLM的第二個缺點是每個batch只預(yù)測了15%的token,這表明模型可能需要更多的預(yù)訓練步驟才能收斂。團隊證明MLM的收斂速度略慢于 left-to-right的模型(預(yù)測每個token),但MLM模型在實驗上獲得的提升遠遠超過增加的訓練成本。
任務(wù)2:下一句預(yù)測
許多重要的下游任務(wù),如問答(QA)和自然語言推理(NLI)都是基于理解兩個句子之間的關(guān)系,這并沒有通過語言建模直接獲得。
在為了訓練一個理解句子的模型關(guān)系,預(yù)先訓練一個二進制化的下一句測任務(wù),這一任務(wù)可以從任何單語語料庫中生成。具體地說,當選擇句子A和B作為預(yù)訓練樣本時,B有50%的可能是A的下一個句子,也有50%的可能是來自語料庫的隨機句子。例如:
Input = [CLS] the man went to [MASK] store [SEP]
he bought a gallon [MASK] milk [SEP]
Label = IsNext
Input = [CLS] the man [MASK] to the store [SEP]
penguin [MASK] are flight ##less birds [SEP]
Label = NotNext
團隊完全隨機地選擇了NotNext語句,最終的預(yù)訓練模型在此任務(wù)上實現(xiàn)了97%-98%的準確率
6.5、BERT模型的影響:
BERT是一個語言表征模型(language representation model),通過超大數(shù)據(jù)、巨大模型、和極大的計算開銷訓練而成,在11個自然語言處理的任務(wù)中取得了最優(yōu)(state-of-the-art, SOTA)結(jié)果。或許你已經(jīng)猜到了此模型出自何方,沒錯,它產(chǎn)自谷歌。估計不少人會調(diào)侃這種規(guī)模的實驗已經(jīng)基本讓一般的實驗室和研究員望塵莫及了,但它確實給我們提供了很多寶貴的經(jīng)驗:
6.5.1、深度學習就是表征學習 (Deep learning is representation learning)
"We show that pre-trained representations eliminate the needs of many heavily engineered task-specific architectures". 在11項BERT刷出新境界的任務(wù)中,大多只在預(yù)訓練表征(pre-trained representation)微調(diào)(fine-tuning)的基礎(chǔ)上加一個線性層作為輸出(linear output layer)。在序列標注的任務(wù)里(e.g. NER),甚至連序列輸出的依賴關(guān)系都先不管(i.e. non-autoregressive and no CRF),照樣秒殺之前的SOTA,可見其表征學習能力之強大。
6.5.2、規(guī)模很重要(Scale matters)
6.5.3、預(yù)訓練價值很大(Pre-training is important)
6.6、BERT模型的觀點:
6.6.1、high-performance的原因其實還是歸結(jié)于兩點,除了模型的改進,更重要的是用了超大的數(shù)據(jù)集(BooksCorpus 800M + English Wikipedia 2.5G單詞)和超大的算力(對應(yīng)于超大模型)在相關(guān)的任務(wù)上做預(yù)訓練,實現(xiàn)了在目標任務(wù)上表現(xiàn)的單調(diào)增長。
6.6.2、這個模型的雙向和Elmo不一樣,大部分人對他這個雙向在novelty上的contribution 的大小有誤解,我覺得這個細節(jié)可能是他比Elmo顯著提升的原因。Elmo是拼一個左到右和一個右到左,他這個是訓練中直接開一個窗口,用了個有順序的cbow。
6.6.3、可復(fù)現(xiàn)性差:有錢才能為所欲為(Reddit對跑一次BERT的價格討論)
For?TPU?pods: ? 4?TPUs?*?~$2/h?(preemptible)?*?24?h/day?*?4?days?=?$768?(base?model) ? 16?TPUs?=?~$3k?(large?model) ? ? ? For?TPU: ? 16?tpus?*?$8/hr?*?24?h/day?*?4?days?=?12k ? 64?tpus?*?$8/hr?*?24?h/day?*?4?days?=?50k
七、BERT模型源代碼細節(jié)記錄:
7.1、預(yù)訓練輸入?yún)?shù)說明(摘自...):
輸入包含七個部分,分別為:input_ids,input_mask,segment_ids,masked_lm_positions,mask_lm_ids,masked_lm_weights,next_sentence_labels.
input_ids:表示tokens的ids
input_mask:表示哪些是input,哪些是padding.len(input_ids)個1,后面繼續(xù)補0.對于mask的詞,主要占了全部vocabulary的15%左右,在代碼中對于每個詞80%replace with [mask],10% keep original,10% replace with random word.超過了mask的詞數(shù),則終止.
segment_ids:第一個句子到[SEP]為0,后面為1.主要是對輸入進行區(qū)分,判斷輸入的兩個句子.
masked_lm_positions:表示句子中mask的token的position.
mask_lm_ids:表示句子中mask的token的id.
masked_lm_weights:表示句子中mask的token的權(quán)重.
next_sentence_labels:表示兩個句子是不是相連的.
對于每個句子,sentence->embedding->postprocess embedding: 將輸入[batch_size, seq_len]->[batch_size, seq_len, embedding_size]
7.2、bert模型詳解 源碼解析
bert模型源代碼詳細講解,查看代碼詳細解析,請點擊...,此處有非常詳細的對Bert模型各模塊及參數(shù),代碼的詳細解釋說明,請大家查閱。
人工智能 AI
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔相應(yīng)法律責任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔相應(yīng)法律責任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。