如何降低視覺Transformer運算成本?時間冗餘方法讓人大吃一驚

在為語言領域帶來變革之後,Transformer 正進入視覺領域,但其也有著高運算成本的問題。近日,威斯康辛大學麥迪遜分校一個研究團隊提出了Eventful Transformer,可透過在視覺Transformer 中利用時間冗餘來節省成本。

圖片來源:由無界AI生成

Transformer 一開始是為自然語言處理任務設計的,但現在卻被廣泛用於視覺任務。視覺Transformer 在一系列視覺辨識任務上實現了出色的準確度,並在影像分類、影片分類和目標偵測等任務上取得了目前最優的表現。

視覺Transformer 的一大缺點是運算成本高。典型的捲積網路(CNN)處理每張影像需要數十GFlops,而視覺Transformer 所需的往往會多上一個數量級,達到每張影像數百GFlops。在處理影片時,由於資料量龐大,這個問題更為嚴重。高昂的運算成本讓視覺Transformer 難以部署到資源有限或有嚴格延遲需求的裝置上,這就限制了這項技術的應用場景,否則我們已經有一些令人興奮的應用了。

在近期一篇論文中,威斯康辛大學麥迪遜分校的三位研究者Matthew Dutson、Yin Li 和Mohit Gupta 首先提出可以在後續輸入之間使用時間冗餘來降低視覺Transformer 在視訊應用中的成本。他們也發布了模型程式碼,其中包含用於建立Eventful Transformer 的PyTorch 模組。

* 論文地址:

  • 項目地址:

時間冗餘:首先假設有一個視覺Transformer,其可以逐幀或逐視頻片段地處理視訊序列。這個Transformer 可能是簡單的逐幀處理的模型(如目標偵測器)或是某個時空模型的中間步驟(如ViViT 的分解式模型的第一步)。不同於一個輸入就是一個完整序列的語言處理Transformer,在這裡,研究者的做法是隨時間為Transformer 提供多個不同的輸入(幀或視訊片段)。

自然视频包含显著的时间冗余,即后续帧之间的差异很小。尽管如此,包括 Transformer 在内的深度网络通常都会「从头开始」计算每一帧。该方法会丢弃之前推理获得的潜在相关信息,浪费极大。故而这三位研究者设想:是否可以复用之前计算步骤的中间计算结果来提升处理冗余序列的效率?

自適應推理:對於視覺Transformer 以及一般意義上的深度網路而言,推理成本通常由架構決定。然而在現實應用中,可用的資源可能會隨時間而變化,例如可能因為存在相競爭的進程或電源變化。如此一來,可能就存在運行時修改模型計算成本的需求。在這項新成果中,研究者設定的一大主要設計目標便是適應性- 其方法可實現對計算成本的即時控制。下圖1(底部)給出了在視訊處理過程中修改計算預算的範例。

Eventful Transformer:本文提出了Eventful Transformer,這類Transformer 能利用輸入之間的時間冗餘來實現高效且自適應的推理。 Eventful 這個術語的靈感來自事件相機(event camera),這種感測器在場景變化時離散地記錄影像。 Eventful Transformer 會追蹤隨時間發生的token 層面的變化情況,並在每個時間步驟有選擇性地更新token 表徵和自註意力映射圖。 Eventful Transformer 的模組包含一種門控模組,用於控制運行時間被更新token 的數量。

此方法可用於現成的模型(通常無需再訓練)並且與許多視訊處理任務相容。研究者也進行了實驗論證,結果顯示Eventful Transformer 可用於現有的當前最佳模型,在極大降低它們的計算成本的同時也能維持其原有的準確度。

多事變壓器

這項研究的目標加速用於視頻識別的視覺Transformer。在這個場景中,視覺Transformer 需要反覆處理視訊畫面或影片片段,具體的任務包括影片目標偵測和影片動作辨識等。這裡提出的關鍵想法是利用時間冗餘,即重複使用之前時間步驟的計算結果。以下將詳細描述如何透過修改Transformer 模組來使其具備感知時間冗餘的能力。

token 門控:偵測冗餘

這一小節將介紹研究者提出的兩種新模組:token 閘和token 緩衝器。這些模組讓模型可以識別和更新自上次更新後有明顯變化的token。

閘模組:該閘會從輸入token N 中選擇一部分M 傳送給下下層執行計算。其記憶中維護著一個參考token 集,記為u。這種參照向量包含每個token 在其最近一次更新時的值。在每個時間步驟,比較各個token 與其對應的參考值,其中與參考值相差較大的token 獲得更新。

現在將該閘的目前輸入記為c。在每個時間步驟,依照下列流程更新閘的狀態並決定其輸出(見下圖2):

