图解Reformer:一种高效的Transformer
作者:Alireza Dirafzoon? ??編譯:ronghuaiyang
導讀
在單GPU上就可以運行的Transformer模型,而且幾乎不損失精度,了解一下?
如果你一直在開發機器學習算法用于處理連續數據 —— 例如語言處理中的文本,語音信號,或視頻 —— 你可能聽說過或使用過Transformer,你可能知道這和是推特中認為的不同于一個東西。
最近,谷歌推出了Reformer架構,Transformer模型旨在有效地處理處理很長的時間序列的數據(例如,在語言處理多達100萬個單詞)。Reformer的執行只需要更少的內存消耗,并且即使在單個GPU上運行也可以獲得非常好的性能。論文Reformer: The efficient Transformer將在ICLR 2020上發表(并在評審中獲得了近乎完美的分數)。Reformer模型有望通過超越語言應用(如音樂、語音、圖像和視頻生成)對該領域產生重大影響。
在這篇文章中,我們將努力深入Reformer模型并試著去理解一些可視化方面的指南。準備好了嗎?
為什么是Transformer?
在NLP類的任務中,如機器翻譯、文本生成、問答,可以被形式化為sequence-to-sequence的學習問題。長短期記憶(LSTM)神經網絡,后來配備了注意機制,是著名用于構建預測模型等問題的架構,比如在谷歌的神經機器翻譯系統中。然而,LSTMs中遞歸的固有順序特性使得無法并行化數據序列,因此在速度和梯度消失方有巨大的障礙,因此,這些架構無法在長序列上利用上下文。
最近Transformer模型,在Attention is all you need這篇文章中提出 —— 在許多任務達到了最先進的性能,擺脫了循環并引入了多頭self-attention機制。Transformer的主要新奇之處在于它的并行處理能力,這使得處理長序列(具有數千個單詞的上下文窗口)成為可能,從而產生更優的模型,例如著名的Open AI的GPT2語言模型,而訓練時間更少。Huggingface的Transformer庫 —— 具有超過32個預訓練的語言模型,支持超過100種語言,并在TensorFlow和PyTorch進行了相互的轉換,這在構建先進的NLP系統上是非常了不起的工作。Transformer已經被用于除文本之外的應用上,比如生成音樂和圖像。
Transformer缺了點什么?
在深入研究reformer之前,讓我們回顧一下Transformer模型的挑戰之處。這需要對transformer體系結構本身有一定的了解,在這篇文章中我們無法一一介紹。然而,如果你還不知道,Jay Alamar的The Illustrated Transformer:http://jalammar.github.io/transformer/是迄今為止最好的可視化解釋,我強烈建議在閱讀本文其余部分之前先閱讀他的文章。
盡管transformer模型可以產生非常好的結果,被用于越來越多的長序列,例如11k大小的文本,許多這樣的大型模型只能在大型工業計算平臺上訓練,在單個GPU上一步也跑不了,因為它們的內存需求太大了。例如,完整的GPT-2模型大約包含1.5B參數。最大配置的參數數量超過每層0.5B,而層數有64 層。
圖2:標準Transformer模型的簡化圖如果這個模型看起來不熟悉或似乎很難理解,我勸你們暫停在這里回顧一下Transformer。
你可能會注意到在圖中存在一些????,有3種不同的顏色。這些獨特的????的代表了Transformer模型的一部分,Reformer作者發現了計算和內存問題的來源:
???? 問題 1 (紅色????): 注意力計算
計算關注序列的長度L的復雜度是O (L2)(時間和內存)。想象一下如果我們有一個長度為64K的序列會發生什么。
???? 問題 2 (黑色 ????): 層數多
具有N層的模型要消耗N倍于單層模型的內存,因為每一層中的激活都需要存儲以進行反向傳播。
???? 問題 3 (綠色 ????): 前饋網絡的深度
中間前饋層的深度往往比注意里激活的深度大得多。Reformer模型解決了Transformer中上述三個內存消耗的主要來源,并對它們進行了改進,使Reformer模型能夠處理最多100萬單詞的上下文窗口,所有這些都在單個GPU上,并且僅使用16GB內存。
簡而言之,Reformer模型結合了兩種技術來解決注意力問題和內存分配:局部敏感哈希來減少長序列注意力的復雜度,可逆殘差層更有效的利用內存。
下面我們進入進一步的細節。
???? 1. 局部敏感哈希(LSH) 注意力
???? 注意力以及最近的鄰居
在深度學習中,注意力是一種機制,它使網絡能夠根據上下文的不同部分與當前時間步長之間的相關性,將注意力集中在上下文的不同部分。transformer模型中存在三種注意機制:
圖3:在Transformer 模型三種類型的注意力在Transformer 中使用的標準注意里是縮放的點積,表示為:
從上面的方程和下面的圖,它可以觀察到,QK?的計算和內存的消耗都是 O (L2) 復雜度的,這是主要的內存瓶頸。
但這是計算和存儲完整的矩陣QK?是必要的嗎 ?答案是不,, 我們感興趣的是softmax*(QK? ),它是由最大的元素決定的,通常是稀疏矩陣。因此,正如你在上面的示例中所看到的,對于每個查詢q,我們只需要注意最接近q的鍵k。例如,如果長度是64K,對于每個q,我們可以只考慮32或64個最近的鍵的一個小子集。因此,注意力機制查找query的最近鄰居鍵,但效率不高。這是不是讓你想起了最近鄰搜索?
Reformer的第一個革新點來自用局部敏感哈希代替點積注意力,把復雜度從O(L2)變為了O(L log L)。
???? LSH的最近鄰搜索
LSH是一種著名的算法,它在高維數據集中以一種“高效”和“近似”的方式搜索“最近的鄰居”。LSH背后的主要思想是選擇hash函數,對于兩個點p和q,如果q接近p,那么很有可能我們有hash(q) == hash(p) 。
做到這一點最簡單的方法是用隨機超平面不斷的分割空間,并在每個點上加上sign(p?H)作為hash碼。讓我們來看一個例子:
圖5:用于最近鄰搜索的局部敏感哈希的簡化動畫一旦我們找到所需長度的哈希碼,我們就根據它們的哈希碼將這些點分成桶 —— 在上面的例子中,a 和b屬于同一個桶,因為hash(a) == hash(b)。現在,查找每個點的最近鄰居的搜索空間大大減少了,從整個數據集到它所屬的桶中。
Angular LSH:普通LSH的一個變化,成為Angular LSH,使用不同的編碼把點投影到單位球上預先定義好的區域里。然后一系列隨機旋轉的點定義了這些點所屬的桶。讓我們通過一個簡單的2D例子來說明這一點,這個例子來自于Reformer的論文:
圖6:Angular LSH最近鄰搜索的簡化動畫,兩個點在不同的桶這里我們有兩個點,它們投影到一個單位圓上,并隨機旋轉3次,角度不同。我們可以觀察到,它們不太可能共享同一個hash桶。在下一個例子中,我們可以看到兩個非常接近的點在3次隨機循環后將共享相同的hash桶:
圖7:Angular LSH最近鄰搜索的簡化動畫:兩個點很近???? LSH注意力
下面是LSH注意力背后的基本思想。回顧一下上面的標準注意力公式,我們不計算Q和K矩陣中所有向量的注意力,而是做以下工作:
找到Q和K矩陣的LSH散列。
只計算相同哈希桶中的k和q向量的標準注意力值。
多回合的LSH注意力:重復以上步驟幾次,以增加相似的物品落入相同的桶中的概率。
下面的動畫演示了一個LSH注意力的簡化版本。
圖6:LSH注意機制的簡化示意圖???? 2. 可逆Transformer和分塊
現在我們準備解決Transformer的第二個和第三個問題,即大量的(N)編碼器和解碼器層以及前饋層的深度。
???? 可逆殘差網絡(RevNet)
仔細觀察圖2中的編碼器和解碼器塊,我們發現每個注意力層和前饋層都被包裝成一個殘差塊(類似于圖6(左)所示)。殘差網絡*(*ResNets),是用來幫助解決深層網絡(多層)中的消失梯度問題的強大組件。然而,ResNets的內存消耗是一個瓶頸,因為需要在內存中存儲每一層的激活來計算反向傳播期間的梯度。內存成本與網絡中的單元數量成正比。
為了解決這個問題,由一系列可逆塊組成的[可逆殘差網絡(RevNet)](https://papers.nips.cc/paper/6816reversib-resinetworkworkbackwithoutoutstorings -activations.pdf)。在Revnet中,每一層的激活都可以從后續層的激活中精確地重建,這使得我們可以在不將激活存儲在內存的情況下執行反向傳播。圖6表示了殘差塊和可逆殘差塊。注意我們如何從它的輸出(Y?, Y?)計算物體的輸入(X?, X?)。
圖6:殘差網絡塊(左)和可逆殘差塊(右)???? 可逆Transformer
回到我們的第二個問題,這個問題是處理N層Transformer網絡的內存需求 —— 可能會有非常大的N。Reformer將RevNet思想應用于變壓器,將RevNet塊內的注意力層和前饋層結合起來。在圖6中,現在F為注意層,G為前饋層:
Y?= X?+Attention(X?) Y?= X?+FeedForward(Y?)
????現在使用可逆的殘差層代替標準殘差層使得在訓練過程中只需要存儲激活一次,不是N次。
???? 分塊
在Reformer的效率改進的最后一部分處理第三個問題,即前饋層的高維中間向量 — 可以達到4K和更高的維度。由于前饋層的計算是獨立于序列的各個位置的,所以前向和后向的計算以及反向的計算都可以被分割成塊。例如,對于向前傳遞,我們將有:
前向通道計算中的分塊???? 實驗結果
作者分別對圖像生成任務imagenet64(長度為12K)和文本任務enwik8(長度為64K)進行了實驗,評價了可逆Transformer和LSH哈希對內存、精度和速度的影響。
????可逆Transformer匹配基準:他們的實驗結果表明,可逆的Transformer 可以節省內存不犧牲精度:
在enwik8和imagenet64訓練中,可逆性對性能的影響????LSH注意力匹配基準:????注意LSH注意力是一個近似的全注意力,其準確性隨著散列值的增加而提高。當哈希值為8時,LSH的注意力幾乎等于完全注意力:
LSH注意力作為散列循環對imagenet64的影響????他們也證明了傳統注意力的速度隨著序列長度的增加而變慢,而LSH注意力速度保持穩定,它運行在序列長度~ 100k在8GB的GPU上的正常速度:
注意力評估的速度作為全注意力和LSH注意力的輸入長度的函數與Transformer模型相比,最終的Reformer模型具有更高的存儲效率和更快的存儲速度。
???? Trax: ?代碼和示例
????Reformer的代碼:https://github.com/google/trax/tree/master/trax/models/reformer,已經發布的新的Trax庫。Trax是一個深度學習訓練和推理庫,可以讓你從頭理解深度學習。Reformer的代碼包含了一個例子,你可以在圖像生成和文本 生成任務上訓練和推理。
—END—
英文原文:https://towardsdatascience.com/illustrating-the-reformer-393575ac6ba0
往期精彩回顧適合初學者入門人工智能的路線及資料下載機器學習在線手冊深度學習在線手冊AI基礎下載(pdf更新到25集)本站qq群1003271085,加入微信群請回復“加群”獲取一折本站知識星球優惠券,請回復“知識星球”喜歡文章,點個在看
總結
以上是生活随笔為你收集整理的图解Reformer:一种高效的Transformer的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python地信专题 |基于geopan
- 下一篇: 科普|推荐系统常用算法总结