當前位置:
首頁 > 知識 > CMU研究者探索新卷積方法:在實驗中可媲美基準CNN

CMU研究者探索新卷積方法:在實驗中可媲美基準CNN

選自medium

機器之心編譯

參與:Panda

儘管卷積神經網路成就非凡,但卷積本身並不完美,卡內基梅隆大學計算機科學博士 Sahil Singla 近日在 Medium 上發文,介紹了他對「新一類卷積」的探索研究,相關實驗代碼也已在文中公開。機器之心對本文進行了編譯介紹。另外要注意,閱讀這篇文章需要預先有一些關於 CNN 的知識儲備。

卷積有很多地方不討人喜歡。其中最大的一個問題是,大多數權重(尤其是後面層的權重)相當接近於 0。這說明大多數權重都沒有學習到任何東西,對網路處理任何新信息都沒有任何幫助。

所以我想對卷積運算進行修改,以便解決這個問題。這篇文章給出了我在這個方向上做出的實驗以及結果。

實驗 1

究其根本,每個 2D 卷積運算其實就是一個矩陣乘法運算。假設卷積的維度是(核大小,核大小,輸入通道,輸出通道),那麼其中矩陣的維度是(核大小×核大小×輸入通道,輸出通道)。為了簡單起見,在本文中,我們將這種矩陣稱為維度為(m,n)的卷積矩陣(convolution matrix)。

如果我們可以維持該卷積矩陣的列是正交的(以可微分的方式),那麼我們可以確保輸出特徵圖(output feature map)中的每個通道都能得到不存在於任何其它特徵圖中的信息。更重要的是,這能幫助我們創造權重更具可解釋性的神經網路。

