LLM 系列——BERT——論文解讀

一、概述

1、是什么

? ? 是單模態“小”語言模型,是一個“Bidirectional Encoder Representations fromTransformers”的縮寫,是一個語言預訓練模型,通過隨機掩蓋一些詞,然后預測這些被遮蓋的詞來訓練雙向語言模型(編碼器結構)。可以用于句子分類、詞性分類等下游任務,本身旨在提供一個預訓練的基礎權重。

2、亮點

? ? 文章中總結為三點:

? ? *?展示了雙向預訓練對語言表示的重要性。

? ? *?預訓練的特征表示對特定任務降低了精心設計架構的需求。

? ? *?BERT 提高了 11 個 NLP 任務的最新指標。

PS

? ? * base版本整體結構和OpenAI的GPT是相同的,只是掩碼機制不同,甚至訓練數據和策略也盡可能可GPT相同來做對比,并驗證了在下游任務的高效性。large是進行了模型縮放。

?? ?* 但是如今2024年還是Open AI 的GPT這種純解碼器一統天下,并且后續針對bert的改進,反而移除一些本文的tick,比如NSP任務等。

? ? * 原版論文還是建議看看,因為本文是提供了一個預訓練模型,然后可以用于各種下游任務(并且文章解釋了怎么處理數據和改動模型),并且也簡要介紹了對應的下游任務,可以對NLP領域有個很好的認識。

二、模型

? ? 1、模型結構

? ??? ?輸入需要進行多種embedding處理,模型整體就是標準的transformer編碼器,只不過針對不同的任務出入輸出頭稍有改動:

? ? 1)預訓練任務:兩個loss,分別是預測掩碼token和預測兩個句子是不是連貫的。也就是后面的Mask LM 和NSP任務。文中訓練了base 和 large兩個版本。

? ? 2)下游任務:主要分為四大類,兩個句子的關系分類、單句分類(比如情感分類)、問答(不是生成模型,所以答案是提供的文本中的一個片段,預測起止點)、句子內次分類(比如實體識別)。?? ?

? ? 輸入如下。針對不同的任務,BERT模型的輸入可以是單句或者句對。對于每一個輸入的Token,它的表征由其對應的詞表征(Token Embedding)、段表征(Segment Embedding)和位置表征(Position Embedding)相加產生。其中BERT的分詞是“Case-preserving WordPiece model”,它在分詞的同時保留了原始文本的大小寫信息。

?? ?

? ? 預訓練整體對應的網絡結構如下:

? ? 不同的下游任務的模型結構如下圖:

? ? 下游任務對應到數據集

? ? 2、模型亮點

? ? 雙向注意力訓練的解碼器,并且有單詞和句子兩個任務。

? ? PS

? ? 可惜現在GPT的decoder 一統天下了。

三、數據

? ? 1、數據標簽

?? ?對于英文模型,使用了Wordpiece模型來產生Subword從而減小詞表規模;對于中文模型,直接訓練基于字的模型。 具體因為涉及到預訓練和不同類型的下游任務,這里稍微有點復雜,一條一條梳理。

?? ?預訓練目標:BERT預訓練過程包含兩個不同的預訓練任務,分別是Masked Language Model和Next Sentence Prediction任務。

? ? 下游任務:分為句子分類、token分類。

? ? 1-1)Masked Language Model任務

?? ?就是預測被mask掉的詞,文章提出一種mask策略(這個過程發生在WordPiece tokenization之后,而且對所有token一視同仁,后面有對應的消融實驗):在一個batch 內先隨機選取15%的單詞作為mask候選,然后對這15%單詞進行二次抽樣,其中80%需要被替換成[MASK]的詞進行替換,10%的隨機替換為其他詞,10%保留原詞。原因是:在微調時[MASK]總是不可見,會造成預訓練和微調時的不一致。論文中的例子如下:

?? ?

? ? 1-2)Next Sentence Prediction任務

?? ?模型輸入需要附加一個起始Token,記為[CLS],對應最終的Hidden State(即Transformer的輸出)可以用來表征整個句子,用于下游的分類任務。

