神经网络的训练

NN 训练

1、训练精度曲线和验证精度曲线
两个曲线的gap可以看出过拟合程度。如果gap过大,则说明有很强的过拟合发生;相反当gap很小的时候,说明过拟合情况没有那么严重。
这里写图片描述
对于强烈过拟合的情况,可以增加正则项的权重,或者增大样本数据来解决;对于绿色曲线,train/val accuracy相差不大,这时,可以尝试增大模型复杂度。
2、学习速率的确定
可以通过更新权重前后权重的比值来确定学习速率过大或者过小,这个比值一般为1e-3,若得到的值比这个数值大,则说明学习速率太大

'python'
# assume parameter vector W and its gradient vector dW
param_scale = np.linalg.norm(W.ravel())
update = -learning_rate*dW # simple SGD update
update_scale = np.linalg.norm(update.ravel())
W += update # the actual update
print update_scale / param_scale # want ~1e-3

同时,观察损失函数的数值,若下降不明显,则是学习速率太低;若出现Nan可能是学习速率太高,出现了explode。解决办法可以是,设定当新loss大于原loss的3倍时,停止迭代。大体上来说学习速率应该位于1e-3~1e-5

3、检查每层的梯度分布
可以绘出网络所有层的梯度直方图,对于tanh激活函数,如果分布于-1到1间,则说明网络运行正常;若大部分位于0,则说明出现问题。
4、参数更新
a、Vanilla update

'python'
# Vanilla update
x += - learning_rate * dx

学习速率为一个固定的数值,且为一个超参数,这是一个很大的缺点。
b、Momentum update
对于深度网络来说,这种方法的效果会更好。

# Momentum update
v = mu * v - learning_rate * dx # integrate velocity
x += v # integrate position

这里和SGD不同的时,考虑到物理学上速度的影响,然后才是对路程。其中mu(momentum)类似与摩擦系数、learning_rate相当于加速度
一般情况下mu是作为一个超参数来调整的,例如[0.5, 0.9, 0.95, 0.99]。但一般情况下0.9是不错的选择
总结:
该种形式的更新一方面来说,使较陡方向的速度衰减,同时较平坦方向的速度建立起来
5、Nesterov Momentum update
对Momentum的改进
这里写图片描述
但这时求解方框的导数不容易,可以考虑做一个参数变换
这里写图片描述

v_prev = v # back this up
v = mu * v - learning_rate * dx # velocity update stays the same
x += -mu * v_prev + (1 + mu) * v # position update changes form

6、学习速率的改变
学习速率是优化过程中一个很关键的因素,关于迭代过程中的处理,有以下几种方法:
a、step decay:没几个epoch衰减学习速率。一般情况下,每5次epoch,学习速率应该衰减一般,每20epoch学习速率应该衰减倒0.1倍。但具体的数值还要依赖于模型和数据。一种启发式方法是说,固定学习速率,观察validITion error,当validition error不在降低时,就就降低学习速率到某个固定值
b、exponent decay:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值