是的,有一些不同的方法能確保這能用上一些線性代數技巧(一種是豪斯霍爾德變換(Householder transformation),另一種是(吉文斯旋轉(Givens rotation))。我使用了豪斯霍爾德變換,因為這在 GPU 上的速度要快很多。

代碼請訪問這個文件:https://github.com/singlasahil14/orthogonal-convolution/blob/master/vecgen_tf.py

其中的思想如下:

我們不再保持卷積過濾器中的 m×n 個變數和偏置中的 n 個變數是可訓練的,而是以另一種方式從另一個可訓練的變數集中生成過濾器和偏置。

更具體一點,對於一個維度為 (m, n) 的卷積矩陣,為 m 個維度的每一個創造 n 個向量。第一個向量(比如說 v1)將會有 m-n+1 個可訓練的變數(在開始時用 n-1 個 0 填充),第二個向量(比如說 v2)有 m-n+2 個 可訓練的變數(用 n-2 個 0 填充),第三個(v3)則有 m-n+3 個可訓練的變數(用 n-3 個 0 填充),依此類推。接下來對所有這些向量進行歸一化。使用這些向量創建 n 個豪斯霍爾德矩陣(Householder matrix),按 v1*v2*v3…*vn 的順序將向量相乘。結果得到的矩陣有 m×m 的維度而且是正交的。取該矩陣的前 n 列,那麼結果得到的矩陣的大小就是 (m, n)。然後將其用作卷積矩陣。

看起來這種運算似乎很耗時間,但實際上對於一個 3x3x64x128 的卷積,意味著 576x576 大小的矩陣進行 128 次矩陣乘法運算。當這種卷積在 256×256 大小的圖像上執行時,這點運算其實算不了什麼(意味著會有 (256x256)x(3x3x64x128) 次翻轉)。

如果你必須沿該過濾器創建一個偏置,仍然可以執行上面的流程,只是其中用 m+1 代替 m,得到的矩陣的大小為 (m+1, n),取出最上面一行,並將其用作偏置,使用剩下的 (m, n) 矩陣作為過濾器。

如果你使用了批規範化(batch normalization),那麼這個構想將沒有效果,因為列正交的假設在這種情況下並不成立。

對於實驗,我使用了 CIFAR-10 和類似 VGG 的架構。代碼在同一個代碼庫中:https://github.com/singlasahil14/orthogonal-convolution/blob/master/cifar_deep.py

結果非常極其讓人失望。

在訓練數據上的交叉熵和準確度圖表

在驗證數據上的交叉熵和準確度圖表

可以看到,因為在基準和正交卷積之間的所有扭曲,所以結果很糟糕。更重要的是,正交卷積所用的訓練時間顯著更多。下圖是每次迭代所用時間(time_per_iter)的圖表:

基準和正交卷積每次迭代所用時間的比較

從圖中可以看到,正交卷積所用時間幾乎超過 7 倍。加速這些代碼的方法是存在的,但因為結果如此糟糕,我也就沒有更進一步了。

我的直觀感覺是,它沒效果的原因是模型的優化格局遭到了嚴重的限制,而這又是由所有列向量必須正交的限制導致的。為了測試我的直覺,我做了下面的實驗。

實驗 2

對於接下來的實驗,我不再使用豪斯霍爾德乘法生成的卷積權重和偏置,而是增加了另一個損失項,稱為正交性損失(orthogonality loss)。正交性損失是按以下方式計算的:

使卷積矩陣的大小為 (m, n),偏置向量的大小為 (n),將這兩個向量級聯到一起,得到一個大小為 (m+1, n) 的矩陣。稱這個矩陣為 M。計算這個矩陣的列式範數(column-wise norm),稱之為 N(這是一個大小為 (1, n) 的矩陣)。

計算轉置 (M)*M。計算轉置 (N)*N。然後將兩個矩陣相除。在得到的矩陣中,a(i,j) 包含了在矩陣 M 中索引 i 和 j 處的列向量之間的角的餘弦。通過對該矩陣中的所有元素求平方而創造一個新矩陣。找到該矩陣中所有元素的和(除了該矩陣的跡)。為所有的卷積層進行這樣的求和,我們將得到的結果值就稱為正交性損失(或簡稱 ortho loss)。我將其與一個稱為正交性權重(orthogonality weight)的超參數相乘,然後將其加入到了總體損失之中。

我使用不同的正交性權重值進行了實驗:對應之前的實驗中描述的卷積,我嘗試了 0.1、1、10、100 和 inf。

所有不同實驗的正交性損失

起始的正交性損失(沒有乘權重)大約為 40。這比交叉熵本身還大得多。然而網路學會了在幾次迭代之內就使其接近於 0。

從上圖中可以看到,該網路非常快地就學會了保持該卷積矩陣中的所有列向量正交。當正交性權重被設置為 0 時,正交性損失會不斷增大;而在其它情況下(0.1、1、10、100),它會達到接近 0 的值。這意味著如果我們添加加權的正交損失,由該卷積矩陣學習到的權重確實是正交的。

在訓練數據上的交叉熵和準確度

如上圖所示,隨著正交性權重越來越大,網路訓練的難度也越來越大。

在驗證數據上的交叉熵和準確度

但該網路得到的驗證準確度/交叉熵卻很接近正交性損失為 0 的情況。又再一次失望了,我還希望結果會更好呢。但至少比前面的結果好。

接下來,為了更進一步觀察,我決定僅給出正交性權重為 0 和 0.1 的情況。

在訓練數據上的交叉熵和準確度

在驗證數據上的交叉熵和準確度

可以看到,這兩個網路都收斂到了同樣的驗證交叉熵和準確度。而且正交性權重為 0 時,網路的訓練交叉熵要高一點。這差不多說明增加正交性權重可以讓網路有更好的泛化能力(更高的訓練損失,但同樣的驗證損失)。

接下來,為了測試這種泛化能力是否適用於其它數據集,我決定使用 CIFAR-100 進行同樣的實驗。

在訓練數據上的交叉熵、準確度和正交性損失

在驗證數據上的交叉熵和準確度

這些結果確實也對 CIFAR-100 有效。更重要的是,我們可以看到使用 0.1 正交性權重的網路與使用 0 正交性權重的網路的驗證準確度是一樣的。而在正交性損失比較圖中可以看到,使用 0.1 正交性權重的網路學習的是該卷積矩陣中的正交列。

實驗 3

接下來,受這些結果的啟發,我決定為循環神經網路也嘗試一下同樣的思想。使用這裡的代碼:https://github.com/singlasahil14/char-rnn,並且在未特別指出時都使用默認架構,我決定實驗一下給 LSTM 加入正交歸一性損失(orthonormality loss)會怎樣。注意:正交歸一性損失=sum_square(I-transpose(M)*M),其中 M 是 hidden to hidden 狀態矩陣。而且它和正交性損失(orthogonality loss)不同——這種情況下我們並不關心所有列的範數是否都為 1。

下面是實驗結果(我為正交歸一性損失嘗試了不同的權重:0.001、0.0001、0.00001、0.000001、0.0000001、0):

網路訓練了 20 epoch 後的交叉熵和正交歸一性損失

同樣,在我們降低正交歸一性權重時,交叉熵下降得更快。接下來,為了比較兩個最佳模型的正交歸一性權重,我決定拿出其中權重為 0 和 0.0000001 時的交叉熵和正交歸一性損失值。

在兩種權重(0 和 0.0000001)設置下,網路訓練了 20 epoch 後的交叉熵和正交歸一性損失

同樣差別不大,但它和基準結果差不多。

結論

從這個小項目中,我學習到的最重要的一件事是神經網路是極其複雜的。即使看起來似乎很好的方法也可能會失敗,因為當大多數人有一個想法時,他們只是想到了網路最終訓練好的狀態(就像我一樣,我想要矩陣的列是正交的)。但如果你想到網路必須通過一個路徑才能優化,那麼大多數好想法就立馬顯得蠢笨了(就像我的這個例子,很顯然,在實驗 1 中,我嚴格限制了模型可以選擇的路徑)。

另外,我也嘗試進行了一些非標準的(我自己發明的)調整,想讓該網路的表現超過基準。但沒有一種調整有效。實際上,能成功重現基準結果就已經讓我很開心了,儘管我增加了一個比交叉熵本身更大的損失項。

我也為圖像分割進行了同樣的實驗。結果也相似。這裡就不過多提及了。

我也相信這項研究有助於更好地可視化卷積層中的權重。這是我接下來會探索的方向。

本博客中提及的所有實驗都可以使用下面的代碼庫重現:

https://github.com/singlasahil14/orthogonal-convolution

https://github.com/singlasahil14/char-rnn

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 機器之心 的精彩文章:

在這場智能汽車浪潮中,互聯網公司、傳統車企、供應商在搶奪的是什麼生意
生成對抗網路初學入門:一文讀懂 GAN 的基本原理
UC Berkeley新研究:多視角圖像3D模型重建技術
Bengio等人提出MILABOT:強化學習聊天機器人
當人臉變成新的指紋,核心社會法則正被推倒重建

TAG:機器之心 |