?? ?模型能夠處理句間關系。為區別兩個句子,用一個特殊標記符[SEP]進行分隔,另外針對不同的句子,將學習到的Segment Embeddings 加到每個Token的Embedding上。對于單句輸入,只有一種Segment Embedding;對于句對輸入,會有兩種Segment Embedding。

? ? 論文中的例子如下,構造方法是隨機構造50%是成對的句子,50%不是成對的句子,并且也要保證整個句子長度小于512個token。和上面的mask策略是共同作用的。

?? ?

? ? 2-1)GLUE 句子分類下游任務

? ? 可以為單個句子或者句子對。

?? ?輸入和預訓練一樣,有cls、sep token,沒有Mask。

? ? 輸出使用cls token對應的最后一個隱層的向量作為句子的整體表示,僅僅引入一個全連接層,映射到分類類別數,計算標準的softmax 分類損失。

? ? 2-2)SQuAD v1.1

? ? 其實就是給定問題,在指定段落里面找答案的起止點,不需要改寫答案。這里確實有點繞,所以再重復貼一下模型圖。這里輸入如下圖,比較好理解。輸出增加了兩個可學習的verctor(就是兩個變量分別稱為S、E),然后對每個輸出單詞做點乘,計算為起點的概率(終點同理):。然后起點到終點的整個段落的概率定義如下:

?? ?2-3)SQuAD v2.0

?? ?我們將沒有答案的問題視為在 [CLS] 標記處具有開始和結束的答案跨度。預測的時候沒有對應答案得分Snull =S·C + E·C,有對應的答案的得分最大值,然后當,閾值t是在驗證集使F1最大調節出來的。

?? ?2-4)SWAG

? ? 本身是多選,這里將問題分別匹配一個答案,構成N個文本對,然后對每個文本對單獨像句子對分類任務一樣,在cls token上訓練分類器。? ??

? ? 2、數據構成

? ? 預訓練

?? ?為了和GPT作對比,數據等也盡可能相同:BERT使用BooksCorpus (800M words)、Wikipedia (2,500M words),其中GPT使用的僅僅為BooksCorpus (800M words)。

? ? 下游任務

? ? MNLI:Multi-Genre Natural Language Inference,兩個句子的蘊含分類任務。給定一對句子,目標是預測第二個句子是否是相對于第一個句子的蘊涵、矛盾或中性。

? ? QQP:Quora Question Pairs,兩個句子分類任務。目標是確定 Quora (果殼問答網站,類似知乎)上提出的兩個問題在語義上是否等價。

? ? QNLI:Question Natural Language Inference,標準的問答任務。被轉換為二元分類任務,正例是(問題、句子)對,包含正確答案,負例是來自同一段落的(問題、句子),不包含答案。

? ? SST-2:Stanford Sentiment Treebank,二元單句分類任務,包括從電影評論中提取的句子及其情感的注釋。

? ? CoLA:The Corpus of Linguistic Acceptability,二元單句分類任務,其目標是預測英語句子在語法上是否“可接受”。

?? ?STS-B:The Semantic Textual Similarity Benchmark,一組從新聞標題和其他來源中提取的句子對。他們用從 1 到 5 的分數進行注釋,表示兩個句子在語義含義方面的相似程度。

?? ?MRPC:Microsoft Research Paraphrase Corpus,從在線新聞源中自動提取的句子對組成,人工注釋對中的句子在語義上是否等價。

?? ?WNLI Winograd NLI:小型自然語言推理數據集,GLUE 網頁指出,該數據集的構建存在問題。

?? ?RTE:Recognizing Textual Entailment,類似于 MNLI 的二元蘊涵任務,但訓練數據要少得多。

?? ?SQuAD v1.1:10w個眾包問題/答案對的集合。給定一個來自維基百科的段落和對應的問題,任務是預測答案在文章中的跨度(也就是起止點)。

?? ?SQuAD v2.0:對比V1.1,還有可能對應的段落沒有問題的答案。

