一種關於感受野尺寸計算的思路


前文的思路存在問題,文末部分進行了更正。


Preface

知道這個詞一年多了,還記得當時的情景,當時沒有涉及到CNN就過去了,后面才知道是一個有趣的事物。前不久打算估計一下網絡的這一指標,發現並不那么輕松,就准備另找時間。昨晚的PR課突然發現沒什么可以打發時間的了,搜腸一番,那就列些等式吧。

Step1

剛提筆那會發現沒什么簡潔明了的思路,還一度考慮用仿真的方法編程算了。后面想到了一種逆向計算的思路,覺得可行。

Proposal

這種思路是把關注點放在兩端上:如果一段長為\(l_0\)的區域(現在只考慮一維情況),通過網絡后輸出為的長度為\(l_T\)。那么當\(l_T=1\)時,就認為其感受野為\(1\)。(說實話,wikipedia上的定義什么的我還沒看,我所理解的感受野是指:輸入中某種最大空間范圍,這個范圍內的所有數據,都有可能在輸出中存在相互作用。寫完這把,我再去看看正式的定義,但目前這個定義對我現在的認知來說,還是有意義的)。
於是就可以這樣考慮,每一個操作層都會使數據的長度發生變化,並且這個變化的屬性只與這一層有關。於是我們可以尋找一個長度\(l_0\)使得在經過所有層后,其長度為\(1\)

Method

長度的變化關系如下面這個圖(裝了asymptote的機器正在run,先忍忍,后面找時間改圖):
長度變化流程
convpool操作都可處理為統一的符號。

Op Analysis

於是我們來考慮單個操作的屬性。
首先pad操作不能擴展信息量,不能被考慮,剩下的是核尺寸\(k\)和步長\(s\)
一段長為\(l_n\)的數據,首先被核截取兩端,然后剩下的那部分再用步長處理,第一個關系式:

\[\begin{equation}\label{eq:l_n+1} l_{n+1} = \lceil \frac{l_n-2\times\lfloor\frac{k_n}{2}\rfloor}{s_n}\rceil \end{equation} \]

此處,最外層上取整的原因是步長從去兩端后的首個數據開始。
根據Proposal的思路,我們是從輸出端向輸入端計算的,現在需要根據\(l_{n+1}\)計算\(l_n\),拆分成兩個不等式計算:

\[\begin{equation}\label{eq:joint_ineq} \frac{l_n-2\lfloor\frac{k_n}{2}\rfloor}{s_n}\leq l_{n+1} < \frac{l_n-2\lfloor\frac{k_n}{2}\rfloor}{s_n}+1 \end{equation} \]

得到關於\(l_n\)為中心的不等式:

\[\begin{equation}\label{eq:joint_l_n} L_{n+1}-s_n<l_n\leq L_{n+1} \end{equation} \]

其中

\[\begin{equation}\label{eq:L_n+1} L_{n+1}=s_nl_{n+1}+2\lfloor\frac{k_n}{2}\rfloor \end{equation} \]

\ref{eq:joint_l_n}得到的是一個范圍,取值的話應該是最大整數,於是\(l_n\)的計算式應該是

\[\begin{equation}\label{eq:l_n} l_n=\lceil s_nl_{n+1}+2\lfloor\frac{k_n}{2}\rfloor\rceil \end{equation} \]

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\)計算,修正的方式就是將操作進行的次數作為標准:

\[\begin{equation}\label{eq:R} R=(l_1-1)s_1+1+2\times\lfloor\frac{k_1}{2}\rfloor \end{equation} \]

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

感覺到需要一個統一的模型進行描述,用這張圖好了。

Hierarchy of Receptive Field
圖中藍色的箭頭指示序列長度$l$的變化,$e$是在層間傳遞時損失的長度。紅色的箭頭指示下一層序列**最多**能吸收到的上一層數據長度。 這樣看來,`由兩端的數據長度着手的思路是一個誤解`,實際的感受野應當是由紅色箭頭引導出的$R$。計算法則為\ref{eq:R},只是需要更換下符號: $$ \begin{eqnarray} R_n& =& (R_{n+1}-1)s_{n+1}+1+2\times\lfloor\frac{k_{n+1}}{2}\rfloor\nonumber\\ & = & (R_{n+1}-1)s_{n+1}+k_{n+1} \end{eqnarray} $$ 最后的計算是: $$ \begin{equation}\label{eq:R_final} R=R_n \end{equation} $$

Appendix

式子簡潔沒必要放code了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM