1. 程式人生 > >深度學習FPGA實現基礎知識14(如何理解“卷積”運算)

深度學習FPGA實現基礎知識14(如何理解“卷積”運算)

需求說明:深度學習FPGA實現知識儲備

百度百科

函式內涵

簡單定義:卷積是分析數學中一種重要的運算。 設:f(x),g(x)是R1上的兩個可積函式,作積分: 可以證明,關於幾乎所有的實數x,上述積分是存在的。這樣,隨著x的不同取值,這個積分就定義了一個新函式h(x),稱為函式fg的卷積,記為h(x)=(f*g)(x)。 容易驗證,(f * g)(x) = (g * f)(x),並且(f * g)(x)仍為可積函式。這就是說,把卷積代替乘法,L1(R1)空間是一個代數,甚至是巴拿赫代數。
卷積與傅立葉變換有著密切的關係。利用一點性質,即兩函式的傅立葉變換的乘積等於它們卷積後的傅立葉變換,能使傅立葉分析中許多問題的處理得到簡化。
       由卷積得到的函式f*g一般要比f和g都光滑。特別當g為具有緊緻集的光滑函式,f為區域性可積時,它們的卷積f * g也是光滑函式。利用這一性質,對於任意的可積函式f,都可以簡單地構造出一列逼近於f的光滑函式列fs,這種方法稱為函式的光滑化或正則化。 函式定義
卷積是兩個變數在某範圍內相乘後求和的結果。如果卷積的變數是序列x(n)和h(n),則卷積的結果 , 其中星號*表示卷積。當時序n=0時,序列h(-i)是h(i)的時序i取反的結果;時序取反使得h(i)以縱軸為中心翻轉180度,所以這種相乘後求和的計演算法稱為卷積和,簡稱卷積。另外,n是使h(-i)位移的量,不同的n對應不同的卷積結果。 如果卷積的變數是函式x(t)和h(t),則卷積的計算變為 其中p是積分變數,積分也是求和,t是使函式h(-p)位移的量,星號*表示卷積。 參考《數字訊號處理》楊毅明著,p.55、p.188、p.264,機械工業出版社2012年發行。 正文:

卷積這個東東是“訊號與系統”中論述系統對輸入訊號的響應而提出的。因為是對模擬訊號論述的,所以常常帶有繁瑣的算術推倒,很簡單的問題的本質常常就被一大堆公式淹沒了,那麼卷積究竟物理意義怎麼樣呢?
卷積表示為y(n) = x(n)*h(n)
使用離散數列來理解卷積會更形象一點,我們把y(n)的序列表示成y(0),y(1),y(2) and so on; 這是系統響應出來的訊號。
同理,x(n)的對應時刻的序列為x(0),x(1),x(2)...and so on;
其實我們如果沒有學過訊號與系統,就常識來講,系統的響應不僅與當前時刻系統的輸入有關,也跟之前若干時刻的輸入有關,因為我們可以理解為這是之前時刻的輸入訊號經過一種過程(這種過程可以是遞減,削弱,或其他)對現在時刻系統輸出的影響,那麼顯然,我們計算系統輸出時就必須考慮現在時刻的訊號輸入的響應以及之前若干時刻訊號輸入的響應之“殘留”影響的一個疊加效果。
假設0時刻系統響應為y(0),若其在1時刻時,此種響應未改變,則1時刻的響應就變成了y(0)+y(1),叫序列的累加和(與序列的和不一樣)。但常常系統中不是這樣的,因為0時刻的響應不太可能在1時刻仍舊未變化,那麼怎麼表述這種變化呢,就通過h(t)這個響應函式與x(0)相乘來表述,表述為x(m)×h(m-n),具體表達式不用多管,只要記著有大概這種關係,引入這個函式就能夠表述y(0)在1時刻究竟削弱了多少,然後削弱後的值才是y(0)在1時刻的真實值,再通過累加和運算,才得到真實的系統響應。
再拓展點,某時刻的系統響應往往不一定是由當前時刻和前一時刻這兩個響應決定的,也可能是再加上前前時刻,前前前時刻,前前前前時刻,等等,那麼怎麼約束這個範圍呢,就是通過對h(n)這個函式在表示式中變化後的h(m-n)中的m的範圍來約束的。即說白了,就是當前時刻的系統響應與多少個之前時刻的響應的“殘留影響”有關。
當考慮這些因素後,就可以描述成一個系統響應了,而這些因素通過一個表示式(卷積)即描述出來不得不說是數學的巧妙和迷人之處了。
  
