深度学习的三个步骤:
如果要想得到一个更好的神经网络应该怎么做:
1、提高模型在训练集上的正确率
深度学习并不会像K近邻等方法,一次训练就得到较好的正确率,他可能在训练集上没办法得到较好的正确率,这个时候就需要回头检查前面的步骤里需要修改的部分,如何使得训练集得到较高的正确率。
2、提高模型在测试集上的正确率
如果已经在训练集上取得好的效果,这时就需要考虑在测试集上的正确率,假如结果不好,这个情况是过拟合,需要回头解决过拟合问题。
3、并不是所有不好的情况都是过拟合
如图所示,横坐标是模型做梯度下降所更新的次数,纵坐标是error rate,黄线是20层网络,红线表示56层网络,可以从测试数据中看出56层的效果没有20层好。但是这并不是过拟合,从训练数据中可以看出在训练集上20层的效果就好于56层,所以这是没有训练好的原因。
总的说:
1、训练集上表现不好
2、测试集上表现不好
下面从两个方面,介绍针对性优化方法:
1、训练集上
训练集上总的来说有两个方面:
1、新的激励函数
如果训练不好,有可能是网络架构设计的不好,可能用的**函数是对训练不利的,可以更换一些新的**函数。
梯度消失问题:
以三个隐藏层的单神经元神经网络为例,**函数采用sigmoid:
假设每一层网络**后输出为
f
i
(
x
)
f_{i}(x)
fi(x),其中i为第i层,x代表第i层的输入,也是第i-1的输出,f是**函数,可以得出:
f
i
+
1
=
f
(
f
i
∗
w
i
+
1
+
b
i
+
1
)
f_{i+1} = f(f_{i}*w_{i+1}+b_{i+1})
fi+1=f(fi∗wi+1+bi+1)记为:
f
i
+
1
=
f
(
f
i
∗
w
i
+
1
)
f_{i+1} = f(f_{i}*w_{i+1})
fi+1=f(fi∗wi+1)。
反向传播算法基于梯度下降策略,以目标的负梯度方向对参数进行调整,参数的更新为:
w
←
w
+
△
w
w\leftarrow w+\bigtriangleup w
w←w+△w,假如更新第二隐层的的权值信息,根据链式求导法则,更新梯度信息:
Δ
w
2
=
∂
L
o
s
s
∂
w
2
=
∂
L
o
s
s
∂
f
4
∂
f
4
∂
f
3
∂
f
3
∂
f
2
∂
f
2
∂
w
2
\Delta w_{2} = \frac{\partial Loss}{\partial w_{2}} = \frac{\partial Loss}{\partial f_{4}} \frac{\partial f_{4}}{\partial f_{3}}\frac{\partial f_{3}}{\partial f_{2}}\frac{\partial f_{2}}{\partial w_{2}}
Δw2=∂w2∂Loss=∂f4∂Loss∂f3∂f4∂f2∂f3∂w2∂f2
由
f
2
=
f
(
f
1
∗
w
2
)
f_{2} = f(f_{1}*w_{2})
f2=f(f1∗w2)得:
∂
f
2
∂
w
2
=
∂
f
∂
f
1
∗
w
2
f
1
\frac{\partial f_{2}}{\partial w_{2}} = \frac{\partial f}{\partial f_{1}*w_{2}} f_{1}
∂w2∂f2=∂f1∗w2∂ff1,其中
f
1
f_{1}
f1是第一层的输出。
∂
f
4
∂
f
3
=
f
′
∗
w
4
∗
∂
f
3
∂
f
2
=
f
′
∗
w
3
\frac{\partial f_{4}}{\partial f_{3}} = f^{'}*w_{4}*\frac{\partial f_{3}}{\partial f_{2}} = f^{'}*w_{3}
∂f3∂f4=f′∗w4∗∂f2∂f3=f′∗w3
对**函数进行求导
f
′
f^{'}
f′,如果此部分大于1,当层数增加时,最终得求出的梯度更新将以指数形式增加,即发生梯度爆炸,如果此部分小于1时,随着层数增加,求出的梯度更新将以指数得形式衰减,即发生梯度消失。
更改**函数可以解决梯度下降的问题:
1、ReLU
Rectified Linear Unit(整流线性单元函数,修正线性单元,ReLU)该函数形状如下图所示,z为输入,a为输出,如果输入大于0,则输出等于输入,如果输入小于0则输出等于0:
ReLU的优点:
1、跟sigmoid函数相比,ReLU函数运算比较快
2、ReLU的想法结合了生物上的观察
3、无穷多bias不同的sigmoid函数叠加结果会变成ReLU
4、ReLU可以处理梯度下降的问题
相关文章: