1 Transformer 概述
在機器學(xué)習(xí)中钳降,我們有很多任務(wù)都是 “序列to序列” 的形式漾根,比如語音識別泰涂、機器翻譯、文本標注等等辐怕。而且在這些任務(wù)中逼蒙,輸入序列和輸出序列的長度都是不定的寄疏,如么如何實現(xiàn)這種序列的轉(zhuǎn)換呢是牢?這就要用到一個很常見的網(wǎng)絡(luò)架構(gòu)— transformer 。transformer的一般結(jié)構(gòu)如下圖所示陕截,包括編碼(Encoder)和解碼(Decoder)兩個部分驳棱。Encoder對輸入序列進行編碼輸出一個序列,轉(zhuǎn)交給Decoder,Decoder對這個序列進行解碼农曲,輸出我們需要的序列社搅。
2 Transformer的Encoder
首先,我們來看一下transformer的Encoder架構(gòu)是怎樣的。transformer對輸入序列進行編碼生成另一個長度相等的序列罚渐,如下圖所示却汉,這里假設(shè)輸入序列是向量青扔,對應(yīng)的輸出是向量谈息。編碼的目的實際上就要考慮序列的全局并聚焦重點,所以Encoder的核心就是自注意力機制凛剥,但不僅僅只有自注意力機制侠仇。
Encoder由多個Block組成,每個Block又由自注意力(self-attention)網(wǎng)絡(luò)和全連接(full-connected)組成犁珠。向量通過自注意力網(wǎng)絡(luò)后生成四個向量余素,這些向量是考慮了序列全局的,然后每個向量再通過一個全連接網(wǎng)絡(luò)進行一次變換得到四個向量炊昆,通過幾次Block后才輸出向量视乐。
實際上,Block的計算還有一些細節(jié)敢茁,如下圖所示佑淀。具體包括兩個方面:
- 通過自注意力網(wǎng)絡(luò)后并不是直接輸入到全連接層。首先僧叉,自注意力網(wǎng)絡(luò)的輸出向量與它的輸入向量進行了求和奕枝。這種操作在深度網(wǎng)絡(luò)中很常見,有一個專門的名字叫做殘差(residual)瓶堕,殘差操作的目的是為了防止梯度消失和網(wǎng)絡(luò)退化隘道。其次,經(jīng)過殘差操作后,進行了一次Layer normalization谭梗,把向量轉(zhuǎn)化成均值為0方差為1的向量忘晤,即歸一化。計算過程如下圖所示(下面這個圖有點錯誤激捏,公式應(yīng)當是)设塔。Layer normalization是為了防止向量落在激活函數(shù)的飽和區(qū)。經(jīng)過上述兩個過程的計算后远舅,才得到全連接層的輸入闰蛔。
- 全連接層的輸出也不是直接輸出到下一層Block,同樣經(jīng)過了殘差和Layer normalization的操作图柏。
總結(jié)起來序六,Encoder的全部計算過程如下圖所示,在一個Block中蚤吹,首先經(jīng)過一個Multi-Head Attention層例诀,然后進行一次殘差(residual)和Layer normalization操作,然后輸入到一個全連接層(即Feed Forward)裁着,重復(fù)多個Block最后輸出一個序列繁涂。
下面這個圖值得注意的一個地方是輸入向量并不是直接輸入到Encoder,而是疊加了一個位置編碼(Positional Encoding)跨算。所謂位置編碼是指將序列中某個向量所處的位置進行編碼爆土,生成一個與向量長度一樣的向量,這對于自然語言處理是很重要的诸蚕。例如進行此行標注的時候步势,句首的詞是動詞的可能性很小。位置編碼的方式有很多背犯,現(xiàn)在也有很多文章在研究一些新的方法坏瘩,感興趣的可以去研究一下。
3 Transformer的Decoder
Encoder對輸入進行編碼后輸出一個序列漠魏,Decoder則要根據(jù)這個序列輸出我們最后想要的一個序列倔矾。以語音識別為例,我們對著機器說柱锹,“機器學(xué)習(xí)”哪自。Encoder對我們的語音進行編碼生成一個序列,Decoder就是要根據(jù)這個序列輸出“機器學(xué)習(xí)”幾個字禁熏,那么是如何實現(xiàn)的呢壤巷?
3.1 Decoder的自回歸(Autoregressive)機制。
首先瞧毙,我們要設(shè)置一個特殊的符號“Begin”作為輸入胧华,Decoder結(jié)合Encoder輸出的序列和“Begin"這個輸入產(chǎn)生一個向量寄症。這個向量的長度非常長,長到和字典的大小相同矩动。假如我們的字典是中文常用詞3500字有巧,那么這個向量的長度就是3500。這個向量再經(jīng)過一個softmax操作悲没,輸出一個概率分布篮迎,概率最大的那個字就是“Begin”的輸出。比如上面這個例子“機”字的概率最大檀训,那么就輸出“機”柑潦。
輸出“機”之后,再將“機”作為Decoder新的輸入峻凫。這樣,Decoder的輸入除了“Begin”之外览露,又多了一個“機”荧琼。通過Decoder和softmax之后,又輸出一個“器”差牛,然后又將“器”作為新的輸入命锄。重復(fù)上述過程,周而復(fù)始的將新的輸出作為新的輸入偏化,又輸出新的輸出脐恩。
但是還有一個重要的問題,機器不能這么一直操作下去吧侦讨?在何時停止這個循環(huán)呢驶冒?這就需要在字典中再添加一個特殊的符號“End”。當輸出一個“End”時韵卤,就停止上述循環(huán)骗污,輸出完整的序列。這樣一個過程就是Decoder的自回歸工作機制沈条。那么Decoder的內(nèi)部結(jié)構(gòu)到底是怎樣的呢需忿?
3.2 Decoder的結(jié)構(gòu)
Decoder的內(nèi)部結(jié)構(gòu)如下圖所示,可以看出Decoder和Encoder的結(jié)構(gòu)非常相似蜡歹,但是有些許不同:首先在第一個自注意力層中多了一個"Masked"的字樣屋厘,其次多了一個自注意力層。
首先月而,我們來看看第一個自注意力層多出個“Masked"是怎么回事汗洒。 前面講自注意力機制的時候,我們講輸出是考慮了輸入序列全局的景鼠,即考慮了所有向量的信息,如下圖所示溯香。
但是注意到這里在輸出”機“的時候鲫构,只能看到"Begin"一個向量,后面的向量是看不到的玫坛。對應(yīng)的结笨,如果我們假設(shè)”機“就是,那么只能利用的信息湿镀,沒法利用的信息勉痴。同理赫模,在輸出“器”的時候,只能看到"Begin蒸矛、機"兩個向量瀑罗,后面的向量也看不到,對應(yīng)的就只能利用的信息斩祭。以此類推,就只能利用的信息,能利用的信息。
因此时迫,Decoder的第一層自注意力網(wǎng)絡(luò)多了一個“masked”颅停。所謂“masked”就是蓋起來的意思。比如在輸出時掠拳,是要把蓋起來的,也就是將設(shè)為0即可喊熟,如下圖所示,
現(xiàn)在我們已經(jīng)理解了“masked”是怎么回事姐刁,接下來再看看多出一個自注意力層是怎么回事芥牌。 從下面這個圖可以看出,多出來的自注意力層是連接Encoder和Decoder的橋梁聂使,這一層稱為“Cross attention”壁拉。
Cross attention的工作機制如下圖所示谬俄,具體過程是:Decoder的輸入通過masked self-attention層之后輸出一個向量,該向量乘以一個轉(zhuǎn)換矩陣得到一個向量弃理。Encoder的輸出序列乘以轉(zhuǎn)換矩陣分別得到矩陣和矩陣溃论,這里的再與上述矩陣和矩陣進行交叉計算得到一個新的向量。因此痘昌,Cross-Attention是利用Encoder自己的輸入產(chǎn)生query向量钥勋,然后再去Encoder的輸出序列中抽取信息,以作為輸出辆苔。