內容是結合: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 Embedding到BERT)學習
Word Embedding->Word2Vec->ELMO->GPT->BERT優化
既然預訓練在圖像處理領域效果這麼好,那麼NLP領域爲何沒有相應的預訓練,其實也有,最先的預訓練是Word Embedding,只不過提高的效果不是特別多。同時須要注意的是:NLP裏面作預訓練通常的選擇是用語言模型任務來作(具體見文檔中NLP的語言模型)。編碼
Word Embedding最先是由神經網絡語言模型做爲副產品產出的,它所建立的語言模型的主要任務是根據窗口大小內的上文預測下一個詞。最火的Word Embedding的工具是Word2Vec,它的主任務就是得到詞向量。spa
預訓練的本質是什麼?或者說在NLP領域預訓練的重要性在哪?設計
本質上預訓練是經過設計好一個網絡結構來作語言模型任務,而後把大量甚至是無窮盡的無標註的天然語言文本利用起來,預訓練任務把大量語言學知識抽取出來編碼到網絡結構中,當某一具體任務帶有標註信息的數據有限時,這些先驗的語言學特徵固然會對當前任務有極大的特徵補充做用,由於當數據有限的時候,不少語言學現象是覆蓋不到的,泛化能力就弱,集成儘可能通用的語言學知識天然會增強模型的泛化能力。如何引入先驗的語言學知識其實一直是NLP尤爲是深度學習場景下的NLP的主要目標之一,不過一直沒有太好的解決辦法,而ELMO/GPT/Bert的這種兩階段模式看起來無疑是解決這個問題天然又簡潔的方法,這也是這些方法的主要價值所在。code
注意:NLP裏面作預訓練通常的選擇是用語言模型(能夠結合前面的博文語言模型篇)任務來作。NLP領域最先的預訓練是Word Embedding,它就是大名鼎鼎的神經網絡語言模型,它所創建的語言模型的任務是經過輸入前面的t-1個詞來預測第t個詞(相似於N-gram文法模型的思想),在這個語言模型任務中詞向量只是做爲副產物產出。隨後谷歌基於此推出了Word2vec,有兩種訓練方法,CBOW和skip-gram,其對應的語言模型任務不一樣,前者是根據窗口大小內的上下文來預測中心詞,後者是根據中心詞來預測窗口大小內上下文詞。爲何說它是一個預訓練,這要從它的使用來看,在NLP任務中會先經過tf.nn.embedding_lookup完成id向詞向量的映射,它的內部機理是把預先訓練好的詞向量跟一個one_hot形式的矩陣相乘進而獲得詞向量,看這樣就把網絡的初始輸入經過預先訓練好的詞向量初始化了,從而說明其是預訓練。Word2vec最大的問題是他沒有解決多義詞的問題,同一詞彙在不一樣語境中所表明的意思不一樣,可是經過Word2vec獲得的詞向量無論詞所處的語境如何,都會用相同的詞向量進行表示,詞向量訓練好了就不變了。orm
爲了克服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對上下文信息進行了更加充分的應用。