前文的思路存在问题,文末部分进行了更正。
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)为中心的不等式:
其中
ef{eq:joint_l_n}得到的是一个范围,取值的话应该是最大整数,于是(l_n)的计算式应该是
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)计算,修正的方式就是将操作进行的次数作为标准:
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
感觉到需要一个统一的模型进行描述,用这张图好了。
Appendix
式子简洁没必要放code了。