一种关于感受野尺寸计算的思路

前文的思路存在问题,文末部分进行了更正。


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了。

posted @ 2017-06-26 11:26  rotxin  阅读(1412)  评论(0编辑  收藏  举报