哈希算法、愛因斯坦求和約定,這是2020年的注意力機制

2020-12-11 機器之心Pro

機器之心報導

參與:思、肖清、一鳴

在 Transformer 完全採用注意力機制之後,注意力機制有有了哪些改變?哈希算法、Head 之間的信息交流都需要考慮,顯存佔用、表徵能力都不能忽視。

注意力機制是非常優美而神奇的機制,在神經網絡「信息過載」的今天,讓 NN 學會只關注特定的部分,無疑會大幅度提升任務的效果與效率。藉助注意力機制,神經機器翻譯、預訓練語言模型等任務獲得了前所未有的提升。

但與此同時,注意力機制也面臨著重重問題,首先就是參數量太大,這有點類似於全連接層,注意力機制需要考慮兩兩之間的所有連接。我們可以看到,完全用注意力機制的模型,參數量輕輕鬆鬆破個億,而卷積這類參數共享的運算,參數量一般也就幾百萬。

如果只是參數量大也就算了,能完整利用這些參數,正是說明模型的表徵能力非常強。但問題在於,Transformer 採用的 Multi-head Attention 並沒有充分利用參數的表徵能力。舉個例子,Transformer 中每一個注意力 Head 都是相互獨立的,它們之間沒有信息交流,因此谷歌最近提出的 Talking-Head 就旨在解決這個問題。

本文從原 Multi-head Attention 出發,探索 Reformer 如何用哈希算法大量降低顯存需求,探索 Talking-Head 如何強化全注意力機制的表徵能力

多頭注意力:開始的地方

Transformer 因在大型預訓練語言模型中的優秀性能而被世人所熟知。這一類模型已廣泛應用於多種預訓練語言模型中,如 BERT、GPT-2 等。當然,在廣泛應用之餘,人們也在思考 Transformer 存在的缺陷,並進行彌補。

論文:Attention Is All You Need論文連結:https://arxiv.org/abs/1706.03762 (https://arxiv.org/abs/1706.03762)提到 Transformer,人們總會想到這類模型最突出的幾個特徵:點乘注意力、多頭注意力、殘差連接、Mask 機制等。在最初介紹 Transformer 的論文中,Waswani 等引入了這些優秀的特性,使 Transformer 獨樹一幟。

優秀的特性,問題的根源

在 Transformer 中,首先引入的是注意力點乘機制。它將輸入分為查詢(Query)、鍵(Key)和值(Value),通過以下公式計算。其相當於根據序列元素之間的相似性,確定每一個元素都應該關注哪些信息。

而另一方面,僅計算一次注意力,不足以捕捉所有的文本結構特徵。因此,Transformer 的提出者想到類似於 CNN 中的 multi-channel 的方法:讓點乘注意力機制「重複」多次。這樣一來,Transformer 的模型複雜度顯著上升,捕捉了更多的語義和語言特徵,這種方法便是我們熟悉的多頭注意力。

圖 2:(左)點乘注意力;(右)多頭注意力,有多個注意力層並行。

多頭注意力的公式如下所示,每一個 Head 都是一個注意力層。為了提高差異性,每一個 Head 的輸入張量都會先經過它特有的線性變換,相當於希望該 Head 注意特定的某個方面。

儘管 Transformer 因為這些特性而產生了很好的性能,但其固有的缺陷也隨之而生。特別需要注意的就是多頭注意力機制了。在設計之初,為了讓不同的注意力頭能夠捕捉語言模型中的不同特徵,不論是 BERT 還是 GPT-2 的設計者都將增加了注意力頭的數量。

但是,由於 Query、Key 和 Value 在訓練中會進行多次線性變換,且每個頭的注意力單獨計算,因此產生了大量的冗餘參數,也需要極大地顯存。

怎樣才能降低計算複雜度呢?研究者們在這個問題上思考了很多方法,本文中可以看到採用哈希算法、參數壓縮等的方法。這些方法有的是強化多頭注意力機制。有的則是利用哈希算法的高效性,替換掉原本的架構,使模型性能更加優秀。

哈希改造下的注意力機制

Transformer 因為 Multi-Head Attention 而成功,也因為它而受到重重限制。在 2017 年 Transformer 提出以後,18 年到 19 年已經有很多研究在改進這種注意力機制,這裡介紹的是一種「哈希大法」,提出該方法的 Reformer 已經被接收為 ICLR 2020 的 Oral 論文。

ICLR 2020 程序主席評論道:「Reformer 這篇論文提出的新型注意力機制有效減少序列長度的複雜度,同時新機制也減少了存儲需求。實驗證明它們非常有效,該論文可能對研究社區會產生顯著影響。儘管有一些次要的觀點,但所有評審者都一致同意接收該論文。」

論文:Reformer: The Efficient Transformer論文地址:https://openreview.net/pdf?id=rkgNKkHtvB

注意力機制到底哪不對?

我們先回到注意力機制,其中非常重要的運算是 Query 與 Key 這兩個張量之間的矩陣乘法,其代表著餘弦相似性。具體而言,如果 Query 表示翻譯領域的中文序列,Key 表示英文序列,那麼矩陣乘法則表示在翻譯成某個中文詞時,需要注意哪些英文詞。

但問題在於,Query 與 Key 的張量維度都是 [batch size, length, d_model],乘完後的維度是 [batch size, length, length]。要是序列長度 length 不長也就罷了,但如果上下文跨度很廣,需要很長的序列,也就是說 length 遠遠大於隱藏層大小 d_model。那可就麻煩了,研究者表示要是序列長度達到 64K,注意力機制計算一個樣本也需要 16GB 的顯存(Float32)。

你可能會說,我不一次性計算 Query 中的所有序列,而每次只算一步,例如一個中文詞,計算它與所有英文詞之間的相似性。這樣不就沒問題了麼?這是沒問題的,但並沒有實質上的改變。

哈希來幫忙

現在,假定序列長度還是 64K,對於 Query 序列中的每一個 q,正常的注意力機制需要計算它和 Key 序列 64K 個元素之間的相似度,並通過 Softmax 將相似度歸一化為概率。反正都是要計算概率,且一般只有概率最高的一些元素真正對 q 有很大的貢獻,那麼為什麼不直接找出這些元素?

之前超大的矩陣乘法會計算 Query 序列所有元素與 Key 序列所有元素之間的相似度,現在如果不通過矩陣乘法,只找每個 Query 序列「最相近」的 32 個或 64 個元素,那麼顯存與計算豈不是成千倍地減少?

這就是 Reformer 最核心的思想,完成查找「最相近」元素的算法即局部敏感哈希算法(Locality sensitive hashing)。

簡單而言,局部敏感哈希算法(LSH)在輸入數據彼此類似時,它們有很大概率映射後的哈希是一樣的;而當輸入數據彼此不同,它們映射後的哈希值相等概率極小。

LSH 算法根據局部敏感哈希函數族將類似的數據映射到相同的桶(Bucket)。

LSH 注意力機制

如下圖 a 所示,傳統注意力機制需要計算 q 與 k 之間的所有相關性,但實際上真正起作用的注意力分配是非常稀疏的。對於圖 b 來說,Query 和 Key 會先通過哈希桶排序,相似的 q 與 k 會落在相同的桶內,因此直接在桶內執行注意力計算就能逼近完整的注意力機制。

然而圖 b 只是理想情況,真正用於注意力機制還有很多困難要克服,比如說,一個桶內包含很多 q 而沒有一個 k。為此,研究者對 b 執行了一系列轉換,並使排序後的注意力權重,來自相同桶的 q 和 v 都集中在對角線上,就如同圖 c 一樣。注意 c 圖中 Q=K,表示 Transformer 中的自注意力機制。

排好序後,d 圖就可以分成不同的批量,並完成並行計算。這樣不僅計算量與參數量大大減少,還能加速訓練。

最後,整個 LSH 注意力機制就如上左圖所示。對於自注意力機制,先根據 LSH 分成不同的桶,然後對桶排序並分割為不同的批量,這些批量能夠並行處理。最後只要在相同的桶內執行注意力機制就行了,整個過程會節省大量存儲與計算資源。

Talking-Heads Attention

近日,來自 Google 的研究團隊提出一種「交談注意力機制」(Talking-Heads Attention),在 softmax 操作前後引入對多頭注意力之間的線性映射,以此增加多個注意力機制間的信息交流。這樣的操作雖然增加了模型的計算複雜度,卻能夠在多項語言處理問題上取得更好的效果。

