5.3.1 机器学习算法一般改进方法

获得更多的训练实例

可解决高方差(未来)。

改变特征数量

减少特征数量可解决高方差(未来),增加特征数量可解决高偏差(现在)。

改变多项式次数

减少多项式次数可解决高方差(未来),增加多项式次数可解决高偏差(现在)。

改变正则化参数

作用:

减小正则化参数可解决高偏差(现在),增加正则化参数可解决高方差(未来)。

基本思想:

基于模型复杂性对其进行惩罚,偏好那些相对简单的能更好的泛化的模型,可以解决过度拟合问题。通过增加一个额外的项到代价函数上,这个项叫做正则化项,消除或降低过拟合的影响,缺点是惩罚会造成欠拟合很难校准。

正则化分类:

  1. L1 正则化:\(C=C_0+λ/n ∑_w |w|\) ,在原始代价函数 \(C_0\) 上加上一个权重绝对值的和。倾向于聚集权重在相对少量的高重要度连接上,而其他权重就会被驱使向 0 接近。
  2. L2正则化:\(C=C_0+λ/n ∑_w w^2\),在原始代价函数 \(C_0\) 上加上一个权重平方和。可以看做是一种寻找小的权重和最小化原始的代价函数之间的折中,\(λ\) 越小就偏向于最小化原始代价函数,反之倾向于小的权重。
λ=0,0.01,0.02,0.04,0.08,…,10

5.3.2 神经网络改进方法

神经网络优化涉及很多的神经网络超参数,分类如下:

  1. 影响分类正确率:神经网络层数 \( L\)、隐藏层中神经元个数 \( j\)、输出编码方式、正则化参数 \(λ\)。
  2. 影响代价函数曲线下降速度,同时有时也会影响分类正确率:权重初始化、代价函数的选择、神经元激活函数的种类。
  3. 影响模型分类正确率和训练用总体时间:学习的回合数Epoch、小批量数据 mini-batch 的大小、参加训练模型数据的规模。
  4. 影响学习速度,主要体现为代价函数曲线的下降速度:学习率 \(η\)

5.3.2.1 神经网络改进基本方法

建立神经网络的首要原则:

  • 对于神经网络中的隐藏层的层数的选择,通常从一层开始逐渐增加层数,针对不同隐藏层的神经网络训练神经网络,然后选择交叉验证集代价最小的神经网络。
  • 通常选择较大的神经网络并采用正则化处理会比采用较小的神经网络效果要好。
    • 使用较小的神经网络,特征参数较少,容易导致高偏差和欠拟合,但计算代价较小。
    • 使用较大的神经网络,特征参数较多,容易导致高方差和过拟合,可以通过正则化手段来调整而更加适应数据,虽然计算代价比较大。
    • 检测过度拟合的明显方法是跟踪测试数据集合上的准确率随训练变化情况,或绘制学习曲线。若测试数据上的准确率不再提升,那么就停止训练。

选择不同的神经元类型:

在神经网络中S型函数激励的神经元较常见,除此之外还有tanh神经元、修正线性神经元等。

选择不同的代价函数:

代价函数必须具备的特性:

  • 非负性:求和中的所有独立的项都是正数。
  • 趋于零:若对于所有的训练输入实际的输出接近目标值,代价函数值接近于零。

二次代价函数:

  • 神经元是通过改变权重和偏置,并以一个代价函数的偏导数( \(\frac {∂C}{∂w}\) 和 \(\frac {∂C}{∂b}\) )决定学习速度。二次代价函数会让学习变得很缓慢,学习缓慢实际上就是这些偏导数很小,当神经元的输出接近1的时候,S曲线变得相当平,\(σ’ (z)\) 就很小了,即 \(\frac {∂C}{∂w}\) 和 \(\frac {∂C}{∂b}\) 会非常小。
  • 当在神经元犯了明显的错误时,学习速度比学习快接近真实值的时候更加缓慢。

交叉熵代价函数:

  • 学习速度更快,因为偏导数 \(\frac {∂C}{∂w}\) 和 \(\frac {∂C}{∂b}\) 消除了 \(σ’ (z)\) 的影响;
  • \(\frac {∂C}{∂w}\) 和 \(\frac {∂C}{∂b}\) 输出中有误差的控制,误差越大,意味着更快的学习速度。
  • 在神经元犯了明显错误的时候,学习速度变得更快,且并不依赖于如何设置学习速率。
  • 若在输出神经元是 S 型神经元时,交叉熵一般都是更好的选择。
  • 交叉熵推广到很多神经元的多层神经网络:假设 \(y=y_1,y_2,…\) 是输出神经元上的目标值,而 \(a_1^L, a_2^L ,…\) 是实际输出值,那么定义交叉熵:

