神经网络学习记录(学习率、滑动平均、正则化)

神经网络优化

学习率(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=Wnlearning_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_BASELEARNING_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_DECAY10+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_)+REGULARIZERloss(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)=iwi

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)=iwi2

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的正则化值相加组成总损失函数

当在神经网络中运用正则化与不用正则化时,神经网络经过训练会产生不一样的拟合曲线:
未用正则化:
未用正则化神经网络产生的你和曲线
使用正则化:
使用正则化神经网络产生的拟合曲线
由此,可以看出使用加入正则化可以让神经网络在训练时弱化噪声对训练参数的影响,进而解决神经网络的过拟合现象。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值