對ALBERT的理解

2021-10-05 00:23:20 字數 2249 閱讀 2151

google大大的bert( 在 2018 年年底通過預訓練打敗了 nlp 上 11 個任務的經典演算法;xlnet 在 2019 年提出來通過雙向網路的方法超過了 bert,再後來,google 大大在bert的基礎上提出了albert( 又超過了 xlnet 和原始的 bert。不得不說一句google 大大牛批!

這幾天看了看bert和albert兩篇**,至於bert的理解在另一篇文章(快速讀懂bert)表述得相當清楚了,現在自己寫一下對albert的粗淺理解。

albert在bert基礎上進行了一些改進,通過兩個技術(具體見下文)減少了參數量從而加快了訓練速度;並提出了sentence-order prediction(sop)的自監督損失,sop聚焦於句子間的連貫性,用以解決bert中nsp不可靠的問題。

在文獻中,e代表embedding大小,l代表encoder層數,h代表隱藏層數,v代表詞彙量大小。

作者認為在bert中e等於h,這似乎不太合理。從模型角度來看,wordpiece embedding的學習不包含上下文資訊,而隱藏層的embedding的學習是包含上下文資訊;研究表明bert強大的表示能力**於為依賴上下文的表示的學習提供資訊,因此h在總引數中的佔比應該遠大於e才好。從實踐角度來看,如果h=e,增加隱藏層就會直接導致嵌入矩陣embedding matrix維數v×e增加,繼而導致參數量增大,而且在訓練期間大多僅是稀疏地更新。因此albert作出如下改進:把one-hot向量先對映到e維空間,然後對映到隱藏層的h維空間。這就把參數量從o(v×h)降低到o(v×e + e×h)了,在h>>e時效果明顯。在沒有引數共享時,e越大albert的效能越好,但是提公升不明顯;在引數共享時,e=128時的效能最佳。albert的large版本與bert的large相比,參數量不及後者的十分之一,速度為1.7倍,當然模型效能也略有下降。

共享引數是albert提公升引數效率的另乙個重要技術。有fnn引數共享、attention引數共享、這兩種引數全部共享三種策略,文獻中預設採用的是全部共享。e=128時,共享attention引數不但沒有使效能下降,反而漲了0.1%。其他情況下共享引數都會使效能下降,因為共享引數導致丟失了部分上下文資訊。雖然效能可能會下降一些,但是此舉可以大大減少引數。

nsp是bert中提出的一種二元分類損失,用於**兩段是否連續出現在原文中,bert用以提公升需要推理兩個句子關係的下游任務的效能。但是最近有研究發現nsp的影響不可靠,將其刪除之後多個任務的效能得到了提公升。作者認為其原因是nsp與mlm相比太簡單了:nsp包含了主題**和連貫性**,前者與後者相比更簡單,而後者又與mlm存在較多重複。作者堅持認為句子間建模是語言理解非常重要的方面,所以提出了基於連貫性的sentence-order prediction(sop)損失。sop損失也是二元分類損失,它使用來自同一文字的兩個連續片段作為正樣例,同樣的片段順序顛倒作為負樣例。這使得模型學習到更細緻的關於話語層次連貫性的區別。實驗結果表明,nsp幾乎不能完成sop任務(52%),而sop卻能比較不錯地完成nsp任務(78.9%)。因此,albert模型始終能夠提高下游任務效能。

此外,比較有意思的一點是,作者發現albert即使在訓練一百萬步之後仍然沒有過擬合,所以作者決定移除dropout進一步提公升模型的能力。後續的實驗結果也證明了albert移除dropout之後能夠得到更好的效能,這也是第一次發現dropout會破壞基於transformer的大規模模型的效能。這也驗證了正則化手段不是提公升模型能力所必需的。

總結:正如albert的名字,它的確是乙個輕量版的bert:參數量大大減少,因而對記憶體容量的需求也大大下降,速度也得到了一定的提公升(large)。雖然xxlarge實現了比bert低的參數量,效能也提高了,但是速度卻下降了許多——更龐大的模型導致了更大的計算量。因此下一步加快模型的訓練和推理速度是非常重要的。作者也提到,或許可以通過sparse attention和block attention提公升訓練和推理速度;作者還假設存在更多沒有被自我監督損失捕捉到的維度,這可能會帶來額外的表示能力。

對委託的理解

在公司看了一上午的委託和事件 其實也沒有那麼久了,2個小時而已 終於明白了一些,看大家都沒有回帖,可能是因為我沒有設定加分,我的分太少了,剛來csdn。委託 我對委託的理解是這樣的 實現定乙個函式規範 簡單點說就是定義乙個函式的格式 如 public int test int a 委託裡是這樣寫的p...

對測試的理解

對測試的理解 如果將整個測試流程劃分為四個環節 測試的計畫,測試的設計,測試的執行,測試的評估 那麼需求分 析應該貫徹在前兩個環節,當然有時在測試的執行階段出現一些問題,也需要去重新定位需求,但往往不會 涉及後兩個環節了,測試的執行階段應當完全依賴測試設計的結果,也就是測試用例 而測試的評估當然就 ...

對gcc的理解

gcc中,ld是鏈器程式,ar可將多個目錄檔案合成乙個函式庫,如ar r liba.a a.o會從a.o中生成a這個庫。nm可以檢視庫檔案的內容,如nm libstdc a。gcc部分引數 l 定義連線的庫目錄 i 定義頭檔案目錄 o 生成的目的檔名 o 加數字定義優化級別 g 生成除錯資訊 c 只...