機器之心原創,作者:邱陸陸。
今年 1 月,谷歌人工智慧負責人 Jeff Dean(當時還是谷歌大腦負責人)與 2017 年圖靈獎得主、體系結構巨擘 David Patterson(當時獲獎結果尚未公佈)聯合發表了題為《計算機體系結構黃金時代:賦能機器學習革命》的文章。文章指出,機器學習演算法正在革命性地著手解決人類社會最為巨大的一些挑戰,因此,不難想象,在不遠的將來,無論是資料中心還是終端裝置,都將會出現專用於機器學習計算的硬體。這樣的硬體會具有什麼特性?在文章中,作者列出了一系列硬體設計者需要考慮到的關鍵問題,這些問題對深度學習研究者也十分具有啟發性。
另一方面,在摩爾定律逐漸失效和深度學習的算力需求如無底洞般膨脹的今天,深度學習研究者們也在思考:能否改進演算法以使其更適應計算硬體?能否幫助優化系統配置?在近日舉行的首屆「清華-谷歌 AI 學術研討會」上,Jeff Dean 談了談「接下來我們希望設計什麼樣的模型」,來自谷歌大腦的研究員 Azalia Mirhoseini 則給出了主題演講「如何用強化學習方法進行系統優化」。
如果將這幾份工作聯絡起來,我們似乎就能看出,在深度學習這個 Arxiv 論文增速超越摩爾定律的領域裡,谷歌大腦的研究者們如何同時思考軟硬體問題以實現系統最佳效能與最佳效率。
在《黃金時代》論文裡,Jeff 和 David 以谷歌開發的兩代機器學習 ASIC(用於加速推理的 TPUv1 和用於加速訓練的 TPUv2)為例,介紹了很多設計專用硬體的思路。進行硬體設計要著眼於至少 5 年後的模型:現在開始一款 ASIC 的設計,它大約可以在 2 年後投入使用,而一款專用硬體至少需要能夠保持 3 年的競爭力才有價值。那麼在這樣的前提下,設計深度學習專用硬體要考慮哪些問題?在文章中,作者列出了六個這樣的關鍵點,按照從「純架構相關」到「純機器學習演算法相關」的順序,分別是:訓練、批規模、稀疏性與嵌入、引數量化與提煉、帶有軟記憶機制的神經網路以及元學習。
訓練
谷歌從 2013 年開始設計的第一代 TPU 是針對推理而非訓練工作設計的,一定程度上是為訓練設計硬體架構要更加困難:
- 第一,訓練的運算量是推理的 3 倍以上。
- 第二,因為要將全部啟用值儲存以進行反向傳播,訓練過程所需的儲存也遠比推理高。
- 最後,訓練的可擴充套件性遠不如推理,因為需要進行大量昂貴的序列計算。
但是,為訓練設計 ASIC 是有價值的,因為研究者的時間是寶貴的而耐心是有限的,如果一次實驗需要跑 30 天甚至更長,大概大多數人會選擇放棄探索這個方向。
第二代 TPU 就面向訓練開發。Jeff 在多次演講中提到了一些 TPU v2 的成功應用案例,包括用四分之一個 pod 把谷歌的搜尋排序模型的訓練提速到 14.2 倍,把處理圖片的模型訓練提速到 9.8 倍等。
而且,TPUv2 具有幾乎是線性的擴充套件性,64 塊 TPU 可以組成一個 TPU pod,提供最高 11.5 PFLOPS 的算力。用一塊 TPUv2 把 ResNet-50 訓練到 76% 準確度需要 1402 分鐘,用二分之一個 pod(32 塊 TPUv2)只需要 45 分鐘(31.2 倍速)。
雖然 TPU 雲價格不菲,但時間就是生命,生命就是金錢。另外,如果你是一位有志於機器學習研究並致力於開源自己的工作,谷歌正以 TensorFlow 研究雲的形式向研究者免費提供一千塊 TPU。
批規模(batch size)
批量是越大越好還是越小越好?這是一個在研究上仍然有爭議的問題。
直覺上,理想選擇是帶有動量的批規模為 1 的隨機梯度下降(SGD with momentum at a minibatch size of 1),這時單位計算量帶來的準確率提升最大。另外選擇一個大於 1 的批規模相當於把輸入維度直接提升了一維(Jeff 原話:一想到這兒我就頭痛。)然而在當前用於訓練的硬體中,以 GPU 為例,它執行程式時的基本單元,即每個 warp 包含 32 個執行緒(threads),因此如果你的批規模不是 32 的整數倍,將會導致效率降低,所以現行的模型通常都採用 32 或者 64 作為批規模。
但是,從 2017 年開始,有一些看起來前景明朗的研究顯示,我們可以用 8192 甚至 32768 作為批規模來高效訓練用於影像的卷積神經網路。
source:Accurate, Large Minibatch SGD: Training ImageNet in 1 Hour (1706.02677)
值得一提的是,Yann LeCun 對於增加批量持有強烈反對態度,他曾經在今年 4 月份轉發一篇支援小批量的論文稱,「用巨型批量做訓練有害健康……選擇 32 而不是 1 做批量只能說明我們的硬體很差勁。」
哦,8192 那篇論文是 Facebook 的工作,作者列表裡包括 Ross Girshick,賈揚清,還有何愷明……
稀疏性與嵌入(Sparsity and Embeddings)
「我們想要更大的模型,但希望每一個樣本只啟用它的一小部分。」又是一個 Jeff 反覆提到的趨勢。
大模型是好的,因為巨大的引數量意味著我們可以記住資料集方方面面的特性。但是如果我們在處理每一個資料的時候都需要啟用整個模型,這意味著巨大的計算成本。因此,最理想的狀態是擁有一個可以分割成眾多獨立的小部分的龐大模型,每一部分都承擔不同分工,當資料進入模型時,模型按任務需求啟用少數幾個部,讓大部分保持閒置狀態。這樣的特性又可以稱作「粗粒度稀疏性」。
谷歌在 ICLR2017 的一篇論文上就提出了一個叫做混合專家層(MoE)的概念。每一個「專家」相當於神經網路中的一小撮引數,只不過比普通神經網路裡的引數更容易訓練,而一層由超過 2000 個專家組成。
訓練過程中,除了學習模型引數,還要學習如何做路由選擇(routing),即如何根據一個樣本選擇啟用的「專家」。在語言任務裡,模型學會了如何根據語境選擇「專家」:專家 381 擅長談論科學研究,專家 752 擅長「領導力」,如果涉及速度,那就交給專家 2004 吧。
在英-法翻譯任務裡,相比於之前的 STOA 模型 GNMT,模型的規模上升了 35 倍,卻可以用更少的 GPU 在六分之一的訓練時間內完成。
相比於 MoE,應用更為廣泛的動態路由的案例是嵌入機制。無論是將單詞從數萬維的獨熱向量對映到幾百維的詞嵌入,還是給每一個 YouTube 視訊賦予一個數千維的、能夠捕捉它與其他視訊間關係的表徵,都是一個需要為了一個樣本,從龐大的資料結構(可能高達數百 G)中隨機地讀取非常少的資料(數十或數百位元組,不到 1KB)。
現有硬體結構裡還鮮有專門處理動態路由選擇的高效讀取的解決方案。
引數量化與提煉(Quantization and Distillation)
稀疏性和嵌入的共同點是保留「大模型」,而關注如何能精確定位到其中的「小部分」。引數量化與提煉則直接追求「小模型」。
引數量化的是低精度運算的另一種說法。
現在常見的做法是,在訓練階段採用浮點數,而在推理中採用定點數。例如在 TPU 的例子中,所有的推理只採用 8 位元定點數表達。其實現原理是在完成訓練後,根據各層的引數和啟用部分的最大值和最小值,找到表達其整數部分所需的最小位元數,用此表示,然後用 8 位元中剩下的部分表示其小數點後部分。實證研究顯示,將精度從 32 位元降低到 8 位元,只會少量影響 GoogLeNet 和 VGG-16 的表現,但是如果繼續下降到 6 位元,模型效果就會受到顯著影響。
文中提到,只有很少的研究關注瞭如何在訓練階段採用低精度運算,大多數結果都仍然集中在 MNIST,CIFAR-10 等小資料集上。不過低精度訓練也在逐漸獲得更多關注,ICLR2018 上,百度和英偉達提出了「混合精度訓練法」,在前向、後向計算中使用 FP16 運算,在權重更新時使用 FP32 計算,在 ImageNet 上的分類任務、Pascal VOC 2007 上的檢測任務、WMT15 上的翻譯任務等多個大型資料集的任務中,達到了使用 FP32 所獲得的準確率,同時節省了算力需求和近半的儲存需求。如今,英偉達已經給出了用混合精度進行訓練的 SDK 範例。
提煉方法是 Hinton 在 NIPS2014 上提出的,試圖以先讓複雜模型進行學習分類問題,然後將最後一層 softmax 學到的軟分類視為知識,訓練簡單模型以預測軟分類。這樣的方法得到的簡單模型(層數更少、每層神經元更少)也能達到複雜模型同樣的準確度。提煉方法讓人們思考,是否能夠直接訓練小模型。小模型和大模型需要的專用硬體特性會截然不同,因此模型的發展方向也是硬體發展方向的重要影像因素。
帶有軟記憶機制的神經網路(Networks with Soft Memory)
這一部分強調的是一些對儲存和儲存訪問有特殊需求的深度學習技巧,例如注意力機制。傳統的記憶機制每次只要訪問儲存資料的表中的一個值,但是以注意力機制為代表的軟記憶機制則需要對錶內的所有值進行加權平均。
相比於特定運算的加速,當前問世的或已經進入開發週期後段的深度學習 ASIC 更強調資料流與儲存的優化。原 Movidius CEO Remi El-Ouazzane 在談論其視覺處理單元 VPU 的設計理念時提到,VPU 中的幾乎所有架構設計都是為了同一個目標:優化資料流。在當前的終端深度學習計算中,用於資料傳輸的能量消耗是用於計算的 10 倍乃至更多,因此要使效能最大化並將功耗降至最低,唯一的方法就是增加資料的本地性,減少外部記憶體訪問次數。致力於加速訓練的 Intel Nervana NNP 的邏輯也是這樣。
FPGA 的邏輯也是如此。大量的引腳和可以根據演算法定製資料通路(datapath)的邏輯單元,讓它不需要像 GPU 一樣需要反覆調取片外儲存中的資料,理想狀態時,只要資料一次性流進去再流出來,演算法就完成了。
元學習(Learning to Learn, L2L)
深度學習相比於機器學習的「進步」,就是將人工選擇的固定特徵提取過程變成了機器選擇的可訓練特徵提取過程。研究者只需要選擇一系列基本模型結構和超引數,就可以由機器接手,進行特徵提取和分佈擬合。
在上述的五個部分裡,無論模型採用什麼結構、技巧,作出這些決策都仍然是人類的工作。而在元學習的設想裡,人類的決策工作進一步被大量的計算和機器自動完成的實驗所替代。
在自動機器學習技術的種種方法中,谷歌選擇了強化學習的方法。模型的準確度被視為「獎勵訊號」。在獲得了 ICLR2017 最佳論文的《用強化學習進行神經網路結構搜尋》中,谷歌的研究員分別為 CIFAR-10 和 PTB 資料集搜尋到了最佳的 CNN 和 LSTM RNN 結構。
而事實上不只是模型結構,「用強化學習進行元學習」的思路適用於深度學習的方方面面:選擇輸入資料預處理路徑,選擇啟用函式、選擇優化與更新策略,以及,選擇硬體配置。
本次谷歌大腦研究員 Azalia 的演講就是以優化硬體配置為主題。傳統的硬體配置多數以貪婪啟發式方法為基礎,需要工程師對硬體的方方面面,從算力到頻寬,都有深刻的理解。而即便如此,隨著模型越來越大,使用的裝置越來越多,得到的配置方案也越來越難具有可泛化性。
因此,將一種特定配置的收斂時間的期望作為獎勵訊號來將各運算分配到不同裝置上,就變成了一個有吸引力的解決方案。演算法學到了並不符合人類直覺的配置,但比專家設計出來的方案快 27.8%,節約近 65 個小時。
元學習指向的道路是讓我們更高效地利用大規模的計算資源,同時「節省」機器學習專家的勞動力。除此之外,在這個深度學習演算法和計算裝置都在快速更新迭代的時期,元學習也奠定了快速進行軟硬體結合的系統設計的基礎。
將所有這些願景綜合起來,深度學習下一個階段會以何種形式出現?
Jeff 在演講中概括為:
- 只是稀疏地啟用的更為龐大的模型。
- 能夠解決多個任務的單一模型。
- 在龐大的模型中動態地學習新路徑,並不斷增加新路徑。
- 專用於進行機器學習超算的硬體
- 高效地配置在硬體上的機器學習模型。
你的研究思路是否有助於其中一個目標的實現?又是否將從這樣的模型中獲益?
無論答案是什麼,確定的一件事情是:研究者、工程師、體系結構設計者,在當下,想要朝通用人工智慧進攻的道路上前行,這些身份,一個都不能少。