?? ?SWAG:Situations With Adversarial Generations,包含 113k 個句子對,用于評估常識推理。

? ? 3、數據清洗

? ? 可能都是開源數據,并且為了保持和Open AI相同,文章并沒有提到如何清洗這兩個數據源。

四、策略

? ? 1、訓練過程

? ? 預訓練

? ? 單階段訓練,訓練所有網絡參數,兩個任務的loss取平均。值得注意的一個預訓練加速細節(原理是transformer的自注意力隨著序列長度二次方增加運算量):使用序列長度為 128 訓練90% 的Step,然后使用 512 序列長度訓練其余10% 來學習位置嵌入。

? ? 訓練超參數如下:

? ? *bs = 256、sequence length = 512、Step = 100W,相當于:128,000 token/batch、訓練了40個epoch。

? ? *學習率為 1e-4 的 Adam,β1 = 0.9,β2 = 0.999,L2 權重衰減為 0.01,學習率在前 10,000 步預熱,學習率的線性衰減。

? ? *在所有層上使用 0.1 的 dropout 概率。

? ? *激活函數和GPT相同為gelu。

? ? *訓練損失是平均掩碼 LM 似然和平均下一句預測似然的總和。

? ? *BERTBASE 的訓練是在4 cloud Pod (總共 16 個 TPU 芯片),LARGE 的訓練是在 16 個 Cloud TPU pod(總共 64 個 TPU 芯片)上進行的。均需要 4 天完成訓練。

? ? 下游任務Finetune整體總結

?? ?如模型結構部分,應用與不同的下游任務(不同下游任務都略有區別,大的數據集,比如10W+樣本的對超參數選擇不敏感),超參數整體和預訓練相同,但是batch size、學習率、訓練epoch不同,如下:

? ? *batch size 選擇16 或32.

? ? *Learning rate (Adam): 5e-5, 3e-5, 2e-5。

? ? *epochs數: 2, 3, 4

?? ?下游任務Finetune-GLUE句子分類

?? ?主要在模型輸出的增加一個分類層,對應輸入的cls token。batch size 32 訓練3 個epoch,學習率嘗試5e-5, 4e-5, 3e-5, 2e-5并選擇驗證集效果最好的。

?? ??注意:這里發現BERT large版本訓練不穩定,采取的策略是隨機多訓練幾個版本,然后選擇驗證集上效果好的,這里的隨機包含:數據隨機shuffle和分類層隨機初始化。

?? ?下游任務SQuAD v1.1句子分類

?? ?batch size 32 訓練3 個epoch,學習率5e-5。

?? ?下游任務SQuAD v2.0句子分類

? ???batch size 48 訓練2 個epoch,學習率5e-5。

?? ?下游任務SWAG句子分類

?? ?batch size 16 訓練3 個epoch,學習率2e-5。

? ? 2、推理過程

? ? 暫無

五、結果

1、多維度對比

? ? 四個下游任務,分別見四個表。

?? ?GLUE:發現large版本結果都比base版本好(包含哪些訓練數據很少的場景),并且好于Open AI。

?? ?

? ??

2、消融實驗

訓練任務

?? ?涉及:有無預測下一個句子任務(NSP)、MLM對比LTR任務(預測中間詞和從左預測右面即GPT)。他的結果顯示預測下一個句子能提升性能,MLM好于LTR。(PS:然而后面bert的改進去掉了NSP任務,GPT系列數據上來效果強悍。所以這些經驗真的會隨著數據和模型規模上來反而成為阻礙。)

模型大小

?? ?除了模型的層數、隱層維度、head 頭數外,其余訓練超參一致。這里作者證明隨著模型規模的提升,下游任務的性能也提升,即使下游任務數據很少也可以finetune(接一個分類頭,并且bert的參數也更新),然后獲得穩定提升(隨著模型規模)。這里作者特別提到之前有人做實驗,證明模型規模不能太大,不然反而性能會降低這里是通過特征的方式,沒有finetune。

?? ?PS:這里感覺有點后面GPT系列對齊的苗頭了。

基于特征

