前文的思路存在問題,文末部分進行了更正。
Preface
知道這個詞一年多了,還記得當時的情景,當時沒有涉及到CNN就過去了,后面才知道是一個有趣的事物。前不久打算估計一下網絡的這一指標,發現並不那么輕松,就准備另找時間。昨晚的PR課突然發現沒什么可以打發時間的了,搜腸一番,那就列些等式吧。
Step1
剛提筆那會發現沒什么簡潔明了的思路,還一度考慮用仿真的方法編程算了。后面想到了一種逆向計算的思路,覺得可行。
Proposal
這種思路是把關注點放在兩端上:如果一段長為\(l_0\)的區域(現在只考慮一維情況),通過網絡后輸出為的長度為\(l_T\)。那么當\(l_T=1\)時,就認為其感受野為\(1\)。(說實話,wikipedia上的定義什么的我還沒看,我所理解的感受野是指:輸入中某種最大空間范圍,這個范圍內的所有數據,都有可能在輸出中存在相互作用。寫完這把,我再去看看正式的定義,但目前這個定義對我現在的認知來說,還是有意義的)。
於是就可以這樣考慮,每一個操作層都會使數據的長度發生變化,並且這個變化的屬性只與這一層有關。於是我們可以尋找一個長度\(l_0\)使得在經過所有層后,其長度為\(1\)。
Method
長度的變化關系如下面這個圖(裝了asymptote的機器正在run,先忍忍,后面找時間改圖):
conv和pool操作都可處理為統一的符號。
Op Analysis
於是我們來考慮單個操作的屬性。
首先pad操作不能擴展信息量,不能被考慮,剩下的是核尺寸\(k\)和步長\(s\)。
一段長為\(l_n\)的數據,首先被核截取兩端,然后剩下的那部分再用步長處理,第一個關系式:
此處,最外層上取整的原因是步長從去兩端后的首個數據開始。
根據Proposal的思路,我們是從輸出端向輸入端計算的,現在需要根據\(l_{n+1}\)計算\(l_n\),拆分成兩個不等式計算:
得到關於\(l_n\)為中心的不等式:
其中
\ref{eq:joint_l_n}得到的是一個范圍,取值的話應該是最大整數,於是\(l_n\)的計算式應該是
Step2
以上是昨晚的結果,今早進行整理的時候發現存在些問題。
比如網絡只有一個核尺寸為\(3\),步長為\(2\)的conv層,記為A,那么根據\ref{eq:l_n},其感受野\(R=2\times 1+2\times 1=4\);而如果將步長改為\(1\),記為B,則\(R=1\times 1+2\times 1=3\)。很明顯,兩個網絡的感受野都應為\(3\)。
Flaw
我們從A中的計算結果考慮問題是怎樣出現的:
假定現在的輸入長度為\(4\)(序列: \(I:=\{a,b,c,d\}\)),然后用該核進行處理。只能得到一個元素的集合:\(O:=\{conv(\{a,b,c\})\}\)。也就是說,實際的\(R\)只有\(3\),\(d\)因為沒有參與計算,不能算入\(R\)中,但在這種計算方式下(以輸入數據長度衡量)卻被考慮進去了。
Fixing
上述的情況只有在第一層的時候才會產生作用,因為經過第一層,各數據已經產生耦合了,后續的目標只是降維就好。所以只需要對最后的\(R\)計算,修正的方式就是將操作進行的次數作為標准:
Solution
最后的方案是,根據\ref{eq:l_n},從\(l_T=1\)開始迭代至\(l_1\),然后根據\ref{eq:R}計算最后結果。
Further Discussion
剛才在討論中,發現一個可能牽涉到pad的環節。
問題發生在Step2中的Flaw中:如果存在了pad,\(O\)就有可能出現兩個元素。——然而這仍不能改變\(R\)的計算。
另外pad實際發生在兩端,實際進行計算(計算\(R\))的時候,可以認為是在中部區域計算的。這也支持pad無關假設。
Jun 27, 2017 更正
之前的討論,存在着某些問題,給人感覺沒有清晰統一的模型。這就導致,Fixing所述的補丁方法也存在問題,比如
\(k_1=3,s_1=1;k_2=3,s_2=2\),輸入序列為\(I:=\{a,b,c,d,e,f\}\),那么第一層輸出\(O_1:=\{conv1(\{a,b,c\},conv1(\{b,c,d\},conv1(\{c,d,e\},conv1(\{d,e,f\})\}=\{a_1,b_1,c_1,d_1\}\),第二層輸出\(O_2:=\{conv2(\{a_1,b_1,c_1 \})\}\)。也就是說\(f\)被遺漏了,但按照fixing的方法,\(f\)仍被計算入\(R\)中。
Model
感覺到需要一個統一的模型進行描述,用這張圖好了。

Appendix
式子簡潔沒必要放code了。