bert原理及原始碼的一些討論

2021-09-24 02:09:21 字數 2468 閱讀 2291

目錄

1.模型原理

2 單詞級任務討論

參考文獻:

寫在前面:學習了一段時間的nlp後,感覺中文資料大多還是翻譯的英文,很多東西找不到更深入的資料。最近在研究超神的bert模型,主要找到的資料也就原始的*****和英文部落格。在此想把我的學到的和一些思考寫一寫,方便大家一起**學習。

做為學渣,介紹一下我學習演算法的一般套路,分兩步,第一步是跑通demo,理解演算法的輸入資料格式,輸出結果,以及適用的任務,第二部是理解網路結構,損失函式的構造,以及想法的來龍去脈。

本片沒有詳細的介紹bert的原理和結構,主要想從*****中沒有介紹的一些問題來討論。

bert的模型分兩部分來看,一部分是transformer的encoder部分,一部分是掩碼語言模型(mlm)。transformer中encoder的網路結構介紹的文章比較多,很經典的一篇是,有中文的翻譯。這部分資料比較多,理論也比較複雜,本學渣就不介紹了。不過其中有乙個問題是,多頭attention的作用是什麼,多頭attention的結構見盜圖1。最近看到蘇大神介紹on-lstm及*****[3],該*****是iclr 2019的兩篇最佳**之一。作者給lstm的神經單元做了層級的劃分,認為各個層包含不同的語法資訊,見下面的盜圖2。

盜圖1 多頭attention機制

盜圖2 on-lstm層級結構

單從這一點看,和多頭attention的拆分是相似的,那多頭attention的作用是什麼,是每乙個頭學習一層(種)語法特徵,還是相似於影象的降取樣呢,每乙個頭是乙個「小」的複本。這個我也不知道,有條件的可以做一下實驗。

然後就是第二部分,bert的語言模型mlm。原文說了這個他們的主要創新點哈。至於mlm,可能他們在別的網路結構上也嘗試過,估計是效果不好,到attention上一嘗試,神了。

mlm的具體實現,*****裡沒有詳細的介紹。有乙個問題是乙個句子裡有多個mask,怎麼做**,怎麼組合損失函式呢,這個在第二章詳細介紹。

還有一點是bert加了是否是下一句的**,目的是適應句子級的任務。訓練過程是用【cls】的向量表示句子向量,損失函式和詞**的損失函式直接相加。注意這裡的句子向量,是乙個樣本的向量,是sentencea+sentenceb,不是單獨的sentencea。

主要介紹損失函式的構造,主要討論mask相關的問題。

乙個訓練樣本中包含多個mask,這裡面包含兩個問題,一是多個mask**如何處理,一是mask的詞向量。首先看模型資料資料的格式,見圖3,各個字段代表的含義就不介紹了。乙個樣本中有多個mask,每個mask位置的目標單詞不同,且所有的mask字元編號相同,都是103。

圖3 bert輸入資料

問題1,乙個樣本中多個mask問題。乙個句子總有多個mask,如何來組合他們的損失函式。其實這是乙個迷惑人的問題,也由於*****沒有說明,很能迷惑人。既然有句子級任務,那就是單詞級任務(叫法不準確),單詞級任務就是mask**。首先記住這一點,然後確定輸入資料是怎麼構造的。在官方發布的實現中,輸入資料的樣子如圖3所示,輸入資料的維度是【batch_size , seq_len , vec_size】,在mask**的輸出層,輸入資料的維度為【batch_size*seq_len , vec_size】。可以看到,這裡第一維由句子轉換為了單詞。**的物件是單詞了,已經和句子無關了。直接用每個mask位置的詞向量,來**單詞的編碼。我們簡單看一下,這一步操作的過程。第一步是維度轉化,第二步的gather是把mask位置的詞向量抽出來,和look_up相似。

問題2 ,mask代表所有被掩蓋的單詞,但mask只有乙個,出現的情況是v(mask)->word1 、v(mask)->word2、、、,即mask在重複使用。對於每個單詞,mask向量的差異是怎麼來的呢。可能帶來差異的有兩個地方,首先是加入的位置編碼,然後是每一次的self-attention。如果沒有位置編碼,不同位置的mask詞向量完全由初始化決定,收斂的速度估計要慢太多。

和mask的重複使用相似的是,cls也是重複使用的,每乙個句子的cls是在其他句子的cls基礎上更新的。我的同事在做句子相似性時發現,即使不相關的句子,余弦相似也在0.8左右,實驗是基於單句任務的。在模型訓練後期,梯度很小,cls的變化也會很小,這個變化在余弦距離上對應乙個很小的角度,造成句子的余弦相似度很大。

《ordered neurons: integrating tree structures into recurrent neural networks》

閱讀Peercast原始碼的一些經驗

peercast源 是我第一次看超過2萬行的 在這期間收穫很大,也積累了一些經驗。peercast源 是我第一次看超過2萬行的 在這期間收穫很大,也積累了一些經驗,在此與大家分享,希望為大家看源 提供一些幫助和參考 這裡主要介紹的是在visual stdio6.0環境下,看peercast的win3...

OC原始碼中的一些巨集

if define cplusplus define foundation extern extern c else define foundation extern extern endif 表示extern全域性變數,此時並沒有分配記憶體,需要在.m檔案中實現,為了支援c和c 混編 cplusp...

原始碼檢視 給你的一些建議

大家身為程式設計師的都知道,很多知識都是入門簡單,但是如果想精通的話並麼有那麼簡單的,比假如說spring幾乎上面試一次問一下,那不就是因為太重要了,隨著自己工作年限的增加,如果想擺脫乙個死工資,只能通過增加自己的底層知識點,或者接一些專案來滿足自己的需求。a 最主要的先了解底層的核心尤其重要 c ...