BERT是在Google論文《BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding》中被提出的,是一個面向NLP的無監督預訓練模型,並在多達11個任務上取得了優秀的結果。這個模型的最大意義是使得NLP任務能夠向CV同樣使用與訓練模型,這極大的方便了一個新的任務開始,由於在NLP領域,海量數據的獲取仍是有難度的。git
模型概述:BERT是一個無監督的NLP與訓練模型,結構上是Transformer的編碼部分,每一個block主要由多頭self-Attention、標準化(Norm)、殘差鏈接、Feed Fordawrd組成。在具體任務中,主要分爲模型預訓練和模型微調兩個階段。在模型預訓練階段,由於模型參數巨大,一般是上千萬乃至上億的數量級,因此須要大量的數據訓練,所幸這時候模型是無監督的,只須要爬取或使用開源數據集便可;在模型微調階段,須要針對具體的任務來微調模型,已達到較好的效果。github
Bert就是Transformer的編碼部分,下圖是Transformer的具體結構:npm
上圖左側爲Transformer的編碼部分,右側爲Transformer的解碼部分,本文主要以編碼部分詳細講解Bert的結構。左側的編碼部分包括輸入,添加位置編碼,以self-Attention、Add&Norm、Feed Fordward的block。下面就每一個具體細節進行具體分析。網絡
位置編碼是用來捕獲文本之間的時序關聯性的,例如打開如今熱度第一的新聞的第一句話:「重慶主城區一棟30層的居民樓發生大火,形成百餘名羣衆被困,重慶市政府迅速調集消防、公安、衛生等數百名人員趕赴現場施救。」其中,「重慶市」與「主城區」相關度最高,位置最近。當對NLP文本處理時,位置更近的文本通常相關性更大,因此將位置編碼融入到數據中是頗有必要的。須要要說明的是與Bert這種所有基於Attention不一樣的是,以前基於RNN的模型在模型結構上已經能夠將這種時序信息考慮在內。koa
在具體處理方式上,採用的是Embedding+Positional的方法,將數據之間的關聯性融入到數據中。Embedding是嵌入到相應維度的文本數據,Positional在論文中使用了\(sine\)和\(cosine\)函數的線性變換來提供模型的位置信息,公式以下:
\[ PE_{(pos,2i)}=sin(pos/10000^{2i/d_{model}})\\PE_{(pos,2i+1)}=cos(pos/10000^{2i/d_{model}}) \tag{1} \]
那爲什麼加了位置編碼就能獲取數據間位置的特徵呢?在self-attention的結構中,在對每維數據計算權重時,是採用點積的形式,本質上就是計算向量之間的相關性。而位置編碼將臨近的數據加上頻率接近的位置編碼,就是增長了相鄰數據的相關性。下圖是位置編碼向量的熱圖,能夠看出距離越近,頻率就更加接近。jvm
self-attention是BERT的重要思想,其與位置編碼結合,解決了文本數據的時序相關性的問題,從而一舉結束了依靠RNN、LSTM、GRU等以前一直用來解決時序問題的網絡模型。self-attention通俗的說就是信息向前傳播時動態的計算權重的一種方式,與CNN常見的MaxPooling、MeanPooling不一樣的是,attention模型是通過訓練,當不一樣信息傳入時,自動的調整權重的一種結構。self-attention的具體結構以下圖所示:
函數
具體的,將上圖的過程進行詳細的解釋,主要是拆分紅4個步驟:
1)\(x^1, x^2, x^3, x^4\)表明的是通過embedding的4條時序文本信息,首先將4條信息加上位置向量,獲得\(a^1, a^2,a^3, a^4\),這樣作的目的上文已經說過,是爲了獲取文本的時序相關性。ui
2) 對每條信息分配三個權重\(W_Q, W_K, W_V (embed.dim*embed.dim)\),分別與\(a^1, a^2, a^3, a^4\)相乘後造成3個矩陣\(Q, K, V\)也就是上圖的\(q^i, k^i, v^i\)。
\[ Q = Linear(a^1) = a^iW^Q\\ K = Linear(a^1) = a^iW^K \\ V = Linear(a^1) = a^iW^V \]
3) 將\(q_1\)分別與\(k^1, k^2, ...,k^i\)點乘,獲得\(\alpha_{1, i}\),再有softmax的計算公式,計算得\(\hat\alpha_{1, i}\)。
\[ \alpha_{1, i} = q^1*k^i\\ \hat\alpha_{1, i} = exp(\alpha_{1, i})/\sum_j{exp(\alpha_{1, j})} \]
4)最後按照softmax輸出的權重對\(V\)進行加權,計算得\(b^1\)。使用一樣的方法計算得\(b^2, b^3, ...,b^i\)。將\(b^1, b^2, b^3, ...,b^i\)進行合併,完成self-attention。
\[ b^1 = \sum_i\hat{\hat\alpha_{1, i}*v^i} \]編碼
殘差鏈接是訓練深層模型時慣用的方法,主要是爲了不模型較深時,在進行反向傳播時,梯度消失等問題。具體實現時,當網絡進行前向傳播時,不只僅時按照網絡層數進行逐層傳播,還會由當前層隔一層或多層向前傳播,以下圖所示:spa
以上是BERT的總體結構,Input輸入的是文本數據,通過Embedding加上位置向量Positional Encoding。Multi-Head Atention爲多頭的self-Attention,實際上就是將self-attention的Q、K、V均分紅n份,分別進行計算。Add&Norm爲殘差計算和標準化;Feedward爲全鏈接層,進行前向傳播。其中\(N_x\)爲基本單元的個數,是能夠條調整的超參數。
在預訓練Bert模型時,論文提供了兩種策略:
在BERT中, Masked LM(Masked language Model)構建了語言模型, 這也是BERT的預訓練中任務之一, 簡單來講, 就是隨機遮蓋或替換一句話裏面任意字或詞, 而後讓模型經過上下文的理解預測那一個被遮蓋或替換的部分, 以後作的時候只計算被遮蓋部分的
, 實際上是一個很容易理解的任務, 實際操做方式以下:
參考內容:
[1] Vaswani A, Shazeer N, Parmar N, et al. Attention is all you need[C]//Advances in neural information processing systems. 2017: 5998-6008.
[2] Devlin J, Chang M W, Lee K, et al. Bert: Pre-training of deep bidirectional transformers for language understanding[J]. arXiv preprint arXiv:1810.04805, 2018.