?? ?這里和圖像領域不太一樣哈,對應CLIP里面的叫Liner prob策略,也就是凍結bert參數,然后對bert的輸出再訓練一個分類器。而該論文的finetune就是全部bert跟著分類器更新參數。對比結果如下,證明bert的特征也挺好(當然低于finetune)。

訓練時長(Step數)

?? ?*與 500k 步相比,BERTBASE 在 1M 步上訓練時在 MNLI 上實現了幾乎 1.0% 的額外準確度。

?? ?*MLM 模型的收斂速度略慢于 LTR 模型。然而,就絕對準確性而言,MLM 模型幾乎很快就開始優于 LTR 模型。

不同的mask策略

? ? 需要注意,對于基于特征的方法,將 BERT 的最后 4 層作為特征連接起來,這在第 5.3 節中被證明是最好的方法。其實差距不是特別大。

?? ?

六、使用方法

?? ?見git和上面的下游任務模型結構介紹部分,對不同下游任務不同。

七、待解決

?論文提到的缺點

?? ?由于每個Batch中只有15%的詞會被預測,因此模型的收斂速度比起單向的語言模型會慢,訓練花費的時間會更長。(作者認為從提升收益的角度來看,付出的代價是值得的。)

?改進算法

?? ?并且很多原始認為很有用的tick已經不再使用,比如預測句子任務。BERT的主要創新在于它的雙向訓練結構,它能夠在預訓練階段同時考慮上下文中的左側和右側信息。自從BERT發布以來,許多研究者和工程師都在嘗試改進這個模型。以下是一些BERT改進的論文總結:

1、RoBERTa(A Robustly Optimized BERT Pretraining Approach)

發現:BERT可能由于其訓練過程沒有被充分優化而受到限制。

改進:更長時間的訓練、更大的數據集、更大的batch size、不使用Next Sentence Prediction(NSP)任務。

結果:在多個基準測試上取得了比原始BERT更好的結果。

2、ALBERT(A Lite BERT for Self-supervised Learning of Language Representations)

發現:BERT模型非常龐大,需要大量的內存和計算資源。

改進:參數共享、降低模型大小的同時保持性能。

結果:減小了模型的內存占用,同時在某些任務上保持或超越了BERT的性能。

3、DistilBERT(Distilling the Knowledge in a Neural Network)

發現:BERT模型過于龐大,對于某些應用來說不夠高效。

改進:利用知識蒸餾技術,將BERT的知識轉移到更小的模型。

結果:模型大小減少了40%,速度提升了60%,同時保持了97%的BERT性能。

4、XLNet(Generalized Autoregressive Pretraining for Language Understanding)

發現:BERT的雙向上下文理解能力強,但是受限于其掩蔽語言模型(MLM)的預訓練方式。

改進:結合了自回歸語言模型和BERT的優點,提出了置換語言模型(PLM)。

結果:在多項NLP任務上超越了BERT和GPT的性能。

5、ERNIE(Enhanced Representation through kNowledge Integration)

發現:BERT沒有充分利用外部知識,如實體、短語和語義關系等。

改進:整合了外部知識,通過實體掩蔽和短語掩蔽來增強語言表示。

結果:在特定任務上,如情感分析和實體識別,性能得到了顯著提升。

6、SpanBERT(SpanBERT: Improving Pre-training by Representing and Predicting Spans)

發現:BERT的單個詞掩蔽可能不足以捕捉到更長的依賴關系。

改進:專注于跨度的預測而不是單個詞的預測,以更好地表示和預測文本跨度。

結果:在句子級和跨度級任務上均顯示出改進。

八、參考鏈接

Transformer 源碼解讀:Transformer源碼詳解(Pytorch版本) - 知乎

bert 源碼解讀:Bert源碼詳解(Pytorch版本) - 知乎

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/716250.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/716250.shtml
英文地址,請注明出處:http://en.pswp.cn/news/716250.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【計算機網絡通信】計算機之間的局域網通信和互聯網通信方法(附Python和C#代碼)

