介紹一下最近看的一種通用卷積核用於模型壓縮的方法,剛剛查了一下,原作者的博客在https://zhuanlan.zhihu.com/p/82710870 有介紹,論文傳送門 https://papers.nips.cc/paper/7433-learning-versatile-filters-for-efficient-convolutional-neural-networks.pdf , github開源地址 https://github.com/huawei-noah/Versatile-Filters
下面介紹下我的理解。
這種模型壓縮方法分為兩步,一步是在spatial-wise的,一步是在channel-wise的,其實思想是一樣的,這兩步也就對應着我們平常一個filter, 假設是7x7x24x100,那么7x7對應的就是spatial-wise,24對應的就是channel-wise。24是input feature的深度,這個沒法變就不管了。從spatial的角度來說,這100個input的filters,每個都是7x7x24,其實沒有必要有100個,25個就可以了,怎么說呢?7x7的這個filter可以拆成7x7,5x5,3x3,1x1,就是4個子卷積核,那么其實有25個7x7x24的filter,就可以變換出100個filter了。這個7x7怎么拆呢?如下圖,以5x5的為例,就是中間這個(b)圖,5x5的卷積核就是最大的這個部分,3x3的子卷積核就是綠色加中間這個部分,其實是5x5的卷積核的一部分參數,相當於外面藍色一圈填0,1x1的子卷積核就是中間這個紅點點,這樣三個子卷積核都是由5x5的卷積核變換而來,參數共享,其實在實際計算的時候,還可以實現計算共享,比起實際用3個5x5卷積核,計算量是要省的,參數大小也少了,memory的要求也降低了。

另一種就是channel-wise的壓縮,基本思想跟上面的是完全一樣的,這一次是在深度24這個方向上進行拆分,比如,1到22為一個子卷積核,3到24為一個子卷積核,這樣就可以有兩個卷積核了,結合上面的spatial-wise的壓縮,就只要13個7x7x24的filter就可以了。與spatial-wise不同的是上一次出現了7x7卷積本尊,這一次沒有24個channel的全的了。這樣計算量也是要節省的,只有原來的22/24,並且中間還有一些結果是可以復用的,實際上會更省一些。

以上大概就是這個方法的精髓了。作者在圖像分類和圖像超分辨率幾個經典網絡上驗證了自己的想法,證明了此方法的有效性。
=========================================
關於這個方法,我有一些疑問,其實這種方法降低了參數的自由度,那么他為什么還可以達到和之前的網絡一樣的效果?是不是之前的網絡參數就有很多冗余,或者說其實這樣的選取參數是有意義的,其實是基於某種先驗。
