Transformer知識梳理
文章目錄
- Transformer知識梳理
- 什么是Transformer?
- 語言模型
- 遷移學習
- Transformer結構
- 注意力層
- 原始結構
- 總結
什么是Transformer?
語言模型
Transformer模型本質上都是預訓練語言模型,大部分采用自監督學習(Self-supervised Learning)的方式在大量生語料上進行訓練,也就是說,訓練這些Transformer模型完全不需要人工標注數據。
自監督學習是一種訓練目標可以根據模型的輸入自動計算的訓練方法。
例如下面兩個常見的預訓練任務:
- 基于句子的前n個詞來預測下一個詞,因為輸出依賴于過去和當前的輸入,因此該任務被稱為因果語言建模(causal language modeling);
- 基于上下文(周圍的詞語)來預測句子中被遮蓋掉的詞語(masked word),因此該任務被稱為遮蓋語言建模(masked language modeling)。
這些語言模型雖然可以對訓練過的語言產生統計意義上的理解,例如可以根據上下文預測被遮蓋掉的詞語,但是如果直接拿來完成特定任務,效果往往并不好。
因此,我們通常還會采用遷移學習(transfer learning)方法,使用特定任務的標注語料,以有監督學習的方法對預訓練模型參數進行微調(fine-tune),以取得更好的性能。
遷移學習
預訓練是一種從頭開始訓練模型的方式:所有的模型權重都被隨機初始化,然后在沒有任何先驗知識的情況下開始訓練:
這個過程不僅需要海量的訓練數據,而且時間和經濟成本都非常高。
基于此,絕大多數情況下,都不會從頭開始訓練模型,而是將別人預訓練好的模型權重通過遷移學習應用到自己的模型中,即使用自己的任務語料對模型進行“二次訓練”,通過微調參數使模型適用于新任務。
這種遷移學習的好處是:
- 預訓練時模型很可能已經見過與我們任務類似的數據集,通過微調可以激發出模型在預訓練過程中獲得的知識,將基于海量數據獲得的統計理解能力應用于特定的任務;
- 由于模型已經在大量數據上進行過預訓練,微調時只需要很少的數據量就可以達到不錯的性能;
- 在特定任務上獲得優秀性能所需的時間和計算成本都可以很小。
例如,可以選擇一個在大規模英文浴簾上預訓練好的模型,使用arXiv語料進行微調,以生成一個面向學術/研究領域的模型。這個微調的過程只需要很少的數據:我們相當于將預訓練模型已經獲得的知識“遷移“到了新的領域,因此被稱為遷移學習。
與頭從開始訓練相比,微調模型所需的時間、數據、經濟和環境成本都要低的多,并且與完整的預訓練相比,微調訓練的約束更少,因此迭代嘗試不同的微調方案也更快、更容易。實踐證明,即使是對于自定義任務,除非你有大量的語料,否則相比訓練一個專門的模型,基于預訓練模型進行微調會是一個更好的選擇。
在絕大部分情況下,我們都應該嘗試找到一個盡可能接近我們任務的預訓練模型,然后微調它,也就是所謂的“站在巨人的肩膀上”。
Transformer結構
標準的Transformer模型主要由兩個模塊構成:
-
Encoder(左邊):負責理解輸入文本,為每個輸入構造對應的語義表示(語義特征);
-
Decoder(右邊):負責生成輸出,使用Encoder輸出的語義表示結合其他輸入來生成目標序列。

這兩個模塊可以根據任務的需要而單獨使用:
- 純Encoder模型:適用于只需要理解輸入語義的任務,例如句子分類,命名實體識別;
- 純Decoder模型:適用于生成式任務,例如文本生成;
- Encoder-Decoder模型或Seq2Seq模型:適用于需要基于輸入的生成式任務,例如翻譯、摘要等。
注意力層
Transformer模型的標志就是采用了注意力層(Attention Layers)的結構,提出Transformer結構的論文名字就是《Attention Is All You Need》。顧名思義,注意力層的作用就是讓模型在處理文本時,將注意力只放在某些詞語上。
例如要將英文“You like this course”翻譯為法語,由于法語中“like”的變位方式因主語而異,因此需要同時關注相鄰的詞語“You”。同樣地,在翻譯“this”時還需要注意“course”,因為“this”的法語翻譯會根據相關名字的極性而變化。對于復雜的句子,要正確翻譯某個詞語,甚至需要關注離這個詞很遠的詞。
同樣的概念也適用于其他NLP任務:雖然詞語本身就有語義,但是其深受上下文的影響,同一個詞語出現在不同上下文中可能會有完全不同的語義(例如“我買了一個蘋果”和“我買了一個蘋果手機”中的“蘋果)
原始結構
Transformer模型本來是為了翻譯任務而設計的。在訓練過程中,Encoder接受源語言的句子作為輸入,而Decoder則接受目標語言的翻譯作為輸入。在Encoder中,由于翻譯一個詞語需要依賴于上下文,因此注意力層可以訪問句子中的所有詞語;而Decoder是順序地進行解碼,在生成每個詞語時,注意力層只能訪問前面已經生成的單詞。
例如,假設翻譯模型當前已經預測了三個詞語,模型會把這三個詞語作為輸入送入Decoder,然后Decoder結合Encoder所有的源語言輸入來預測第四個詞語。
實際訓練中為了加快速度,會將整個目標序列都送入Decoder,然后在注意力層中通過Mask遮蓋掉未來的詞語來防止信息泄露。例如我們在預測第三個詞語時,應該只能訪問到已生成的前兩個詞語,如果Decoder能夠訪問到序列中的第三個(甚至是后面的)詞語,就相當于作弊了。
原始的Transformer模型結構如下圖所示,Encoder在左,Decoder在右:

其中,Decoder中的第一個注意力層關注Decoder過去所有的輸入,而第二個注意力層則是使用Encoder的輸出,因此Decoder可以基于整個輸入句子來預測當前詞語。這對于翻譯任務非常有用,因為同一句話在不同語言下的詞語順序可能并不一致(不能逐詞翻譯),所以出現在源語言句子后部的詞語反而可能對目標語言句子前部詞語的預測非常重要。
在Encoder/Decoder的注意力層中,還會使用Attention Mask遮蓋掉某些詞語來防止模型關注它們,例如為了將數據處理為相同長度而向序列中添加的填充(padding)字符。
總結
以上就是關于Transformer的基本知識以及Transformer模型結構的介紹,后續我們將繼續帶來Transformer的深入探索。