汇聚全球视觉新闻资讯
你所在的位置:汇视网 > 聚焦 >科技

R语言残差网络(ResidualNetwork)深层网络训练

发布时间:2017-05-01 13:18  来源:汇视网   编辑:张璠  阅读量:14846   

目前我们在训练极深层网络时,最有效的方法是使用残差网络(Residual Network)结构。关于残差网络,一种常见的理解方法是认为它等价于多个浅层网络的 ensemble(见 1605.06431),但这不足以解释几个现象,例如:

  • ReLU 和卷积的排列顺序,为什么按照 1603.05027 的方法比较好?

  • 为什么要旁路掉 2 层网络才能得到不错的结果?如果只旁路掉 1 层,为什么效果并不好?

其实可以用一个极其简单的模型探讨这两个现象。虽然这里的模型极其简单,但好像还没有看到有人这样说,如果你看过有人这样说,请告诉我。

我们都知道,用 2 层网络,配合足够多的神经元,就可以拟合任何函数。

那么考虑这个问题: 如果我们在每层只用 1 个神经元,但是用足够深的网络,以及合理的网络架构,是否也可以拟合任何函数?答案也是肯定的,而且需要用残差结构才能得到较好的结果 。

不妨看个具体例子,因为一般情况的证明是显然的。需要说明,理论能拟合,不代表实际能拟合。实际的拟合情况是这里的关键。

只需看一个极其简单的回归问题,使用 MSE 损失。我们的目标是在 (-3, 3) 区间拟合 sin(x):

方法 1 :

如果用直接的方法:

我们会发现多加几层后就根本无法训练,全部清零。原因很简单,ReLU 会不断丢失信息。当 ReLU 给出 0 之后,后面就全死了。如果网络的层数少,还可以得到这样的结果:

如果层数一多,就肯定全部清零。

如果层数一多,就肯定全部清零。

方法 2 :

那么加上残差结构吧,比如旁路掉 1 层:

这个肯定也不行。因为 x 只会变大,我们会得到类似这样的结果:

方法 3 :

最简单的解决方法就是旁路掉 2 层。因为如果熟悉 ReLU 就会知道,ReLU 是可以给出负值的,只需要 2 层即可。例如 -Max(0, -x) = Min(0, x)。

于是,最简单的满足我们要求的 2 层结构,就是 Convolution => ReLU => Convolution(这其实就是 1610.02915 PyramidNet 的结构了):

可以得到类似这样的结果:

易证这种方法可以拟合任何函数,

易证这种方法可以拟合任何函数, 因为它其实就是在不断"折"一条线

。不过,如果层数很多,仍然可能死掉,拟合效果卡住。

方法 4 :

把 ReLU 再换成 leaky 的,例如 PReLU。这就基本解决了死亡问题,可以保证多层训练的效果,例如:

最后,如果我们把方法 1 中的 ReLU 换成 PReLU,是否可以解决死亡问题?遗憾的是不行。这里涉及到数值稳定性。最好的方法仍然是方法 4 的旁路2层残差+PReLU。

最后,如果我们把方法 1 中的 ReLU 换成 PReLU,是否可以解决死亡问题?遗憾的是不行。这里涉及到数值稳定性。最好的方法仍然是方法 4 的旁路2层残差+PReLU。

总结:

下一步自然的问题是做数值稳定性的分析。在下一篇写吧。深度网络的奥秘在于深度,因此在后文也会继续探讨训练这种极窄极深的网络的办法。

此外,在数学上容易看到残差结构的必要性:假设网络的层数很多,那么每一层就最好接近于 identity map,否则本征值很容易发散或消亡(严格说,不一定如此,因为还可以用更精细的方法控制本征值,不过这也是后话了)。

欢迎关注 《 数据分析必知必会课程》!上线特惠88元!

郑重声明:此文内容为本网站转载企业宣传资讯,目的在于传播更多信息,与本站立场无关。仅供读者参考,并请自行核实相关内容。

相关搜索热词:网络,训练