BERT 模型(1)

 

BERT的創新在於Transformer Decoder(包含Masked Multi-Head Attention)作爲提取器,並使用與之配套的掩碼訓練方法。雖然使用了雙編碼使得BERT不具有文本生成能力,但BERT在對輸入文本的編碼過程中,利用了每個詞的所有上下文信息,與只能使用前序信息提取語義的單向編碼器相比,BERT的語義信息提取能力更強

下面距離說明單向編碼與雙向編碼在語義理解上的差異

    今天天氣很差,我們不得不取消戶外運動。

將句子中的某個字或者詞“挖”走,句子變爲

    今天天氣很{},我們不得不取消戶外運動。

分別從單向編碼(如GPT)和雙向編碼(如BERT )的角度來考慮“{}”中應該填什麼詞。單向編碼只會使用“今天天氣很”這5個字的信息來推斷“{}”的字或詞,以人類的經驗與智慧,使用概率最大的詞應該是:“好”“不錯”“差”“糟糕”,而這些詞可以被劃分爲截然不同的兩類。

通過這個例子我們可以直觀地感覺到,不考慮模型的複雜度和訓練數據量,雙向編碼與單向編碼相比,可以利用更多的上下文信息來輔助當前的語義判斷。在語義理解能力上,採用雙向編碼的方式是最科學的,而BERT的成功很大程度上有此決定。
————————————————
原文鏈接:https://blog.csdn.net/weixin_42486623/article/details/119485297

 

BERT的結構

 參數
L :Transformer blocks;
H :hidden size;
A:self-attention heads;

 


————————————————
原文鏈接:https://blog.csdn.net/weixin_42486623/article/details/119485297

 

BERT模型中使用的是WordPiece embeddings,最後一層隱藏層的向量會作爲每個token的表示。另外,有3個特殊字符如下:

  • [CLS]:用於分類任務中每個序列的第一個token
  • [SEP]:作爲句子對(A,B)的分割符,句子首尾都有,具體可看輸入輸出表示部分。
  • [MASK]:用於masked ML中word的替換

鏈接:https://www.jianshu.com/p/91cb3546da89

還需要說明的是,BERT模型中sentence並不是語義層面的句子,可以是連續的文本。sequence指的是token 序列,可以是單個sentence也可以是合在一起的 two sentences。

部分小疑問
  1. 輸入不管有幾個sentence,總和的maxlength是固定的,與其他訓練任務一樣
  2. segment可以有多種(可以大於2,只是比較少見),如果只有一種那麼Segment embedding只有一個E_A

鏈接:https://www.jianshu.com/p/91cb3546da89
 

通過源碼能看到:

  • MLM和NSP任務的輸入都是一樣的,即輸入中都會有masked token
  • 在masked LM任務中只會預測masked token,其他token不做預測。
  • 由於是多任務學習,最終的loss = loss_{MLM} + loss_{NSP}
 

無監督預訓練深度雙向語言模型

 (1) Token Embeddings 是詞向量,第一個單詞是CLS標誌,可以用於之後的分類任務

(2) Segment Embeddings用來區別兩種句子,因爲預訓練不光做LM 還要做以兩個句子爲輸入的分類任務

(3) Position Embeddings和之前文章中的Transformer不一樣,不是三角函數而是學習出來的

預訓練任務


Task1: Masked LM

爲了構建一個深層的真雙向語言模型,但是標準的語言模型是使用了馬爾可夫鏈進行的單向編碼,即使使用 LTR 與 RTL,但也是假的雙向編碼,性能會受到極大的影響。使用完形填空機制可以避免標準的語言模型的編碼瓶頸。

完形填空策略:隨機的 mask 掉 15% 的單詞,然後使用編碼器最後的 hidden state 過一層 softmax 進行完形填空預測。

但是這種策略會有兩個缺點,以下是內容和解決方案:
Downside 1: mismatch
這樣做構造了一種 mismatch:因爲 [MASK] 永運不會出現在 fine-tuning 階段,所以 pre-training 與 fine-tuning 出現了 mismatch。

緩解方案:對於隨機選擇的 15% 待 mask 單詞,不是直接將它替換爲 [MASK],而是再做一次隨機:
80%:將該詞替換爲 [MASK]
10%:將該詞替換爲一個隨機的詞語
10%:不替換

原因:Transformer Encoder 不知道哪個單詞被要求做預測,哪個單詞被隨機替換掉了,所以對於每個輸入的單詞,它都必須保持上下文嵌入;而且,現在這種策略下隨機替換掉的單詞只有 1.5%,幾乎不會影響模型的語言建模能力。

Downside 2: slower
現在使用的 MLM 模型,每個 batch 只有 15% 的單詞被預測,所以收斂速度確實慢了。但是效果帶來的提升卻很大。
Task2: Next Sentence Prediction

NLP 中有很多句子關係性的任務,這部分的能力不能通過 Task1 的 MLM 來俘獲到,所以加入了一個二分類任務進行多任務學習。
策略:50% 的句子對,將第二句替換爲隨機的句子來構建負樣本。
其他細節

(1) 訓練語料:BooksCorpus 800𝑀 words + English Wikipedia 2,500𝑀𝑤𝑜𝑟𝑑𝑠
(2) batch size:256
(3) Adam: γ=1e−4,  β1​=0.9,  β2​=−.999,warmup
(4) dropout:0.1
(5) GELU
(6) loss:兩個任務的 loss 和

 

