Transformer模型技術長文
可高效處理長文本的模型Longformer、和堪稱“升級版”Transformer的BigBird模型,到底有什么區別?
Transformer的其他各種變體(X-former)到底都長什么樣、又有哪些新應用?
由於Transformer模型的發展速度日新月異,一天一個樣,哪怕是隔段時間回來研究,模型可能也已經多了不少。
Transformer模型,是谷歌在2017年推出的NLP經典模型(Bert就是用的Transformer)。
本文參考鏈接
https://mp.weixin.qq.com/s/btdnjKVVSuLZH15bXmihlw
論文鏈接: https://www.arxiv-vanity.com/papers/2009.06732
https://mp.weixin.qq.com/s/_th7rXfZDuSu2xo7gdPp0w
https://www.cnblogs.com/zhongzhaoxie/p/13064374.html
Transformer論文及相關代碼:
- Read the Attention Is All You Need paper, the Transformer blog post (Transformer: A Novel Neural Network Architecture for Language Understanding), and the Tensor2Tensor announcement.
- Watch Łukasz Kaiser’s talk walking through the model and its details
- Play with the Jupyter Notebook provided as part of the Tensor2Tensor repo
- Explore the Tensor2Tensor repo.
Transformer相關工作:
- Depthwise Separable Convolutions for Neural Machine Translation
- One Model To Learn Them All
- Discrete Autoencoders for Sequence Models
- Generating Wikipedia by Summarizing Long Sequences
- Image Transformer
- Training Tips for the Transformer Model
- Self-Attention with Relative Position Representations
- Fast Decoding in Sequence Models using Discrete Latent Variables
- [Adafactor: Adaptive Learning Rates with Sublinear Memory Cost](https://arxiv.org/abs/1804.04235
在機器翻譯任務上,Transformer表現超過了RNN和CNN,只需要編/解碼器就能達到很好的效果,可以高效地並行化。
好消息是,這里有一篇Transformer模型的“最新動向”,集中探討Transformer新模型對於自注意力機制(Self-attention)的改進,並對這些模型進行對比。
此外,還有模型在NLP、計算機視覺和強化學習等各個領域的最新應用。
標准Transformer模型
標准的Transformer模型是什么樣的。
Transformer的核心部分,是右邊的兩個黑色實線框圈起來的兩部分,左邊是編碼器(Encoder),右邊是解碼器(Decoder)。
可以看見,編/解碼器主要由兩個模塊組合成:前饋神經網絡(圖中藍色的部分)和注意力機制(圖中玫紅色的部分),解碼器通常多一個(交叉)注意力機制。
Transformer最重要的部分,就是注意力機制。
通俗來講,注意力機制在圖像處理中的應用,是讓機器“像人一樣特別注意圖像的某個部分”,就像在看圖時,通常會“特別關注”圖中的某些地方。
自注意力機制是定義Transformer模型特征的關鍵,其中一個重點難題就在於時間復雜度和空間復雜度上。
由於注意力機制直接將序列(sequence)兩兩比較,導致計算量巨大(計算量變成O(n²))。
最近,大量論文提出了新的Transformer“變種”,根本目的都是加速模型的效率,但如果一篇篇去看,可能有點眼花繚亂。
為此,Google AI的研究人員特意整理了一篇Transformer模型的發展論文,仔細講解出處。
“變種”后的Transformer模型
2種分類方法
按使用方法來分類的話,Transformer模型可以分成如下3類:
只用編碼器:可用於分類
只用解碼器:可用於語言建模
編碼器-解碼器:可用於機器翻譯
但如果按這些變種的提高效率的原理,也就是“高效方法”來分類,那么Transformer模型的這些“變種”則可以被分成如下幾類:
Fixed Patterns(固定模式):將視野限定為固定的預定義模式,例如局部窗口、固定步幅塊,用於簡化注意力矩陣;
Learnable Patterns(可學習模式):以數據驅動的方式學習訪問模式,關鍵在於確定token相關性。
Memory(內存):利用可以一次訪問多個token的內存模塊,例如全局存儲器。
Low Rank(低秩):通過利用自注意力矩陣的低秩近似,提高效率。
Kernels(內核):通過內核化的方式提高效率,其中核是注意力矩陣的近似,可視為低秩方法的一種。
Recurrence(遞歸):利用遞歸,連接矩陣分塊法中的各個塊,最終提高效率。
可以看見,近期Transformer相關的研究都被分在上面的圖像中了,非常清晰明了。
了解完分類方法后,接下來就是Transformer模型的各種變體了。
17種經典“X-former”
1、Memory Compressed Transformer(2018)
這是讓Transformer能更好地處理長序列的早期嘗試之一,主要修改了兩個部分:定位范圍注意、內存壓縮注意。
前者旨在將輸入序列分為長度相似的模塊,並在每個部分中運行自注意力機制,這樣能保證每個部分的注意力成本不變,激活次數就能根據輸入長度線性縮放。
后者則是采用跨步卷積,減少注意力矩陣的大小、以及注意力的計算量,減少的量取決於跨步的步幅。
2、Image Transformer(2018)
這是個受卷積神經網絡啟發的Transformer變種,重點是局部注意范圍,即將接受域限制為局部領域,主要有兩種方案:一維局部注意和二維局部注意。
不過,這種模型有一個限制條件,即要以失去全局接受域為代價,以降低存儲和計算成本。
3、 Set Transformer(2019)
這個模型是為解決一種特殊應用場景而生的:輸入是一組特征,輸出是這組特征的函數。
利用了稀疏高斯過程,將輸入集大小的注意復雜度從二次降為線性。
4、Sparse Transformer(2019)
這個模型的關鍵思想,在於僅在一小部分稀疏的數據對上計算注意力,以將密集注意力矩陣簡化為稀疏版本。
不過這個模型對硬件有所要求,需要自定義GPU內核,無法直接在TPU等其他硬件上使用。
5、Axial Transformer(2019)
這個模型主要沿輸入張量的單軸施加多個注意力,每個注意力都沿特定軸混合信息,使沿其他軸的信息保持獨立。
由於任何單軸的長度通常都比元素總數小得多,因此這個模型可以顯著地節省計算和內存。
6、Longformer(2020)
Sparse Transformer的變體,通過在注意力模式中留有空隙、增加感受野來實現更好的遠程覆蓋。
在分類任務上,Longformer采用可以訪問所有輸入序列的全局token(例如CLS token)。
7、Extended Transformer Construction(2020)
同樣是Sparse Transformer的變體,引入了一種新的全局本地注意力機制,在引入全局token方面與Longformer相似。
但由於無法計算因果掩碼,ETC不能用於自動回歸解碼。
8、BigBird(2020)
與Longformer一樣,同樣使用全局內存,但不同的是,有獨特的“內部變壓器構造(ITC)”,即全局內存已擴展為在sequence中包含token,而不是簡單的參數化內存。
然而,與ETC一樣,BigBird同樣不能用於自動回歸解碼。
9、Routing Transformer(2020)
提出了一種基於聚類的注意力機制,以數據驅動的方式學習注意力稀疏。為了確保集群中的token數量相似,模型會初始化聚類,計算每個token相對於聚類質心的距離。
10、Reformer(2020)
一個基於局部敏感哈希(LSH)的注意力模型,引入了可逆的Transformer層,有助於進一步減少內存占用量。
模型的關鍵思想,是附近的向量應獲得相似的哈希值,遠距離的向量不應獲得相似的哈希值,因此稱為“局部敏感”。
11、Sinkhorn Transformer(2020)
這個模型屬於分塊模型,以分塊的方式對輸入鍵和值進行重新排序,並應用基於塊的局部注意力機制來學習稀疏模式。
12、Linformer(2020)
這是基於低秩的自注意力機制的高效Transformer模型,主要在長度維度上進行低秩投影,在單次轉換中按維度混合序列信息。
13、Linear Transformer(2020)
這個模型通過使用基於核的自注意力機制、和矩陣產品的關聯特性,將自注意力的復雜性從二次降低為線性。
目前,已經證明可以在基本保持預測性能的情況下,將推理速度提高多達三個數量級。
14、Performer(2020)
這個模型利用正交隨機特征(ORF),采用近似的方法避免存儲和計算注意力矩陣。
15、Synthesizer models(2020)
這個模型研究了調節在自注意力機制中的作用,合成了一個自注意力模塊,近似了這個注意權重。
16、Transformer-XL(2020)
這個模型使用遞歸機制鏈接相鄰的部分。基於塊的遞歸可被視為與其他討論的技術正交的方法,因為沒有明確稀疏密集的自注意力矩陣。
17、Compressive Transformers(2020)
這個模型是Transformer-XL的擴展,但不同於Transformer-XL,后者在跨段移動時會丟棄過去的激活,關鍵思想是保持對過去段激活的細粒度記憶。
整體來說,這些經典模型的參數量如下:
視覺Transformer
Transformer 是一種基於注意力的編碼器-解碼器架構,徹底改變了自然語言處理領域。受這一重大成就的啟發,最近,在將類似於 Transformer 的結構應用於計算機視覺 (CV) 領域上進行了一些開創性工作,這已經證明了在各種 CV 任務上的有效性。與現在的卷積神經網絡 (CNN) 相比,視覺 Transformer (ViT) 依靠有競爭力的建模能力,在 ImageNet、COCO 和 ADE20k 等多個基准上取得了十分優異的性能。在中,全面回顧了針對三個基本 CV 任務(分類、檢測和分割)的一百多種不同的視覺 Transformer,其中提出了一種分類法,根據動機、結構和使用場景來組織這些方法。由於訓練設置和面向任務的差異,還在不同的配置上評估了這些方法,以方便直觀地進行比較,而不僅僅是各種基准測試。此外,披露了一系列基本但未經開發的方面,這些方面可能使 Transformer 從眾多架構中脫穎而出,例如,不充分的高級語義嵌入以彌合視覺和順序 Transformer 之間的差距。最后,提出了三個有前景的未來研究方向,以供進一步研究。
> 1. 論文和代碼地址
論文題目:A Survey of Visual Transformers
發表單位:中國科學院、東南大學、聯想研究院、聯想
論文地址:https://arxiv.org/abs/2111.06091
提交時間:2021年11月11日
> 2. 動機
ViT 發展速度十分迅速!
圖1. Transformer 在NLP和CV中的應用和發展進程
如上圖左邊所示,Transformer 逐漸成為自然語言處理 (NLP) 的主要深度學習模型。從上圖右圖所示,在過去的一年中,針對不同的領域提出了數百種基於 Transformer 的視覺模型。
圖2. ViT 的分類
2020年發表了幾篇關於 Transformer 的評論,其中 Tay 等人回顧了 NLP 中 Transformers 的效率,Khan 等人和 Han 等人總結了早期的視覺 Transformer 和之前的注意力模型,以及一些沒有系統方法的語言模型。最近對 Transformer 的綜述是 Lin 等人介紹的,提供了對 Transformer 各種變體的系統綜述,並粗略地提到了在視覺上的應用。基於這些觀察,旨在全面回顧最近的 ViT,並系統地對這些現有方法進行分類:
- 全面性和可讀性。全面綜述了100多種 ViT 的三個基本任務:分類、檢測和分割。選擇並分析了50多個代表性模型,如上圖所示,不僅從一個角度對每個模型進行了詳盡的分析,而且還通過漸進、對比和多視角分析等方式建立了之間的內在聯系。
- 直觀的比較。由於這些 ViT 在各種任務中遵循不同的訓練方案和超參數設置,因此本次調查通過在不同的數據集和限制上將分開來呈現多個橫向比較。更重要的是,總結了為每個任務設計的一系列有前景的組件,包括:用於主干的具有層次結構的淺層局部卷積,用於頸部檢測器的具有稀疏注意力的空間先驗加速,以及用於分割的通用掩碼預測方案。
- 深入分析。進一步在以下方面提供了重要的見解:從序列到視覺任務的轉換過程,Transformer 與其他視覺網絡之間的對應關系,以及不同任務中采用的可學習嵌入(即類token、對象查詢、掩碼嵌入)的相關性。最后,概述了未來的研究方向。例如,編碼器-解碼器的 Transformer 主干可以通過學習的嵌入來統一三個子任務(分類、檢測和分割)。
> 3. 最初的 Transformer
圖3. Transformer 中的注意力層
圖4. Transformer 整體架構
最初的Transformer架構如上圖4所示。
> 4. 分類中的 Transformer
受到在 NLP 中 Transformer 優異發展的啟發,一些研究人員試圖將 Transformer 引入圖像分類。與傳統CNN相比,Vision Transformer(ViT)首次在主流分類基准上實現了類似甚至更高的性能。本節全面回顧了 2021 年 6 月之前發布的 40 多個 Transformer 主干,並根據其動機和實現將分為六類,如下圖 5 所示。
基於提出的分類,首先介紹了 ViT,用於圖像分類的原始視覺 Transformer。然后討論了 Transformer Enhanced CNN 方法,該方法利用Transformer來增強CNN主干的遠程依賴性。Transformer 具有很強的全局建模能力,但在早期忽略了局部信息。因此,CNN Enhanced Transformer 方法利用適當的卷積歸納偏置來增強 Transformer,而 Local Attention Enhanced Transformer 方法重新設計補丁分區和注意力塊以增強 Transformer 的局部性並保持無卷積架構。此外,CNN 在性能和計算效率方面從經驗上受益於分層和深層結構。受此啟發,提出了 Hierarchical Transformer 和 Deep Transformer 方法。前者用金字塔莖代替固定分辨率的柱狀結構,而后者防止注意力圖過於平滑並增加其在深層的多樣性。此外,還回顧了當前可用的視覺 Transformer 自監督方法。最后,評估這些 Transformer 的性能,分析有希望的改進,並回答一個常見問題以供進一步調查。
圖5. ViT骨干的分類
4.1 最初的 ViT
ViT 是 Transformer 在圖像分類中的第一個骨干。
圖6. ViT 架構
4.2 Transformer 增強的 CNN
Transformer 有兩個關鍵部分:MHSA 和 FFN。最近,Cordonnier 等人已經證明卷積層可以通過具有足夠頭數的 MHSA 來近似。Dong等人已經表明,MHSA 可能在沒有跨層連接和 FFN時對“token一致性”具有很強的歸納偏置。因此,Transformer 在理論上具有比 CNN 更強大的建模能力。然而,不可避免地具有沉重的計算成本,特別是對於淺層,由自注意力機制帶來,隨着特征分辨率的二次方增長。與之前基於注意力的方法類似,一些方法嘗試將 Transformer 插入 CNN 主干或用 Transformer 層替換部分卷積塊。例如 VTs 和 BoTNet。
4.3 CNN 增強 Transformer
歸納偏差可以表示為一組關於數據分布或解空間的假設,其在卷積中的表現是局部性和方差平移。局部性側重於空間上接近的元素,並將與遠端隔離。平移不變性表明在輸入的位置之間重復使用相同的匹配規則。由於局部鄰域內的協方差很大,並且在整個圖像中趨於逐漸平穩,這些卷積偏差可以有效地處理圖像數據。然而,強大的偏差也限制了 CNN 具有足夠數據集的上限。最近的工作試圖利用適當的卷積偏差來增強 Transformer 並加速其收斂。這些應用可以概括如下:軟近似(DeiT、ConViT)、直接局部性處理( CeiT、LocalViT)、位置編碼的直接替換(CPVT、ResT)和結構組合(Early Conv. 、CoAtNet)。
4.4 局部注意力增強的 Transformer
ViT 將輸入圖像視為一個補丁序列。這種粗糙的補丁嵌入過程忽略了語言和圖像之間的差距,這可能會破壞圖像的局部信息。作為局部提取器,卷積通過相對固定的濾波器聚合特征。這種模板匹配過程可以有效地處理大多數小數據集,但在處理大型數據集時面臨表示的組合爆炸。與卷積相比,局部注意力機制可以根據局部元素之間的關系動態生成注意力權重。為了增強局部特征提取能力並保留無卷積結構,一些工作(Swin Transformer、 TNT block、Twins、T2T-ViT)嘗試通過局部自注意力機制來適應補丁結構。隨后對一些 ViT 變體進行了簡要闡述,分別是:TNT、Swin Transformer、Twins& ViL和 VOLO。
4.5 分層 Transformer
由於 ViT 在整個網絡中以固定分辨率繼承了原始的柱狀結構,因此忽略了細粒度特征,並帶來了昂貴的計算成本。繼分層 CNN 之后,最近的工作(CvT、PVT、ViL、T2T-ViT、PiT)將類似的結構應用於 Transformer 中。
4.6 深度 Transformer
根據經驗,增加模型的深度使網絡能夠學習更復雜的表示。最近的工作將這種深度結構應用於 Transformer 並進行大量實驗,通過分析跨 patch(Diverse Patch)和跨層(Refiner、DeepViT)的相似性以及殘差塊(CaiT)的貢獻來研究其可擴展性。在深度 Transformer 中,更深層的特征往往不太具有代表性(注意力崩潰,由 DeepViT 發現),並且 patch 映射到難以區分的潛在表示(補丁過度平滑,由 Diverse Patch 發現)。為了彌補上述限制,這些方法也多方面提出了相應的解決方案。簡要介紹了CaiT、DeepViT & Refiner和 Diverse Patch。
4.7 有自監督學習的 Transformers
自監督 Transformers 在 NLP 中取得了成功,但受監督的預訓練 Transformers 仍占據 CV 領域的主導地位。最近的工作還試圖在生成性(iGPT、BEiT)和辨別性(MoCo v3、DINO)中為視覺 Transformer 設計各種自監督學習方案。
4.8 討論
1)實驗評估和對比分析
表1. 視覺 Transformer 在IMAGENET-1K、CIFAR-10、CIFAR-100上的TOP-1准確率對比
根據的分類法,所綜述的監督模型可分為六類。表一總結了 Transformer 在主流分類基准上的分類性能,並為每個型號指定了專用顏色。為了客觀直觀地評估,以下三幅圖說明了在不同配置下在 ImageNet-1k 上的比較(例如,模型大小、FLOPs 和訓練方案)。下圖總結了在 224x224輸入分辨率下,每個模型的性能。由於 FLOPs 在 Transformer 內隨輸入大小呈二次增長,下圖(b)將 FLOPs 作為水平軸,重點關注在更高分辨率下的性能。下圖(c)重點介紹帶有外部數據集的預訓練模型。根據這些圖,簡要分析了有利於模型性能、效率和可擴展性的幾項改進,如下所示:
- 一般來說,大多數結構改進的方法針對特定模型尺寸、問題或特定輸入分辨率進行優化,其它基本訓練策略,如 DeiT 和 LV-ViT,更適用於各種模型、任務和輸入。
- 局部性對於 Transformer是不可或缺的,VOLO 和 Swin 分別在分類和密集預測任務中占主導地位。
- 卷積 patch 化莖(即使用卷積生成patch)和早期卷積階段(CoAtNet)顯著提高了 Transformer 的精度,尤其是在大型模型上,因為這樣的組合可以為淺層的細粒度局部特征提供相互幫助。
- 深層 Transformer 潛力巨大,如 Refined-ViT 和 CaiT。然而,由於模型大小與通道維度成二次方增長,因此深度 Transformer 中之間的權衡值得進一步研究。
- CeiT 和CvT 展示了顯著的優勢在訓練小型或中型模型(0−40M)時,這表明這種用於輕量級模型的混合注意塊值得進一步探索。
圖7
2)視覺Transformer發展趨勢綜述
Transformer 骨干在去年興起。當系統學與這些模型的時間線相匹配時,可以清楚地追蹤到 Transformer for image classification 的發展趨勢(前面的圖 1)。作為一種自注意力機制,視覺 Transformer 主要根據 NLP 中的 vanilla 結構(ViT 和 iGPT)或 CV 中基於注意力的模型(VTs 和 BoTNet)重新設計。
然后,許多方法開始將 CNN 的層次結構或深層結構擴展到視覺 Transformer。T2T-ViT、PVT、CvT 和 PiT 的共同動機是將層次結構轉移到 Transformer 中,但執行下采樣的方式不同。CaiT、Diverse Patch、DeepViT 和 Refiner 專注於深度 Transformer 中的問題。此外,一些方法轉向內部組件以進一步增強先前 Transformer 中的圖像處理能力,即位置編碼、MHSA 和 MLP。
下一波 Transformer 是局部范式。大多數通過引入局部注意力機制或卷積將局部性引入 Transformer。如今,最新的監督式 Transformer 正在探索結構組合和縮放定律。除了有監督的 Transformers,自監督學習在視覺 Transformers 中占了很大一部分。然而,目前尚不清楚哪些任務和結構對 CV 中的自監督 Transformer 更有利。
3) 淺談替代方案
在視覺 Transformer 的開發過程中,最常見的問題是 Transformer 是否可以取代卷積。通過回顧過去一年的改善歷史,沒有性能不足的跡象。視覺 Transformer 已經從一個純粹的結構回歸到一個混合的形式,全局信息逐漸回歸到一個與局部信息混合的階段。雖然 Transformer 可以等價於卷積,甚至比卷積具有更好的建模能力,但這種簡單有效的卷積運算足以處理底層的局部性和低級語義特征。在未來,兩者結合的思想將推動圖像分類的更多突破。
> 5. 檢測中的 Transformer
詳細介紹了用於目標檢測的視覺 Transformer,可以分為兩類:作為頸部(neck)的 Transformer 和作為主干(backbone)的 Transformer。頸部檢測器主要是基於 Transformer 結構的一種新表示,稱為目標查詢,即一組學習的參數均等地聚合全局特征。這些方法嘗試在提高收斂速度或改進性能方面提供最佳融合范式。除了專門為檢測任務設計的各種頸部外,一部分骨干檢測器也考慮了特定的策略。最后,比較了之間的性能,然后分析了 Transformer 檢測器的一些潛在的改進。
5.1 Transformer 頸部
首先回顧 DETR,這是最開始的一個 Transformer 檢測器,提供了一個新的表示目標查詢,將對象檢測制定為一個集合預測問題。由於其對小物體的准確性低和收斂速度慢,人們從三個方面努力改進這種 Transformer 檢測器:稀疏注意力、空間先驗和結構重設計。此外,還回顧了自監督的應用。
最初的檢測器:DEtection with TRansformer (DETR)
圖8
DETR是第一個端到端的 Transformer 檢測器,消除了手工設計的表示和非極大值抑制(NMS)后處理,通過引入目標查詢和集合預測直接檢測所有對象。具體地,DETR 使用編碼器-解碼器 Transformer 作為頸部,以及使用 FFN 作為預測頭(如上圖所示)。
稀疏注意力的 Transformer
在 DETR 中,解碼器嵌入和全局特征之間的密集交互會消耗大量計算資源並減慢 DETR 的收斂速度。因此,一些努力旨在設計依賴於數據的稀疏注意力來解決這個問題,例如 Deformable DETR 和 ACT。接着描述了在稀疏注意力中的幾個重要改進:Deformable DETR、ACT、SMCA、Conditional DETR、Two-Stage Deformable DETR 和 Efficient DETR。
重新設計結構的 Transformer
除了聚焦於交叉注意力的改進外,一些工作還重新設計了僅編碼器的結構來直接避免解碼器的問題。例如,TSP 繼承了集合預測的思想,並放棄了解碼器和目標查詢。YOLOS 結合了 DETR 的編碼器-解碼器頸部和 ViT 的僅編碼器主干,來重新設計僅編碼器的檢測器。
自監督學習的 Transformer 檢測器
受到自然語言處理中取得成功的預訓練 Transformer 的啟發,Dai 等人提出無監督預訓練DETR(UP-DETR)從三個方面輔助監督訓練:
- 從給定圖像中隨機裁剪的一個 path 分配給所有目標查詢。解碼器的目標是定位 patch 位置。
- 為了避免在預訓練中對定位的過度偏見,提出了一個輔助重建任務來保留有判別性的特征。
- 基於單個查詢 patch,多查詢定位將多個 patch 分配給不同的目標查詢,以模仿多目標檢測任務並加速收斂。每個 patch 查詢都是通過掩碼注意力和目標查詢混洗獨立預測的。
UP-DETR 在小數據集上比 DETR 獲得了更高的精度和更快的收斂速度,甚至在訓練數據充足的情況下性能更好。
5.2 Transformer 骨干
在中回顧了許多用於圖像分類的基於 Transformer 的主干。這些主干可以很容易地合並到各種框架中(例如,MaskR-CNN、RetinaNet、DETR 等)來執行密集預測任務。除了一般的改進外,中的一部分也有利於改進密集預測任務。層次結構將 Transformer 構造為一個從高分辨率到低分辨率的過程來學習多尺度特征,如 PVT。局部增強結構將主干構建為局部到全局的組合,以有效地提取短程和長程的視覺依賴性並避免二次計算開銷,例如 Swin-Transformer、ViL 和 Focal Transformer。下表3在密集預測任務中比較了基於視覺 Transformer 框架的模型。基於 Transformer 的主干比當前 CNN 模型的性能高 2-6.8%,這證明了 Transformer 在密集預測方面的有效性。
表2. Transformer 頸和 CNN 在 COCO 2017 驗證集上的性能
表3. 不同模型在密集預測任務的性能對比
與 FPN 類似,Zhang 等人通過結合非局部 和多尺度特征的特性,提出了一種專用於密集預測任務的特征金字塔 Transformer(FPT)。利用三個注意力組件來建模跨空間和尺度的交互,包括自注意力、自上而下的交叉注意力和自下而上的跨通道注意力。FPT 作為密集預測任務的通用主干,在許多 SOTA 模型上獲得進一步提升。
5.3 討論
本節在表2和表3中簡要比較和分析了 Transformer 檢測器。對於 Transformer 頸,只關注在單尺度特征結構中的 FLOPs,而不是多尺度特征,因為應用了不同的層數。從稀疏注意力(SA)的角度來看,Deformable DETR 減少了 8 GFLOPs 並縮短了 12 倍的訓練時間,而 ACT-DC5 將計算成本從 187 GFLOPs 降低到 156 GFLOPs,並且性能損失很小。從空間先驗(SP)的角度來看,one-stage 檢測器顯示地將空間先驗與目標查詢分開,帶來快速收斂和高精度。SMCA 和 Conditional DETR 在 108 個訓練 epoch 時分別達到了 42.7% 和 43% 的 mAP。two-stage 檢測器和 TSP-RCNN 都用 proposals 替換了學習到的目標查詢。這種本質上相同但結構上不同的方法顯着提高了檢測器的准確性。從多尺度 (MS) 特征的角度來看,可以補償 Transformer 在小物體檢測上的性能。例如,Deformable DETR 和 SMCA 將 DETR 提高了 5.2% 和 3.1% APs 。僅編碼器的結構減少了 Transformer 層數,但過度增加了 FLOPs,例如具有 537 GFLOPs 的 YOLOS-B。相比之下,編碼器-解碼器的結構是 GFLOPs 和層數之間的一個很好的權衡,但更深的解碼器層可能會導致長時間的訓練過程和過度平滑的問題。因此,將 SA 集成到具有 MS 和 SP 的深度解碼器中值得進一步研究。
對於分類,有許多主干的改進,但很少有工作涉及密集預測任務。基於提出的分類法,很容易將現有方法分為兩部分:分層的 Transformer 和局部增強的 Transformer。未來,預計 Transformer 主干將加入深度高分辨率網絡來解決密集預測任務。
> 6. 分割中的 Transformer
Transformer 以兩種方式廣泛應用於分割:基於 patch 的 Transformer (patch-based Transformer)和基於查詢的 Transformer (query-based Transformer)。后者可以進一步分解為帶有目標查詢的 Transformer(Transformer with object query) 和帶有掩碼嵌入的Transformer(Transformer with mask embedding)。
6.1 基於 patch 的 Transformer
為了擴展感受野,CNN 需要大量的解碼器堆疊來將高級特征映射到原始空間分辨率。相比之下,依靠全局建模能力,基於 patch 的 Transformer 將輸入圖像視為 patch 序列,並將送到一個柱狀 Transformer 編碼器中。這種分辨率不變策略使 Transformer 能夠僅包含一個相對簡單的解碼器,並為分割任務獲得理想的性能。此外,一些工作(SETR、TransUNet、Segformer)嘗試研究基於 patch 的 Transformer 與不同分割框架(Mask R-CNN、U-net)之間的最佳組合。
6.2 基於查詢的 Transformer
查詢(Query)是 Transformer 解碼器輸入和輸出處的一個可學習的嵌入。與 patch 嵌入相比,查詢嵌入可以更“公平”地整合每個 patch 的信息。有着集合預測損失的基於查詢的 Transformer 能夠刪除其他手工制作的表示和后處理。最近,許多努力試圖將這種表示推廣到可以分為兩類的分割任務。一類框架是由檢測任務監督的目標查詢所驅動。另一類的查詢僅由分割任務監督,稱為掩碼嵌入。
用目標查詢的 Transformer(Transformer with Object Queries)
圖9
基於目標查詢的方法有三種訓練方式:
- 基於 DETR 的預訓練目標查詢,一個帶有查詢的掩碼頭通過分割任務進一步細化(上圖9(a)所示),如 Panoptic DETR。
- 代替多階段訓練過程,目標查詢由一些端到端框架中的檢測和分割任務同時建模(上圖9(b)所示),如 Cell-DETR、VisTR。
- 用混合級聯網絡構建不同任務分支之間的差距,其中檢測框的輸出用作掩碼頭的輸入(上圖9(c)所示),如 QueryInst。
用掩碼嵌入的 Transformer(Transformer with Mask Embeddings)
另一類的 Transformer 框架努力使用查詢直接預測掩碼,將這種基於學習掩碼的查詢稱為掩碼嵌入。與目標查詢不同,掩碼嵌入僅由分割任務監督。如上圖 9(d)所示,兩個不相交的查詢集並行用於不同的任務,例如:ISTR 和 SOLQ。對於語義分割和無框框架,一些研究從基於查詢的 Transformer 中刪除對象查詢,並直接通過掩碼嵌入來預測掩碼(上圖 9(e)),如 Max-DeepLab、Segmenter 和 Maskformer(嚴格意義上說 Maskformer 結合了 box-free 和 box-based 方法,使用 box-based 來增強 box-free 的效果)。
6.3 討論
作為一項基礎但仍具有挑戰性的任務,分割也從不斷發展的視覺 Transformers 中受益。根據三種不同的分割子任務(語義分割、實例分割和全景分割)總結了這些 Transformer。
下表 4 側重於語義分割任務的 ADE20K 驗證集(170 個類別)。發現 Transformer 在有大量類而不是較小類的數據集上進行訓練可以顯示出巨大的性能改進。
下表 5 側重於評估實例分割任務的 COCO test-dev 2017 數據集。顯然,帶有掩碼嵌入的 Transformer 在分割和檢測任務中都超越了以往流行的模型。這些方法顯著提高了 box 的准確率,但對分割只有輕微的改進,從而導致 APbox 和 APseg 的性能存在巨大差距。基於級聯框架,QueryInst 在 Transformer 模型中獲得了 SOTA 性能。因此,Transformer 與混合任務級聯結構的結合值得進一步研究。
下表 6 側重於評估全景分割任務。Max-DeepLab 通常通過掩碼預測的方式解決全景分割任務中的前景和背景,而 Maskformer 成功地將此方式用於語義分割並統一了語義和實例級分割任務。基於在全景分割領域的表現,可以得出結論:Transformer 可以將多個分割任務統一到一個具有掩碼預測的無框框架中。
表4. UperNet 和基於 Transformer 的模型在 ADE20K Val 中語義分割任務上的對比
表5. Transformers 和 有代表性的CNNs 在 COCO test-dev 中實例分割任務上的對比
表6. 三種有代表性的 Transformers 在 COCO 全景 MiniVal 中全景分割任務上的對比
> 7. 討論和總結
7.1 總結最近的改進
基於之前的比較和討論,簡要總結了三個基本任務(分類、檢測和分割)的最新改進。
- 對於分類,深的層次的 Transformer 主干可有效降低計算復雜度並避免深層中的特征過度平滑。同時,早期的卷積足以捕獲低級特征,可以顯着增強魯棒性並降低淺層的計算復雜度。此外,卷積投影和局部注意機制都可以提高Transformer的局部性。前者也可能是一種替代位置編碼的新方法。
- 對於檢測,Transformer 頸部受益於編碼器-解碼器結構,其計算量少於僅編碼器的 Transformer 檢測器。因此,解碼器是必要的,但由於其收斂速度慢,因此只需要很少的堆疊即可。此外,稀疏注意力有利於降低計算復雜度並加速 Transformer 的收斂,而空間先驗有利於Transformer的性能,收斂速度稍快。
- 對於分割,編碼器-解碼器 Transformer 模型可以通過一系列可學習的掩碼嵌入將三個分割子任務統一為掩碼預測問題。這種無框的方法在多個基准測試中取得了最新的 SOTA (MaskFormer)。此外,基於框的 Transformer 的特定混合任務的級聯模型被證實可以在實例分割任務中獲得更高的性能。
7.2 視覺 Transformer 的討論
盡管有大量的視覺 Transformer 模型和應用,但對視覺 Transformer 的“基本”理解仍然效率低下。因此,將重點關注一些關鍵問題,以幫助解決讀者的困惑。
7.2.1 Transformer 如何彌合語言和視覺之間的鴻溝
Transformer 最初是為機器翻譯任務而設計的。在語言模型中,以句子的每個詞為基本單元,代表高層次、高維的語義信息。這些詞可以嵌入到低維向量空間表示中,因此稱為詞嵌入。在視覺任務中,圖像的每個像素都是低級、低維的語義信息,與嵌入特征不匹配。因此,遷移到視覺任務的關鍵是構建圖像到矢量的轉換並保持圖像的特征。例如,ViT 通過強松弛條件將圖像轉換為具有多個低級信息的 patch 嵌入,而 Early Conv. 和 CoAtNet 利用卷積來提取高級信息並減少 patch 中的冗余特征。
7.2.2 Transformer、自注意力與 CNN 的關系
從卷積的角度來看,如上提到的 4.3 節,其歸納偏置主要表現為局部性、平移不變性、權重共享、稀疏連接。這種簡單的卷積核可以有效地執行模板匹配,但由於其具有強烈的歸納偏差(因為很快就可以收斂學習好了),其上限低於 Transformer。
從自注意力機制的角度來看,如上提到的 4.2 和 4.4 節,當給定足夠數量的頭時,理論上可以表達任何卷積層。這種全注意力操作可以交替地結合局部和全局級別的注意力,並根據特征的關系動態生成注意力權重。即便如此,實用性也較差,准確率低於 SOTA CNN,計算復雜度更高。
從 Transformer 的角度來看,Dong 等人證明當在沒有短連接或 FFNs 的深層訓練時,自注意力層會表現出對“令牌均勻性(token uniformity)”的強烈歸納偏見。得出的結論是,Transformer 由兩個關鍵組件組成:一個 self-attention 層聚合了 token 的關系,一個 position-wise FFN 提取了輸入的特征。盡管 Transformer 具有強大的全局建模能力,如 4.3 節和 7.2.1 節所述,卷積可以有效處理低級特征,增強 Transformer 的局部性,並通過填充附加位置特征。
7.2.3 不同視覺任務中的可學習到的嵌入
圖10 可學習的嵌入分類
Transformer 模型采用可學習的嵌入來執行不同的視覺任務。從監督任務的角度來看,這些嵌入可以分為類標記、目標查詢和掩碼嵌入。從結構上看,之間是有內在聯系的。最近的 Transformer 方法主要采用兩種不同的模式:僅編碼器結構和編碼器-解碼器結構。每個結構由三個層次的嵌入組成,如上圖 10 所示。從位置層次,學習嵌入在僅編碼器的 Transformer 中的應用被分解為初始令牌(initial token)和后期令牌(later token),而學習的位置編碼和學習的解碼器輸入嵌入被應用於編碼器-解碼器結構。從數量層面來看,僅編碼器的設計會應用不同數量的令牌。例如,ViT 家族和 YOLOS 將不同的數字標記附加到初始層,而 CaiT 和 Segmenter 利用這些標記來表示最后幾層的不同特征。在編碼器 - 解碼器結構中,解碼器的學習位置編碼(目標查詢或掩碼嵌入)在顯式或隱式中附加到解碼器的輸入中。與常數輸入不同,Deformable DETR 采用學習嵌入作為輸入並加入到編碼器的輸出。
受多頭注意力設計的啟發,多初始的標記策略應該能進一步提高分類性能。然而,DeiT 表明這些額外的令牌會收斂到相同的結果,這對 ViT 沒有好處。從另一個角度來看,YOLOS 提供了一種通過使用多個初始令牌來統一分類和檢測的范式,但這種僅編碼器的設計會導致計算復雜度過高。根據CaiT 的觀察,后面的 class token 可以減少 Transformer 的一些 FLOPs 並略微提高性能(從79.9%到80.5%)。Segmenter 還展示了該策略在分割任務中的效率。
與帶有僅編碼器 Transformer 的多個后期令牌(later token)相比,編碼器-解碼器結構節省了更多的計算。通過使用一小組目標查詢(掩碼嵌入)來標准化檢測和分割領域中的 Transformer 方法。通過結合多個后期令牌和目標查詢(掩碼嵌入)的形式,像 Deformable DETR 這樣的結構,對目標查詢和可學習的解碼器嵌入(相當於多個后期令牌)作為輸入,可以將基於不同任務的可學習嵌入統一到 Transformer 編碼器-解碼器中。
7.3 未來的研究方向
Visual Transformer 方法取得了巨大的進步,並顯示出在多個基准上接近或超過 SOTA CNN 方法的有希望的結果。然而,該技術太不成熟,無法顛覆卷積在 CV 領域的主導地位。基於 7.2 中的分析,指出了視覺 Transformer 的一些有前途的未來方向,以進一步進行整體串聯。
1)集合預測:如上 7.2.3 節所述,由於損失函數的梯度相同,額外的類標記(token)將一致收斂。具有二分損失函數的集合預測策略已廣泛應用於許多密集預測任務中的視覺 Transformer 里。如之前提到的,為分類任務考慮集合預測設計是很自然的,例如多類標記 Transformer 通過集合預測來預測混合 patch 圖像,這類似於 LV-ViT 的數據增強策略。在集合預測策略中的一對一標簽分配導致早期過程中的訓練不穩定,這可能會降低最終結果的准確性。使用其他標簽分配和損失來改進集合預測可能有助於新的檢測框架。
2)自監督學習:自監督 Transformer 預訓練規范了NLP領域,並在各種應用中取得了巨大成功。作為 CV 中的自監督范式,卷積孿生網絡采用對比學習來執行自監督預訓練,這與 NLP 中的基於 mask 的自編碼器不同。最近,一些研究嘗試設計一種自監督的視覺 Transformer,以彌合視覺和語言之間預訓練方法的差距。中的大多數繼承了 NLP 中的掩碼自編碼器或 CV 中的對比學習方案。但是,沒有像 NLP 中的 GPT-3 那樣革命性的用於視覺 Transformer 的特定監督方法。如上 7.2.3 節所述,編碼器-解碼器結構可以通過學習的解碼器嵌入和位置編碼來統一視覺任務。用於自監督學習的編碼器-解碼器 Transformer 值得進一步研究。
7.4 總結
在 ViT 證明了其在 CV 任務中的有效性后,視覺 Transformer 受到了相當多的關注,並削弱了 CNN 的主導地位。在中,全面回顧了 100 多個 Transformer 模型,這些 Transformer 模型已先后應用於各種視覺任務中,包括分類、檢測和分割。對於每個任務,提出了一種具體的分類法來組織最近開發的 Transformer 方法,並在各種流行的基准上對性能進行了評估。通過對這些方法的綜合分析和系統比較,總結了具有顯著改進的方法,討論了視覺 Transformer 的三個基本問題,並進一步提出了未來有希望的幾個潛在研究方向。
Transformer中拋棄了傳統的CNN和RNN,整個網絡結構完全是由Attention機制組成。更准確地講,Transformer由且僅由self-Attenion和Feed Forward Neural Network組成。一個基於Transformer的可訓練的神經網絡可以通過堆疊Transformer的形式進行搭建,作者的實驗是通過搭建編碼器和解碼器各6層,總共12層的Encoder-Decoder,並在機器翻譯中刷新了BLEU值。
作者采用Attention機制的原因是考慮到RNN(或者LSTM,GRU等)的計算限制為是順序的,也就是說RNN相關算法只能從左向右依次計算或者從右向左依次計算,這種機制帶來了兩個問題:
- 時間片t的計算依賴t-1時刻的計算結果,這樣限制了模型的並行能力;
- 順序計算的過程中信息會丟失,盡管LSTM等門機制的結構一定程度上緩解了長期依賴的問題,但是對於特別長的依賴關系,LSTM依舊無能為力。
Transformer的提出解決了上面兩個問題,首先使用了Attention機制,將序列中的任意兩個位置之間的距離是縮小為一個常量;其次不是類似RNN的順序結構,因此具有更好的並行性,符合現有的GPU框架。
說明:該筆記總結的圖片來源於Jay Alammar的博客,前言部分來自知乎劉岩的總結, 謝謝兩位大佬的分享。本篇是結合自己的理解翻譯中文,有錯誤的地方,請在評論區中留言。
2. Transformer詳解
2.1 Transformer整體結構
論文中的驗證Transformer的實驗室基於機器翻譯的,下面就以機器翻譯為例子詳細剖析Transformer的結構,在機器翻譯中,Transformer可概括為如圖1
圖1:Transformer用於機器翻譯
Transformer的本質上是一個Encoder-Decoder的結構,那么圖1可以表示為圖2的結構
圖2:Transformer的Encoder-Decoder結構
如論文中所設置的,編碼器由6個編碼block組成,同樣解碼器是6個解碼block組成。與所有的生成模型相同的是,編碼器的輸出會作為解碼器的輸入,如圖3所示:
圖3:Transformer的Encoder和Decoder均由6個block堆疊而成
繼續分析每個encoder的詳細結構:在Transformer的encoder中,數據首先會經過一個叫做‘self-attention’的模塊得到一個加權之后的特征向量ZZ,這個便ZZ是論文公式1中的Attension(Q,K,V)Attension(Q,K,V):
Attension(Q,K,V)=softmax(QKTd1/2k)VAttension(Q,K,V)=softmax(QKTdk1/2)V
第一次看到這個公式可能會一頭霧水,在后面的文章中會揭開這個公式背后的實際含義,在這一段暫時將其叫做ZZ 。得到ZZ之后,會被送到encoder的下一個模塊,即Feed Forward Neural Network。這個全連接有兩層,第一層的激活函數是ReLU,第二層是一個線性激活函數,可以表示為:
FFN=max(0,ZW1+b1)W2+b2FFN=max(0,ZW1+b1)W2+b2
Encoder的結構如圖4所示
圖4:Transformer由self-attention和Feed Forward neural network組成
Decoder的結構如圖5所示,和encoder的不同之處在於Decoder多了一個Encoder-Decoder Attention,兩個Attention分別用於計算輸入和輸出的權值
- Self-Attention:當前翻譯和已經翻譯的前文之間的關系;
- Encoder-Decoder Attention:當前翻譯和編碼的特征向量之間的關系。
圖5:Transformer的解碼器由self-attention,encoder-decoder attention以及FFNN組成
2.2 輸入編碼
1.1節介紹的就是Transformer的主要框架,下面將介紹輸入數據。如圖6所示,首先通過Word2Vec等詞嵌入方法將輸入語料轉化成特征向量,論文中使用的詞嵌入的維度為dmodel=512dmodel=512
圖6:單詞的輸入編碼
在最底層的block中,xx將直接作為Transformer的輸入,而在其他層中,輸入則是上一個block的輸出。為了畫圖更簡單,使用更簡單的例子來表示接下來的過程,如圖7所示:
圖7:輸入編碼作為一個tensor輸入到encoder中
2.3 Self-Attention
Self-Attention是Transformer最核心的內容,然而作者並沒有詳細講解,下面來補充一下作者遺漏的地方。回想Bahdanau等人提出的用Attention,其核心內容是為輸入向量的每個單詞學習一個權重,例如在下面的例子中判斷it代指的內容
The animal didn't cross the street because it was too tired
通過加權之后可以得到類似圖8的加權情況,在講解self-attention的時候也會使用圖8類似的表示方式:
圖8:經典Attention可視化示例圖
在self-attention中,每個單詞有3個不同的向量,分別是Query向量(QQ),Key向量(KK)和Value向量(VV),長度均是64。是通過3個不同的權值矩陣由嵌入向量 XX 乘以三個不同的權值矩陣WQWQ, WKWK, WVWV 得到,其中三個矩陣的尺寸也是相同的。均是512×64512×64 。
圖9:Q,K,V的計算示例圖
那么Query,Key,Value是什么意思呢?在Attention的計算中扮演着什么角色呢?先看一下Attention的計算方法,整個過程可以分成7步:
- 如上文,將輸入單詞轉化成嵌入向量;
- 根據嵌入向量得到qq, kk, vv 三個向量;
- 為每個向量計算一個score:score=q∗kscore=q∗k ;
- 為了梯度的穩定,Transformer使用了score歸一化,即除以d1/2kdk1/2;
- 對score施以softmax激活函數;
- softmax點乘Value值vv ,得到加權的每個輸入向量的評分vv ;
- 相加之后得到最終的輸出結果z=∑vz=∑v 。
上面步驟的可以表示為圖10的形式。
圖10:Self-Attention計算示例圖
實際計算過程中是采用基於矩陣的計算方式,那么論文中的QQ, VV, KK 的計算方式如圖11:
圖11:Q,V,K的矩陣表示
如圖12所示的矩陣形式,這個softmax分數決定了每個單詞對編碼當下位置(“Thinking”)的貢獻。顯然,已經在這個位置上的單詞將獲得最高的softmax分數,上述第三步和第四步是將分數除以8(8是論文中使用的鍵向量的維數64的平方根,這會讓梯度更穩定。這里也可以使用其它值,8只是默認值),然后通過softmax傳遞結果。softmax的作用是使所有單詞的分數歸一化,得到的分數都是正值且和為1。
圖12:Self-Attention的矩陣表示
這里也就是公式1的計算方式。在self-attention需要強調的最后一點是其采用了殘差網絡中的short-cut結構,目的當然是解決深度學習中的退化問題,得到的最終結果如圖13。
圖13:Self-Attention中的short-cut連接
2.4 Multi-Head Attention
Multi-Head Attention相當於hh個不同的self-attention的集成(ensemble),在這里以h=8h=8舉例說明。Multi-Head Attention的輸出分成3步:
- 將數據XX分別輸入到圖13所示的8個self-attention中,得到8個加權后的特征矩陣Zi,i∈1,2,...,8Zi,i∈1,2,...,8。
- 將8個ZiZi按列拼成一個大的特征矩陣512,64×8512,64×8。
- 特征矩陣經過一層全連接后得到輸出ZZ。
整個過程如圖14所示:
圖14:Multi-Head Attention
同self-attention一樣,multi-head attention也加入了short-cut機制。現在已經觸及了注意力的頭,讓重新審視之前的例子,看看不同的注意力頭在哪里聚焦,因為在例句中編碼“it”這個詞:
當對“它”這個詞進行編碼時,一個注意力的焦點主要集中在“動物”上,而另一個注意力集中在“疲憊” - 從某種意義上說,模型對“它”這個詞的表現形式在某些表現形式中有所表現。 “動物”和“疲倦”。
2.5 位置編碼
截止目前為止,介紹的Transformer模型並沒有捕捉順序序列的能力,也就是說無論句子的結構怎么打亂,Transformer都會得到類似的結果。換句話說,Transformer只是一個功能更強大的詞袋模型而已。
為了解決這個問題,論文中在編碼詞向量時引入了位置編碼(Position Embedding)的特征。具體地說,位置編碼會在詞向量中加入了單詞的位置信息,這樣Transformer就能區分不同位置的單詞了。
那么怎么編碼這個位置信息呢?常見的模式有:a. 根據數據學習;b. 自己設計編碼規則。在這里作者采用了第二種方式。那么這個位置編碼該是什么樣子呢?通常位置編碼是一個長度為 dmodeldmodel的特征向量,這樣便於和詞向量進行單位加的操作,如圖16。
圖16:Position Embedding
論文給出的編碼公式如下:
PE(pos,2i)=sin(pos100002idmodel)PE(pos,2i)=sin(pos100002idmodel)
PE(pos,2i+1)=cos(pos100002idmodel)PE(pos,2i+1)=cos(pos100002idmodel)
在上式中,pospos 表示單詞的位置, ii 表示單詞的維度。關於位置編碼的實現可在Google開源的算法中get_timing_signal_1d()
函數找到對應的代碼。
作者這么設計的原因是考慮到在NLP任務重,除了單詞的絕對位置,單詞的相對位置也非常重要。根據公式$sin(\alpha+\beta)=sin{\alpha}cos{\beta}+cos{\alpha}sin{\beta}$ 以及 cos(α+β)=cosαcosβ−sinαsinβcos(α+β)=cosαcosβ−sinαsinβ,這表明位置k+pk+p的位置向量可以表示為位置kk的特征向量的線性變化,這為模型捕捉單詞之間的相對位置關系提供了非常大的便利。
如果假設嵌入的維數為4,那么實際的位置編碼將如下所示:
圖17:詞嵌入大小為4的位置編碼
在下圖中,每行對應矢量的位置編碼。因此第一行將是添加到輸入序列中嵌入第一個單詞的向量。每行包含512個值 - 每個值介於1和-1之間。對進行了顏色編碼,使圖案可見。
圖18:位置編碼的可視化
嵌入大小為512(列)的20個字(行)的位置編碼的真實示例。可以看到在中心區域分成兩半。這是因為左半部分的值由一個函數(使用正弦)生成,而右半部分由另一個函數(使用余弦)生成。然后將連接起來以形成每個位置編碼矢量。
2.6 殘差結構
如果要將向量和與self-attention相關的圖層規范操作可視化,將如下所示:
圖19:self-attention的圖層可視化
這也適用於解碼器的子層。如果將2個堆疊編碼器和解碼器圖層可視化,看起來像這樣:
圖20:編碼器和解碼器的可視化
2.7 解碼器結構
既然已經涵蓋了編碼器方面的大多數概念,基本上都知道解碼器的組件是如何工作的。但是讓來看看如何協同工作。 編碼器通過處理輸入序列開始。然后將頂部編碼器的輸出變換成一組注意力向量K和V.這些將由每個解碼器在其“編碼器 - 解碼器注意力”層中使用,這有助於解碼器關注輸入序列中的適當位置:
圖21:解碼過程
完成編碼階段后,開始解碼階段。解碼階段中的每個步驟輸出來自輸出序列的元素(在這種情況下為英語翻譯句子)。
以下步驟重復該過程,直到到達特殊符號,表明Transformer解碼器已完成其輸出。每個步驟的輸出在下一個時間步驟中被饋送到底部解碼器,並且解碼器像編碼器那樣冒泡解碼結果。就像對編碼器輸入所做的那樣,在這些解碼器輸入中嵌入並添加位置編碼,以指示每個字的位置。
圖22:關注輸出序列的解碼過程
解碼器中的self-attention層以與編碼器中的self-attention層略有不同的方式操作: 在解碼器中,僅允許self-attention層關注輸出序列中的較早位置。這是通過在self-attension計算中的softmax步驟之前屏蔽未來位置(將設置為-inf)來完成的。 “Encoder-Decoder Attention”層就像多頭self-attention一樣,除了從下面的層創建其查詢矩陣,並從編碼器堆棧的輸出中獲取鍵和值矩陣。
2.8 The Final Linear and Softmax Layer
解碼器堆棧輸出浮點數向量。如何將其變成一個單詞?這是最終線性層的工作,其后是Softmax層。 線性層是一個簡單的全連接的神經網絡,將解碼器堆棧產生的向量投影到一個更大的向量中,稱為logits向量。
讓假設模型知道從訓練數據集中學到的10,000個獨特的英語單詞(模型的“輸出詞匯表”)。這將使logits向量10,000個細胞(cell)寬 - 每個細胞(cell)對應於一個唯一單詞的得分。這就是如何解釋模型的輸出,然后是線性層。 然后softmax層將這些分數轉換為概率(全部為正,全部加起來為1.0)。選擇具有最高概率的單元,並且將與其相關聯的單詞作為該時間步的輸出。
圖23:關注輸出序列的解碼過程
該圖從底部開始,向量的產生為解碼器堆棧的輸出。然后變成輸出字。
2.9 損失函數
現在已經通過訓練有素的Transformer覆蓋了整個前向過程,看一下尋兩模型的直覺是有用的。 在訓練期間,未經訓練的模型將通過完全相同的前向過程。但是由於在標記的訓練數據集上訓練,可以將其輸出與實際正確的輸出進行比較。 為了想象這一點,讓假設輸出詞匯只包含六個單詞(“a”,“am”,“i”,“thanks”,“student”和“”(“句末”的縮寫)) 。
圖24: 詞對應索引
在開始訓練之前,模型的輸出詞匯是在預處理階段創建的。一旦定義了輸出詞匯表,就可以使用相同寬度的向量來表示詞匯表中的每個單詞。這也稱為“one-hot”編碼。例如,可以使用以下向量指示單詞“am”:
圖25:輸出詞匯的編碼
在回顧一下之后,讓討論一下模型的損失函數 - 在訓練階段優化的指標,以引導一個訓練有素且令人驚訝的精確模型。
假設正在訓練模型。說這是在訓練階段的第一步,正在訓練一個簡單例子 - 將“merci”翻譯成“謝謝”。 這意味着,希望輸出是指示“謝謝”一詞的概率分布。但由於這種模式還沒有接受過訓練,所以這種情況不太可能發生。
圖26:輸出詞匯的編碼
由於模型的參數(權重)都是隨機初始化的,因此(未經訓練的)模型產生具有每個單元/單詞的任意值的概率分布。可以將與實際輸出進行比較,然后使用反向傳播調整所有模型的權重,使輸出更接近所需的輸出。
如何比較兩個概率分布?簡單地從另一個中減去一個。有關更多詳細信息,請查看交叉熵和Kullback-Leibler散度。
但請注意,這是一個過於簡單的例子。更現實的是,將使用長於一個單詞的句子。例如 - 輸入:“jesuisétudiant”和預期輸出:“是學生”。這真正意味着,希望模型能夠連續輸出概率分布,其中:
1. 每個概率分布由寬度為vocab_size的向量表示(在前面示例中為6,但更實際地是3,000或10,000的數字)
2. 第一概率分布在與單詞“i”相關聯的單元處具有最高概率
3. 第二概率分布在與單詞“am”相關聯的單元格中具有最高概率
4. 依此類推,直到第五個輸出分布表示'<句末結束>'符號,其中還有一個與10,000元素詞匯表相關聯的單元格。
圖27: 目標詞的真實位置
將在一個樣本句子的訓練示例中訓練模型的目標概率分布。在足夠大的數據集上訓練模型足夠的時間之后,希望產生的概率分布看起來像這樣:
圖28: 模型預測單詞的位置
希望通過訓練,模型將輸出期望的正確翻譯。當然,這個短語是否是訓練數據集的一部分並不是真正的指示(參見:交叉驗證)。請注意,即使不太可能是該時間步的輸出,每個位置都會獲得一點概率 - 這是softmax非常有用的屬性,有助於訓練過程。
現在,因為模型一次生成一個輸出,可以假設模型從該概率分布中選擇具有最高概率的單詞並丟棄其余的單詞。這是一種方法(稱為貪婪解碼)。另一種方法是保持前兩個詞(例如,'I'和'a'),然后在下一步中,運行模型兩次:一旦假設第一個輸出位置是單詞'I',另一次假設第一個輸出位置是單詞'me',並且考慮到#1和#2位置保留的任何版本產生的錯誤都較少。重復這個位置#2和#3 ......等。這種方法稱為“波束搜索”,在例子中,beam_size是兩個(因為在計算位置#1和#2的波束后比較了結果),top_beams也是兩個(因為保留了兩個詞)。這些都是可以嘗試的超參數。
3. 總結
優點:
- 雖然Transformer最終也沒有逃脫傳統學習的套路,Transformer也只是一個全連接(或者是一維卷積)加Attention的結合體。但是其設計已經足夠有創新,因為其拋棄了在NLP中最根本的RNN或者CNN並且取得了非常不錯的效果,算法的設計非常精彩,值得每個深度學習的相關人員仔細研究和品位。
- Transformer的設計最大的帶來性能提升的關鍵是將任意兩個單詞的距離變成1,這對解決NLP中棘手的長期依賴問題是非常有效的。
- Transformer不僅僅可以應用在NLP的機器翻譯領域,甚至可以不局限於NLP領域,是非常有科研潛力的一個方向。
- 算法的並行性非常好,符合目前的硬件(主要指GPU)環境。
缺點:
- 粗暴的拋棄RNN和CNN雖然非常炫技,但是也使模型喪失了捕捉局部特征的能力,RNN + CNN + Transformer的結合可能會帶來更好的效果。
- Transformer失去的位置信息其實在NLP中非常重要,而論文中在特征向量中加入Position Embedding也只是一個權宜之計,並沒有改變Transformer結構上的固有缺陷。
參考鏈接
https://mp.weixin.qq.com/s/btdnjKVVSuLZH15bXmihlw
論文鏈接: https://www.arxiv-vanity.com/papers/2009.06732
https://mp.weixin.qq.com/s/_th7rXfZDuSu2xo7gdPp0w
https://www.cnblogs.com/zhongzhaoxie/p/13064374.html
Transformer論文及相關代碼:
- Read the Attention Is All You Need paper, the Transformer blog post (Transformer: A Novel Neural Network Architecture for Language Understanding), and the Tensor2Tensor announcement.
- Watch Łukasz Kaiser’s talk walking through the model and its details
- Play with the Jupyter Notebook provided as part of the Tensor2Tensor repo
- Explore the Tensor2Tensor repo.
Transformer相關工作:
- Depthwise Separable Convolutions for Neural Machine Translation
- One Model To Learn Them All
- Discrete Autoencoders for Sequence Models
- Generating Wikipedia by Summarizing Long Sequences
- Image Transformer
- Training Tips for the Transformer Model
- Self-Attention with Relative Position Representations
- Fast Decoding in Sequence Models using Discrete Latent Variables
- [Adafactor: Adaptive Learning Rates with Sublinear Memory Cost](https://arxiv.org/abs/1804.04235