本文轉載自個人博客html
在學習機器學習和圖像處理的過程當中,常常會遇到卷積這個概念。我每次遇到這個概念都有點似懂非懂的樣子。有時候清楚它的直觀解釋,但又搞不清公式中是如何體現的。究其緣由,仍是我沒有徹底搞懂這個概念。git
維基百科上有一個動態圖來演示這個概念,但對於我來講仍是有些複雜。因而本身在網上找了不少文章來研究,終於有了比較直觀的印象,這裏就趁熱把我理解的解釋一下,做爲總結。github
維基百科上,卷積的形式化定義以下:app
$$ f(x)*g(x) = \int_{-\infty}^{\infty} f(\tau)g(x-\tau) d\tau \tag{1}\label{1} $$機器學習
先來分析一下這個公式:函數
$f(x)*g(x)$ 表示 $f(x)$ 和 $g(x)$ 的卷積,注意此處自變量爲 $x$;post
它是對 $(-\infty, \infty)$ 區間上對 $\tau$ 求積分;學習
積分對象爲兩個函數的乘積:$f(\tau)$ 和 $g(x-\tau)$。spa
等式右邊只有 $g(x-\tau)$ 提到了 $x$,其餘部分都在關注 $\tau$rest
這樣一個公式恐怕仍是難以理解,接下來將經過一個例子來進行解釋。
試想小明有一段時間天天都要去輸液,輸的藥會在身體裏殘留直至失效,藥效隨着時間是不斷衰落的。 這裏爲簡便起見,假設藥效 4 天就失效,並且藥效持續函數是離散的。以下圖所示:
圖中,橫座標爲天數,縱座標爲藥效。輸液當天(day=0)藥效爲 100%,次日減弱爲 80%,第三天減弱爲 40%,第四天減弱爲 0。
如今先定義一些符號:
記天數爲 $t$,天天輸液的藥量爲 $\operatorname{m}(t)$, 藥效函數爲 $\operatorname{eff}(t)$,小明身上殘留的藥效爲 $\operatorname{rest}(t)$
其中藥效函數:
$$\operatorname{eff}(t) =
\begin{cases} 100 \% & \text{t=0} \\\
80 \% & \text{t=1} \\\
40 \% & \text{t=2} \\\
0 \% & \text{t>=3} \end{cases} \\\
$$
下面觀察一下小明從第一天起,連續三天輸液後身上所留下的藥效(假設天天藥量固定爲10)。
第一天,小明去醫院輸完液後,藥效爲 10($ \operatorname{rest}(t) = \operatorname{m}(t)\cdot \operatorname{eff}(0) $)。
第一天累積的藥效示意
次日,小明去醫院準備輸液
輸液前,他身上帶着前一天的藥效,此時已經衰減爲 10$\cdot$ 80%=8,即 $ \operatorname{m}(t-1)\cdot \operatorname{eff}(1) $。
輸液後,他身上攜帶的藥效爲:8 + 10 = 18($ \operatorname{rest}(t) = \operatorname{m}(t-1)\cdot \operatorname{eff}(1) + \operatorname{m}(t)\cdot \operatorname{eff}(0) $)
次日累積的藥效示意
第三天,小明去醫院準備輸液
輸液前,他身上帶着前兩天的藥效,第一天的此時已衰減爲 10$\cdot$ 40%=4($ \operatorname{m}(t-2)\cdot \operatorname{eff}(2) $),次日的此時衰減爲 10$\cdot$ 80%=8($ \operatorname{m}(t-1)\cdot \operatorname{eff}(1) $)。
輸液後,他身上攜帶的藥效爲:4 + 8 + 10 = 22($ \operatorname{rest}(t) = \operatorname{m}(t-2)\cdot \operatorname{eff}(2) + \operatorname{m}(t-1)\cdot \operatorname{eff}(1) + \operatorname{m}(t)\cdot \operatorname{eff}(0) $)。
第三天累積的藥效示意
從上面的分析咱們能夠獲得,小明第 t 天身上殘留的藥效 $\operatorname{rest}(t) = \sum_{i=1}^n \operatorname{m}(t-i) \operatorname{eff}(i)$,其中 $n$ 爲藥效有效的最大天數。 咱們不難想象,但藥效函數 $\operatorname{eff}(t)$ 爲連續時,上式中的求和就應改成積分;而當藥效能無限期有效時,上式中 $n$ 就爲 $\infty$。 無限期有效的藥效函數,所對應的 $\operatorname{rest}(t) = \int_{-\infty}^\infty \operatorname{m}(t-\tau) \operatorname{eff}(\tau) \,d\tau$(本例中嚴格來講應該是 $\int_0^\infty$ ,這裏推廣到了 $(-\infty, \infty)$)。推導到這裏,基本就是維基百科上卷積的定義了。
我以前對卷積概念的困惑主要是由於對公式 $\ref{1}$ 的那個 $\tau$ 的意義理解錯了,總覺得 $\tau$ 是隨着座標軸變化的量。 事實上,在上面舉的例子中,$\tau$ 是做爲沿着縱座標遍歷的量:它的做用是對「縱向」上,歷次函數 $\operatorname{eff}(t)$ 在當前點($t$)殘餘量($\operatorname{rest}(t)$)的求和。積分也是對縱向上的積分,而非橫向上沿自變量的積分。
橫座標變化的量始終爲 $t$,並且在卷積中並無明顯體現出 $t$ 的變化。
最後從新回顧一下上面的整個過程:
比較三天以來的示意圖能夠發現,若是咱們以「當天」而不是第 $t$ 天爲參考的話,就會看到 $\operatorname{eff}(t)$ 隨着時間是在向左平移(深藍的線表示當天,前幾天的線都在其左邊),而後各天衰落後的藥量殘餘等於 $\operatorname{eff}(t)$ 值乘上初始的藥量值,最後將各天的藥量殘餘求個和。
整個過程的核心就是「(反轉),移動,乘積,求和」,這裏面「反轉」的概念也好理解,就是原本 $\operatorname{eff}(t)$ 是「朝着右邊」走的函數,$t=0,t=1,\cdots$,$\operatorname{eff}(t)$ 是形容t 天后的藥量的,然而實際例子中咱們是以當天爲參考系,咱們是在「朝着左邊」看的,於是要「反轉」。我認爲這個「反轉」是一個很天然的過程,不算是整個卷積的核心。 此外,在計算機領域,至少我接觸到的圖像處理、機器學習方面用到的卷積,其卷積核(就是例子中不斷平移的函數 $\operatorname{eff}(t)$)通常是對稱的,因此這個反轉的概念也不是那麼必要。
$$ f(x, y)* g(x, y) = \int_{\tau_1=-\infty}^\infty \int_{\tau_2=-\infty}^{\infty} f(\tau_1, \tau_2) \cdot g(x-\tau_1, y-\tau_2)\,d\tau_1 d\tau_2 \tag{2} $$
二維卷積在圖像處理中會常常遇到,圖像處理中用到的大可能是二維卷積的離散形式:
$$ f[x,y] * g[x,y] = \sum_{n_1=-\infty}^\infty \sum_{n_2=-\infty}^\infty f[n_1, n_2] \cdot g[x-n_1, y-n_2] \tag{3} $$
二維卷積就是一維卷積的擴展,原理差很少。核心仍是(反轉),移動,乘積,求和。這裏二維的反轉就是將卷積核沿反對角線翻轉,好比矩陣
a b c d e f g h i
翻轉爲
i h g f e d c b a
以後,卷積核在二維平面上平移,而且卷積核的每一個元素與被卷積圖像對應位置相乘,再求和。經過卷積核的不斷移動,咱們就有了一個新的圖像,這個圖像徹底由卷積核在各個位置時的乘積求和的結果組成。
舉一個最簡單的均值濾波的例子:
一個 3x3 的均值濾波核(卷積核):
1/9 1/9 1/9 1/9 1/9 1/9 1/9 1/9 1/9
和被卷積圖像(這裏簡化爲一個二維 5x5 矩陣):
3 3 3 3 3 4 4 4 4 4 5 5 5 5 5 6 6 6 6 6 7 7 7 7 7
當卷積核運動到圖像右下角處(卷積中心和圖像對應圖像第 4 行第 4 列)時,它和圖像卷積的結果以下圖所示:
能夠看出,二維卷積在圖像中的效果就是:
對圖像的每一個像素的鄰域(鄰域大小就是核的大小)加權求和獲得該像素點的輸出值。
濾波器核在這裏是做爲一個「權重表」來使用的。
歡迎到個人博客查看更多文章