[pdf][supp]
这篇论文发布在18年的NeurIPS上,内容偏理论,比较晦涩难懂,借助Youtube上一些比较优质的讲解视频,我总算是搞懂了这篇论文的核心思想,至于其他的部分,因为视频中并没有讲解,可以认为不是这篇论文的核心,所以等有需要时再来研究
Method
首先我们来看普通的ResNet,如图

输入一个x,由网络获得一个输出F(x),最终获得的结果为F(x)+x。本文中,为了与论文符号保持一致,我们用f表示函数F,用z表示输入x
这是ResNet其中的一层,而对于一个多层的ResNet,我们用t来表示层数,其公式可以表示为
zt+1=zt+f(zt,θt)
zt是第t层的输入,该层网络可以认为是一个黑匣子,由ResNet模拟了一个函数f,这个函数的输出f(zt,θt),与该层的输入zt和该层的网络参数θt有关
从公式我们看到,z在不同的层具有不同的输出,那我们是否可以将z看作一个关于参数t的函数z(t),此时,以上公式就变成了一个常微分方程
ε→0limz(t+ε)−z(t)=dtdz(t)=f(z(t),t,θ)
该方程的解就是z(t),此时的t将不限于整数,而是任意一个实数,获得输出的过程如下
假设初始时刻为t0,则初始的输入为z(t0),而我们需要t1时刻的输出,那么获得输出并计算loss的方法如下
L(z(t1))=L(z(t0)+∫t0t1f(z(t),t,θ)dt)=L(ODESolve(z(t0),f,t0,t1,θ))
如果需要更多的输出,我们可以增加t2,t3,...
Optimize
方法与之前不同,优化方法也与之前不一样,首先来看传统的ResNet的优化方式,当我们获得了loss L,我们需要计算的L关于参数θ的梯度
以从t到t+1为例,已知
zt+1=zt+f(zt,θ)
则反向传播为
∂zt∂L=∂zt+1∂L∂zt∂zt+1=∂zt+1∂L∂zt∂(zt+f(zt,θ))=∂zt+1∂L(1+∂zt∂f(zt,θ))=∂zt+1∂L+∂zt+1∂L∂zt∂f(zt,θ)
L关于参数θ的梯度为
∂θ∂L=∂zt+1∂L∂θ∂zt+1=∂zt+1∂L∂θ∂(zt+f(zt,θ))=∂zt+1∂L∂θ∂f(zt,θ)
而当z是连续的时,反向传播是无法用链式法则计算的,或者说,使用链式法则的准确度不高,而且需要消耗巨大内存,因此使用了另一个微分方程求解以计算梯度
首先,另a(t)=∂z(t)∂L,则有结论如下
Forward:
z(t+1)=z(t)+∫tt+1f(z(t),t,θ)dt
Backword:
a(t)=a(t+1)+∫t+1t−a(t)∂z(t)∂f(z(t),t,θ)dt
Params:
∂θ∂L=∫tt+1a(t)∂θ∂f(z(t),t,θ)dt
以下为证明:
首先需要证明的是
dtda(t)=−a(t)∂z(t)∂f(z(t),t,θ)
过程如下,首先设一个很小的值ε,且
z(t+ε)=∫tt+εf(z(t),t,θ)dt+z(t)=Tε(z(t),t)
那么根据链式法则可以得到
a(t)=a(t+ε)∂z(t)∂Tε(z(t),t)
根据定义计算a(t)的导数
dtda(t)=ε→0+limεa(t+ε)−a(t)=ε→0+limεa(t+ε)−a(t+ε)∂z(t)∂Tε(z(t))=ε→0+limεa(t+ε)−a(t+ε)∂z(t)∂(z(t)+εf(z(t),t,θ)+O(ε2))=ε→0+limεa(t+ε)−a(t+ε)(I+ε∂z(t)∂f(z(t),t,θ)+O(ε2))=ε→0+lim−a(t+ε)∂z(t)∂f(z(t),t,θ)+εO(ε2)=−a(t)∂z(t)∂f(z(t),t,θ)
此时可以认为
∂θ∂L=∂z(t)∂L∂θ∂z(t)=∫t1t0a(t)∂θ∂f(z(t),t,θ)dt
文中的图可以很好地描述反向传播的过程

对于每一个loss都使用ODE求解器往前计算a(t)的值,具体的操作流程如下

总结
第一次读这篇文章时惊为天人,可以说是一点也没有读懂,但是体会到了具体的思路,后来才借助了一些讲解视频逐渐搞懂。不得不感叹作者十分厉害,不仅提出了新型的网络,还巧妙地使用了另一个ODE求解器解决了反向传播和训练的问题,十分的优雅
因为是为了理解另一篇文章才读的,当时有种感觉,那篇文章可能和talk-to-edit里图像编辑的思路很相近。后来果然发现,上述两篇文章的思想其实如出一辙,都是nonlinear image editing。而NueralODE确实十分适合解决这个问题,并且它适合的场景不限制于人脸编辑,比talk-to-edit中的方法要更强大。目前在做对于两者的人脸图像编辑的对比实验,找一找其中存在的问题