當前位置:成語大全網 - 書法字典 - 了解伯特

了解伯特

在遠離深度學習的地方修修補補了壹段時間後,我終於回來了。

所以我很快回顧了18之後NLP的發展。基本上,我在NLP領域更廣泛地使用了遷移學習,並在17的結尾發揚了《註意力就是妳所需要的壹切》中的思想。ELMO彌補了傳統word2vec多義詞表達的不足,GPT使用了功能更強大的特征提取轉換器來取代LSTM,伯特使用了雙向轉換器來進壹步改進GPT。

從Bert模型帶來的NLP裏程碑式的影響和成就來看,毫無疑問Bert將是未來兩三年NLP應用開發的基石,因此有必要仔細看看其模型的結構,數據如何流動,是如何訓練和測試的。

不得不說現在的學習環境比幾年前好多了。本文主要參考了以下文章,然後補充了壹些理解:

剖析BERT第1部分:編碼器

圖示的變壓器

剖析BERT附錄:解碼器

它的整體框架具有與lstm時代的MNT或《註意力集中的變形金剛》相同的編碼器-解碼器結構:

我們先介紹編碼器部分。

為了理解這種架構,讓我們用壹個簡單具體的例子來看看輸入數據是如何通過編碼器壹步步改變到輸出的。

Bert的單詞嵌入由三種嵌入組成:標記嵌入、片段嵌入和位置嵌入。

這個過程與以前的rnn沒有什麽不同,例如,給出壹個句子:

第壹步是標記它:

然後是數字化,將每個標簽映射到語料庫詞匯表中的壹個唯壹整數:

下壹步是獲得序列中每個單詞的單詞嵌入,也就是將整數映射到壹維向量。這個向量是模型在訓練過程中學習的,您可以將其視為壹個查找過程。作為模型的參數,這些向量的元素像其他權重壹樣通過反向傳播來優化。

本文使用詞塊標記化將英語單詞轉換為768()維向量,轉換過程如下:

把每個單詞的向量放在壹起,妳會得到壹個句子長度x向量維數()的矩陣Z:

為了清楚起見,我們通常使用填充來使輸入序列具有相同的長度,例如,通過添加“

如果設置為9,那麽我們將從5到9填充句子。

然而,上面的嵌入不包含單詞的位置信息。因此,我們的目標是根據單詞在句子中的位置適當調整這個向量,使其能夠攜帶位置信息。

作者選擇的方法是通過使用預定的(非學習)正弦和余弦函數將它們之間的數字添加到先前的嵌入中,即通過正弦和余弦函數將位置表示為彼此的線性組合,從而實現網絡學習中標記位置之間的相對關系。將位置矩陣添加到通過令牌嵌入獲得的矩陣中。

在數學上,標記在序列中的位置由表示,標記嵌入特征向量中的位置由表示:

具體來說,對於給定的句子,其位置嵌入矩陣為:

作者解釋說,使用這種確定性方法的結果類似於學習位置表示的結果(就像我們嵌入單詞壹樣),因此它將具有壹些優勢:

因此,添加位置信息後的矩陣為:

它是第壹個編碼器模塊的輸入,其大小為

* * *在生成編碼器輸出之前,有n個編碼器模塊連接在壹起,特定模塊負責查找輸入表示之間的關系並在其輸出中對其進行編碼。

直觀地說,這些塊的叠代過程將幫助神經網絡捕獲輸入序列中單詞之間更復雜的關系,您可以將其作為壹個整體來理解以捕獲輸入序列的語義。

編碼器使用Transformer的多頭註意力機制,這意味著它將計算不同權重矩陣的自我註意力,然後將結果連接在壹起。

這些並行註意力計算的結果稱為頭部,我們使用下標來表示特定的頭部和相關的權重矩陣。

如上圖所示,計算完所有人頭後,將它們連接起來得到壹個尺寸矩陣,然後乘以壹個尺寸權重矩陣進行線性變換,得到最終的尺寸結果,用數學公式表示:

其中壹個是通過乘以相應的權重矩陣獲得的。讓我們通過壹個簡單的例子直觀地了解壹下這個過程。

該圖描述了輸入令牌經過令牌嵌入和位置編碼,然後輸入到編碼器:

接下來,讓我們看看編碼器中的操作過程,首先看看單頭自關註:

上圖描繪了壹個頭像是怎麽來的,其中維度是,因為Q和K需要計算相似度,所以維度應該是相同的,而維度是,維度可以相同也可以不同,在論文中。

所謂的自我關註是通過softmax縮放點積後獲得壹個概率權重,然後將這些權重乘以自己的權重:

為了加深理解,我們選擇其中壹個頭像,繼續通過圖形直觀地觀察這壹變化過程:

然後計算自我關註度,

如果妳看漲,那麽上面提到的幾個計算過程會同時進行:

假設我們有八個頭,那麽我們得到八個頭:

