NLP之預訓練


內容是結合:https://zhuanlan.zhihu.com/p/49271699 可以直接看原文

預訓練一般要從圖像處理領域說起:
可以先用某個訓練集合比如訓練集合A或者訓練集合B對這個網絡進行預先訓練,在A任務上或者B任務上學會網絡參數,然后存起來以備后用。假設我們面臨第三個任務C,網絡結構采取相同的網絡結構,在比較淺的幾層CNN結構,網絡參數初始化的時候可以加載A任務或者B任務學習好的參數,其它CNN高層的參數仍然需要隨機初始化。之后我們用C任務的訓練數據來訓練網絡,此時有兩種做法,一種是淺層加載的參數在訓練C任務過程中不動,這種方法被稱為“Frozen”;另外一種是底層網絡參數盡管被初始化了,在C任務訓練過程中仍然隨着訓練的進程不斷改變,這種一般叫“Fine-Tuning”(微調),顧名思義,就是更好地把參數進行調整使得其更適應當前的C任務。一般圖像或者視頻領域要做預訓練一般都這么做。
那么為什么這種預訓練的思路是可行的?
就圖像處理的人臉識別方面而言,目前我們已經知道,對於層級的CNN結構來說,不同層級的神經元學習到了不同類型的圖像特征,由底向上特征形成層級結構,越是底層的特征越是所有不論什么領域的圖像都會具備的比如邊角線弧線等底層基礎特征,越往上抽取出的特征越與手頭任務相關。正因為此,所以預訓練好的網絡參數,尤其是底層的網絡參數抽取出特征跟具體任務越無關,越具備任務的通用性,所以這是為何一般用底層預訓練好的參數初始化新任務網絡參數的原因。而高層特征跟任務關聯較大,實際可以不用使用,或者采用Fine-tuning用新數據集合清洗掉高層無關的特征抽取器。
預訓練的好處在哪?
由於底層特征的通用性,可以先用大型的圖像數據集抽取底層的特征,數據量越大抽取的特征越好,隨后對於具體的任務底層特征可以直接使用通過大型數據集訓練出的特征(神經網絡由於在反向傳播中通過鏈式求導法則對參數進行優化,網絡層數過多時梯度在回傳過程中不斷彌散,這一神經網絡的先天不足導致神經網絡存在訓練難問題,接近底層的參數更新粒度很小,因此事先通過大型數據進行預訓練,得到通用性較強的底層參數,然后直接應用到下游的具體任務中,可以使得模型效果很好),由於高層數據和具體任務的聯系過大,因此可以結合任務的相關數據集對高層數據集進行微調,這樣即使相關數據集過小也能取得很好的效果。