文章目錄 前言一、局域網通信1.1 基本原理和方法1.1.1 獲取本地ip1.1.2 實現局域網內的廣播1.1.3 進行局域網通信 1.2 實現多客戶端連接1.3 Python源碼1.4 C#源碼1.5 可能存在的問題 二、互聯網通信2.1 實現原理2.1.1 內網穿透軟件2.1.2 實現互聯網通信 2.2 Python源碼2.3 C#源…

基于Java的超市商品管理系統(Vue.js+SpringBoot)

目錄 一、摘要1.1 簡介1.2 項目錄屏 二、研究內容2.1 數據中心模塊2.2 超市區域模塊2.3 超市貨架模塊2.4 商品類型模塊2.5 商品檔案模塊 三、系統設計3.1 用例圖3.2 時序圖3.3 類圖3.4 E-R圖 四、系統實現4.1 登錄4.2 注冊4.3 主頁4.4 超市區域管理4.5 超市貨架管理4.6 商品類型…

牛客小白月賽85_D-阿里馬馬和四十大盜

非常非常非常有意思的一道題,正好寫一下做題思路 對于到不了的情況,那就是存在連續>0的區間,該區間和>m,這樣不管怎么補血一定過不去,cin的時候,就可以判斷 最開始我以為是貪心,發現當前區間走不過去那就返回上一個0點補血,但就是過不去 突然我發現這個樣例很有意思 1…

Vant Weapp

Vant Weapp - 輕量、可靠的小程序 UI 組件庫 van-radio name 是一個字符串&#xff0c;無法傳對象的處理 以及 mpx 多層嵌套 for 循環處理 <viewwx:for"{{questionList}}"wx:for-item"question" // item 重命名wx:for-index"questionIndex"…

一文了解docker與k8s

隨著 k8s 作為容器編排解決方案變得越來越流行&#xff0c;有些人開始拿 Docker 和 k8s 進行對比&#xff0c;不禁問道&#xff1a;Docker 不香嗎&#xff1f; k8s 是 kubernetes 的縮寫&#xff0c;8 代表中間的八個字符。 其實 Docker 和 k8s 并非直接的競爭對手兩者相互依存…

Qt外部調用進程類QProcess的使用

有的時候我們需要在自己程序運行過程中調用其他進程&#xff0c;那么就需要用到QProcess。 首先可以了解一些關于進程的相關知識&#xff1a;線程與進程&#xff0c;你真得理解了嗎_進程和線程的區別-CSDN博客 進程是計算機中的程序關于某數據集合上的一次運行活動&#xff0…

Java面試——Redis

優質博文&#xff1a;IT-BLOG-CN 一、Redis 為什么那么快 【1】完全基于內存&#xff0c;絕大部分請求是純粹的內存操作&#xff0c;非常快速。數據存在內存中。 【2】數據結構簡單&#xff0c;對數據操作也簡單&#xff0c;Redis中的數據結構是專門進行設計的。 【3】采用單線…

【Vue3】全局切換字體大小

VueUse 先安裝VueUse <template><header><div class"left">left</div><div class"center">center</div><div class"right">right</div></header><div><button click"cha…

飛天使-學以致用-devops知識點4-SpringBoot項目CICD實現(實驗失敗,了解大概流程)

文章目錄 代碼準備創建jenkins 任務測試推送使用項目里面的jenkinsfile 進行升級操作 文字版本流程項目構建 代碼準備 推送代碼到gitlab 代碼去叩叮狼教育找 k8s 創建jenkins 任務 創建一個k8s-cicd-demo 流水線任務 將jenkins 里面構建時候的地址還有token&#xff0c; 給到…

azure devops工具實踐分析

對azure devops此工具的功能深挖&#xff0c;結合jira的使用經驗的分析 1、在backlog的功能描述&#xff0c;可理解為需求項&#xff0c;這里包括了bug&#xff0c;從開發的角度修復bug也是個工作項&#xff0c;所以需求的范圍是真正的需求&#xff08;開發接收到的已經確認的…

已解決org.springframework.web.multipart.MultipartException處理多部分請求異常的正確解決方法,親測有效!!!

