BERT中使用Transformer作特征提取器,其實只使用了Transformer的Encoder。
那么Decoder去哪了呢?顯然是被BERT改造了。Transformer其實是個完整地seq-to-seq模型,可以解決諸如機器翻譯、生成式QA這種輸入輸出為不定長句子的任務,在Transformer中,它使用Encoder做特征提取器,然后用Decoder做解析,輸出我們想要的結果。
而對于BERT,它作為一個預訓練模型,它使用固定的任務——language modeling來對整個模型的參數進行訓練,這個language modeling的任務就是masked language model,所以它是一個用上下文去推測中心詞[MASK]的任務,故和Encoder-Decoder架構無關,它的輸入輸出不是句子,其輸入是這句話的上下文單詞,輸出是[MASK]的softmax后的結果,最終計算Negative Log Likelihood Loss,并在一次次迭代中以此更新參數。所以說,BERT的預訓練過程,其實就是將Transformer的Decoder拿掉,僅使用Encoder做特征抽取器,再使用抽取得到的“特征”做Masked language modeling的任務,通過這個任務進行參數的修正。
當然了,BERT不僅僅做了MLM任務,還有Next Sequence Prediction,這個由于后序驗證對模型的效果提升不明顯,所以沒有贅述。
注意:我們常說,xxx使用Transformer作為特征抽取器,這其實在說用Transformer的Encoder(主要是Self-Attention和短路連接等模塊)做特征抽取器,和Decoder啥關系也沒有
Transformer block是由multi-head self-attention + FFN構成的?
其實論文原文以及配圖就是這樣寫的,但這么說不確切。如果你仔細地看過Transformer部分的源碼,你會發現,在multi-head self-attention和FFN層之間,還有一個“intermediate layer”,即中間層,【代碼詳見此處】。這個中間層將前面Attention-layer的hidden size擴大了4倍,然后再做一次非線性變換(即過一個激活函數,如gelu、relu),再將hidden size變回原size。中間這部分的功能,我個人理解,有點類似于“特征組合器”,增大神經元個數,增強Transformer對于distributed的文本特征的組合能力,從而獲取更多、更復雜的語義信息。此外,中間層是Transformer中唯一一個過了激活函數的layer,所以也引入了非線性信息,當然從理論上也對提升模型的擬合不同語義信息能力有幫助。(當然,BERT預訓練的MLM任務中,在bert_model的輸出之后,在接softmax+將結果計算loss之前,有一個hidden_size不變的線性變換Linear + 激活函數激活 + LayerNorm的過程,【代碼詳見此處】,這里也有個激活函數,但這并非Transformer的結構,這屬于接了下游MLM任務的結構,故真正Transformer-block中的非線性映射,只在中間層的激活函數引入)
實際上,“intermediate layer”在bert代碼里是集成到FFN類中的,但由于很多人經常把FFN層直接當做一次線性變換(即簡單的nn.Linear layer)而忽略了其中的intermediate layer,故在這里單拎出來加以解釋。
————————————————
版權聲明:本文為CSDN博主「illusion」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/weixin_41712499/article/details/103993879
Transformer和BERT的位置編碼有什么區別?
BERT的位置編碼是學習出來的,Transformer是通過正弦函數生成的。
原生的Transformer中使用的是正弦位置編碼(Sinusoidal Position Encoding),是絕對位置的函數式編碼。由于Transformer中為self-attention,這種正余弦函數由于點乘操作,會有相對位置信息存在,但是沒有方向性,且通過權重矩陣的映射之后,這種信息可能消失。
BERT中使用的是學習位置嵌入(learned position embedding),是絕對位置的參數式編碼,且和相應位置上的詞向量進行相加而不是拼接。
BERT模型結構是什么?
利用Transformer結構構造了一個多層雙向的encoder網絡。
BERT、GPT、ELMO之間的區別是什么?
(1)特征提取器:elmo采用LSTM進行提取,GPT和bert則采用Transformer進行提取。很多任務表明Transformer特征提取能力強于LSTM,elmo采用1層靜態向量+2層LSTM,多層提取能力有限,而GPT和bert中的Transformer可采用多層,并行計算能力強。
(2)單/雙向語言模型:
GPT采用單向語言模型,elmo和bert采用雙向語言模型。但是elmo實際上是兩個單向語言模型(方向相反)的拼接,這種融合特征的能力比bert一體化融合特征方式弱。
GPT和bert都采用Transformer,Transformer是encoder-decoder結構,GPT的單向語言模型采用decoder部分,decoder的部分見到的都是不完整的句子;bert的雙向語言模型則采用encoder部分,采用了完整句子。
————————————————
版權聲明:本文為CSDN博主「麥格芬230」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/weixin_42295205/article/details/106152707
————————————————
版權聲明:本文為CSDN博主「麥格芬230」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/weixin_42295205/article/details/106152707
positionencoding
PositionalEmbedding的成分直接疊加于Embedding之上,使得每個token的位置信息和它的語義信息(embedding)充分融合,并被傳遞到后續所有經過復雜變換的序列表達中的線性組合得到, 也就是乘上某個線性變換矩陣就得到了
Feed Forward Network
每一層經過attention之后,還會有一個FFN,這個FFN的作用就是空間變換。FFN包含了2層lineartransformation層,中間的激活函數是ReLu。其實,FFN的加入引入了非線性(ReLu激活函數),變換了attention output的空間,從而增加了模型的表現能力。把FFN去掉模型也是可以用的,但是效果差了很多。
feed-forward network: 實現 很簡單,如果你用 Dense這種實現,那就簡單了, ffn_1 = nn.Dense(hidden_size, activation='relu')
ffn_2 = nn.Dense(units, activation='identity')
ffn_2(ffn_1(X))
如果自己寫layer 那需要 做一個 reshape操作,因為input 是 3-D (batch,seq,embedding), 這里推薦大家用conv1d去寫, kernel_size設置成1就行(后續可以和cv的一些常見操作聯系起來,便于理解feed-forward network的意義),另外要注意的是這邊第一層的activation是relu,后面 一層是沒有activation的
這里如何去理解ffn(feed-forward network)的作用可以從 兩個層面去理解:
模型的capacity,第一層映射到更大的空間,無外乎就是用了更大的網絡,提升了模型的空間,沒有ffn當然也可以,但是效果卻明顯差了,這點我做過實驗
’unique‘ representation: 之前提到推薦用conv1d的方式去實現,會發現這個做法是在cv中網絡的最后的位置嘗嘗出現的,是一個localized transform,因為在前面的attention層的表示中,每個位置已經融合了其他位置的信息了,這里我們想要鞏固每一個位置他們自己的 'unique' representation, 做法就是用kernel_size = 1 的conv1d,這個操作不考慮周邊鄰居的信息,只會對自己的位置的representation進行transform. 這邊看上去有點難以理解,其實是說的通的,雖然我們希望每個位置在空間上去融合不同位置的信息(無論是圖片 conv block 實現,還是句子 attention 實現),但是我們還是會希望每個位置去保持/鞏固 自己原有的信息(而不是簡單的對每個位置的信息做加權平均,這里從前面一層的結構 input = input+attention 也可以看出),這里的ffn 我會理解去鞏固自己原有信息來獲取一個unique representation,不然結果可能每個位置的最后輸出會差不太多 (這里其實可以做個實驗去掉ffn 看看每個attention block 的每個位置的輸出會不會比較相似)
multi-head
Graph Attention Networks‘ ,attention 可以讓你關注重點的部分,但是attention 機制使得信息的交互很有限,會損失兩者之間一些有用的信息,而使用multi-head 可以增加網絡空間,讓更多的信息傳輸
Dropout說的簡單一點就是:我們在前向傳播的時候,讓某個神經元的激活值以一定的概率p停止工作,這樣可以使模型泛化性更強,因為它不會太依賴某些局部的特征