Network Pruning
要把Network裡面的參數剪掉,一個大的Network裡面一定有在甚麼作用的參數,沒有做的參數放在那邊只是占空間,可以把他們剪掉。
不能一次剪大量資料,可能會對network造成損害,大到fine-tune無法復原。
修剪單位可以以參數為單位,也可以以神經元為單位
參數為單位:
決定某一個參數需不需要,把該參數去掉之後,所得的network可能是不規則的,會導致不好實作,也不好用GPU加速。
因為在pytorch都是設定每一層要幾個neural 輸入幾個輸出,或是輸入多長的vector輸出多長的vector,如果硬實做出來,用GPU加速也不好加速因為GPU在加速時是把Neural看成矩陣乘法。
所以在實作上,被剪掉的weight會直接補0,但這樣其實network沒有變小,還是有參數
把network變不規則用GPU去加速,實際上並沒有變快。
以神經元為單位:
比較好實作。
為何大的Network比較好train,直接train一個小的network沒有辦法跟大的network一樣的效果。一定要大的prune之後變小結果才會好。
Lottery Ticket Hypothesis(大樂透理論)
可以想成大的network裡面包含很多小的sub network,當我們訓練大的network = 訓練許多小的network,每一個小的network不一定可以成功被訓練出來(透過gradient descent找到一個好的solution ),但只要有一個成功train出來就可以成功。
就像是買大樂透,買一個多組的彩券,只要一個中就中大獎。
實驗過程:
一開始大的network用init的紅色這組參數train,train完之後,將其prune,prune完之後將其參數重新隨機初始化,則結果會train不起來,但是如果參數代紅色的則可以train起來。
用大樂透假說來解釋就是,一開始有很多sub network,而右下角的那一組參數就是幸運的那組,可以train起來的network,如果再重新初始化,運氣比較不好就抽不到可以成功訓練的參數。
但有一篇是打臉大樂透假說的,所以可能還是需要證實
#以上參考李宏毅老師講義自己做筆記使用