深度学习优化

深度学习性能优化

1 从数据上提升性能

1.1 收集更多的数据

深度学习和其他现代的非线性机器学习模型在大数据集上的效果更好

不总是数据阅读效果更好,深度学习效果越好。

检查这些共同进步,平均运行时间之间的关键算法的建议和相应的进步是十八年,而关键数据集之间的平均运行时间可用性和相应的进步还不到三年,约6倍,这表明数据集可能是进步的限制因素。

1.2 产生更多的数据

如果得不到更多的数据,也可以制造一些数据

Keras提供了ImageDataGenerator类,它定义了图像数据准备和增强的配置

一个增强图像生成器可以创建如下:

datagen = ImageDataGenerator()

与数据匹配:

datagen.fit(train)

配置批处理大小:

X_batch, y_batch = datagen.flow(train, train, batch_size=32)

使用数据生成器:

fit_generator(datagen,samples_per_epoch=len(train), epochs=100) 
1.2.1 概述:泛化怎样是可能的

泛化:在给定的输入不在训练集中的情况下,使网络的输出近似目标值。

人工神经网络不会自动泛化。

良好的泛化包括三个典型的必要条件:

  1. 网络的输入必须包含足够的与目标相关的信息。
  2. 要学习的函数(将输入与正确输出联系起来)在某种意义上是平滑的。换句话说,输入上的一个小变化,在大多数情况下,应该会产生输出上的一个小变化。
  3. 训练用例必须是希望泛化到的所有用例(统计术语中的“总体”)的足够大的有代表性的子集(统计术语中的“样本”)。
1.2.2噪声如何影响泛化

“统计噪声”是指目标值的变化,该变化无法通过特定网络的输入项来预测,与体系结构或权重无关。“物理噪声“是指目标值的变化,无论使用什么输入,其固有地是不可预测的。输入中的噪声通常是指测量误差,因此如果同一个对象或实例被多次呈现给网络,输入值就会有所不同。

目标值中的噪声增加了过拟合的危险。

输入信号中的噪声会限制泛化的准确性。

1.2.3 什么是过拟合,如何避免过拟合

不够复杂的网络可能无法完全检测出复杂数据集中的信号,从而导致拟合不足。太复杂的网络可能会适应噪声,而不仅仅是信号,从而导致过度拟合。

避免过度拟合的最佳方法是使用大量训练数据。如果您拥有的训练案例至少是网络中权重的30倍,尽管无论训练集有多大,您都可能会略有过度拟合,但不太可能遭受过度拟合。对于无噪声的数据,训练例数是权重的5倍就足够了。

对于固定的训练数据量,至少有六种方法可以避免欠拟合和过拟合,从而得到较好的泛化效果:

  • Model selection
  • Jittering
  • Early stopping
  • Weight decay
  • Bayesian learning
  • Combining networks
1.2.4 什么是抖动(噪音训练)

抖动是在训练过程中故意添加到输入信号中的人工噪声。

1.2.5 什么是early stopping

过程:

  • 将可用数据分为训练集和验证集
  • 使用大量隐藏单元
  • 使用很小的随即初始值
  • 使用慢的学习速度
  • 在训练过程中定期计算验证错误率
  • 当验证错误率开始上升时,停止训练
1.2.6 什么是权重衰减

权重衰减为误差函数增加了惩罚项。通常的代价是权重平方乘以衰减常数。

权重衰减是正则化方法的子集。根据定义,重量衰减的惩罚项会惩罚较大的重量。

权重过大会以两种不同的方式影响泛化。太大的权重会导致隐藏的单位,可能会导致输出功能过于粗糙,甚至可能会出现不连续的情况。如果输出激活函数未限制在与数据相同的范围内,则导致输出单位过大的权重可能导致输出超出数据范围。换句话说,较大的权重会导致输出的过度差异

权重消除:

在这里插入图片描述

w_i是第i个权重,c是用户指定的常数。虽然使用平方权重和的衰减倾向于使大系数比小系数收缩得更大,但是权重消除倾向于使小系数收缩得更大,因此对于建议子集模型(修剪)更有用。

网络的泛化能力可能主要取决于衰减常数,尤其是在训练量较小的情况下。 选择衰减常数的一种方法是训练多个具有不同衰减量的网络,并估计每个网络的泛化误差。然后选择使估计的泛化误差最小的衰减常数。

权重衰减的一个基本问题是,网络中不同类型的权重通常需要不同的衰减常数才能很好地概括。至少,对于输入到隐藏权重,隐藏到隐藏权重和隐藏到输出权重,您需要三个不同的衰减常数。

幸运的是,权重衰减还有一个更好的选择:层次贝叶斯学习。贝叶斯学习使得有可能有效地估计许多衰减常数。

1.2.7 什么是贝叶斯学习?
1.2.8 如何组合网络?

许多方法如boosting是对欠拟合的补救方法,bagging是对过拟合的补救方法

1.2.9 我应该使用多少个隐藏层?

可能根本不需要任何隐藏层。线性模型和广义线性模型可用于多种应用。即使你要学习的函数是轻度非线性的,如果数据太少或噪声太大而无法准确估计非线性,那么用简单的线性模型可能比用复杂的非线性模型得到更好的泛化。

1.2.10 我应该使用多少个隐藏单元

最佳隐藏单元数量以复杂的方式取决于:

  • 输入输出单元数
  • 训练案例数
  • 目标中的噪音量
  • 要学习的功能或分类的复杂性
  • 架构
  • 隐藏单元激活功能的类型
  • 训练算法
  • 正则化

在大多数情况下,如果不训练几个网络并估计每个网络的泛化误差,就无法确定最佳隐藏单元数。如果隐藏单元太少,由于拟合不足和统计偏差较大,将导致较高的训练误差和较高的泛化误差。如果隐藏单元过多,则训练误差可能较低,但由于过拟合和高方差,因此泛化误差仍然很高。

一些经验法则将网络中可训练权重的总数与训练案例的数量相关联。一个典型的建议是权重的数量应不超过训练案例数量的1/30。

避免局部最小值,例如多次随机启动和模拟退火

1.2.11 如何估算泛化误差
  • 单样本统计数据

    AIC,SBC,MDL,FPE,Mallows’ Cp

  • 分样或保留验证

    估计神经网络中泛化误差的最常用方法是将部分数据保留为“测试”集,在训练期间不得以任何方式使用该数据。测试集必须是要推广到的案例的代表性样本。训练后,在测试集上运行网络,如果随机选择了测试集,则测试集上的错误将为泛化误差提供无偏估计。分割样本验证的缺点在于,它会减少可用于训练和验证的数据量

  • 交叉验证

  • Bootstrapping

1.2.12 什么是交叉验证和Boostrapping

交叉验证和bootstrapping都是基于“重采样”估计泛化误差的方法。

  • 交叉验证

    在k倍交叉验证中,您将数据划分为k个(大约)大小相等的子集。您训练了净k次,每次都忽略了训练中的一个子集,但是仅使用省略的子集来计算您感兴趣的任何误差标准。如果k等于样本大小,则称为“留一法”交叉验证。 注意,交叉验证与NN中通常用于提前停止的“分割样本”或“保持”方法有很大不同。在分割样本方法中,仅使用一个子集(验证集)来估计泛化误差,而不是使用k个不同的子集。即没有“交叉”。

  • Jackknifing

    交叉验证用于估计泛化误差,而Jackknifing用于估计统计量的偏差。 在Jackknifing中,您可以计算数据的每个子集中的一些感兴趣的统计信息。 将这些子集统计信息的平均值与从整个样本计算出的相应统计信息进行比较,以估计后者的偏差。 您还可以获取统计信息标准误的Jackknifing估计。 可以使用Jackknifing估计训练误差的偏差,从而估计泛化误差

  • 交叉验证方法的选择

    包含所有相关输入的子集将被称为“好”子集,而包含所有相关输入但没有其他输入的子集将被称为“最佳”子集。

    泛化误差可以分解为噪声方差+估计方差+估计偏差平方三个相加部分。

  • Bootstrapping

    在最简单的bootstrapping中,不是重复分析数据的子集,而是重复分析数据的子样本。每个子样本是从完整样本中替换的随机样本。

1.2.13 如何计算预测和置信区间(误差线)

1.3 对数据做缩放

使用神经网络模型的一条经验法宝就是:将数据缩放到激活函数的阈值范围。

归一化到0 ~ 1 、 归一化到-1 ~ 1 、标准化

1.3.1 数据需要预处理

建议为数据创建许多不同的视图和转换,然后在数据集的每个视图上使用一些算法。这将帮助您了解哪些数据转换在暴露问题的总体结构方面可能更好。

1.3.2 数据预处理

每个方法都有相同的结构:

  • 从URL加载数据集
  • 将数据集分割成输入输出变量,用于机器学习
  • 对输入变量应用预处理变换
  • 汇总数据以显示变化

