1. 程式人生 > >CNN:對於卷積的理解

CNN:對於卷積的理解

學習深度學習看到卷積這個operation,為了理解它查了一些資料,有幸看到一個大佬的總結,再加上一些自己的想法,做一個總結。

一、卷積的定義

內涵:

在泛函分析中,卷積、旋積或摺積(英語:Convolution)是通過兩個函式f 和g 生成第三個函式的一種數學運算元,表徵函式f 與g經過翻轉和平移的重疊部分的面積。

設:f(x),g(x)是R1上的兩個可積函式,作積分:

                                     \int_{-\infty }^{+\infty }f(\tau )g(x-\tau )d\tau

可以證明,關於幾乎所有的實數x,上述積分是存在的。這樣,隨著x的不同取值,這個積分就定義了一個新函式h(x),稱為函式fg的卷積,記為h(x)=(f*g)(x)

定義:

卷積是兩個變數在某範圍內相乘後求和的結果。如果卷積的變數是序列x(n)h(n),則卷積的結果

                             y(n)=\sum_{-\infty }^{+\infty }x(i)h(n-i)=x(n)*h(n)

其中星號*表示卷積。當時序n=0時,序列h(-i)h(i)的時序i取反的結果;時序取反使得h(i)以縱軸為中心翻轉180度,所以這種相乘後求和的計演算法稱為卷積和,簡稱卷積。另外,n是使h(-i)

位移的量,不同的n對應不同的卷積結果。這句話解釋了內涵中翻轉和平移的重疊部分的面積。n=0時,y(0)=\sum_{-\infty }^{+\infty }x(i)h(-i),函式h(n)翻轉180度,平移n(此時為0),然和乘積求和。

如果卷積的變數是函式x(t)h(t),則卷積的計算變為

                           y(t)=\int_{-\infty }^{+\infty }x(p)h(t-p)dp=x(t)*h(t)

其中p是積分變數,積分也是求和,t是使函式h(-p)位移的量,星號*表示卷積。

二、理解卷積

首先選取知乎上對卷積物理意義解答排名最靠前的回答。 
不推薦用“反轉/翻轉/反褶/對稱”等解釋卷積(上邊我們講了使用翻轉的 -  -)。好好的訊號為什麼要翻轉?導致學生難以理解卷積的物理意義。 
這個其實非常簡單的概念,國內的大多數教材卻沒有講透。

直接看圖,不信看不懂。以離散訊號為例,連續訊號同理。

已知x[0] = a, x[1] = b, x[2]=c

è¿éåå¾çæè¿°

 已知y[0] = i, y[1] = j, y[2]=k

下面通過演示求x[n] * y[n]的過程,揭示卷積的物理意義。

第一步,x[n]乘以y[0]並平移到位置0: 

 第二步,x[n]乘以y[1]並平移到位置1 :

 第三步,x[n]乘以y[2]並平移到位置2: 

 最後,把上面三個圖疊加,就得到了x[n] * y[n]: 

 è¿éåå¾çæè¿°

 無非是平移(沒有反褶!)、疊加。

從這裡,可以看到卷積的重要的物理意義是:一個函式(如:單位響應)在另一個函式(如:輸入訊號)上的加權疊加。

重複一遍,這就是卷積的意義:加權疊加

我們也可以根據公式來看,令

                     z(n)=\sum_{-\infty }^{+\infty }x(i)y(n-i)=x(n)*y(n)

那麼

z[0] = x[0]*y[0]+x[1]y[-1]+x[2]y[-2]=ai+b0+c0=ai

z[1] = x[0]*y[1]+x[1]y[0]+x[2]y[-1]=aj+b+c0=aj+bi+c0=aj+bi

z[2] = x[0]*y[2]+x[1]y[1]+x[2]y[0]=ak+bj+ci

z[3] = x[0]*y[3]+x[1]y[2]+x[2]y[1]+x[3]y[0]=a0+bk+cj+0i=bk+cj

z[4] = x[1]y[3]+x[2]y[2]=b0+ck=ck

三、卷積的應用

用一個模板和一幅影象進行卷積,對於影象上的一個點,讓模板的原點和該點重合,然後模板上的點和影象上對應的點相乘,然後各點的積相加,就得到了該點的卷積值。對影象上的每個點都這樣處理。由於大多數模板都是對稱的,所以模板不旋轉。卷積是一種積分運算,用來求兩個曲線重疊區域面積。可以看作加權求和,可以用來消除噪聲、特徵增強。 
把一個點的畫素值用它周圍的點的畫素值的加權平均代替。 
卷積是一種線性運算,影象處理中常見的mask運算都是卷積,廣泛應用於影象濾波。 
卷積關係最重要的一種情況,就是在訊號與線性系統或數字訊號處理中的卷積定理。利用該定理,可以將時間域或空間域中的卷積運算等價為頻率域的相乘運算,從而利用FFT等快速演算法,實現有效的計算,節省運算代價。

四、直觀感受的例子

點積是計算兩個向量相似性的一種重要度量。看以下例子

a中是一個形如sin的訊號和本身求點積;b是sin訊號和一個形如cos的資訊求點積;c是該訊號和一個隨機產生的向量求點積。a兩個訊號相似程度最高,得到了最大值,c得到了負值,從視覺上看也是差異最高的。

上面是一個長度為20的sin訊號兩邊各接一個長度為20的隨機訊號作為一個新的帶卷積訊號,然後定義個倒序之後就是sin波形的訊號作為卷積核。

上面是帶卷積訊號,下面是結果。在形如sin的訊號劃過被卷積訊號的形如sin的區域時,卷積結果的值最大。從訊號的角度,可以把卷積看做是卷積核作為一個濾波器,卷積的結果則是被卷積訊號在這個濾波器上的響應。所以大體上越是和卷積核倒序之後相似的訊號越是獲得越大的響應。

這個例子中卷積核起到了縱向邊緣查詢的作用。 

參考文獻:

《深度學習》 Ian GoodFellow.

《深度學習與計算機視覺》 叶韻.

https://blog.csdn.net/bitcarmanlee/article/details/54729807