㈠ 預訓練模型綜述--Albert,xlnet,bert,word2vec
Albert,xlnet,bert,word2vec
通過預訓練模型實現遷移學習,遷移學習本質上是在一個數據集上訓練模型,然後對該模型進行調整,以在不同的數據集上執行不同的自然語言處理功能。
1. word2vec
線性模型 :
很神奇的地方,從而也說明高維空間映射的詞向量可以很好體現真實世界中token之間的關系。如:king-man = queen-woman
負采樣 :
由於訓練詞向量模型的目標不是為了得到一個多麼精準的語言模型,而是為了獲得它的副產物——詞向量。所以要做到的不是在幾萬幾十萬個token中艱難計算softmax獲得最優的那個詞(就是預測的對於給定詞的下一詞),而只需能做到在幾個詞中找到對的那個詞就行,這幾個詞包括一個正例(即直接給定的下一詞),和隨機產生的雜訊詞(采樣抽取的幾個負例),就是說訓練一個sigmoid二分類器,只要模型能夠從中找出正確的詞就認為完成任務。
這種負采樣思想也應用到之後的BERT里,只不過從word-level變成sentence-level,這樣能獲取句子間關聯關系。
缺點是上下文無關(static):
因而為了讓句子有一個整體含義(context),大家會在下游具體的NLP任務中基與詞向量的序列做encoding操作。
下面是一個比較表格,模型不細講了,預測目標這里的next word下一個詞,是所有傳統語言模型都做的事——尋找下一個詞填什麼。
BERT模型進一步增加詞向量模型泛化能力,充分描述字元級、詞級、句子級甚至句間關系特徵。
真正的雙向encoding:
Masked LM,類似完形填空,盡管仍舊看到所有位置信息,但需要預測的詞已被特殊符號代替,可以放心雙向encoding。
Transformer做encoder實現上下文相關(context):
使用transformer而不是bi-LSTM做encoder,可以有更深的層數、具有更好並行性。並且線性的Transformer比lstm更易免受mask標記影響,只需要通過self-attention減小mask標記權重即可,而lstm類似黑盒模型,很難確定其內部對於mask標記的處理方式。
提升至句子級別:
學習句子/句對關系表示,句子級負采樣。首先給定的一個句子,下一句子正例(正確詞),隨機采樣一句負例(隨機采樣詞),句子級上來做二分類(即判斷句子是當前句子的下一句還是雜訊),類似word2vec的單詞級負采樣。
二、BERT細則
這里主要介紹BERT的三個亮點Masked LM、transformer、sentence-level。
1. Masked Language Model
原本叫cloze test,是完形填空的意思。
隨機mask語料中15%的token,然後將masked token 位置輸出的最終隱層向量送入softmax,來預測masked token。
這樣輸入一個句子,每次只預測句子中大概15%的詞,所以BERT訓練很慢。。。(但是google設備NB。。)
而對於蓋住詞的特殊標記,在下游NLP任務中不存在。因此,為了和後續任務保持一致,作者按一定的比例在需要預測的詞位置上輸入原詞或者輸入某個隨機的詞。如:my dog is hairy
2. Transformer —— attention is all you need
Transformer模型是2018年5月提出的,可以替代傳統RNN和CNN的一種新的架構,用來實現機器翻譯,論文名稱是attention is all you need。無論是RNN還是CNN,在處理NLP任務時都有缺陷。CNN是其先天的卷積操作不很適合序列化的文本,RNN是其沒有並行化,很容易超出內存限制(比如50tokens長度的句子就會占據很大的內存)。
下面左圖是transformer模型一個結構,分成左邊Nx框框的encoder和右邊Nx框框的decoder,相較於RNN+attention常見的encoder-decoder之間的attention(上邊的一個橙色框),還多出encoder和decoder內部的self-attention(下邊的兩個橙色框)。每個attention都有multi-head特徵。最後,通過position encoding加入沒考慮過的位置信息。
下面從multi-head attention,self-attention, position encoding幾個角度介紹。
multi-head attention:
將一個詞的vector切分成h個維度,求attention相似度時每個h維度計算。由於單詞映射在高維空間作為向量形式,每一維空間都可以學到不同的特徵,相鄰空間所學結果更相似,相較於全體空間放到一起對應更加合理。比如對於vector-size=512的詞向量,取h=8,每64個空間做一個attention,學到結果更細化。
self-attention:
每個詞位的詞都可以無視方向和距離,有機會直接和句子中的每個詞encoding。比如上面右圖這個句子,每個單詞和同句其他單詞之間都有一條邊作為聯系,邊的顏色越深表明聯系越強,而一般意義模糊的詞語所連的邊都比較深。比如:law,application,missing,opinion。。。
position encoding:
因為transformer既沒有RNN的recurrence也沒有CNN的convolution,但序列順序信息很重要,比如你欠我100萬明天要還和我欠你100萬明天要還的含義截然不同。。。
transformer計算token的位置信息這里使用正弦波↓,類似模擬信號傳播周期性變化。這樣的循環函數可以一定程度上增加模型的泛化能力。
但BERT直接訓練一個position embedding來保留位置信息,每個位置隨機初始化一個向量,加入模型訓練,最後就得到一個包含位置信息的embedding(簡單粗暴。。),最後這個position embedding和word embedding的結合方式上,BERT選擇直接相加。
3. sentence-level representation
在很多任務中,僅僅靠encoding是不足以完成任務的(這個只是學到了一堆token級的特徵),還需要捕捉一些句子級的模式,來完成SLI、QA、dialogue等需要句子表示、句間交互與匹配的任務。對此,BERT又引入了另一個極其重要卻又極其輕量級的任務,來試圖把這種模式也學習到。
句子級負采樣
句子級別的連續性預測任務,即預測輸入BERT的兩端文本是否為連續的文本。訓練的時候,輸入模型的第二個片段會以50%的概率從全部文本中隨機選取,剩下50%的概率選取第一個片段的後續的文本。 即首先給定的一個句子(相當於word2vec中給定context),它下一個句子即為正例(相當於word2vec中的正確詞),隨機采樣一個句子作為負例(相當於word2vec中隨機采樣的詞),然後在該sentence-level上來做二分類(即判斷句子是當前句子的下一句還是雜訊)。
句子級表示
BERT是一個句子級別的語言模型,不像ELMo模型在與下游具體NLP任務拼接時需要每層加上權重做全局池化,BERT可以直接獲得一整個句子的唯一向量表示。它在每個input前面加一個特殊的記號[CLS],然後讓Transformer對[CLS]進行深度encoding,由於Transformer是可以無視空間和距離的把全局信息encoding進每個位置的,而[CLS]的最高隱層作為句子/句對的表示直接跟softmax的輸出層連接,因此其作為梯度反向傳播路徑上的「關卡」,可以學到整個input的上層特徵。
segment embedding
對於句對來說,EA和EB分別代表左句子和右句子;對於句子來說,只有EA。這個EA和EB也是隨模型訓練出來的。
如下圖所示,最終輸入結果會變成下面3個embedding拼接的表示。
首先,XLNet 是一個類似 BERT 的模型,而不是完全不同的模型。但這是一個非常有前途和潛力的。總之,XLNet是一種通用的自回歸預訓練方法。
那麼什麼是自回歸(AR)語言模型?
AR語言模型是一種使用上下文詞來預測下一個詞的模型。但是在這里,上下文單詞被限制在兩個方向,前向或後向。
AR 語言模型的優勢是擅長生成式自然語言處理任務。 因為在生成上下文時,通常是前向的。AR 語言模型很自然地適用於此類 NLP 任務。
但AR語言模型有一些缺點,它只能使用前向上下文或後向上下文,這意味著它不能同時使用前向和後向上下文。
自回歸語言模型有優點有缺點,缺點是只能利用上文或者下文的信息,不能同時利用上文和下文的信息,當然,貌似ELMO這種雙向都做,然後拼接看上去能夠解決這個問題,因為融合模式過於簡單,所以效果其實並不是太好。它的優點,其實跟下游NLP任務有關,比如生成類NLP任務,比如文本摘要,機器翻譯等,在實際生成內容的時候,就是從左向右的,自回歸語言模型天然匹配這個過程。而Bert這種DAE模式,在生成類NLP任務中,就面臨訓練過程和應用過程不一致的問題,導致生成類的NLP任務到目前為止都做不太好。
與 AR 語言模型不同,BERT 被歸類為自動編碼器(AE)語言模型。
AE 語言模型旨在從損壞的輸入重建原始數據。
損壞的輸入意味著我們在預訓練階段用 [MASK] 替換原始詞 into 。目標是預測 into 得到原始句子。
AE 語言模型的優勢是,它可以從向前和向後的方向看到上下文。
但 AE 語言模型也有其缺點。它在預訓練中使用 [MASK] ,但這種人為的符號在調優時在真實數據中並不存在,會導致預訓練-調優的差異。[MASK] 的另一個缺點是它假設預測(掩蔽的)詞 在給定未屏蔽的 詞 的情況下彼此獨立。例如,我們有一句話「它表明住房危機已經變成銀行危機」。我們掩蔽「銀行業」和「危機」。在這里注意,我們知道掩蔽的「銀行業」和「危機」包含彼此的隱含關系。但 AE 模型試圖預測「銀行業」給予未掩蔽的 詞,並預測「危機」分別給出未掩蔽的 詞。它忽略了「銀行業」與「危機」之間的關系。換句話說,它假設預測(掩蔽)的標記彼此獨立。但是我們知道模型應該學習預測(掩蔽)詞之間的這種相關性來預測其中一個詞。
作者想要強調的是,XLNet 提出了一種讓 AR 語言模型從雙向上下文中學習的新方法,以避免 MASK 方法在 AE 語言模型中帶來的缺點。
XLNet的出發點就是:能否融合自回歸LM和DAE LM兩者的優點。就是說如果站在自回歸LM的角度,如何引入和雙向語言模型等價的效果;如果站在DAE LM的角度看,它本身是融入雙向語言模型的,如何拋掉表面的那個[Mask]標記,讓預訓練和Fine-tuning保持一致。當然,XLNet還講到了一個Bert被Mask單詞之間相互獨立的問題,我相信這個不太重要,原因後面會說。當然,我認為這點不重要的事情,純粹是個人觀點,出錯難免,看看就完了,不用較真。
AR 語言模型只能向前或向後使用上下文,那麼如何讓它從雙向上下文中學習呢?
語言模型包括兩個階段,即預訓練階段和調優階段。XLNet 專注於預訓練階段。在預訓練階段,它提出了一個名為排列語言建模的新目標。我們可以從這個名稱知道基本思想,它使用排列。
這里我們舉一個例子來解釋。序列的次序是 [x1, x2, x3, x4] 。這種序列的所有排列如下。
因此對於這 4 個詞的([圖片上傳失敗...(image-c7a4e0-1570519576567)]
)句子,有 24([圖片上傳失敗...(image-d738b7-1570519576567)]
)個排列。
情景是我們想要預測 x3 。因此在 24 個排列中有 4 種模式,分別 x3 位於第 1 位,第 2 位,第 3 位,第 4 位。
當然,上面講的仍然是基本思想。難點其實在於具體怎麼做才能實現上述思想。首先,需要強調一點,盡管上面講的是把句子X的單詞排列組合後,再隨機抽取例子作為輸入,但是,實際上你是不能這么做的,因為Fine-tuning階段你不可能也去排列組合原始輸入。所以,就必須讓預訓練階段的輸入部分,看上去仍然是x1,x2,x3,x4這個輸入順序,但是可以在Transformer部分做些工作,來達成我們希望的目標。具體而言,XLNet採取了Attention掩碼的機制,你可以理解為,當前的輸入句子是X,要預測的單詞Ti是第i個單詞,前面1到i-1個單詞,在輸入部分觀察,並沒發生變化,該是誰還是誰。但是在Transformer內部,通過Attention掩碼,從X的輸入單詞裡面,也就是Ti的上文和下文單詞中,隨機選擇i-1個,放到Ti的上文位置中,把其它單詞的輸入通過Attention掩碼隱藏掉,於是就能夠達成我們期望的目標(當然這個所謂放到Ti的上文位置,只是一種形象的說法,其實在內部,就是通過Attention Mask,把其它沒有被選到的單詞Mask掉,不讓它們在預測單詞Ti的時候發生作用,如此而已。看著就類似於把這些被選中的單詞放到了上文Context_before的位置了)。具體實現的時候,XLNet是用「雙流自注意力模型」實現的,細節可以參考論文,但是基本思想就如上所述,雙流自注意力機制只是實現這個思想的具體方式,理論上,你可以想出其它具體實現方式來實現這個基本思想,也能達成讓Ti看到下文單詞的目標。
上面說的Attention掩碼,我估計你還是沒了解它的意思,我再用例子解釋一下。Attention Mask的機制,核心就是說,盡管當前輸入看上去仍然是x1->x2->x3->x4,但是我們已經改成隨機排列組合的另外一個順序x3->x2->x4->x1了,如果用這個例子用來從左到右訓練LM,意味著當預測x2的時候,它只能看到上文x3;當預測x4的時候,只能看到上文x3和x2,以此類推……這樣,比如對於x2來說,就看到了下文x3了。這種在輸入側維持表面的X句子單詞順序,但是其實在Transformer內部,看到的已經是被重新排列組合後的順序,是通過Attention掩碼來實現的。如上圖所示,輸入看上去仍然是x1,x2,x3,x4,可以通過不同的掩碼矩陣,讓當前單詞Xi只能看到被排列組合後的順序x3->x2->x4->x1中自己前面的單詞。這樣就在內部改成了被預測單詞同時看到上下文單詞,但是輸入側看上去仍然維持原先的單詞順序了。關鍵要看明白上圖右側那個掩碼矩陣,我相信很多人剛開始沒看明白,因為我剛開始也沒看明白,因為沒有標出掩碼矩陣的單詞坐標,它的坐標是1-2-3-4,就是表面那個X的單詞順序,通過掩碼矩陣,就能改成你想要的排列組合,並讓當前單詞看到它該看到的所謂上文,其實是摻雜了上文和下文的內容。這是attention mask來實現排列組合的背後的意思。
ALBERT相比於BERT的改進
ALBERT也是採用和BERT一樣的Transformer的encoder結果,激活函數使用的也是GELU,在講解下面的內容前,我們規定幾個參數,詞的embedding我們設置為E,encoder的層數我們設置為L,hidden size即encoder的輸出值的維度我們設置為H,前饋神經網路的節點數設置為4H,attention的head個數設置為H/64。
在ALBERT中主要有三個改進方向。
1、對Embedding因式分解(Factorized embedding parameterization)
在BERT中,詞embedding與encoder輸出的embedding維度是一樣的都是768。但是ALBERT認為,詞級別的embedding是沒有上下文依賴的表述,而隱藏層的輸出值不僅包括了詞本生的意思還包括一些上下文信息,理論上來說隱藏層的表述包含的信息應該更多一些,因此應該讓H>>E,所以ALBERT的詞向量的維度是小於encoder輸出值維度的。
在NLP任務中,通常詞典都會很大,embedding matrix的大小是E×V,如果和BERT一樣讓H=E,那麼embedding matrix的參數量會很大,並且反向傳播的過程中,更新的內容也比較稀疏。
結合上述說的兩個點,ALBERT採用了一種因式分解的方法來降低參數量。首先把one-hot向量映射到一個低維度的空間,大小為E,然後再映射到一個高維度的空間,說白了就是先經過一個維度很低的embedding matrix,然後再經過一個高維度matrix把維度變到隱藏層的空間內,從而把參數量從O(V×H) O(V×H)O(V×H)降低到了O(V×E+E×H) O(V×E+E×H)O(V×E+E×H),當E<<H時參數量減少的很明顯。
下圖是E選擇不同值的一個實驗結果,尷尬的是,在不採用參數共享優化方案時E設置為768效果反而好一些,在採用了參數共享優化方案時E取128效果更好一些。
2、跨層的參數共享(Cross-layer parameter sharing)
在ALBERT還提出了一種參數共享的方法,Transformer中共享參數有多種方案,只共享全連接層,只共享attention層,ALBERT結合了上述兩種方案,全連接層與attention層都進行參數共享,也就是說共享encoder內的所有參數,同樣量級下的Transformer採用該方案後實際上效果是有下降的,但是參數量減少了很多,訓練速度也提升了很多。
下圖是BERT與ALBERT的一個對比,以base為例,BERT的參數是108M,而ALBERT僅有12M,但是效果的確相比BERT降低了兩個點。由於其速度快的原因,我們再以BERT xlarge為參照標准其參數是1280M,假設其訓練速度是1,ALBERT的xxlarge版本的訓練速度是其1.2倍,並且參數也才223M,評判標準的平均值也達到了最高的88.7
除了上述說了訓練速度快之外,ALBERT每一層的輸出的embedding相比於BERT來說震盪幅度更小一些。下圖是不同的層的輸出值的L2距離與cosine相似度,可見參數共享其實是有穩定網路參數的作用的。
3、句間連貫(Inter-sentence coherence loss)
BERT的NSP任務實際上是一個二分類,訓練數據的正樣本是通過采樣同一個文檔中的兩個連續的句子,而負樣本是通過採用兩個不同的文檔的句子。該任務主要是希望能提高下游任務的效果,例如NLI自然語言推理任務。但是後續的研究發現該任務效果並不好,主要原因是因為其任務過於簡單。NSP其實包含了兩個子任務,主題預測與關系一致性預測,但是主題預測相比於關系一致性預測簡單太多了,並且在MLM任務中其實也有類型的效果。
這里提一下為啥包含了主題預測,因為正樣本是在同一個文檔中選取的,負樣本是在不同的文檔選取的,假如我們有2個文檔,一個是娛樂相關的,一個是新中國成立70周年相關的,那麼負樣本選擇的內容就是不同的主題,而正樣都在娛樂文檔中選擇的話預測出來的主題就是娛樂,在新中國成立70周年的文檔中選擇的話就是後者這個主題了。
在ALBERT中,為了只保留一致性任務去除主題識別的影響,提出了一個新的任務 sentence-order prediction(SOP),SOP的正樣本和NSP的獲取方式是一樣的,負樣本把正樣本的順序反轉即可。SOP因為實在同一個文檔中選的,其只關注句子的順序並沒有主題方面的影響。並且SOP能解決NSP的任務,但是NSP並不能解決SOP的任務,該任務的添加給最終的結果提升了一個點。
4、移除dropout
除了上面提到的三個主要優化點,ALBERT的作者還發現一個很有意思的點,ALBERT在訓練了100w步之後,模型依舊沒有過擬合,於是乎作者果斷移除了dropout,沒想到對下游任務的效果竟然有一定的提升。這也是業界第一次發現dropout對大規模的預訓練模型會造成負面影響。
參考鏈接:
徹底搞懂BERT
什麼是 XLNet,為何它會超越 BERT?
XLNet:運行機制及和Bert的異同比較
一文揭開ALBERT的神秘面紗
不懂word2vec,還敢說自己是做NLP?
㈡ linux如何使用vgg模型
linux如何使用vgg模型如下
首先我們需要導入所需要的包,本次訓練模型呢,使用了VGG16預訓練網路模型,對於沒有GPU加持的小夥伴眾多的預訓練網路模型也算是福音。即可加快模型訓練速度,也可以使小批量的數據集的准確率提高很多。
從網上找到的貓狗數據集資源,載入貓狗數據集和劃分貓狗訓練(train)數據和測試(test)數據。貓狗原數據集我已上傳到網路雲盤,需要的文章末尾請自取。
㈢ 自己寫的網路怎麼預訓練
首先固定隨機種子,簡單化,其次在評估中添加有效數字,最後在初始階段驗證損失函數初始化。
。由於神經網路實際上是數據集的壓縮版本,因此您將能夠查看網路(錯誤)預測並了解它們的來源。如果你的網路給你的預測看起來與你在數據中看到的內容不一致,那麼就會有所收獲。
㈣ deepfacelab神丹怎麼用
使用步驟是:
1、下載一個預訓練模型,放到model文件夾內。
2、訓練階段選擇預訓練模型。開始訓練,在選擇要訓練的模型(如果文件夾中還有更多)和要訓練的設備(GPU/CPU)之後,等待片刻,會提示2秒鍾內按enter回車以修改模型設置,按它進入參數設置環節,把最後一個選項(是否啟用預訓練模式usepretrainmode)改為N。神丹指的是預訓練模型。
㈤ 如何構建深度學習預訓練模型
可以直接先找到自己需要的訓練模型,一般來說都可以找到的
㈥ 如何應用預訓練模型
比如inageNet 多分類圖像預訓練模型。下游任務是貓和狗的二分類。
使用預訓練模型,直接將最後一層多分類修改成二分類即可。
使用預訓練模型,凍結n-k層, fine-tune k層權重
使用預訓練模型,fine-tune 所有權重
適合使用預訓練模型,建議重新訓練模型
㈦ 使用python在GPU上構建和訓練卷積神經網路
我將對代碼進行補充演練,以構建在數據集上訓練的任何類型的圖像分類器。在這個例子中,我將使用花卉數據集,其中包括102種不同類型的花。需要數據集和代碼都可以私信我。
Pytorch是機器學習和Python上的免費軟體包,非常易於使用。語法模擬numpy,因此,如果你在python中有一些科學計算經驗,那麼會相當有用的。只需幾行代碼,就可以下載預先訓練的數據集,使用定義的變換對圖像進行標准化,然後運行訓練。
創建和擴充數據集
為了增加數據集,我使用' google_images_download'API 從互聯網上下載了相關圖像。顯然,您可以使用此API不僅可以擴充現有數據集,還可以從頭開始創建自己的數據集。
確保從圖像中挑選出異常值(損壞的文件或偶然出現的無關圖像)。
圖像標准化
為了使圖像具有相同的大小和像素變化,可以使用pytorch的transfors模塊:
轉移學習
從頭開始訓練的模型可能不是最明智的選擇,因為有許多網路可用於各種數據集。簡單地說,像edge-和其他簡單形狀檢測器等低級特徵對於不同的模型是相似的,即使clasificators是針對不同目的進行訓練的。在本項目中,我使用了一個預訓練網路Resnet152,只有最後一個完全連接的層重新用於新任務,即使這樣也會產生相當好的效果。
在這里,我將除最後一層之外的所有層都設置為具有固定權重(requires_grad = False),因此只有最後層中的參數將通過梯度下降進行更新。
訓練模型
下面介紹一下進行訓練的函數:
如何獲得GPU?
當然,對CPU的訓練太慢了。根據我自己的經驗,在GPU僅需要一個小時就可以完成12次訓練周期,但是在CPU上相同數量的訓練周期可能需要花費大約15個小時。
如果您沒有本地可用的GPU,則可以考慮使用雲GPU。為了加速CNN的訓練,我使用了floydhub(www.floydhub.com)上提供的雲GPU 。
這項服務非常指的使用:總有很好的文檔和大量的提示,所以你會很清楚的知道下一步需要如何去做。在floydhub上對於使用GPU的收費也是可以接受的。
首先,需要將數據集上傳到伺服器
然後,需要創建項目。需要在計算機上安裝floydhub客戶端,將數據集上載到其網站並在終端中運行以下命令:
其中'username'是您的登錄名,'i'是數據集所在的文件夾。
這樣子在訓練網路時就會很輕鬆了
結果和改進想法
得到的模型在數據集上訓練了1.5小時,並在驗證數據集上達到了95%的准確度。
㈧ 如何調整預訓練權重每層的網路形狀
1、修改網路結構,根據網路初始化設置,在Resnet50後面加一層全連接網路,輸出1乘以2048的特徵編碼。
2、修改模型權重,需要載入模型後,將weights的第一維砍掉四分之三,同樣bias也砍掉四分之三即可。
㈨ BERT預訓練模型
n-gram語言模型:根據前面n個詞預測當前詞,它的缺點是,一般只能取1-2,n越大計算成本越高,這就使得它關注的信息是非常局限的。
預訓練語言模型:wordvec\glove\fasttext。wordvec是根據周圍詞預測當前詞或當前詞預測周圍詞,相比於n-gram,它關注了下文,但它仍然是關注局部信息。glove通過構建詞頻共現矩陣來訓練詞向量,將全局信息融入到詞向量中。fasttext仍然是局部的,只是他分詞是基於subword,對於oov詞相對友好。三者共同的缺點是,無法解決一詞多義問題。
高級語言模型:elmo\GPT,elmo採用1層靜態向量+2層單向LSTM提取特徵,並且能夠解決一詞多義,elmo是一個雙向語言模型,但實際上是兩個單向語言模型(方向相反)的拼接,這種融合特徵的能力比 BERT 一體化融合特徵方式弱。GPT採用Transformer的decoder單元提取特徵,同樣也可以解決一詞多義問題,但GPT是單向的。所以,對上下文信息的融合,二者能力還不夠。
bert是雙向語言模型,句子沒有shift_mask操作,所以是完整的上下文環境,證實了雙向語言模型對文本特徵表示的重要性。bert同時證實了預訓練模型能夠簡化很多繁重任務的網路結構,在11個nlp任務上都有顯著提升。
bert採用Transformer的encoder單元提取特徵,encoder中包含幾個重要的機制:self-attention、muti-head attention、position encoding。
bert分為bert_base和bert_large大小兩個模型,bert_base採用了12個encoder單元,768維隱藏層,12個attention。bert_base採用了24個encoder單元,1024維隱藏層,16個attention。
input:單句或句對組合,有[cls]作為句子開頭的標記,[sep]作為句子分隔和結束的標記。
token embedding:對於英文採用WordPiece embeddings,也就是一個單詞會被拆成詞根詞綴的,比如圖中的playing被拆成了play和ing兩個token;對於中文,就是單子拆分。
segment embedding:相鄰句子採用不同的標志分隔,形如111111111100000011111100000。
position embedding:在transformer中,單詞之間是沒有先後順序的,而語言本身是有序的,所以採用採用正餘弦函數來計算每個單詞的先後順序,這種方式有點勉強,算是折中方式。
前面講到elmo也是雙向語言模型,它是採用bi-LSTM來提取特徵,如下:
比如一句話:『北京是中國的首都』,在LSTM中從左往右,預測『中國』的時候只能看到『北京』,從右往左,預測『中國』的時候只能看到『首都』,然後將兩個lstm的輸出做拼接來達到上下文信息融合的目的。其實是沒有完全做到雙向,只是以結構的改變來接近雙向語言模型。真正的雙向是預測『中國』的時候,需要同時看到『北京』和『首都』。由此,mask LM產生了。
mask LM的原理是將『中國』遮蓋住,同時用『北京』和『首都』來預測『中國』。『北京』和『首都』聯系起來語言模型很容易聯想到就是『中國』啦。這個思想和wordvec的CBOW模型如出一轍,就是用周圍詞預測當前詞,只是這個思想放在厲害的transformer中,便能大顯其能。
BERT的mask方式:在選擇mask的15%的詞當中,80%情況下使用mask掉這個詞,10%情況下採用一個任意詞替換,剩餘10%情況下保持原詞彙不變。這樣mask的優點是什麼?
1)被隨機選擇15%的詞當中以10%的概率用任意詞替換去預測正確的詞,相當於文本糾錯任務,為BERT模型賦予了一定的文本糾錯能力;
2)被隨機選擇15%的詞當中以10%的概率保持不變,緩解了finetune時候與預訓練時候輸入不匹配的問題(預訓練時候輸入句子當中有mask,而finetune時候輸入是完整無缺的句子,即為輸入不匹配問題)。
在Mask LM任務中,模型學到了詞與詞之間的關系,而NSP任務是要模型學到句子與句子之間的關系,比如問答、推理等。它將訓練語料分為兩類,一是將50%語料構建成正常語序的句子對,比如A-B句子對,B就是A的實際下一個句子,並做標記為isnext;二是將50%語料構建成非正常語序句子對,B是來自語料庫的隨機句子,並做標記為notnext。然後通過對句子對的關系做分類,預測B到底是不是A句子的下一個句子,使模型具有句子級別的識別能力。
微調的目的在於我們的任務與bert預訓練任務是不一致的,但是bert是非常好的語言模型,他具備提取詞法和句法的強大能力。將bert嵌入到我們的網路結構中,能夠簡化在語言模型方面的復雜結構。只需要將輸入做成和bert適配的格式就行,而在bert後面接上全連接、CNN等簡單模型進行訓練,就能夠使訓練得到一個比較好的效果。
GPT 和 BERT 都採用Transformer,Transformer 是encoder-decoder 結構,GPT 的單向語言模型採用 decoder 部分,decoder 的部分見到的都是不完整的句子;BERT 的雙向語言模型則採用 encoder 部分,採用了完整句子。他倆最主要的區別在於BERT是雙向語言模型,更適合文本分類等任務,GPT是單向語言模型,更適合生成式任務。
1)低層網路捕捉了短語級別的結構信息
2)表層信息特徵在底層網路(3,4),句法信息特徵在中間層網路(6~9),語義信息特徵在高層網路。(9~12)
3)主謂一致表現在中間層網路(8,9)
1)ROBERTA
•靜態mask->動態mask:在bert中每一個epoch被mask的是相同的詞,而ROBERTA在每一個epoch結束,重新隨機15%的詞,使不同的詞被mask。
•去除句對NSP任務,輸入連續多個句子:在bert中最長是512個token,輸入單句或者句對不容易把512個token占滿,ROBERTA輸入更多句子占滿512個坑位。
•訓練使用更多數據 更大batch size 更長時間
2)ALBERT
•減少參數:詞表 V 到隱層 H 的中間,插入一個小維度 E,即一個VxH的embedding變成兩個VxE, ExH的兩個fc。
•共享所有層的參數:Attention 和 FFN,在bert中每一層的Attention 和 FFN的參數是不一樣的。
•SOP 替換 NSP:負樣本換成了同一篇文章中的兩個逆序的句子,bert中是A-->B和A-->隨機,ALBERT中是A-->B,B-->A。
•BERT對MASK 15% 的詞來預測。ALBERT 預測的是 n-gram 片段,包含更完整的語義信息。
•訓練數據長度:90%取512,BERT90% 128
•對應BERT large:H:1024 ->4096 L:24->12 窄而深->寬而淺