論文:Talking-Heads Attention論文地址:https://arxiv.org/abs/2003.02436einsum 表示法

作者在論文的偽代碼中使用大寫字母表示張量,而小寫字母表示其對應維度大小。同時作者在張量的計算中使用了 einsum 表示法,也就是愛因斯坦求和約定。它在 numpy、tensorflow、pytorch 等 Python 擴展庫中均有實現。使用 einsum 表示法能夠僅使用一個函數,就可以優雅地實現如點積、外積、轉置、矩陣-向量乘法、矩陣-矩陣乘法等運算。

einsum 解釋:https://rockt.github.io/2018/04/30/einsum

限於本文篇幅,有關 einsum 表示法的概念,感興趣的小夥伴可參考上面這篇博客。這裡舉個慄子,兩個矩陣的乘法運算使用 einsum 表示法可寫為:

Y[a, c] = einsum(X[a, b], W[b, c])

於是,前面介紹的多頭注意力機制使用 einsum 表示法可改寫為如下形式:

同時,einsum 表示法還支持大於兩個矩陣作為輸入的運算。於是,以上偽代碼可進一步精簡為如下極簡模式:

交談注意力機制

不同於多頭注意力機制,交談注意力機制在 softmax 運算的前後增加了兩個可學習的線性映射 P_l 與 P_w,這使得多個注意力 logit 和注意力 weight 彼此之間能夠相互傳遞信息。

於是,交談注意力機制出現了三個不同的維度:h_k、h 和 h_v,其中 h_k 表示 Query 和 Key 的注意力頭數量,h 表示 logit 和 weight 的注意力頭數量,h_v 則表示值的注意力頭數量。其對應偽代碼表示如下,注釋中標出了每個 einsum 運算所對應的計算量。

Talking-Head 是 Multi-Head 的延伸

當假設注意力機制的輸入與輸出維度相同時,可得到計算多頭注意力機制所需進行的標量乘法運算數目為:

h·(dk +dv)·(n·dX +m·dM +n·m)

而交談注意力機制所需的標量乘法運算數目為:

(dk ·hk +dv ·hv)·(n·dX +m·dM +n·m)+n·m·h·(hk +hv)

可以看到上式中第一項與多頭注意力機制的計算量類似,而第二項是由交談注意力中的線性映射導致的。假如 h<d_k 且 h<d_v,那麼交談注意力機制的線性映射計算量,將分別小於對應多頭注意力機制中的 n·m·dk ·hk 與 n·m·dv ·hv。

作者指出,由於交談注意力機制引入了額外的小尺寸張量運算,在實際運行過程中很可能導致速度比 Transformer 更慢。

最後,多頭注意力機制與交談注意力機制都可看作一種「通用雙線性多頭注意力機制」(GBMA, i.e. general bilinear multihead attention)的特殊形式。我們可以從以下偽代碼看出,GBMA 具有兩個三維的參數張量。

從以下偽代碼不難看出,多頭注意力機制在數學上等效於,使用兩個因子的乘積分別表示 GBMA 中的各參數張量。

而交談注意力機制在數學上等效於,使用三個因子的乘積分別表示 GBMA 中的各參數張量。

這裡的 GBMA 僅作為理論研究探討,由於其計算量較大可能並不具備實用性。

「注意力」這個想法真的非常優雅,所以 2020 年剩下的是,我們如何才能更高效地實現「注意力」?

相關焦點

  • einsum滿足你一切需要:深度學習中的愛因斯坦求和約定
    本文打算改變這一現狀,讓所有人都了解它!愛因斯坦求和約定(einsum)在numpy和TensorFlow之類的深度學習庫中都有實現,感謝Thomas Viehmann,最近PyTorch也實現了這一函數。關於einsum的背景知識,我推薦閱讀Olexa Bilaniuk的numpy的愛因斯坦求和約定以及Alex Riley的einsum基本指南。
  • 哈希算法現狀——原因、方法及未來
    新手在了解區塊鏈的時候經常會接觸到哈希(hash)和哈希算法(hashing algorithm)這樣的概念,它們在安全方面可以說是無處不在。通過P2P運行像比特幣,以太坊之類有眾多節點的去中心化網絡需要去信任機制和驗證的高效性。這就是說,這些系統需要想辦法將信息以一種高效而簡潔的方式編碼,並允許其參與者能夠安全而快速的進行驗證。
  • 什麼是哈希算法
    例如朋友給我傳遞一份數據,傳完之後,我有一份,他手裡也有一份,如果兩份數據的哈希值是一樣的,那麼這兩份數據的內容就是一樣的,或者說可以認為傳遞過程中數據沒有損壞,我手裡拿到的數據是完整的。這些算法可以分成普通哈希和加密哈希算法,兩種算法之間沒有特別明顯的區別。例如本來 MD5 就是設計出來做加密哈希的,但是後來由於計算機的發展 MD5 出現碰撞的可能性就很大了,所以目前 MD5 只能當普通哈希用,用來做數據校驗。
  • 五分鐘帶你了解哈希算法
    >其中一個初始哈希算法標準是MD5哈希,這是被廣泛用來進行文件整合驗證,而且存儲哈希密碼在網頁應用資料庫。哈希算法的多樣化和革新進入SHA3時代在2006年,國家標準和技術研究院提出了一個比賽,來找到SHA2的替代,這在本質上九不同,從而形成了標準。因此,SHA3作為現在所知的KECCAK哈希算法一部分,就這樣誕生了。
  • 關於哈希算法,必須了解這三點
    在2004年的國際密碼學大會上,王小雲教授介紹了對一系列哈希算法尋找實際碰撞的方法,並當場破解了包括MD4、MD5、HAVAL128算法在內的多種哈希算法。2005年,王小雲教授進一步優化了方案,對SHA0、SHA1算法也成功地給出了碰撞攻擊。
  • 圖解什麼是一致性哈希算法
    一致性,咱懂哈希算法,咱也懂一致性+哈希算法  什麼鬼?問題到這裡,基本上已經守得雲開見月明了,不過還是來看看1997年麻省理工發明的一致性哈希算法原理吧。5.2 Karger的一致性哈希算法一致性哈希算法在1997年由麻省理工學院的Karger等人在解決分布式Cache中提出的,設計目標是為了解決網際網路中的熱點(Hot spot)問題,初衷和CARP十分類似。
  • 一文搞懂負載均衡中的一致性哈希算法
    因為伺服器可能發生上下線,所以少數伺服器的變化不應該影響大多數的請求。這也呼應了算法名稱中的「一致性」。同時,一個優秀的負載均衡算法還有一個隱性要求:流量儘可能均勻分布。綜上所述,我們可以概括出一致性哈希負載均衡算法的設計思路。
  • 和你聊聊哈希算法
    和你聊聊哈希算法1.1 引言哈希算法又稱散列函數算法,是一種查找算法,應該說哈希算法是最快的查找算法,沒有之一。對於查找問題,哈希算法一直是首選算法。那麼,為什麼名字起的這麼「嘻哈」的算法會如此強大,本文將為你揭開謎底。
  • 什麼是一致性哈希算法
    這裡主要記錄一致性Hash算法如何將數據分配到各個機器中去。2,衡量一致性哈希算法好處的四個標準①平衡性。平衡性是指哈希的結果能夠儘可能分布到所有的緩衝中去,這樣可以使得所有的緩衝空間都得到利用。②單調性。
  • 理解數字籤名、加密通信的關鍵:哈希算法
    例如朋友給我傳遞一份數據,傳完之後,我有一份,他手裡也有一份,如果兩份數據的哈希值是一樣的,那麼這兩份數據的內容就是一樣的,或者說可以認為傳遞過程中數據沒有損壞,我手裡拿到的數據是完整的。  所以說,哈希函數的基本作用就是給大數據算出一個摘要性的長度固定的字符串,也就是所謂的哈希。哈希的作用主要是進行完整性校驗。
  • 哈希研究院:Proof of Space 杜絕浪費,共識機制的「大殺器」
    POW(工作量證明)共識算法比特幣實現了一種點對點的電子支付系統,而這一分布式系統的誕生,有賴於其採取的POW(工作量證明)共識算法。目前,絕大多數具備主鏈的區塊鏈項目,仍採用POW或改良後的POW共識算法,僅有一部分項目採用POS(權益證明)或DPOS(股權代理證明)等算法。
  • AITD小課堂第十二課:哈希算法是什麼?非對稱加密是什麼?
    哈希算法是什麼? 區塊鏈的四大核心技術分別是密碼學、分布式帳本、共識機制以及智能合約。而密碼學作為其中最重要的一部分,可以說是區塊鏈的基石,而其他技術是以密碼學為地基,才能搭建出區塊鏈這座高樓大廈。
  • 面試時遇到一致性哈希算法這樣回答會讓面試官眼前一亮
    面試中一致性哈希算法被問到的概率非常大,本文將從如下三個方面探探一致性哈希算法,讓大家輕鬆應對面試,並且說出與眾不同的答案。在分布緩存領域,對數據存在新增與查詢,即數據通過路由算法存儲在某一個節點後,查詢時需要儘量路由到同一個節點,否則會出現查詢未命中緩存的情況,這也是與分布式服務調用領域的負載算法一個不同點。
  • 一文讀懂哈希時間鎖的合約機制、改進方向與應用場景
    HTLC 應用瓶頸協議兼容性較低HTLC 實施需要滿足一些必要條件:一是用戶資產所在區塊鏈需要基於相同哈希算法(比如都使用比特幣的 SHA-256 哈希算法);二是區塊鏈需要兼容 HTLC 和其他可編程功能;三是交易雙方需要在同一區塊鏈上有交易帳戶
  • 10分鐘了解一致性哈希算法,全網(小區區域網)(建議收藏)
    由美國密碼學家 Ronald Linn Rivest設計,於1992年公開並在 RFC 1321 中被加以規範。CRC算法循環冗餘校驗(Cyclic Redundancy Check)是一種根據網絡數據包或電腦文件等數據,產生簡短固定位數校驗碼的一種散列函數,由 W. Wesley Peterson 於1961年發表。
  • Hash(哈希)算法科普
    單向散列函數算法也稱Hash(哈希)算法,是一種將任意長度的消息壓縮到某一固定長度(消息摘要)的函數(該過程不可逆)。
  • 哈希革新Transformer:ICLR高分論文讓一塊GPU處理64K長度序列
    局部敏感哈希注意力(LSH Attention)Transformer 中的多頭注意力層是造成內存佔用大的主要原因,因此研究者從這裡入手解決問題。首先回顧一下點乘注意力機制,如下所示:在多頭注意力中,多個注意力層平行計算併疊加。每個注意力層會線性地投影 queries、keys 和 values h 次。在計算中可以發現,這種注意力機制帶來的內存佔用是很大的。
  • Comunion 區塊鏈深度學習系列|哈希算法的應用
    此時可以把這7個數據看成一個整體,前面6個數據是X,把X放在哈希函數裡面,會出來一個值,比如說Y值。由於比特幣網絡裡使用的哈希算法是SHA-256,當Y值出來之後,就會得到一個256個由0和1組成的字符串。這個字符串出來之後,它會和X裡面的難度值比較大小。
  • 科普 | 哈希函數的過去、現在與未來
    SHA3 興起在 2006 年,美國國家標準技術研究所(NIST)舉辦了一場競賽,旨在找到一個本質上不同於 SHA2 的替代標準。因此,SHA3 應運而生,它是 KECCAK 哈希算法的一種方案。雖然 SHA 3 在名稱上與 SHA1 和 SHA2 一脈相承,但是在本質上差異很大,因為它採用了一種名為海綿結構(sponge construct)的機制。該機制使用隨機排列來吸收並輸出數據,同時為將來用於哈希算法的輸入值提供隨機性。- KECCAK256 海綿結構是如何進行輸入操作的 -SHA3 的內部狀態相較於輸出值擁有更多信息,突破了以往算法的局限性。
  • 區塊鏈的三個「天然缺陷」|區塊鏈技術|算法|程式語言|哈希_網易科技
    以Go為例,創建時間是2009年,距今只有10年,其「錯誤處理機制」、「垃圾回收器」與「編譯器」等邏輯功能,還需要逐步完善,才能滿足未來區塊鏈開發需要。同時,朱嘉明還認為:現有的計算機語言正在面臨與其它新技術的融合,進而影響區塊鏈的技術體系。例如,人工智慧技術和計算機語言的融合,很可能引發計算機語言系統的變革。