下游監督任務微調

 (1) 單句/句子對分類任務:直接使用 [CLS] 的 hidden state 過一層 softmax 進行預測;
(2) QA 任務:將問題和答案所在的段拼接起來,使用最後的答案段的 hidden state 向量來計算某個單詞是答案開始單詞和結束單詞的概率,進而進行預測。
(3) 其中,S 和 E 是需要下游 fine-tuning 階段訓練的開始向量和結束向量。在推斷階段,會強行限制結束的位置必須在開始的位置之後。
(4) 序列標註任務:直接將序列所有 token 的最後一層 hidden state 喂進一個分類層(沒有使用自迴歸、CRF)
————————————————
版權聲明:本文爲CSDN博主「發呆的比目魚」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/weixin_42486623/article/details/119485297

 

 


————————————————
版權聲明:本文爲CSDN博主「發呆的比目魚」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/weixin_42486623/article/details/119485297

 

 

 

 

 

BERT的視頻講解:

https://www.bilibili.com/video/BV1Ey4y1874y/?spm_id_from=333.337.search-card.all.click

 

position最長512,在下游任務中,有長於512的句子怎麼辦呢

 

BERT優點



    Transformer Encoder因爲有Self-attention機制,因此BERT自帶雙向功能

    因爲雙向功能以及多層Self-attention機制的影響,使得BERT必須使用Cloze版的語言模型Masked-LM來完成token級別的預訓練

    爲了獲取比詞更高級別的句子級別的語義表徵,BERT加入了Next Sentence Prediction來和Masked-LM一起做聯合訓練

    爲了適配多任務下的遷移學習,BERT設計了更通用的輸入層和輸出層

    微調成本小



BERT缺點

 

 



    task1的隨機遮擋策略略顯粗獷,推薦閱讀《Data Nosing As Smoothing In Neural Network Language Models》

    [MASK]標記在實際預測中不會出現,訓練時用過多[MASK]影響模型表現;

    每個batch只有15%的token被預測,所以BERT收斂得比left-to-right模型要慢(它們會預測每個token)

    BERT對硬件資源的消耗巨大(大模型需要16個tpu,歷時四天;更大的模型需要64個tpu,歷時四天。
————————————————
版權聲明:本文爲CSDN博主「廢柴當自強」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/jiaowoshouzi/article/details/89073944

 

谷歌用1024塊TPUv3將訓練時間縮短到76分鐘,英偉達又用1472個V100 GPU將訓練時間進一步減少到53分鐘。

在最新的MLPerf中,英偉達只花了49秒就完成了BERT的訓練,他們用了一臺包含2048個A100 GPU的超級計算機SuperPOD。

 

經過探索,我們發現使用谷歌的TPU是一種可行的解決方案。通過實驗室的研究和實踐,相比GPU,TPU能顯著提高BERT模型運算的效率,且大幅度降低所需要的成本。

 

關於TPU的簡單介紹

TPU 即谷歌推出的 Tensor ProcessingUnit,一個只專注於神經網絡計算的處理器。TPU的主要功能是矩陣運算,是一個單線程芯片,不需要考慮緩存、分支預測、多道處理等問題的處理器,其可以在單個時鐘週期內處理數十萬次矩陣運算,而GPU在單個時鐘週期內只可以處理數百到數千的計算。

此外,GPU作爲“圖像處理器”,其基本的硬件架構仍然要能夠支持圖像相關運算中所存在的各種需求,這意味着GPU多少受到其固有架構的桎梏,這些機制的存在使得預測GPU的處理性能和利用率變得比較困難,故在現實使用中,使GPU達到理論計算峯值是比較困難的。

而相比於GPU,TPU的實際運算表現要比GPU更加穩定,除此之外,TPU對於數據的讀取也進行了大量的優化,所以當所涉及的運算包含大量的矩陣計算時,TPU在訓練的優勢就顯現出來了。

因爲BERT模型是multi-head dot-product attention,所以從數學上而言,BERT不論是前向傳播還以後向傳播計算都包含了大量矩陣運算,這使得TPU天生就非常適合計算BERT等神經網絡。

當然任何理論分析都是沒有Benchmark有說服力的。那麼TPU效果究竟如何呢?下面我們來展現一下百分點認知智能實驗室對TPU的測評結果。

 

租用TPU V2八核心爲例,系統的說明一下創建虛擬機實例和TPU實例的方法。進入到谷歌雲的首頁

 

BERT是谷歌去年推出的NLP模型,一經推出就在各項測試中碾壓競爭對手,而且BERT是開源的。只可惜訓練BERT的價格實在太高,讓人望而卻步。

之前需要用64個TPU訓練4天才能完成,後來谷歌用並行計算優化了到只需一個多小時,但是需要的TPU數量陡增,達到了驚人的1024個。

那麼總共要多少錢呢?谷歌雲TPU的使用價格是每個每小時6.5美元,訓練完成訓練完整個模型需要近4萬美元,簡直就是天價。

現在,有個羊毛告訴你,在培養基上有人找到了薅谷歌羊毛的辦法,只需1美元就能訓練BERT,模型還能留存在你的谷歌雲盤中,留作以後使用。

 

GPU就行,目前大部分還是直接使用pretrained的bert模型,很少需scratch。資源比較緊張的話也可以考慮bert-mini的版本進行實驗,分實際使用情況了。

 

自己訓練模型的可行性?

用已有的預訓練模型,是否可以做自己的文本分類?

 

 https://www.jianshu.com/p/91cb3546da89

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章