当前位置:首页>维修大全>生活>

残差怎么算(残差越大越好还是越小越好)

残差怎么算(残差越大越好还是越小越好)

更新时间:2022-04-24 05:17:31

论文:《Deep Residual Learning for Image Recognition》

目录

  • 背景
  • 残差网络
  • 解决的问题

关键词:残差连接、网络退化

一、背景

在深度神经网络中,当网络很深时,除了增加计算资源消耗以及模型过拟合问题外,还会出现梯度消失/爆炸问题,导致浅层网络参数无法更新。

而且深层的网络还有一个问题,假设我们的初始设定网络是M层,而其实最优化模型对应的层数可能是K层,那么多出来的(M-K)层网络结构,不仅不会提升模型的表达能力,反而使得模型的效果变差(表现为Loss先下降并趋于稳定值,然后再次上升。),这就产生了网络退化问题。

基于以上问题,CV领域里ResNet模型中的残差网络闪亮登场了。

其实我在看BERT模型的原理时也发现了BERT模型中存在着残差连接(Transformer中的attention层之后的Add,与LayerNorm一起使用)的现象。现在想想,果然加得很有必要啊!

二、残差网络

定义问题统计学中的残差和误差是非常易混淆的两个概念。误差是衡量观测值和真实值之间的差距,残差是指预测值和观测值之间的差距。为什么叫残差网络呢?作者的解释是,网络的一层通常可以看做y=H(x),而残差网络的一个残差块为:H(x)=F(x) x,则F(x) = H(x)-x,而y=x是观测值,H(x)是预测值,所以H(x)-x即为残差,也即F(x)是残差,故称残差网络

深层网络在前向传播时,随着网络加深,网络获得的信息会逐层递减,而ResNet针对该问题的处理方式是“直接映射”,即下一层不仅包括该层的信息x,还包括该层经非线性变换后的新信息F(x)。这样的处理使得信息反而呈现逐层递增趋势。这可太好用了,可以不用担心信息的丢失问题了。

残差网络是由一系列残差块组成的。残差块的结构如下:

一个残差块可表示为:

残差块分直接映射部分残差部分。残差部分一般由2个或2个以上的卷积操作组成【ResNet论文中的处理,BERT中其实经过了Self-Attention模块,包括之后的一层全连接层】。但当 与 的维度不一致时,残差块需要表示为:

其中 。

三、解决的问题

解决梯度消失网络退化的问题。

为什么可解决梯度消失?

由残差块的表示式可得:

上述过程说明:L层可以表示为任意一个比它浅的l层和它们之间的残差部分之和。也说明了残差网络在训练的过程中始终保留了原始信息,还增加了网络中获取的新知识

设损失函数为Loss,则根据BP算法的链式求导公式:

由损失函数的梯度计算结果可知,网络在进行反向传播时,错误信号可以不经过任何中间权重矩阵变换直接传播到低层,一定程度上可以缓解梯度弥散(梯度消失)问题(即便中间层矩阵权重很小,梯度也基本不会消失)。

残差连接使得信息前后向传播更加顺畅。

为什么可解决网络退化?

假设某层是冗余的,在引入ResNet之前,我们想让该层学习到的参数能够满足H(x)=x,即输入是x,经过该冗余层后,输出仍为x。但是要想学习h(x)=x恒等映射时的参数是很难的。ResNet想到避免去学习该层恒等映射的参数,使用了如上图的结构,让H(x)=Relu(F(x) x);我们发现,要想让该冗余层能够恒等映射,我们只需要学习F(x)=0。学习F(x)=0比学习h(x)=x要简单,因为一般每层网络中的参数初始化偏向于0,并且ReLU能够将负数激活为0,这样在相比于更新该网络层的参数来学习h(x)=x,该冗余层学习F(x)=0的更新参数能够更快收敛,如图所示:

假设该层网络只经过线性变换,没有bias也没有激活函数。我们发现因为随机初始化权重一般偏向于0,那么经过该网络的输出值为[0.6 0.6],很明显会更接近与[0 0],而不是[2 1],相比于学习h(x)=x,模型要更快地学习到F(x)=0。并且Relu能够将负数激活为0,过滤了负数的线性变化,也能够更快的使得F(x)=0。这样当网络自己决定哪些网络层为冗余层时,使用ResNet网络很大程度上解决了学习恒等映射的问题,用学习残差F(x)=0更新该冗余层的参数来代替学习h(x)=x更新冗余层的参数。

这样当网络自行决定了哪些层为冗余层后,通过学习残差F(x)=0来让该层网络恒等映射上一层的输入,使得有了这些冗余层的网络效果与没有这些冗余层的网络效果相同,这样很大程度上解决了网络退化问题。

有兴趣也可关注一波:叮当猫 - 知乎

每天进步一点点~

一起学习,一起监督。

,

更多栏目