日a在线_91精品成人在线_影音先锋成人网站_免费欧洲毛片A级视频_丰满大乳奶水区一区电影

從零實現(xiàn)BERT、GPT及Difussion類算法-3:Multi-head Attention & Transformer|熱資訊
來源:嗶哩嗶哩     時間:2023-04-24 01:30:44

教程簡介及目錄見: 從零實現(xiàn)BERT、GPT及Difussion類算法:文章簡介及目錄


(資料圖)

本章完整源碼見https://github.com/firechecking/CleanTransformer/blob/main/CleanTransformer/transformer.py

這一章將參考《attention is all you need》論文,實現(xiàn)Multi-head Attention、LayerNorm、TransformerBlock,有了這章的基礎后,在下一章就可以開始搭建Bert、GPT等模型結(jié)構(gòu)了

Multi-head Attention

參考:https://arxiv.org/abs/1706.03762

Attention介紹(選讀)

先簡單介紹下一般性的Attention,如果已經(jīng)了解的同學可以跳過

Attention字面意思是注意力,也就是讓模型能夠學習到一個權(quán)重,來將輸入選擇性的傳入下一層

比較常用的操作如下:

首先假定輸入tensor為q, k, v,其中

self-attention是attention的一個特例:q=k=v

以下給出基礎attention的偽代碼

Multi-head Attention基礎原理

由以上論文截圖可知,

所以實現(xiàn)步驟如下(可以和上文基礎Attention對比著看):

對Q,K,V進行Linear:得到新的Q、K、V的size不變

Multi-Head拆分:

使用Q、K計算Weight(其中第二行是Transformer在attention基礎上增加的一個scaling factor)

使用Weight和V,計算新的V

對V進行維度變換

Multi-head Attention實現(xiàn)代碼

代碼不是太復雜,結(jié)合上文和注釋,應該能很容易看懂

LayerNorm

參考

https://arxiv.org/abs/1607.06450

https://arxiv.org/abs/1607.06450

https://pytorch.org/docs/stable/generated/torch.nn.LayerNorm.html

https://blog.csdn.net/xinjieyuan/article/details/109587913

BatchNorm與LayerNorm的差異

batch normalization

對每一個輸入,先在mini-batch上計算輸入的均值、標準差,然后當前層的每個輸入值使用均值、標準差進行正則計算

公式如下

先在mini-batch上計算出每個位置的均值、標準差,其中為mini-batch大小

然后對每個值應用變換

提示:這里之所以有下標i,是因為batch normalization是在batch內(nèi),對不同樣本的相同位置進行歸一

layer normalization

batch normalization是在batch內(nèi),對不同樣本相同位置進行歸一;而layer normalization是在layer內(nèi),對同一個樣本不同位置進行歸一

batch normalization不在整個mini-batch上計算均值、標準差,而是在當前層的當前樣本計算輸入的均值、標準差,然后對當前層的當前樣本輸入值使用均值、標準差進行正則計算(也可以理解為Layer Normalization是和batch無關(guān),而是對每個樣本單獨處理)

公式如下

先在單個樣本上計算出每一層的均值、標準差,其中為當前l(fā)ayer的大小hidden units數(shù)量

然后對每個值應用變換

Layer Normalization代碼實現(xiàn)

代碼如下

eps為一個較小值,是為了防止標準差std為0時,0作為除數(shù)

從上文公式看出,標準差是計算的均值后開根號,所以代碼中有std = self._mean((x - mean).pow(2) + self.eps).pow(0.5),是復用了self._mean()的計算均值操作

為了和pytorch的LayerNorm保持一致,這里同樣可以接受normalized_shape參數(shù),表示Normalization要在哪幾個維度上進行計算,可以結(jié)合_mean()函數(shù)中的代碼進行理解

TransformerBlock

參考

https://arxiv.org/abs/1706.03762

Transformer原理

從《Attention Is All You Need》論文中這張圖可以看出以下幾點信息:

Encoder、Decoder基本相同,最大差別是Decoder上多了一層Multi-Head Attention

每一個TransformerBlock只由Multi-Head Attention、Add、LayerNorm、Linear這4種操作組合而成

在上文已經(jīng)實現(xiàn)的Multi-Head Attention、LayerNorm基礎上,再來實現(xiàn)TransformerBlock就很簡單了

為進一步簡化,在本章我們先只實現(xiàn)Encoder,并且省略掉mask等額外操作。到之后講到GPT時再來實現(xiàn)Decoder以及更完善的TransformerBlock

Transformer代碼實現(xiàn)

代碼主要由attention+Add+Norm,以及FFW+Add+Norm這2個部分組成,其中ffw是兩層全連接中間夾一個ReLU激活函數(shù)

從以上代碼看出TransformerBlock還是非常簡潔的,而Bert、GPT等模型就是對TransformerBlock的堆疊,這部分內(nèi)容將放在下一章講解

關(guān)鍵詞:

新聞推薦