然而,顯然前饋層只需要壹個矩陣。怎麽處理?類似於多重卷積核的處理,這八個矩陣被連接,乘以權重矩陣並被壓縮成壹個矩陣。

為了有更全面直觀的了解,我們把上面的整個過程整理成壹張圖。

顯然,第二編碼器塊不需要嵌入過程,只需將第壹編碼器塊的輸出作為輸入。

經過上面的介紹,妳應該對這個過程有了很好的理解,但為什麽可以使用向量點積來計算註意概率呢?

那麽讓我們進壹步了解原理。

這個結構系統的關鍵在於:

即每個單詞的q向量和每個單詞的k向量的點積,並且應用點積公式:

這意味著方向越相似,長度越長,點積越大。這個詞和它的關系越大,我們理解這個詞時受到的關註就越大,這和我們的初衷是壹樣的。

我們先來看看開頭的結構圖。每個編碼器塊都經過壹個加法&;進入下壹個區塊前的規範層。讓我們來看看這塊地板做了什麽。

加法實際上是壹個殘差連接,將輸出添加到輸入,這將在每個塊的自關註和FFN之後進行,然後跟隨壹個層範數。

Norm是壹種圖層歸壹化,它將被正則化,也就是說,它將被縮放到平均值為0且方差為1的屬性域。因為

但壹般在這壹層之前,會有壹個dropout層。

每個編碼器模塊都由多頭add & amp;標準前饋網絡加和。Norm就是這樣壹個過程。讓我們介紹壹下這個前饋網絡。

這是壹個全連接層,包含兩個線性變化和壹個非線性函數(實際上壹般是ReLu)。

對於輸入(大小),通過權重矩陣(大小)和偏移線性變換將其轉換為隱藏層(大小),然後激活**ReLu **並將其記錄下來,然後通過權重矩陣(大小)和偏移線性變換將其轉換為輸出層(大小),其表示為數學公式:

在最後壹個編碼器模塊輸出後連接到解碼器。

解碼器和編碼器結構相似,但視覺信息不同。

Transformer解決了翻譯問題。要將壹個句子翻譯成另壹種語言,我們希望該模型可以捕獲輸入句子中單詞之間的關系,並在每壹步將輸入句子中包含的信息與翻譯內容結合起來。繼續上面的示例,我們的目標是將壹個句子從英語翻譯成西班牙語,這是我們獲得的序列標記:

讓我們像以前壹樣看看輸入和輸出數據是如何流動的。

這是我們解碼器的輸入標簽:

這是解碼器的預期輸出:

然而,這裏有壹個問題。例如,在輸入端,我們已經看到‘como’後面跟著‘estas’,然後用它來預測‘estas’,這顯然是不合理的,因為模型在測試時無法看到它後面的單詞。

因此,我們需要修改註意力層,以防止模型看到預測單詞右側的信息,同時,它可以使用預測單詞左側的信息。

繼續上面的示例,我們將輸入標簽轉換為矩陣形式並添加位置信息:

像編碼器壹樣,解碼器塊的輸出將是大小的矩陣。激活逐行線性變換+softmax後,將生成壹個證明,其中每行中最大的元素代表下壹個單詞。也就是說,分配“

但是,當我們使用多頭註意力機制時,所有行都會相互影響,因此我們需要在輸入時添加壹個掩碼,這將在註意力計算後完成:

這是自我關註的計算結果:

然後我們在此基礎上添加遮罩,即矩陣上三角形的所有位置都設置為:

然後,在softmax激活後,矩陣變為:

只是為了滿足我們的要求,右側需要在訓練中忽略的單詞的註意力全部變為0。

當這個註意力矩陣乘以時,預測的單詞是模型可以訪問右邊的元素。請註意,這裏的多頭註意力輸出將是多維的,因為它的序列長度是。

這是來自目標序列的解碼器的輸入,它是通過改變掩蔽的多頭註意力而獲得的。解碼器的部分輸入來自通過編碼器的源語句的最終輸出(大小為)。

接下來是與編碼器相同的多頭註意力添加和層範數-》;FFN的過程。

然而,現在來自於,而是來自於:

在計算了每個查詢相對於關鍵字的關註度後,我們得到了壹個新的矩陣,並繼續我們的示例。例如,註意力矩陣是:

從上圖可以看出,這種註意力是當前解碼器輸入和編碼器輸出的每個單詞之間的註意力。讓我們將這個矩陣相乘得到壹個新的矩陣,每壹行代表源句子相對於當前輸入詞匯的特征:

h頭連接後,大小變為,並通過權重矩陣將其線性轉換為1的輸出。

多重解碼後,通過乘以權重矩陣()對最終輸出矩陣進行線性變換,然後對每行的向量softmax進行變換,其中最大值位置處的詞庫索引所對應的單詞為預測單詞。

如果丟失了,只需要計算每個預測單詞向量和真實單詞的壹個熱門單詞表示的交叉熵。