OpenAI的研究人員們近日發布了一個高度優化的 GPU 計算內核,它可以支持一種幾乎沒被人們探索過的神經網絡架構:帶有稀疏塊權重的網絡。取決于不同的稀疏程度,這些內核的運行速度可以比 cuBLAS 或者 cuSPARSE 快一個數量級。OpenAI的研究人員們已經通過這些內核在文本情感分析和文本圖像的生成中得到了頂尖的成果。
在深度學習領域,模型架構和算法的開發很大程度上受制于GPU對基礎計算操作的支持到什么程度。具體來說,其中有一個問題就是通過 GPU 實現稀疏線性操作時計算效率太低。OpenAI這次發布的計算內核就是為了支持這個的,同時也包含一些實現的多種稀疏模式的初期成果。這些成果已經展示出了一些潛力,不過還算不上是決定性的證據。OpenAI的研究人員們也邀請更多深度學習領域的研究人員一起參與,攜手繼續改進這個計算內核,讓更多的計算架構變得可能。
密集連接的層(左側)可以用稀疏的、更寬的層(中間)或者稀疏的、更深的層(右側)替代,而計算時間幾乎不變
稀疏權重矩陣與密集權重矩陣有明顯的不同,就是其中的很多值都是零。稀疏權重矩陣是許多模型所向往的基礎部件,因為有稀疏的塊參與的矩陣乘法和卷積操作的計算成本只是和塊中非零數字的數目成比例而已。稀疏性的一個明顯的好處,就是在給定的參數數目和計算資源限制下可以訓練比別的方法寬得多、深得多的神經網絡,比如實現帶有上萬個隱層神經元的LSTM網絡(當下能訓練的LSTM只有上千個隱層神經元而已)。
計算內核
密集權重矩陣(左)、稀疏塊權重矩陣(中)的示意圖。白色的區域意味著權重矩陣中對應的位置是0
這個計算內核可以讓全連接和卷積層高效地利用稀疏塊權重。對于卷積層來說,這個內核的輸入和輸出特征維度都可以是稀疏的;而空間維度中的連接性不受到任何影響。稀疏性的定義是在塊的級別上定義的(如上右圖),而且為大小為 8x8、16x16、32x32 的塊做了優化(在這里展示的就是 8x8 的塊)。在塊的級別上,稀疏模式是完全可以自己配置的。由于這個內核在計算時會直接跳過值為 0 的塊,所以消耗的計算資源就只和非零的權重的數目成正比,而不是像以往一樣和輸出/輸出特征的數目成正比。存儲這些參數的開銷同樣和非零的權重的數目成正比。
與 cuBLAS 相比,這個內核在不同稀疏比例下的加速倍數。測試條件:很寬的神經網絡(12288 個隱層神經元),塊大小為 32x32,mini-batch 大小為 32;測試硬件為 NVIDIATitanXPascalGPU,CUDA 版本為 8.0。在測試的這些稀疏比例下,相比 cuSPARSE 的速度提升比例還要高一些。
應用這個計算內核
OpenAI 的研究人員們也展示了一些在TensorFlow中進行稀疏矩陣乘法的示例代碼
importtensorflowastf
importnumpyasnp
hidden_size =4096
block_size =32
minibatch_size =64
# Create a (random) sparsity pattern
sparsity = np.random.randint(2, size=(hidden_size//block_size,hidden_size//block_size))
# Initialize the sparse matrix multiplication object
bsmm = BlocksparseMatMul(sparsity, block_size=block_size)
# Input to graph
x = tf.placeholder(tf.float32, shape=[None, hidden_size])
# Initialize block-sparse weights
w = tf.get_variable("w", bsmm.w_shape, dtype=tf.float32)
# Block-sparse matrix multiplication
y = bsmm(x, w)
# Run
sess = tf.InteractiveSession()
sess.run(tf.global_variables_initializer())
result = sess.run([y], feed_dict = {x: np.ones((minibatch_size,hidden_size), dtype='float32')})
print(result)
微縮 LSTM
稀疏塊內核有一種非常有意思的用途,就是用來創建微縮神經網絡。微縮圖之間可以進行連接,圖中的任意兩個節點都只需要很少的幾個步驟就可以連接起來,即便整張圖有數十億個節點也可以。OpenAI的研究人員們想要實現這樣的微縮連接性的原因是,即便網絡是高度稀疏的,他們仍然希望信息可以在整張圖中快速傳播。人類大腦就顯示出了微縮連接模式,從而也帶來了「如果LSTM有同樣的特性,它的表現能否有所提高」的問題。通過微縮稀疏連接性的應用,OpenAI 的研究人員們高效地訓練了帶有大約 2 萬個隱層神經元的 LSTM 模型,同時網絡的寬度也要比參數總數目類似的網絡寬 5 倍。訓練后的網絡在文本生成建模、半監督情感分類上都有更好的表現。
在微縮圖中,即便稀疏程度很高的情況下節點之間也只需要很少的步數就可以互相連接。上面動圖里顯示的是從二維 Watts-Strogatz 微縮圖中,中央的節點(像素)向外激活的情況;另外為了更好的觀感做了隨機的平滑。在這張圖中,不同節點之間路徑長度的平均值小于5,和OpenAI研究員們的LSTM實驗中Barabasi-Albert圖的狀況類似。
情感表征學習
OpenAI的研究人員們訓練了參數數目差不多的稀疏塊權重網絡和密集權重矩陣網絡,對比它們的表現。稀疏模型在所有的情感數據集上都取得了更好的表現。在IMDB數據集上,OpenAI的這個稀疏模型把此前最好的 5.91%錯誤率大幅降低到了 5.01%。相比OpenAI此前一些實驗中只在短句上有好的表現,這次在長句中也顯示出了有潛力的結果。
基于生成式密集和稀疏模型提取的特征訓練的線性模型的情感分類結果。這里的密集和稀疏模型有幾乎相等的參數數目。
壓縮任務的表現
借助稀疏的、更寬的LSTM模型,比特數每字符的壓縮結果在實驗中從 1.059進步到了 1.048,同樣是在具有差不多的參數數目的模型上達到的。帶有稀疏塊的線性層架構如果換成密集連接的線性層,這個結果也可以得到進一步的提高。OpenAI的研究人員們在用于CIFAR-10的PixelCNN++模型上做了一個簡單的修改,把正常的 2D卷積核換成了稀疏核,同時把網絡變得更深的同時保持其它的超參數不變。修改之后的網絡也把比特數每維度的數值從 2.92降低到了 2.90,達到了這個數據集上的最好結果。
未來研究方向
神經網絡中的多數權重在訓練結束后都可以剪枝。如果讓剪枝動作配合此次的稀疏內核使用,那推理時能節省多少計算時間、提高多少計算速度呢?
在生物大腦中,網絡的稀疏結構有一部分是在成長時確定的(成長的另一個作用是改變連接強度)。人造神經網絡中是否也能有類似的做法呢,就是不僅通過梯度學習連接權重,同時還學習最優的稀疏結構?近期有一篇論文就提出了一種學習稀疏塊RNN的方法,OpenAI最近也提出了一個算法用來在神經網絡中做L0規范化,兩者都可以在這個方向上起到作用。
OpenAI的研究人員們這次訓練了帶有上萬個隱層神經元的LSTM模型,帶來了更好的文本建模表現。那么更廣泛地說,帶有很大的權重矩陣的模型如果用了稀疏層,就可以保持與更小的模型一樣的參數數目和計算開銷。相信一定有一些領域能讓這種方法發揮很大的作用。
-
神經網絡
+關注
關注
42文章
4765瀏覽量
100568 -
gpu
+關注
關注
28文章
4703瀏覽量
128729
原文標題:學界 | OpenAI 發布稀疏計算內核,更寬更深的網絡,一樣的計算開銷
文章出處:【微信號:AItists,微信公眾號:人工智能學家】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論