神经网络优化
学习率(learning_rate)
学习率表示的是神经网络参数更新的幅度:
W
n
+
1
=
W
n
−
l
e
a
r
n
i
n
g
_
r
a
t
e
∗
▽
W_{n+1} = W_n - learning\_rate*▽
Wn+1=Wn−learning_rate∗▽
其中,Wn+1表示更新后的参数,Wn表示当前参数,learning_rate即定义的学习率值,▽表示损失函数的梯度(导数)。
学习率在某种程度上代表了神经网络训练中信息学习的速度,学习率如果定义过大则神经网络将振荡不收敛,过小则收敛速度慢,如下图所示:
在实际神经网络训练中,难以找到最优的学习率使得模型达到理想的效果,因此常常动态设置学习率,即:指数衰减学习率:
l
e
a
r
n
i
n
g
_
r
a
t
e
=
L
E
A
R
N
I
N
G
_
R
A
T
E
_
B
A
S
E
∗
L
E
A
R
N
I
N
G
_
R
A
T
E
_
D
E
C
A
Y
g
l
o
b
a
l
_
s
t
e
p
(
L
E
A
R
N
I
N
G
_
R
A
T
E
_
S
T
P
E
)
learning\_rate = LEARNING\_RATE\_BASE * LEARNING\_RATE\_DECAY^{\frac{global\_step}{(LEARNING\_RATE\_STPE)}}
learning_rate=LEARNING_RATE_BASE∗LEARNING_RATE_DECAY(LEARNING_RATE_STPE)global_step
其中,learning_rate表示学习率基数,LEARNING_RATE_BASE表示学习率初始值,LEARNING_RATE_DECAY表示学习率衰减率(0,1),gloabl_step表示运行了多少次BATCH_SIZE,LEARNING_RATE_STPE表示神经网络训练多少轮后更新学习率:
L
E
A
R
N
I
N
G
_
R
A
T
E
_
S
T
P
E
=
总
样
本
数
量
/
B
A
T
C
H
_
S
I
Z
E
LEARNING\_RATE\_STPE = 总样本数量 / BATCH\_SIZE
LEARNING_RATE_STPE=总样本数量/BATCH_SIZE
指数衰减学习率使用tensorflow程序实现如下:
learning_rate = tf.train.exponential_decay(
LEARNING_RATE_BASE,
global_step,
LEARNING_RATE_STEP,
LEARNING_RATE_DECAY,
staircase=True) //True:学习率阶梯型衰减,False:学习率平滑下降
滑动平均
滑动平均记录了所有参数(w,b)一段时间内过往值的平均,增加了模型的泛化性,其计算公式如下:
滑
动
平
均
值
=
衰
减
率
∗
滑
动
平
均
值
+
(
1
−
衰
减
率
)
∗
参
数
滑动平均值 = 衰减率*滑动平均值+(1-衰减率)*参数
滑动平均值=衰减率∗滑动平均值+(1−衰减率)∗参数
其中,衰减率计算表示如下:
衰
减
率
=
m
i
n
{
M
O
V
I
N
G
_
A
V
E
R
A
G
E
_
D
E
C
A
Y
,
1
+
轮
数
10
+
轮
数
}
衰减率=min\{MOVING\_AVERAGE\_DECAY,\frac{1+轮数}{10+轮数}\}
衰减率=min{MOVING_AVERAGE_DECAY,10+轮数1+轮数}
滑动平均值使用tensorflow程序实现如下:
ema = tf.train.ExponentialMovingAverage(
MOVING_AVERAGE_DECAY, //衰减率,例如:0.99
global_step, //当前训练轮数
)
ema_op = ema.apply(tf.trainable_ariables()) //将所有待优化的参数求滑动平均值
with tf.control_dependencies([train_step, ema_op]):
train_op = tf.no_op(name='train') //将训练过程和求滑档平均值绑定在一起运行
ema.average(参数名) //查看某参数的滑动平均值
正则化
当训练数据中存在噪声,模型训练可能产生过拟合现象,即:在训练数据集上正确率远大于在实际预测中的正确率,为了解决神经网络的过拟合现象,我们引入正则化,在损失函数中引入模型复杂度指标,利用给W加权值,弱化训练数据的噪声。
加入正则化的损失函数定义如下:
l
o
s
s
=
l
o
s
s
(
y
,
y
_
)
+
R
E
G
U
L
A
R
I
Z
E
R
∗
l
o
s
s
(
w
)
loss=loss(y, y\_)+REGULARIZER*loss(w)
loss=loss(y,y_)+REGULARIZER∗loss(w)
其中,loss(y, y_)表示模型中所有参数的损失函数,如:均方误差、交叉熵等;
REGULARIZER即定义的超参数,表示权重参数W在总loss中占有的比例,即正则化的权重;
loss(w)中的w表示正则化的参数,常见的计算方式有L1正则化、L2正则化。
- L1正则化的计算公式如下:(L1正则化会让很多参数变成零,因此该方法可通过稀疏参数,即减少参数的数量,降低复杂度)
l o s s L 1 ( w ) = ∑ i ∣ w i ∣ loss_{L1}(w)=\sum_{i}\left|w_i\right| lossL1(w)=i∑∣wi∣
L1正则化使tensorflow程序实现如下:
loss(w) = tf.contrib.layers.l1_regularizer(REGULARIZER)(w)
- L2正则化的计算公式如下:(L2正则化会让参数接近零但不是零,因此该方法可通过减小参数值的大小降低复杂度)
l o s s L 2 ( w ) = ∑ i ∣ w i 2 ∣ loss_{L2}(w)=\sum_{i}\left|w_i^2\right| lossL2(w)=i∑∣∣wi2∣∣
L2使用tensorflow程序实现如下:
loss(w) = tf.contrib.layers.l2_regularizer(REGULARIZER)(w)
正则化过程使用tensorflow程序实现如下:
tf.add_to_collection('losses',tf.contrib.layers.l2_regularizer(regularizer)(w)) //使用正则化将所有参数w的正则化值加到集合losses中
loss = cem + tf.add_n(tf.get_collection('losses')) //将模型损失函数值和权重参数w的正则化值相加组成总损失函数
当在神经网络中运用正则化与不用正则化时,神经网络经过训练会产生不一样的拟合曲线:
未用正则化:
使用正则化:
由此,可以看出使用加入正则化可以让神经网络在训练时弱化噪声对训练参数的影响,进而解决神经网络的过拟合现象。