为什么正则化能够防止过拟合呢?
为什么它有助于减少方差问题?
我们通过几个例子来直观地体会一下
请回忆一下 左边是高偏差 右边是高方差
中间的是恰好的情况 我在之前的视频中画过这几张图
现在 来看一下这个庞大的深度神经网络的拟合情况
我知道画出来的这个网络还不够大 也不够深
但是你可以认为这就是过拟合的神经网络
图中就是我们的代价函数J 包含了参数W和B
并且J是一些损失项的总和
所以我所做的正则化就是添加一些
额外的项目
来避免权重矩阵过大
这就是弗罗贝尼乌斯范数
那么为什么通过压缩L-2范式或者
弗罗贝尼乌斯范数 或者参数项就能减轻过拟合情况呢?
关于这个问题的一个直观理解就是
如果你把正则项λ设置的很大
权重矩阵W就会被设置为
非常接近0的值
因此这个直观理解就是 把很多隐藏单元的权重
设置的太接近0了而导致
这些隐藏单元的影响被消除了
如果是这种情况
那么就会使这个大大简化的神经网络变成一个很小的神经网络
事实上 这种情况与逻辑回归单元很像
但很可能是网络的深度更大了
因此这就会使
这个过拟合网络带到更加接近左边高偏差的状态
但是λ存在一个中间值
能够得到一个更加接近中间这个刚刚好的状态
直观理解就是把λ值设的足够高的话
它就会使W接近0
但实际中并不会发生这种情况
我们可以想象成通过把隐藏单元的值归零
来削减了隐藏单元的影响
最终导致这个网络变成了一个更加简单的网络
这个神经网络越来越接近逻辑回归
我们直觉上认为这些隐藏单元的影响被完全消除了 其实并不完全正确
实际上网络仍在使用所有的隐藏单元
但每个隐藏单元的影响变得非常小了
但最终你得到的这个简单的网络
看起来就像一个不容易过拟合的小型的网络
这种直觉在你通过编程练习
实现正则化时对你理解是很有帮助的
你实际上看到了一些方差变小的结果
现在通过另一个例子直观理解一下
为什么正则化可以帮助防止过拟合
在这个例子中 假设我们使用的
tanh激活函数是图中这样的
使用g(z)表示tanh(z)
因此这种情况下
可以发现只要Z的值很小
比如Z只涉及很小范围的参数
也许就像图中这个范围所示那么你其实是在使用tanh函数的线性的条件部分
只有Z的值被允许取到更大的值或者像这种小一点的值的时候
激活函数才开始展现出它的非线性的能力
因此直觉就是 如果λ值
即正则化参数被设置的很大的话
那么激活函数的参数实际上会变小
因为代价函数的参数会被不能过大
并且如果W很小那么由于
Z等于W这项再加上b
但如果W非常非常小
那么Z也会非常小
特别是如果Z的值相对都很小时
就在图中这样的范围内取值的话
那么g(z)函数就会接近于线性函数
因此 每一层都几乎是线性的
就像线性回归一样
就像我们第一课中讲过的那样
如果每层都是线性的那么你的整个网络就是线性网络
因此即使一个很深的神经网络
如果使用线性激活函数
最终也只能计算线性的函数
因此就不能拟合那些很复杂的决策函数
也不过度拟合那些
数据集的非线性决策平面
就像我们在上张幻灯片中看到的过拟合高方差的情况
总结一下
如果正则化变得非常大
而参数W很小
那么Z就会相对很小
此时先暂时忽略b的影响
Z会相对变小
即Z只在小范围内取值
那么激活函数如果是tanh的话
这个激活函数就会呈现相对线性
那么你的整个神经网络就只能计算一些
离线性函数很近的值 也就是相对比较简单的函数
而不能计算 很复杂的非线性函数
因此就不大容易过拟合了
再重申一遍 当你在编程练习作业中实现正则化的时候
你就能亲眼看到这里所说的情况
在总结关于正则化的讨论之前
我想给大家一个实现程序时的小建议
在程序中增加正则项的时候
我们根据代价函数J的定义
加入这个额外的惩罚项来防止权重过大
如果你使用梯度下降方法
调试程序的一个步骤就是画出代价函数J关于
梯度下降的迭代次数的图像
可以看到的是每次迭代后代价函数J都会单调递减
如果你实现了正则化部分
那么请记住J现在有了新的定义
如果你仍然使用原来定义的J
就像这里的第一项
你可能看不到单调递减的函数图像
所以为了调试梯度下降程序请确保你画的图像
是利用这个新定义的J函数 它包含了这里第二个项
否则J不会在每次迭代后都单调递减
以上就是L2正则化
也是我训练深度模型的时候最常用的正则化技巧
在深度学习中也常会碰到另一个时常会用到的正则化技巧
被称作dropout正则化
我们就在下一个视频中看看它是怎么工作的吧 GTC字幕组翻译