python 深度学习(3) -- 模型优化准则

(一)激活函数的选择

在前面我们提到的激活函数是 sigmoid 函数,但 sigmoid 函数有一个很大的局限性,就是当 x 增大或减少时,它的梯度变得越来也小。如果使用梯度下降或类似的方法,就存在问题。也就是 梯度消失问题 。因为大的负数变为 0 ,大的整数变成 1 这意味着大面积的输入空间被映射到一个非常小的范围。

使用不会将输入空间压缩成狭小范围的激活函数,将可以避免梯度消失的问题。用“非挤压式”函数替换“挤压式”函数能显著的改善深度神经网络的性能。

最常用的“非挤压式”函数之一就是 线性整流函数 ReLu,它的定义是: f(x) = max(x,0)

该激活函数非常流行,因为其显著的提高了语音识别和计算机视觉任务的分类率。该函数只有在输出神经元是正的时候,它才会允许激活。使用 ReLu 代替前面的 sigmoid 函数如下

fit2 = Regressor(
            ''' 使用线性整流函数,最后指定一个线性输出(回归问题的标准) '''
            layers = [Layer("Rectifier",units = 6),Layer("Rectifier",units = 4),Layer("Linear")],
            learning_rate = 0.002,
            random_state = 2018,
            n_iter = 10)  

(二)层数 & 神经元的选择

这个只能根据尝试和经验法则:函数越复杂,需要使用的层数越多;训练模式的数量越多,可使用的神经元数量越多,更多的神经元可以检测数据中的良好结构和规律。但层数越多会使得模型越复杂,过拟合的风险就越大。因此建议遵循 奥卡姆剃刀法则

(三)奥卡姆剃刀法则

简约之法则:若无必要,勿增实体”-- 奥卡姆剃刀法则

   1.如果较小的一组属性能充分拟合观测值,便使用这些属性。避免“叠加”附加属性来提高模型的 拟合度
   2.选择需要最少假设的建模方法
   3.只保留那些与假设的预测有明显差异的假定子集
   4.如果几种假设能同样好的解释一种现象,通常在开始选择最简单的一个

   5.如果几个模型具有相同的预测精度,请选择最简单的模型

(四)奥卡姆法则 -- 正则化

在构建深度神经网络时,面临的永远存在的问题就是过拟合。过拟合的结果是模型在训练集上表现的非常不错,但是在测试样本上都是失败的。为了降低深度神经网络的复杂度并提高泛化能力的一个常见的网络限制方法就是 正则化 。正则化限制了模型的复杂度,这意味着正则化可能会降低模型在训练数据集上的表现。当然可能也不会降低,正则化将通过抑制网络权重避免其变得非常大。正则化有两种,第一种是 L1 正则化,使用权重绝对值的和 。第二种是 L2 正则化,使用权重的平方和。

加入正则化的代码如下:权重衰减参数 0.001

fit4 = Regressor(
            layers = [Layer("Rectifier",units = 6),Layer("Rectifier",units = 14),Layer("Linear")],
            learning_rate = 0.02,
            random_state = 2018,
            ''' 加入正则化 '''
            regularize = "L2",
            weight_decay = 0.001, # 权重衰减参数
            n_iter = 10)

如果正则化后的模型在训练集上的表现相对于不使用正则化来说并没有太大的减弱,则使用正则化简化模型将可以避免过拟合

 

备注:

1.网络权重的冻结

冻结优化模型的权重后,可以将其用于未来数据而不必重新训练模型。这可以通过指定冻结参数来实现。

# 指定 frozen 参数
fitFr = Regressor(
                layers = [Layer("Rectifier",units = 6,frozen = True),Layer("Rectifier",units = 14,frozen = True),
                                                    Layer("Linear")],
                learing_rate = 0.02,
                random_state = 2018,
                regularize = "L2",
                weight_decay = 0.001,
                n_iter = 100)

这里所有层都被冻结。也可以冻结特定的层,如果想调查非冻结层的权重如何响应输入属性,这样做会很有用

2.模型的保存 & 加载

相对于 TensorFlow 来说,这里的保存和加载方式很简洁。

# 保存模型
import cPickle
f = open("Boston_fit4.pkl","w")
cPickle.dump(fit4,f)
f.close()

# 加载模型
f = open("Boston_fit4.pkl")
fit4 = cPickle.load(f)
f.close()
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值