對於非數學系學生來說,只要懂怎麼用卷積就可以了,研究什麼是卷積其實意義不大,它就是一種微元相乘累加的極限形式。卷積本身不過就是一種數學運算而已。就跟“蝶形運算”一樣,怎麼證明,這是數學系的人的工作。
在訊號與系統裡,f(t)的零狀態響應y(t)可用f(t)與其單位衝激響應h(t) 的卷積積分求解得,即y(t)=f(t)*h(t)。學過訊號與系統的都應該知道,時域的卷積等於頻域的乘積,即有 Y(s)=F(s)×H(s)。(s=jw,拉氏變換後等到的函式其實就是訊號的頻域表示式)有一點你必須明白,在通訊系統裡,我們關心的以及 要研究的是訊號的頻域,不是時域,原因是因為訊號的頻率是攜帶有資訊的量。所以,我們需要的是Y(s)這個表示式,但是實際上,我們往往不能很容易的得到F(s)和H(s)這兩個表示式,但是能直接的很容易的得到f(t)和h(t),所以為了找到Y(s)和y(t)的對應關係,就要用到卷積運算。
複頻域。s=jw,當中的j是複數單位,所以使用的是複頻域。通俗的解釋方法是,因為系統中有電感X=jwL、電容X=1/jwC,物理意義是,系統H(s)對不同的頻率分量有不同的衰減,即這種衰減是發生在頻域的,所以為了與時域區別,引入複數的運算。但是在複頻域計算的形式仍然滿足歐姆定理、KCL、KVL、疊加法。負的頻率。之所以會出現負的頻率,這只是數學運算的結果,只存在於數學運算 中,實際中不會有負的頻率。

卷積的過程就是相當於把訊號分解為無窮多的衝擊訊號,然後進行衝擊響應的疊加。
 

舉個小例子
有一個七品縣令,喜歡用打板子來懲戒那些市井無賴,而且有個慣例:如果沒犯大罪,只打一板,釋放回家,以示愛民如子。有一個無賴,想出人頭地卻沒啥指望,心想:既然揚不了善名,出惡名也成啊。怎麼出惡名?炒作唄!怎麼炒作?找名人呀!他自然想到了他的行政長官——縣令。

無賴於是光天化日之下,站在縣衙門前撒了一泡尿,後果是可想而知地,自然被請進大堂捱了一板子,然後昂首挺胸回家,躺了一天,嘿!身上啥事也沒有!第二天如法炮製,全然不顧行政長管的仁慈和衙門的體面,第三天、第四天......每天去縣衙門領一個板子回來,還喜氣洋洋地,堅持一個月之久!這無賴的名氣已經和衙門口的臭氣一樣,傳遍八方了!

縣令大人噤著鼻子,呆呆地盯著案子上的驚堂木,擰著眉頭思考一個問題:這三十個大板子怎麼不好使捏?......想當初,本老爺金榜題名時,數學可是得了滿分,今天好歹要解決這個問題:

——人(系統!)挨板子(脈衝!)以後,會有什麼表現(輸出!)?

——費話,疼唄!
——我問的是:會有什麼表現?

——看疼到啥程度。像這無賴的體格,每天挨一個板子啥事都不會有,連哼一下都不可能,你也看到他那得意洋洋的嘴臉了(輸出0);如果一次連揍他十個板子,他可能會皺皺眉頭,咬咬牙,硬挺著不哼(輸出1);揍到二十個板子,他會疼得臉部扭曲,象豬似地哼哼(輸出3);揍到三十個板子,他可能會象驢似地嚎叫,一把鼻涕一把淚地求你饒他一命(輸出5);揍到四十個板子,他會大小便失禁,勉強哼
出聲來(輸出1);揍到五十個板子,他連哼一下都不可能(輸出0)—— 死啦!

縣令鋪開座標紙,以打板子的個數作為X軸,以哼哼的程度(輸出)為Y軸,繪製了一條曲線:

——嗚呼呀!這曲線象一座高山,弄不懂弄不懂。為啥那個無賴連捱了三十天大板卻不喊繞命呀?

——呵呵,你打一次的時間間隔(Δτ=24小時)太長了,所以那個無賴承受的痛苦程度一天一利索,沒有疊加,始終是一個常數;如果縮短打板子的時間間隔(建議Δτ=0.5秒),那他的痛苦程度可就迅速疊加了;等到這無賴挨三十個大板(t=30)時,痛苦程度達到了他能喊叫的極限,會收到最好的懲戒效果,再多打就顯示不出您的仁慈了。

——還是不太明白,時間間隔小,為什麼痛苦程度會疊加呢?

——這與人(線性時不變系統)對板子(脈衝、輸入、激勵)的響應有關。什麼是響應?人挨一個板子後,疼痛的感覺會在一天(假設的,因人而異)內慢慢消失(衰減),而不可能突然消失。這樣一來,只要打板子的時間間隔很小,每一個板子引起的疼痛都來不及完全衰減,都會對最終的痛苦程度有不同的貢獻:
t個大板子造成的痛苦程度=Σ(第τ個大板子引起的痛苦*衰減係數)[衰減係數是(t-τ)的函式,仔細品味]
數學表達為:y(t)=∫T(τ)H(t-τ)

——拿人的痛苦來說卷積的事,太殘忍了。除了人以外,其他事物也符合這條規律嗎?

——呵呵,縣令大人畢竟仁慈。其實除人之外,很多事情也遵循此道。好好想一想,鐵絲為什麼彎曲一
次不折,快速彎曲多次卻會輕易折掉呢?

——恩,一時還弄不清,容本官慢慢想來——但有一點是明確地——來人啊,將撒尿的那個無賴抓來,
狠打40大板!

整理來自:時間的詩