步骤:

  1. 重新缩放数据

    当数据由不同尺度的属性组成时,许多机器学习算法可以从将属性重新标定为具有相同尺度的属性中获益。这通常称为规范化,属性通常被重新调整到0到1之间的范围。可以使用scikit-learn使用MinMaxScaler类重新设置数据。

  2. 标准化是一种有用的技术,可以将具有高斯分布和不同均值和标准差的属性转换为具有均值为0和标准差为1的标准高斯分布。它最适合于在输入变量中假设高斯分布的技术,并且更好地处理调整过的数据,如线性回归、逻辑回归和线性判别分析。

  3. 规范化数据

    归一化是指对每个观察(行)进行重新缩放,使其长度为1(在线性代数中称为单位范数)。

  4. 二值化数据

    您可以使用二进制阈值来转换数据。 所有高于阈值的值都标记为1,所有等于或低于阈值的值都标记为0。 这称为二进制化数据或阈值数据。 当您有可能想要做出明晰的值时,它会很有用。 当进行要素工程并且您想添加表示有意义的新要素时,该功能也很有用。

1.4 对数据做变换

1.4.1 特征选择

也许用更少的特征也能得到同样的、甚至更好的效果。

1.4.2 重新定义问题

收集到的观测数据不一定是描述问题的唯一途径

2 从算法上提升性能

2.1 算法的筛选

筛选一些常用的算法,挑出其中适用的几个。 尝试一些线性算法、树模型、SVM和kNN等算法、尝试其他的神经网络模型

2.2 从文献中学习

2.3 重采样的方法

数据归约?

2.3.1 用keras评估深度学习模型的效果
2.3.2 用重采样的方法评估机器学习算法的效果

3 从算法调优上提升性能

3.1 模型可诊断性

如何判断模型过拟合还是欠拟合,模型总是处于这两种状态之间:在训练集和验证集上测试模型的准确率。

如果训练集的效果好于验证集,说明可能存在过拟合的现象,试一试增加正则项。

如果训练集和验证集的准确率都很低,说明可能存在欠拟合,你可以继续提升模型的能力,延长训练步骤。

如果训练集和验证集的曲线有一个焦点,可能需要用到early stopping的技巧了。

3.2 权重的初始化

有一条经验规则:用小的随机数初始化权重

3.2.1 深度网络模型的初始化

3.3 学习率

尝试非常大、非常小的学习率。

根据参考文献,在常规值附近用网格化搜索。

尝试使用逐步减小的学习率。

尝试每隔固定训练步骤衰减的学习率。

尝试增加一个向量值,然后用网格搜索。

3.4 激活函数

3.5 网络结构

试一试加一层有许多节点的隐藏层(拓宽)。

试一试一个深层的神经网络,每层节点较少(纵深)。

尝试将上面两种组合。

尝试模仿近期发表的问题类似的论文。

尝试拓扑模式和书本上的经典技巧(参考下方的链接)。

3.6 batch和epoch

batch的大小决定了梯度值,以及权重更新的频率。

一个epoch指的是训练集的所有样本都参与了一轮训练,以batch为序。

· 尝试将batch大小设置为全体训练集的大小(batch learning)。

· 尝试将batch大小设置为1(online learning)。

· 用网格搜索尝试不同大小的mini-batch(8,16,32,…)

· 尝试再训练几轮epoch,然后继续训练很多轮epoch。

· 尝试设置一个近似于无限大的epoch次数,然后快照一些中间结果,寻找效果最好的模型。

3.7 正则项

正则化是克服训练数据过拟合的好方法。

Dropout方法在训练过程中随机地略过一些神经节点,强制让同一层的其它节点接管。

其他:

· 权重衰减来惩罚大的权重值。

· 激活限制来惩罚大的激活函数值。

· 尝试用各种惩罚措施和惩罚项进行实验,比如L1、L2和两者之和。

3.8 优化目标

3.9 提早结束训练

在模型性能开始下降的时候停止训练

4 从模型融合上提升性能

4.1 模型融合

不必挑选出一个模型,而是将它们集成。如果你训练了多个深度学习模型,每一个的效果都不错,则将它们的预测结果取均值。模型的差异越大,效果越好。

4.2 视角融合

对训练数据采取完全不同的缩放和变换技巧。所选用的变化方式和问题的刻画角度差异越大,效果提升的可能性也越大。简单地对预测结果取均值是一个不错的方式。

4.3 stacking

将各个模型的预测结果相融合。这被称作是stacked泛化,或者简称为stacking。通常,可以用简单的线性回归的方式学习各个模型预测值的权重。把各个模型预测结果取均值的方法作为baseline,用带权重的融合作为实验组。Stacked Generalization (Stacking)

如果你训练了多个深度学习模型,每一个的效果都不错,则将它们的预测结果取均值。模型的差异越大,效果越好。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值