初學卷積——卷積的計算過程及應用場景

寫在前面:
因爲本人初學科學計算這一塊,這兩天遇到了卷積的問題,有點琢磨不透,就瞭解了一下卷積的計算過程及使用場景,因爲時間太短,這裏只能寫下一點點個人的心得體會,希望大家多多包函與指教。

一、卷積公式

由於還沒學習到二維卷積,所以我們這裏只進行一維卷積的討論。

  • 離散卷積:
    離散的數據,就好比是我們平時的考試成績(0,1,2,…,100),離散卷積的公式如下:
    離散卷積公式
    這裏i的定義域爲負無窮到正無窮,當然具體的問題要具體分析,比如成績(100分滿分),那麼i的定義域就是(0-100)。
  • 連續卷積:
    連續的數據,我們還是說成績,但是這個老師比較牛*,他打分甚至可以個給你打根號,也就是說是0-100之間的所有實數。連續卷積的公式如下:
    連續卷積公式
    這裏定積分的下限是負無窮,上限是正無窮,同理,還是具體情況具體分析,如果還是那個打分情況,那麼就是下限爲0,上限爲100。
    注:這裏的*是卷積的符號,不是乘法。
  • 公式說明:
    我們可以從這兩個公式中發現一個情況,就是無論是離散情況還是連續情況,都會有n = i + (n - i)和t = τ + (t - τ),那麼這個問題我們後續在卷積翻轉的時候再說明。

二、卷積的翻轉和平移

1.卷積的翻轉

卷積的翻轉也即“卷”字的由來,由於本人技術有限繪製不了git圖,所以這裏用靜態圖片說明。
我們先講解離散的情況(主要是連續的圖太難畫了嗚嗚嗚)。我們以小學教學爲例,只有語文和數學,各科滿分100,且兩者是相互獨立的,互不干擾,那麼假設小明總分195分,於是小明會有如下幾個情況:

  1. 語文:95分;數學:100分。(出現的概率:g(195) = c(95) · m(100))
  2. 語文:96分;數學:99分。(出現的概率:g(195) = c(96) · m(99))
  3. 語文:97分;數學:98分。(出現的概率:g(195) = c(97) · m(98))
  4. 語文:98分;數學:97分。(出現的概率:g(195) = c(98) · m(97))
  5. 語文:99分;數學:96分。(出現的概率:g(195) = c(99) · m(96))
  6. 語文:100分;數學:95分。(出現的概率:g(195) = c(100) · m(95))

那麼所有的概率即上述六個的求和,也即離散的那個公式。相應的圖示如下:
195分情況
從上面的圖看出這個線條錯綜複雜,是不是和你早上起來枕頭上的頭髮一樣凌亂,所以這裏使用卷積的“卷”,對“語文”進行翻轉,讓他看的清晰一些。如下圖所示:
195分第一次翻轉
這樣的線條不凌亂了,但是數字還是倒着的,所以再對每個數字翻轉一次。如下圖所示:
195分第二次翻轉
這樣那麼卷積的翻轉就完成了,接下來就是卷積的平移問題。

2.卷積的平移

我們剛剛討論的是195分的情況,那麼如果是196分、197分甚至200分呢?那麼就是上面(或者下面)的框框平移的過程了。如果學過計算機網絡的同學,可以類比一下停止等待協議裏面的滑動窗口,比較方便理解。
那麼來到196分,196分的情況就比之前少了一種,各種情況分別是:

  1. 語文:96分;數學:100分。(出現的概率:g(196) = c(96) · m(100))
  2. 語文:97分;數學:99分。(出現的概率:g(196) = c(97) · m(99))
  3. 語文:98分;數學:98分。(出現的概率:g(196) = c(98) · m(98))
  4. 語文:99分;數學:97分。(出現的概率:g(196) = c(99) · m(97))
  5. 語文:100分;數學:96分。(出現的概率:g(196) = c(100) · m(96))

而對應的翻轉後的圖片如下:
196分翻轉後圖片
同理,當我們牛*轟轟的小明同學來到200分時,就只剩下唯一一種情況了:

  1. 語文:100分;數學:100分。(出現的概率:g(200) = c(100) · m(100))

而對應翻轉後的圖片如下:
200分翻轉後圖片
我們就先假設小明考的總分從0-200都是等概率事件(即每個數字權重都相同),由於我們是從195分舉例的,但是實際上總分爲0也是可能出現的,所以整個窗口是從0-0一直移動至100-100爲止,這就是平移,當然這裏也會涉及到邊緣效應的問題,下面再談。
上面說的都是離散的情況,但是連續的情況也是同樣的操作方式,而學習過高數的同學都懂,連續的情況無非就是求兩個部分的面積總和。

三、卷積的計算方法

這裏我們還是用離散的數據進行計算說明(主要還是積分看着都頭大),當然100這個數據太大了,我們就另外取兩個一維數組來計算,數組如下:
數組圖片
翻轉後的數組如下:
翻轉後的數組
首先我們重溫一下離散的卷積公式:
離散卷積公式
第一步我們要求n的值,我們看到arr_1有3個數據,arr_2有4個數據,所以n = 3 + 4 = 7。7就有以下6種情況構成:

  1. 1 + 6
  2. 2 + 5
  3. 3 + 4
  4. 4 + 3
  5. 5 + 2
  6. 6 + 1

