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

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


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)的数据,首先被核截取两端,然后剩下的那部分再用步长处理,第一个关系式:

[egin{equation}label{eq:l_n+1} l_{n+1} = lceil frac{l_n-2 imeslfloorfrac{k_n}{2} floor}{s_n} ceil end{equation} ]

此处,最外层上取整的原因是步长从去两端后的首个数据开始。
根据Proposal的思路,我们是从输出端向输入端计算的,现在需要根据(l_{n+1})计算(l_n),拆分成两个不等式计算:

[egin{equation}label{eq:joint_ineq} frac{l_n-2lfloorfrac{k_n}{2} floor}{s_n}leq l_{n+1} < frac{l_n-2lfloorfrac{k_n}{2} floor}{s_n}+1 end{equation} ]

得到关于(l_n)为中心的不等式:

[egin{equation}label{eq:joint_l_n} L_{n+1}-s_n<l_nleq L_{n+1} end{equation} ]

其中

[egin{equation}label{eq:L_n+1} L_{n+1}=s_nl_{n+1}+2lfloorfrac{k_n}{2} floor end{equation} ]

ef{eq:joint_l_n}得到的是一个范围,取值的话应该是最大整数,于是(l_n)的计算式应该是

[egin{equation}label{eq:l_n} l_n=lceil s_nl_{n+1}+2lfloorfrac{k_n}{2} floor ceil end{equation} ]

Step2

以上是昨晚的结果,今早进行整理的时候发现存在些问题。
比如网络只有一个核尺寸为(3),步长为(2)conv层,记为A,那么根据 ef{eq:l_n},其感受野(R=2 imes 1+2 imes 1=4);而如果将步长改为(1),记为B,则(R=1 imes 1+2 imes 1=3)。很明显,两个网络的感受野都应为(3)

Flaw

我们从A中的计算结果考虑问题是怎样出现的:
假定现在的输入长度为(4)(序列: (I:={a,b,c,d})),然后用该核进行处理。只能得到一个元素的集合:(O:={conv({a,b,c})})。也就是说,实际的(R)只有(3)(d)因为没有参与计算,不能算入(R)中,但在这种计算方式下(以输入数据长度衡量)却被考虑进去了。

Fixing

上述的情况只有在第一层的时候才会产生作用,因为经过第一层,各数据已经产生耦合了,后续的目标只是降维就好。所以只需要对最后的(R)计算,修正的方式就是将操作进行的次数作为标准:

[egin{equation}label{eq:R} R=(l_1-1)s_1+1+2 imeslfloorfrac{k_1}{2} floor end{equation} ]

Solution

最后的方案是,根据 ef{eq:l_n},从(l_T=1)开始迭代至(l_1),然后根据 ef{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$。计算法则为 ef{eq:R},只是需要更换下符号: $$ egin{eqnarray} R_n& =& (R_{n+1}-1)s_{n+1}+1+2 imeslfloorfrac{k_{n+1}}{2} floor onumber\ & = & (R_{n+1}-1)s_{n+1}+k_{n+1} end{eqnarray} $$ 最后的计算是: $$ egin{equation}label{eq:R_final} R=R_n end{equation} $$

Appendix

式子简洁没必要放code了。

原文地址:https://www.cnblogs.com/chenyliang/p/7079702.html