小白對於BERT細節的一點理解

2021-09-29 12:13:28 字數 2168 閱讀 4440

最初在部落格看過對於bert的講解,閱讀原始**,發現bert主要包括以下三點內容:

1、使用transformer的進行雙向訓練。

2、輸入向量包括token embedding、segment embedding、position embedding三部分

3、使用了mask language model(mlm)訓練策略。

4、使用了next sentence prediction(nsp)訓練策略。

當時還以為只有這些內容,不禁去想,不就這些幾句話不就說完了,現在想想真是無知。。。

隨著了解的慢慢深入,逐漸學會去想具體細節,在此站在乙個小白的角度以回答的形式對這些細節進行整理。

問題一:bert使用transformer進行訓練,然而transformer包括encoders和decoders兩部分,是使用了兩部分結構進行訓練嗎?

答案一:不是,只採用了transformer的encoders部分

問題二:bert的輸入形式為「[cls]今天天氣好去哪玩[sep]去西湖吧[sep]」,其中[cls]和[sep]的作用分別是什麼?

答案二:bert會在輸入的最開頭加上[cls],在每乙個句子的末尾新增[sep],其中[cls]的由於本身沒有任何含義,因此計算attention時,cls會更加公平的計算其本身對於句子中每個詞的attention,因此使用[cls]在最後一層輸出層的輸出結果代表整個句子的語義向量,主要應用在分類問題;而[sep]的作用僅僅是作為句子分隔符

問題三:輸入向量中的token embedding很容易理解,即詞向量,而segment embedding、position embedding是指什麼,具體又是什麼維度,最終是將這三個向量拼接還是對應元素相加?

答案三:bert的輸入包括兩種情況,單個句子或者乙個句子對,segment embedding是為了區分第乙個句子和第二個句子,以「[cls]今天天氣好去哪玩[sep]去西湖吧[sep]」為例,對其進行字切分,則「[cls]今天天氣好去哪玩[sep]」中每乙個字的segment embedding是乙個1x768的向量,其中每乙個向量元素全為0,同理「去西湖吧[sep]」中每乙個字的segment embedding是乙個1x768的向量,其中每乙個向量元素全為1(768是bert原始**採用的向量維度),則整個句子的segment embedding是10x768維度的0向量和5x768維度的1向量的拼接。而此例中的position embedding是隨機初始化的15x768的向量,其中15是按字切分後的序列長度,在訓練過程中對其進行調整,position embedding的作用是為了記錄句子中字詞的順序資訊。最終輸入到bert的向量是三個向量對應位置元素相加,而非向量拼接,即最終的輸入值維度仍然是15x768。

問題四:採用mlm訓練策略**被mask詞時,採用了雙向訓練策略,這裡的雙向具體是指什麼?

答案四:在先前的了解中,使用lstm進行雙向訓練,是將序列正反向順序分別輸入到lstm網路中,稱之為雙向訓練,而bert採用的是transformer的encoders部分,沒有網路結構,只採用注意力機制進行計算,因此這裡的雙向是指根據被mask詞的上下文內容計算attention。

問題五:網路最後一層如何**被mask詞?

答案五:總的方面,在bert模型最初,會採用wordpiece演算法進行分詞,該演算法分詞時會產生3萬個常用詞,**被mask詞即**被mask的詞是這3萬個常用詞的哪乙個。細節方面,該問題可以認為是多分類問題,即對被mask詞進行分類,類別則是3萬個常用詞,原始**中採用softmax函式對其進行分類,損失函式採用交叉熵損失函式。

答案六:nsp任務同樣是二分類問題,標籤為「是」和「否」,同樣採用softmax函式進行分類,損失函式採用交叉熵損失函式。

問題七:**中hidden_size和intermediate_size的區別?

答案七:**中hidden_size和intermediate_size的值分別為768和3072,其中hidden_size是指輸入向量維度,經過self-attention計算以後產生的結果同樣為768維,該結果輸入到前饋神經網路中,此時前饋神經網路的輸入層維度是768,隱藏層維度則是3072維(intermediate_size)

問題八:配置檔案中的initializer_range = 0.02是什麼意思?

答案八:具體什麼意思目前也沒搞明白,大概知道initializer_range是指初始化範圍,目前初始化採用正態分佈初始化等初始化方式,0.02是初始化方式中的均值或者偏差等。。。。。。。。。。。。。。

對於錘子科技的一點理解

最近總聽到有 爆料錘子要倒閉了,自己也是乙個數碼愛好者,隨便談談自己對錘子科技的一點認識吧。乙個外行人 拿著風投圓自己的夢。我覺得是對錘子最好的定位。全世界有多少手機廠商?比錘子有錢的,有經驗的至少有十家吧,怎麼就沒發現走情懷,工匠精神這條路能生存?肯定是這裡面有很多連這些大廠都不願去觸碰的問題。消...

對於原型鏈的一點理解

先舉個簡單的例子 var a 0 a.data data 可以用a.data取值 a.proto data1 data1 可以用a.data1取值 a.proto proto data2 data2 可以用a.data2取值 a.proto proto proto data3 data3 canno...

對於POJ 1011的一點理解

description 喬治拿來一組等長的木棒,將它們隨機地砍斷,使得每一節木棍的長度都不超過50個長度單位。然後他又想把這些木棍恢復到為裁截前的狀態,但忘記了初始時有多少木棒以及木棒的初始長度。請你設計乙個程式,幫助喬治計算木棒的可能最小長度。每一節木棍的長度都用大於零的整數表示。input 輸入...