BERT nlp領域跨時代的預訓練模型

2021-10-10 23:38:51 字數 3431 閱讀 7020

2023年是nlp重大改革的一年,bert的橫空出世使得未來nlp的發展有利跨時代的進步,其在多個領域的完美成功使nlp研究方向有了很大的改變,一直到現在很多比賽的榜單都是由bert或者其畸形霸佔。本文讓我們簡單了解bert,看看它是如何達到如此成就的。

bert其實並沒想象中的那麼複雜,只要了解其中的幾個知識點和兩幅圖便可以知曉它的原理和思想。而bert與其他網路之間也有很多參考和改變,詳細見前篇部落格:pre-training in nlp | ripshun blog

知識點:

contextual word representation

傳統的詞向量嵌入方法(word2vec等等)沒有考慮詞的語義,即一詞多義。在elmo之中注意到了這一點。elmo通過雙向lstm長記憶神將網路結構預訓練詞語的語義。在bert中也參考了這種思想。

pre-training and fine-tuning

預處理表示在訓練開始之前使用別人已經學習完大量資料集後的引數,微調指的是在訓練過程中由自己給出的資料集來輕微調整引數來滿足需要。這種模式在gpt中就有了很好的運用。

而在bert的結構中不難發現,bert使用多層transfromer進行預處理,使得token有了很好的訓練成果,再將訓練完的模型放入使用者自己微調後的模型之中,使得bert可以適應不同的nlp任務。

在中可以看出bert的預處理主要使用的transfromer,transfromer的原理在前篇已經介紹了:attention is all you need**解讀 | ripshun blog,其主要的思想在於self-attention之中,而如何運用self-attention也是bert與gpt的區別,在gpt中使用單向的結構使得當前token的attention只於前面的token有關,這樣忽略了後面token的影響,這就是bert最大的改變之處,bert將單向的結構轉為同時訓練的雙向結構,那麼它是如何實現的呢?讓我們圍繞這個問題進行探索。

masked lm(mlm) and next sentence prediction (nsp)

在bert的**中給出了兩種形式的訓練模式:

mlm:在乙個句子中使用隨機遮蔽掉 15% 的詞,也就是用 [mask] 取代它們,然後去**這些詞。就像英語的完形填空一樣,根據上下文填詞。具體過程是這 15% 的詞,80% 的機率是用 [mask] 取代,10% 的機率是用乙個隨機的詞取代,10% 的機率不變。而這種模式使得在訓練乙個句子時不用從前往後單向的進行,而是同時深度雙向的表示。

nsp 是專門為像 qa 這種需要理解兩個句子之間關係的任務提出的,具體訓練過程是一半的句子 b 是句子 a 的下一句,一半的句子 b 不是句子 a的下一句,**句子 b 是不是 句子 a 的下一句。b 不是句子 a的下一句,**句子 b 是不是 句子 a 的下一句。

(token,position,segment) embedding

在bert中輸入格式主要由三個嵌入向量構成(token,position,segment) embedding,它們分別代表詞語的3個特徵。

embedding就是把乙個東西對映為多維空間的乙個點,即乙個vector;那麼token embedding就是把token對映為乙個token的vector;然後,position embedding就是把位置資訊對映為位置空間的乙個點,也就是乙個vector;同理,segment embedding就是把segment資訊(表示這個token是屬於哪個segment的,不同的segment通過【sep】分割)對映為segment的vector。

通過上面的知識點我們大概能知道bert到底是運用了什麼技術,以及他的特點,那麼bert模型便可以很容易的構建出來。

可以看到bert相對與gpt其實沒什麼變化,唯一的變換在於訓練的方式,上面我們說了bert是雙向的,即輸入時mask掉一些token,所以bert相對與gpt多了從後向前的箭頭。而其內部其實由很多塊transformers的encoder組成。這樣bert的預訓練模型就構建出來了。

看一看到bert預訓練模型的輸入和輸出維度是一樣的,所以我們很容易進行微調構建相對應的任務。讓我們用乙個簡單的**構建乙個多分類問題吧。

class bertforsequenceclassification(bertpretrainedmodel):

def __init__(self, config, num_labels=2, ...):

super(bertforsequenceclassification, self).__init__(config)

self.num_labels = num_labels

self.bert = bertmodel(config, ...)

self.dropout = nn.dropout(config.hidden_dropout_prob)

self.classifier = nn.linear(config.hidden_size, num_labels)

...def forward(self, input_ids, token_type_ids=none, attention_mask=none, labels=none, ...):

outputs = self.bert(input_ids, token_type_ids, attention_mask, ...)

...pooled_output = self.dropout(pooled_output)

logits = self.classifier(pooled_output)

if labels is not none:

loss_fct = crossentropyloss()

loss = loss_fct(logits.view(-1, self.num_labels), labels.view(-1))

return loss

elif self.output_attentions:

return all_attentions, logits

return logit

這是bert官方bertforsequenceclassification類的具體實現方法,可以看到實現乙個簡單的多分類問題,只在預訓練模型bertmodel後面加入了乙個dropout和乙個linear層。

bert作為乙個預訓練模型主要使用transfromers的encoder層,通過mlm的掩碼機制實現雙向訓練,而bert進行下游任務擴充套件時由於預訓練後的維度與原始維度相同也很容易實現,只需要對相應任務做一些微調便可實現。

DP專題 2679 跨時代

1.題目描述 鐘逆時針而繞,噁物猙獰的傾巢,我謙卑安靜地於城堡下的晚禱,壓抑遠古流竄的蠻荒暗號,而管風琴鍵高傲的說,那只是在徒勞。我的樂器在環繞,時代無法淘汰我霸氣的皇朝。你無法預言,因為我越險,翅越豔 沒有句點,跨時代蔓延,翼朝天。月下浮雕,魔鬼的淺笑,狼迎風嚎,蝠翔似黑潮,用孤獨去調尊嚴的色調。...

《GMOJ Senior 2679 跨時代》題解

給出n nn根欄杆的長度,讓你從這n nn根欄杆中選出一些欄杆圍成乙個矩形 必須要剛好圍成乙個矩形,即不能出現多餘的邊長,且不能切斷欄杆,但所給欄杆不一定要全部用上 求圍成矩形的最大面積。對於30 30 30 的資料,1 n 10 1 leq n leq 10 1 n 10 對於100 100 10...

faceair 跨領域AI智慧型顯示應用解決方案

摘要 faceair是全球領先的智慧型顯示技術應用專家,程式設計客棧基於不同前瞻顯示黑科技,結合多通道互動進行上層應用研發,在各領域定製化的解決方案,顛覆了傳統的顯示和互動方式,在ai時代給使用者帶來了極致的使用者體驗。faceair研究的前瞻智慧型顯示技術 隨著ar,vr的狂潮漸漸退去,再現現實的...