NLP領域預訓練的發展(從Word EmbeddingBERT

Word Embedding->Word2Vec->ELMO->GPT->BERT

既然預訓練在圖像處理領域效果這么好,那么NLP領域為什么沒有相應的預訓練,其實也有,最早的預訓練是Word Embedding,只不過提升的效果不是特別多。同時需要注意的是:NLP里面做預訓練一般的選擇是用語言模型任務來做(具體見文檔中NLP的語言模型)。

Word Embedding最早是由神經網絡語言模型作為副產品產出的,它所創建的語言模型的主要任務是根據窗口大小內的上文預測下一個詞。最火的Word Embedding的工具是Word2Vec,它的主任務就是獲得詞向量。

預訓練的本質是什么?或者說在NLP領域預訓練的重要性在哪?

本質上預訓練是通過設計好一個網絡結構來做語言模型任務,然后把大量甚至是無窮盡的無標注的自然語言文本利用起來,預訓練任務把大量語言學知識抽取出來編碼到網絡結構中,當某一具體任務帶有標注信息的數據有限時,這些先驗的語言學特征當然會對當前任務有極大的特征補充作用,因為當數據有限的時候,很多語言學現象是覆蓋不到的,泛化能力就弱,集成盡量通用的語言學知識自然會加強模型的泛化能力。如何引入先驗的語言學知識其實一直是NLP尤其是深度學習場景下的NLP的主要目標之一,不過一直沒有太好的解決辦法,而ELMO/GPT/Bert的這種兩階段模式看起來無疑是解決這個問題自然又簡潔的方法,這也是這些方法的主要價值所在。

注意:NLP里面做預訓練一般的選擇是用語言模型(可以結合前面的博文語言模型篇)任務來做。NLP領域最早的預訓練是Word Embedding,它就是大名鼎鼎的神經網絡語言模型,它所建立的語言模型的任務是通過輸入前面的t-1個詞來預測第t個詞(類似於N-gram文法模型的思想),在這個語言模型任務中詞向量只是作為副產物產出。隨后谷歌基於此推出了Word2vec,有兩種訓練方法,CBOW和skip-gram,其對應的語言模型任務不同,前者是根據窗口大小內的上下文來預測中心詞,后者是根據中心詞來預測窗口大小內上下文詞。為什么說它是一個預訓練,這要從它的使用來看,在NLP任務中會先通過tf.nn.embedding_lookup完成id向詞向量的映射,它的內部機理是把預先訓練好的詞向量跟一個one_hot形式的矩陣相乘進而得到詞向量,看這樣就把網絡的初始輸入通過預先訓練好的詞向量初始化了,從而說明其是預訓練。Word2vec最大的問題是他沒有解決多義詞的問題,同一詞匯在不同語境中所代表的意思不同,但是通過Word2vec得到的詞向量不管詞所處的語境如何,都會用相同的詞向量進行表示,詞向量訓練好了就不變了。

為了克服Word2vec的缺點,可以使用ELMO,它可以融入語境特征,因為代表每個單詞的向量不是相同的,會根據具體語境變換。它所建立的語言模型的任務是根據單詞的上文去正確預測單詞,以及根據單詞的下文去正確預測單詞。它的網絡結構一般采用雙層雙向LSTM(這個可以自己設定),句子中每個單詞都能得到對應的三個Embedding:最底層是單詞的Word Embedding,往上走是第一層雙向LSTM中對應單詞位置的Embedding,這層編碼單詞的句法信息更多一些;再往上走是第二層LSTM中對應單詞位置的Embedding,這層編碼單詞的語義信息更多一些。也就是說,ELMO的預訓練過程不僅僅學會單詞的Word Embedding,還學會了一個雙層雙向的LSTM網絡結構,而這兩者后面都有用。

具體它該如何使用?先通過語料pre-train一個語言模型,訓練完之后把三層的Embedding通過一定的權重相乘相加,再和下游任務中的Word2vec獲得的詞向量進行拼接作為網絡的輸入。句子X中每個單詞在ELMO網絡中都能獲得對應的三個Embedding,之后給予這三個Embedding中的每一個Embedding一個權重(這個權重是結合訓練語料訓練得來的),根據各自權重加權求和,將三個Embedding整合成一個。然后將整合后的這個Embedding作為X句在自己任務的那個網絡結構中對應單詞的輸入,以此作為補充的新特征給下游任務使用。

那么ELMO(Embedding from Language Models),它是在Deep contextualized word representation(深度語境化詞語表達)論文中提出的,論文的題目更能表現其特性。又有什么不足吶,只是事后和GPT(Generative Pre-Training生成性預訓練)以及BERT(Bidirectional Encoder Representations from Transformers)比在特征抽取器方面它選用的不是Transformer,同時它采用拼接的方式融合雙向的特征,相對而言融合能力較弱。

GPT采用了Transformer作為特征提取器,但是它所建立的語言模型是根據單詞的上文預測單詞,沒有使用雙向的信息。對於如何使用需要根據不同任務進行具體的網絡構造。首先,對於不同的下游任務來說,本來你可以任意設計自己的網絡結構,現在不行了,你要向GPT的網絡結構看齊,把任務的網絡結構改造成和GPT的網絡結構是一樣的。然后,在做下游任務的時候,利用第一步預訓練好的參數初始化GPT的網絡結構,這樣通過預訓練學到的語言學知識就被引入到你手頭的任務里來了,這是個非常好的事情。再次,你可以用手頭的任務去訓練這個網絡,對網絡參數進行Fine-tuning,使得這個網絡更適合解決手頭的問題。

BERT(Bidirectional Encoder Representations from Transformers)采用了Transformer作為特征提取器,同時它所建立的語言模型是根據單詞的上下文預測單詞,引入了masked language model對上下文信息進行了更加充分的應用。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM