背景
卷積是信號處理中的重要操作,在深度學習中更是重中之重,所以有必要對一些經典的快速卷積方法做一些瞭解。
在查閱了若干資料後,對於Cook-Toom算法,以下簡稱CT算法,有了一定的瞭解,記錄一下,便於以後查閱。
卷積介紹
由於這個算法比較經典,所以默認處理的是信號系統中的一維卷積,此文也是基於一維卷積對CT算法做一個介紹。
一維卷積過程如下:
給定信號f[n]以及濾波器g[m],則卷積過後的信號s[n]長度爲N=n+m-1,具體計算爲:
s[n]=(f*g)[n] = \sum_{m=-M}^{m=M}f[m]g[n-m]
以3個元素的信號爲例:
f(n) = [1 2 3]; g(n) = [2 3 1];
s(0) = f(0)g(0-0) + f(1)g(0-1)+f(2)g(0-2) = 12 + 20 + 3*0 =2
s(1) = f(0)g(1-0) + f(1)g(1-1) + f(2)g(1-2) = 13 + 22 + 3*0 = 7
s(2) = f(0)g(2-0) + f(1)g(2-1) + f(2)g(2-2) =11 + 23 + 3*2=13
s(3) = f(0)g(3-0) + f(1)g(3-1) + f(2)g(3-2) =10 + 21 + 3*3=11
s(4) = f(0)g(4-0) + f(1)g(4-1) + f(2)g(4-2) =10 + 20 + 3*1=3
最終結果爲:
s(n) = [2 7 13 11 3]
拉格朗日插值定理
直接從wiki抄過來的,證明過程可以參考拉格朗日插值法
簡單來說就是,對於n+1組二維點,可以找到一個不超過n階多項式函數,擬合這n+1組點。CT算法就是這個定理在卷積上的應用。
Cook-Toom 算法
一個事實
下面所有和加速有關的解釋,都依賴於一個前提:計算平臺的乘法比加法慢,且慢的多。根據一般規律,CPU處理乘法的時間,大致上是處理加(減)法的10倍。
也就是說,如果我們去掉一個乘法操作的代價是增加不超過10個加法,理論上是可以提升效率的,但是這個不一定時時刻刻都正確,因爲還要考慮到cache,如果是亂序還要考慮流水線等等。總體來說,如果能減少乘法運算,且增加少量的加法運算,被認爲是速度上的提升。
CT算法
具體步驟
以2x2的卷積過程爲例說明,2x2的卷積會產生2+2-1=3個數,所以需要3個對應點:
-
計算
-
計算:
-
改寫成矩陣形式
-
實際計算過程:
因爲h爲濾波器,所以可以提前計算H相關的值,其他值都是需要實時計算,一共包括5次加法和3次乘法,乘法數量就是上面中間矩陣主對角線不爲0的值的數量。
評價
Cook-Toom算法能夠利用加法來換乘法運算,在某些情況下,可以減少整體的計算時間,而且將卷積計算和多項式乘法有效的結合起來,思路非常值得學習,缺點是當卷積核較大時,增加的加法數量以遠超核大小的速度增長,最終會導致增加的加法所耗費的時間甚至超過節省下來的乘法所耗費的時間。
因爲CT算法本身是建立在Lagrange之上的,如果要改進這種算法,也可以從Lagrange定理入手,比如使用重心Lagrange插值法等。
參考
https://antkillerfarm.github.io/dl%20acceleration/2019/07/19/DL_acceleration.html