大名鼎鼎的BERT模型

2022-06-30 15:12:13 字數 3014 閱讀 6160

bert是bidirectional encoder representations from transformers的縮寫,它是2023年谷歌團隊提出來的新型語言表徵模型(language representation model)。

ps. 它也是芝麻街的人物,就長下面這樣

為什麼說它是新型的呢?讓我們來對比一下其它兩個比較有名的語言模型:

bert和gpt都是採用了transformer的編碼器(encoder),但是兩者的區別是gpt是單向的,而bert是雙向的,這意味著每個token既可以看到前面的資訊也可以看到後面的。如果你還不了解transformer的話,可以看一下**attention is all you need,也可以看我的筆記。

不同於bert採用的transformer,elmo使用的是lstm長短期記憶,它也做到了「雙向」時序性,但是emlo的雙向其實是偽雙向,因為他是將向左的和向右的兩組embedding直接拼接起來的,兩者相互獨立。想要具體了解emlo的同學也可以參考原**deep contextualized word representations。

根據**概括,bert主要可以解決兩個層面的問題:

1.token-level tasks 例如,詞性標註

2.sentence-level tasks 例如,qa

bert其實是一種預訓練模型,整個bert模型分為兩個部分:1)pre-train;2)fine-tuning

在這個階段,bert使用了兩個無監督任務:

核心思想是,隨機mask 15% 的token,讓模型來**這個位置的token,這個**是可以通過對該位置的final hidden vector做softmax來得到的。那麼,這裡有個問題,fine-tuning階段是沒有[mask]這個token的,就造成了不匹配,怎麼辦呢?bert就是採用了乙個方法,對這個15%的token有80%的概率用[mask]替代,10%概率用隨機token替代,最後10%概率不改變這個token。然後,既然是做**,這裡就產生了乙個損失loss(mlm)

模型中的資料形式是這樣的:[cls] tok1 tok2 ...tokn [sep] tok1 tok2 ... tokm [sep] 用cls做開頭,sep用於分隔兩個句子

這個任務的目的是**兩個句子是否為上下句,label=isnext 或 notnext,然後就會產生第二個損失loss(nsp)

兩個任務下來,總損失total_loss = loss(mlm)+loss(nsp)

要注意的是,到後面的backward階段,bert採用的是adam optimizer來降低loss。oh,如果不了解這個優化過程,可以參考**adam: a method for stochastic optimization,沒有耐心也可以直接谷歌一波公式。

預訓練結束後,我們就有了預訓練的模型,因為這個過程非常耗時費錢,通常個人或是小公司是不會去自己訓練的,不過谷歌已經提供了幾個預訓練的模型(也有中文的),我們可以直接拿過來,然後結合下游任務去做fine-tuning,常見的下游任務有language inference、情感分析、語義相似度、問答等。整個fine-tuning階段其實很簡單,例如在分類任務上,基本上只需要在對應位置接乙個全連線層,做乙個linear classifier就可以了。這裡就不展開了,有興趣的可以對應不同的下游任務去看**實現。

我放個手寫草稿在下面,意思一下。

由三個部分構成(相加):

1)token embedding 這個沒什麼好說;

2)segment embedding 每個token所在句子的index,來區分句子1和句子2;

3)position embedding 每個token所在的位置計算得到

1.padding mask 為了使用矩陣運算,需要對句子的長度保持一致,長句子要截,短句子要補,補就是用[pad]這個token來補,同時為了減少attention機制對[pad]的過度關注,[pad]對應的值一般是乙個絕對值非常大的負數,這樣在經過softmax後就變為了0。

2.bert使用了一種啟用函式gelu,公式:\(gelu(x) = xp(x \leq x)=x \phi(x)\)

3.在tokeniation階段,這裡使用的是wordpiece token,比一般的按word分更加細。例如,『playing』 可以繼續分為 『play』 和 『##ing』。

1.devlin, j., chang, m. w., lee, k., & toutanova, k. (2018). bert: pre-training of deep bidirectional transformers for language understanding. arxiv preprint arxiv:1810.04805.

2.vaswani, a., shazeer, n., parmar, n., uszkoreit, j., jones, l., gomez, a. n., ... & polosukhin, i. (2017). attention is all you need. in advances in neural information processing systems (pp. 5998-6008).

3.peters, m. e., neumann, m., iyyer, m., gardner, m., clark, c., lee, k., & zettlemoyer, l. (2018). deep contextualized word representations. arxiv preprint arxiv:1802.05365.

4.kingma, d. p., & ba, j. (2014). adam: a method for stochastic optimization. arxiv preprint arxiv:1412.6980.

5.源**

大名鼎鼎的malloc函式(動態記憶體分配)

原型 extern void malloc unsigned int num bytes 標頭檔案 在tc2.0中可以用malloc.h或 alloc.h 注意 alloc.h 與 malloc.h 的內容是完全一致的 而在visual c 6.0中可以用malloc.h或者stdlib.h。功能 ...

談談Python大名鼎鼎的第三方庫Requests

requests是基於urllib庫編寫的http庫,官方的大標題是這麼寫的 人性化的http?手動斜眼笑,總之官方文件寫的挺逗逼的,非常值得一看。當然這個庫的強大也足以對得起官方文件不遺餘力的吹捧。官方文件 官方中翻 注意 優先看英文原版,因為它的版本總是最新的。在使用requests之前,htt...

bert中的sep 語言模型 BERT

今天我們想到 nlp 就會想到 bert,在 nlp 領域中 bert 到處屠榜。bert 主要應用於自然語言處理中的預訓練。這裡想說一件有趣的事,就是當下比較火的自然語言處理模型如 elmo 和 bert 都是動畫片芝麻街中角色。那麼什麼是 bert 呢?我們先從字面上解釋一下什麼是 bert。我...