权重初始化优化:

  • 模型假设:若一神经元网络有1000个输入,根据独立高斯随机变量来选择权重和偏置(被归一化为均值为 0,标准差 1),初始化了第一个隐藏层的权重。
    若训练集的输入 \(x\) 有一半的输入为 1,另一半为0。某个隐藏神经元的带权输入 \(z=∑_j w_j x_j +b\) ,其中 500 个项消去了,\(z\) 是遍历总共 501 个归一化的高斯随机变量的和,包含 500 个权重项和额外的 1 个偏置项。因此 \(z\) 本身是一个均值为 0标准差为 \(\sqrt {501} ≈ 22.4\) 的高斯分布。\(z\) 是一个非常宽的高斯分布,\(|z|\) 会变得非常的大,即 \( z ≫ 1\) 或者 \(z ≪ -1\)
    独立高斯分布权重初始化

  • 问题分析:会出现隐藏神经元饱和现象

    • 隐藏神经元的输出 \(σ(z) \) 会接近 1 或者 0。也就表示隐藏神经元会饱和。
    • 在权重中进⾏微小的调整仅仅会给隐藏神经元的激活值带来极其微弱的改变。而这种微弱的改变也会影响网络中剩下的神经元,然后会带来相应的代价函数的改变。这些权重在进⾏梯度下降算法时会学习得⾮常缓慢。
    • 通过选择交叉熵代价函数可以解决在输出神经元上的错误值上饱和导致学习的下降,但对于隐藏神经元的饱和却一点作⽤都没有。
  • 标准权重初始化:假设有 \(n{in} \) 个输入权重的神经元,使用均值为 0 标准差为 \(\frac {1}{\sqrt {n{in}}}\) 的高斯随机分布初始化这些权重。使用这种方法,会向下挤压高斯分布(有更尖锐的峰值),让神经元更不可能饱和,不大可能遇到学习速度下降的问题。
    标准权重初始化

5.3.2.2 神经网络的超参数选择步骤

首先用宽泛策略先大致搭建一个简单网络:

  • 确定神经元类型、代价函数、输出层的编码方式、输出层模式(是否采用softmax)、确定神经网络中隐层的数目以及每一个隐层中神经元的个数。
  • 使用简化的训练数据,验证简化的网络性能,逐渐增加神经元的个数和网络的层数。
  • 确定小批量数据的大小, 小批量数据大小的选择独立于网络整体架构外的参数,使用某些可以接受的值作为其他参数的选择,然后进行不同小批量数据大小的尝试。
    • 小批量数据太小浪费矩阵库的快速计算能力,太大不能够足够频繁地更新权重。常见大小为bϵ[2,100]
    • 获得验证准确率的值随时间(非回合)变化的图,选择那个得到最快性能的提升的小批量数据大小。得到了小批量数据大小后就可以对其他的超参数进行优化。

其次调整学习率 \(η\):

  • 首先选择在训练数据上的代价函数立即开始下降而非震荡或增加时的 \(η\) 为阈值的大致估计。
  • 若代价函数在训练的前面若干回合开始下降,则逐步增加 \(η\) 的量级,直到找到一个的值使得在开始若干回合代价就开始震荡或者增加。
  • 相反若代价函数曲线开始震荡或者增加,那就尝试减小量级直到找到代价在开始回合就下降的设定,取阈值的一半就确定了学习速率 。

再次确定学习的回合数Epoch:

  • 提前停止表示在每个回合的最后,都要计算验证集上的分类准确率,当准确率不再提升,就终止它也就确定了迭代次数。另外提前停止也能够避免过度拟合。
  • 分类准确率在整体趋势下降的时候仍旧会抖动或者震荡。若在准确度刚开始下降的时候就停止,那么肯定会错过更好的选择。一般在分类准确率在一段时间内不再提升的时候终止。建议在更加深入地理解网络训练的方式时,仅仅在初始阶段使用 10 回合不提升规则,然后逐步地选择更久的回合,比如20回合不提升就终止,30回合不提升就终止,以此类推。

最后确定正则化参数λ :

  • 使用确定出来的 \(η\),用验证数据来选择好的 \(λ \) 。尝试从 \(λ=1 \) 开始,然后根据验证集上的性能按照因子 10 增加或减少其值。一旦已经找到一个好的量级,可以改进 \(λ \) 的值。
  • 确定 \(λ \) 后返回再重新优化 \(η\)。