已解決org.springframework.web.multipart.MultipartException處理多部分請求異常的正確解決方法&#xff0c;親測有效&#xff01;&#xff01;&#xff01; 目錄 問題分析 出現問題的場景 報錯原因 解決思路 解決方法 總結 在Web開發過程中&#xff0c;我們經常需要處…

基于JAVA協同過濾算法網上海鮮水產推薦購物商城系統設計與實現(Springboot框架)可行性分析

博主介紹&#xff1a;黃菊華老師《Vue.js入門與商城開發實戰》《微信小程序商城開發》圖書作者&#xff0c;CSDN博客專家&#xff0c;在線教育專家&#xff0c;CSDN鉆石講師&#xff1b;專注大學生畢業設計教育和輔導。 所有項目都配有從入門到精通的基礎知識視頻課程&#xff…

【PDF技巧】網上下載的pdf文件怎么才能編輯

不知道大家有沒有遇到過網上下載的PDF文件不能編輯的情況&#xff0c;今天我們來詳細了解一下導致無法編輯的原因即解決方法有哪些。 第一種原因&#xff1a;PDF文件中的內容是否是圖片&#xff0c;如果確認是圖片文件&#xff0c;那么我們想要編輯&#xff0c;就可以先使用PD…

分享經典、現代以及前沿軟件工程課程

https://www.icourse163.org/course/PKU-1003177002 隨著信息技術的發展&#xff0c;軟件已經深入到人類社會生產和生活的各個方面。軟件工程是將工程化的方法運用到軟件的開發、運行和維護之中&#xff0c;以達到提高軟件質量&#xff0c;降低開發成本的目的。軟件工程已經成為…

第三方支付牌照出讓,具備何種優勢的買方容易成功

在支付牌照并購的過程中&#xff0c;選擇一個合適的并購方是至關重要的。基于多年的支付牌照公司股權并購居間經驗&#xff0c;我發現具備以下特質的并購方在并購過程中表現得較為靠譜&#xff0c;他們不僅使得并購過程更為順暢&#xff0c;還能顯著提高并購的成功率。 并購方…

字符函數和字符串函數(下)

個人主頁&#xff08;找往期文章包括但不限于本期文章中不懂的知識點&#xff09;&#xff1a;我要學編程(?_?)-CSDN博客 目錄 strncpy函數的使用 函數原型&#xff1a; strncpy的使用 strncat函數的使用 函數原型&#xff1a; strncat的使用 strncmp函數的使用 函…

Vue3快速上手(十六)Vue3路由傳參大全

Vue3路由傳參 一、傳參的多種方式 1.1 拼接方式 這種方式適合傳遞單個參數的情況&#xff0c;比如點擊查看詳情&#xff0c;傳個id這樣的場景 傳參&#xff1a; <RouterLink to"/person?id1" active-class"active">person</RouterLink> …

Unity - 相機畫面為黑白效果

一、 在Hierarchy中創建一個Global Volume,并設置它為局部作用 二、 將場景出現的作用域范圍縮小至相機所在位置&#xff0c;將相機包含即可。 三、添加覆蓋組件Color Adjustments,并將Saturation直接拉為-100 。 此時&#xff0c;相機拍攝畫面為黑白&#xff0c;場景視圖中…

1、Linux-安裝

一、Linux和Windows的一些區別 1、Linux嚴格區分大小寫——【Windows創建文件夾時不區分大小寫】 2、Linux中所有內容都以文件形式存儲&#xff0c;包括硬件 3、Linux不靠拓展名區分文件類型&#xff0c;而是可以通過讀取文件開頭的一些字節來區分。 但是在實際使用中一般要…

MYSQL---日志

1.日志的概述 日志是MySQL數據庫的重要組成部分。日志文件中記錄著MySQL數據庫運行期間發生的變化&#xff1b;也就是說用來記錄MySQL數據庫的客戶端連接狀況、SQL語句的執行情況和錯誤信息等。當數據庫遭到意外的損壞時&#xff0c;可以通過日志查看文件出錯的原因&#xff0…