Reformer: 使用記憶體高效的 Transformer 推展語言建模的極限
總覽
Reformer 模型在處理長序列時解決了標準 Transformer 的記憶體瓶頸。通過重新設計自注意力、前饋層、殘差連接和位置編碼,它能在低於 8 GB RAM 的情況下訓練多達 500 000 個 token,遠超過 BERT 等模型的 512‑token 限制。
Reformer 自注意力層
Reformer 用兩種記憶體高效的替代方案取代全域自注意力:局部自注意力和 LSH 自注意力。
局部自注意力
局部自注意力將輸入分割成長度為 config.local_chunk_length 的塊,並在每個塊內應用全域自注意力。透過添加重疊 (config.local_num_chunks_before 和 config.local_num_chunks_after),每個 token 只能關注鄰近塊的有限上下文,將二次記憶體成本降低至 O(n × chunk_length)。僅此一點對於需要長距離依賴的任務仍然不足。
LSH 自注意力
LSH 自注意力透過局部敏感哈希將查詢(和鍵)向量雜湊到桶中來近似全域注意力。雜湊到同一桶的向量被視為相似,因此自注意力僅在每個桶內計算。經過置換的輸入接著被分塊(帶重疊)並進行注意力計算,使得遠距 token 的資訊能夠混合,同時保持記憶體使用量為 O(n × hashes × chunk_length)。多個哈希輪次 (config.num_hashes) 可以結合以提高準確度。
基準測試
對 google/reformer-enwik8 模型進行基準測試顯示記憶體節省:
- 使用全域自注意力(塊長度設為 8192)時,模型在約 16 K token 時超過 GPU 記憶體。
- 使用預設的局部 + LSH 自注意力,相同模型在 11 GB GPU 上可運行至約 16 K token 才發生記憶體不足,證明了隨序列長度增長時記憶體消耗的增長速率被降低。
分塊前饋層
寬闊 Transformer 中的大型前饋中間矩陣佔據了主要記憶體。Reformer 引入分塊前饋層,其中線性層以大小為 config.chunk_size_feed_forward 的小塊進行處理。這避免了存儲完整的中間張量,用額外的計算換取較低的記憶體使用。
基準測試
當前饋大小被放大(例如,至 16384)且注意力頭數被減少時,啟用分塊 (chunk_size_feed_forward=1) 會使峰值記憶體從約 9 GB 降至約 6 GB,序列長度為 4096、批次大小為 8,證明了在前饋層為瓶頸的模型中此方法的好處。
可逆殘差層
訓練標準 Transformer 時會儲存所有中間激活值,導致記憶體隨深度線性增長。Reformer 使用可逆殘差層,使得激活值能在反向傳播過程中重新計算,而不需要被保存。僅需保留最終層的輸出,使得每層的記憶體開銷從數百兆位元組降至低於 100 MB。
基準測試
在序列長度 512、批次大小為 8 的情況下,比較 BERT 與 Reformer 在不同層數(4、8、12)時的記憶體使用:
- BERT‑12‑Layers:約 7.4 GB
- Reformer‑12‑Layers:約 5.4 GB 因此 Reformer 每層增加的記憶體遠少,使得在相同硬體限制下能夠構建更深的模型。
軸向位置編碼
標準位置嵌入會隨著最大序列長度線性增長,對於非常長的輸入變得難以承受(例如,0.5 M token 需要約 2 GB)。軸向位置編碼將位置空間分解為兩個較小的維度 (config.axial_pos_shape),並拆分隱藏大小 (config.axial_pos_embds_dim)。得到的嵌入表大小為 shape[0]×dim[0] + shape[1]×dim[1],而非 max_len×hidden_size。
基準測試
對於 google/reformer-crime-and-punishment 模型(能處理 0.5 M token,隱藏大小 256):
- 預設位置嵌入:524 288 × 256 參數(約 136 M)。
- 軸向位置嵌入,形狀為 (512、1024) 且維度為 (64、192):約 2.6 M 參數。 在批次大小 8、序列長度 512 的推理階段,記憶體使用從約 959 MB 下降至約 447 MB,說明了顯著的減少。
意義
透過結合這四種機制,Reformer 使得在不需要專門硬體的情況下,訓練非常長的文檔(如完整書籍或程式碼庫)上的語言模型變得可行。這擴展了可受益於全上下文理解的 NLP 任務範圍,包括長距離摘要、在大型語料庫上的問答以及建模依賴跨越數十萬 token 的序列資料。
{"summary": "Reformer 模型由 Hugging Face 在 2020 年 7 月推出,透過結合 LSH 自注意力、局部自注意力、分塊前饋層、可逆殘差和軸向位置編碼,使得在少於 8 GB RAM 的情況下可訓練長度達到五十萬個 token 的序列。"} {"title": "Reformer: 使用記憶體高效的 Transformer 推展語言建模的極限"}