那麼也就可以說明我們要平移6次,我這裏詳細講解每一次的過程。
第一次,也就是1對應1的時候,圖片如下:
第一步
這時候我們執行x(i) · h(n - i)獲得結果爲1,因爲就這麼一個數據,所以求和後依舊爲1,所以這時候卷積之後的數組中有了第一個數[1]。
第二次,也就是2對應1,1對應2的情況,圖片如下:
第二步
同理,執行x(i) · h(n - i)獲得結果分別爲2與2,求和之後爲4,於是數組中有了第二個數,現在數組是[1 4]。
第三次,這時候我們發現arr_1和arr_2完全重疊了,關於重疊的問題下面和邊緣效應一起討論,圖片如下:
第三步
執行公式後,數據分別爲3、4、3,求和後數據爲10,數組繼續添加,爲[1 4 10]。
依次執行相同步驟後,來到最後一步,就是3與4對應的時候,圖片如下:
第六步
這時候只有一個數據了,得到12,添加至數組,數組也就完滿了,數組爲[1 4 10 16 17 12],卷積也就到此結束了。

四、卷積的邊緣效應

由於本人查閱了相關資料,也沒得到比較好的解答(也有可能是我不會查資料),所以我這裏就粗略、淺顯的談一談我對邊緣效應的理解。
從圖片來看,那麼邊緣效應指的就是兩個數組沒有完全重疊在一起的部分,如果用剛剛[1 2 3]和[1 2 3 4]的例子來說,那麼重疊的部分就只有2種情況,即:
第三步
第四步
也就是說,其餘的4種情況全存在邊緣效應,也就是說會或多或少影響到數據。就好比我們燒了一盆書,還一直在往裏面丟書,我們想知道某一時刻的溫度與燒了的書的關係,但是之前還有一些書沒有燒透徹,還可以提供點點火星,那是不是會對溫度的測量造成點點誤差?

五、卷積的實際意義

我們從一個系統來思考,只要系統不是及時響應的,那麼我們在輸入一個衝擊的時候,會因爲系統中的某些不可抗拒的因素影響到整個過程,而我們想求其中某個過程狀態的時候就需要卷積。
就還是拿剛剛燒書的過程來說,我們將書丟進火裏面就是一個衝擊,但是之前還有些星星火會影響到現在的情況,也就是過去的東西會影響到現在;或者說我們喫飯的問題,比如我們早飯喫多了或者喫晚了,那麼我們午飯就會喫得少或者也喫的晚,這就是卷積的實際使用場景,反映了一個變化情況的過程。
由於我也還在門口徘徊,所以要具體拿來相關的例子還是十分困難的嗚嗚嗚。

六、convolve說明

convolve(a, v, mode='full')
Parameters
    ----------
    a : (N,) array_like
        First one-dimensional input array.
    v : (M,) array_like
        Second one-dimensional input array.
    mode : {'full', 'valid', 'same'}, optional
        'full':
          By default, mode is 'full'.  This returns the convolution
          at each point of overlap, with an output shape of (N+M-1,). At
          the end-points of the convolution, the signals do not overlap
          completely, and boundary effects may be seen.

        'same':
          Mode 'same' returns output of length ``max(M, N)``.  Boundary
          effects are still visible.

        'valid':
          Mode 'valid' returns output of length
          ``max(M, N) - min(M, N) + 1``.  The convolution product is only given
          for points where the signals overlap completely.  Values outside
          the signal boundary have no effect.

這是numpy中convolve函數的源碼中的註釋,我用我蹩腳的英語翻譯能力+翻譯工具簡單說明一下,傳入的參數有3個,a、v、mode,其中a、v是必填的,mode是選填的,默認值爲full。
a:第一個輸入的一維數組。
v:第二個輸入的一維數組。
mode:模式,共有3種,“full”,“same”,“valid”,默認full。

  1. full:默認模式,返回的是每個重疊點的卷積,卷積的輸出形狀爲(N + M - 1),在卷積的端點信號不完全重疊,且存在邊緣效應。
    說明:這就是我們剛剛討論的那種情況,N就是len(a),M就是len(v),存在的邊緣效應看第三大點與第四大點也能夠理解。
  2. same:返回的是M和N中最大值的,依舊存在邊界效應。
    說明:由於本人看源碼技術還不夠熟練,所以我只能在做測試的時候發現,最大值的取法就是從無邊緣效應的部分開始向外擴展。
  3. valid:返回的就是信號重疊區域的卷積,不會返回存在邊緣效應的部分,返回的長度爲max(M, N) - min(M, N) + 1。

七、參考

[1] Ivan Idris.python數據分析基礎教程NumPy學習指南(第2版)〔M〕.人民郵電出版社,2014:54-58.
[2] QLMX.numpy中的convolve的理解.CSDN,2017
[3] 小元老師.【小動畫】徹底理解卷積【超形象】卷的由來,小元老師.嗶哩嗶哩.2020

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章