1. 計算總誤差e = u − c。

  1. 對誤差e 使用一個選取策略。選擇策略傳回一個二元掩碼m(相當於一個token 索引清單),表示其中哪M 個token 應該被更新。

  2. 提取出上述策略所選取的token。圖2 中將其描述為乘積c×m;在實務上則是透過沿著c 的第一個軸執行「gather」操作來實現。這裡將收集到的token 記為

,這就是該閘的輸出。

  1. 將參考token 更新成所選token。圖2 將這個過程描述為

;實務上所使用的操作則是“scatter”。在第一個時間步驟,門會更新所有token(初始化u ← c 並返回c˜ = c)。

緩衝器模組:緩衝模組維護著一個狀態張量

,其追蹤的是每個輸入token

時,此緩衝器將來自f (c˜) 的token 分散到其在b 中對應位置。然後它會傳回更新後的b 作為其輸出,請參見下圖3。

研究者將每個門與其後的緩衝器組成一對。這裡給出一個簡單的使用模式:閘的輸出

傳遞給一系列針對各個token 的運算f (c˜);然後將得到的張量

傳遞給一個緩衝器,將恢復完整的形狀。

建構可感知冗餘的Transformer

為了利用上述時間冗餘,研究者提出了Transformer 模組的修改方案。下圖4 展示了Eventful Transformer 模組的設計。此方法可以加速針對各個token 的運算(如MLP)以及查詢- 鍵值和注意力- 值乘法。

在針對各個token 的運算Transformer 模組中,許多運算都是針對各個token 的,也就是說它們不涉及到token 之間的資訊交換,其中包括MLP 和MSA 中的線性變換。為了節省計算成本,研究者表示可以跳過未被閘選取的token 的面向token 的運算。由於token 之間的獨立性,這不會改變對所選token 的運算結果。參見圖3。

具體來說,針對各個token 的運算(包括W_qkv 變換、W_p 變換和MLP)的連續序列,研究者使用了一對門- 緩衝器。請注意,他們還在skip 連接之前添加了緩衝器以確保兩個加法操作數的token 是正確對齊的。

針對各個token 的運算的成本正比於token 的數量。門可將這個數量從N 降至M,也就將下游的針對各個token 的運算的計算成本降低了N/M 倍。

查詢- 鍵值的積:現在來看看查詢- 鍵值積B = qk^T。

下圖5 展示了稀疏地更新查詢- 鍵值積B 中一部分元素的方法。

這些更新的總體成本為2NMD,相較而言,從頭開始計算B 的成本為N^2D。注意,新方法的成本正比於M,即門選取的token 的數量。當M < N/2 時(此時更新的token 不到總量一半),可節省計算量。

注意力- 值的積:研究者為此提出了一種基於增量∆ 的更新策略。

下圖6 展示了新提出的高效計算三個增量項的方法。

同樣當M < N/2 時,可節省計算量。

token 選取政策

Eventful Transformer 的一大重要設計是其token 選取策略。給定一個閘誤差張量e,這樣一個策略的目標是產生一個遮罩m,其中指示了應當被更新的token。具體的策略包括:

Top-r 策略:此策略選取r 個誤差e 有最大範數的token(這裡使用的是L2 範數)。

閾值策略:此策略選取誤差e 的範數超過一個閾值h 的所有token。

其它策略:更複雜精細的token 選取策略可實現更好的準確度- 成本權衡,例如可以使用一個輕量級策略網路來學習一個策略。但是,訓練策略的決策機制的難度可能很大,因為二元掩碼m 一般是不可微分的。另一個想法是使用重要度分數作為選取的參考資訊。但這些想法都還有待未來研究。

實驗

研究者用實驗評估了新提出的方法,具體使用的任務是視訊目標偵測和視訊動作辨識。

下图 7 展示了视频目标检测的实验结果。其中正轴是计算节省率,负轴是新方法的 mAP50 分数的相对减少量。可以看到,新方法用少量的准确度牺牲换来了显著的计算量节省。

下圖8 給出了在視訊目標檢測任務上的方法比較和消融實驗結果。

下圖9 給出了影片動作辨識的實驗結果。

下表2 給出了在一台CPU(Xeon Silver 4214, 2.2 GHz)和一台GPU(NVIDIA RTX3090)上運行時間(毫秒)結果,可以看到時間冗餘在GPU 上帶來的速度提升可達1.74 倍,在CPU 上帶來的提升可達2.47 倍。

查看原文
此頁面可能包含第三方內容,僅供參考(非陳述或保證),不應被視為 Gate 認可其觀點表述,也不得被視為財務或專業建議。詳見聲明
  • 讚賞
  • 留言
  • 分享
留言
0/400
暫無留言
交易,隨時隨地
qrCode
掃碼下載 Gate APP
社群列表
繁體中文
  • 简体中文
  • English
  • Tiếng Việt
  • 繁體中文
  • Español
  • Русский
  • Français (Afrique)
  • Português (Portugal)
  • Bahasa Indonesia
  • 日本語
  • بالعربية
  • Українська
  • Português (Brasil)