如果你怀疑你的神经网络在数据上发生了过拟合
也就是存在高方差问题
你也许需要首先尝试使用正则化
获取更多数据也是解决高方差问题的
一个很可靠的方法
但你并不是总能获取到更多的训练数据
或者获取更多数据的代价太大
但使用正则化通常有助于防止过拟合
并降低网络的误差
下面我们来看看正则化是如何生效的
我们以逻辑回归为例进行阐述
在逻辑回归中 你会尝试最小化代价函数J
该代价函数定义为
每一个训练样本的预测的损失之和
其中w和b是
逻辑回归的参数
因此w是一个x维的参数向量 b是一个实数
要为逻辑回归正则化 你需要
加上这个lambda 它称为正则化参数
我稍后会详细介绍
lambda/2m 再乘以w范数的平方
这里w的范数的平方等于
对于j从1到n_x 求w_j的平方和
也可以写成w的转置乘以w 即参数矢量w的欧几里得范数的平方
这称为L2正则化
因为这里使用的是参数矢量w的
欧几里得范数 也称为L2范数
为什么只对参数w进行正则化呢?
为什么我们不把b的相关项也加进去呢？
实际上你可以这样做 但我通常会把它省略掉
因为你可以看一下你的参数 w往往是一个非常高维的参数矢量
尤其是在发生高方差问题的情况下
可能w有非常多的参数
你没能很好地拟合所有的参数 而b只是单个数字
几乎所有的参数都集中在w中 而不是b中
即使你加上了最后这一项
实际上也不会起到太大的作用
因为b只是大量参数中的一个参数
在实践中我通常就不费力气去包含它了
但如果你想的话也可以(包含b)
L2正则化是最常见的一种正则化方式
你可能也听说过L1正则化
即不使用L2范数
而是使用lambda/m乘以这一项的和
这称为参数矢量w的L1范数
这里有一个数字1的小角标
无论你在分母中使用m还是2m 它只是一个缩放常量
如果你使用L1正则化 w最后会变得稀疏
这意味着w矢量中有很多0
有些人认为这有助于压缩模型
因为有一部分参数是0 只需较少的内存来存储模型
然而我在实践中发现 通过L1正则化让模型变得稀疏
带来的收效甚微
所以我觉得至少在压缩模型的目标上
它的作用不大
在训练网络时
L2正则化使用得频繁得多
抱歉 修改一下这里的标记
最后要说明的是
这里的lambda称为正则化参数
通常使用开发集或hold-out交叉验证
来配置这个参数
通过尝试一系列的值 找出最好的那个
即在训练集上得到较好的结果
和保持参数的L2范数较小以避免过拟合
之间进行取舍
lambda是你需要调优的另一个超参数
顺便一提 在编程练习中
lambda是Python编程语言的保留关键字
所以在编程练习中 我们把它写为lambd
不写a 以避免和Python的保留关键字冲突
我们使用lambd表示正则化参数lambda
以上是在逻辑回归中实现L2正则化的方法
那么在神经网络中呢?
在神经网络中 你有一个代价函数
它是你所有参数的函数 包括w[1] b[1]到w[L] b[L]
这里大写的L是神经网络的层数
因此 代价函数是m个训练样本上
的损失之和
至于正则化 再加上lambda/2m
乘以所有参数W的范数的平方之和
这里W是你的参数矩阵
这里矩阵范数的平方定义为
对于i和j
对矩阵中每一个元素的平方求和
如果你想为这个求和加上索引
这个求和是i从1到n[l-1]
j从1到n[l]
因为w是一个n[l-1]列 n[l]行的矩阵
这些是第l-1层和第l层的隐藏单元数量单元数量 或
这个矩阵的范数 称为矩阵的弗罗贝尼乌斯范数
使用角标F标记
由于线性代数中某些神秘的技术原因
这不叫矩阵的L2范数
而是称为矩阵的弗罗贝尼乌斯范数
我知道把它称为矩阵的L2范数会更加自然
但由于某些你不需要了解的神秘原因
习惯上把它称为弗罗贝尼乌斯范数
它表示矩阵中元素的平方和
有了它 现在要如何实现梯度下降呢?
之前我们使用反向传播计算dw
通过反向传播 我们能得到J关于w的偏导数
准确来说是任意给定l的w
之后更新w[l] 为w[l]减去学习速率乘以dw
这是为目标函数添加正则化项之前的步骤
现在我们为目标函数添加了这个正则化项
就需要为这个dw加上lambda/m*w[l]
然后就可以像之前一样计算这个更新
可以证明 这个新的dw[l]
仍然正确地定义了
在添加了额外的正则化项之后
代价函数关于参数的倒数
出于这个原因 L2正则化有时也被称为
权重衰减
如果我把这个dw[l]的定义代入这里
你会发现w[l]的更新是 w[l]乘以学习速率alpha
乘以由反向传播得到的这一项
加上lambda/m*w[l]
在这里加上减号
这等于
[如图所示]
这一项表示无论矩阵w[l]是多少
你都会让它变得稍小一点
实际上 这相当于在矩阵w上乘以
1-alpha*lambda/m
你实际上是让矩阵w 减去alpha*lambda/m乘以它本身
就像让矩阵w乘以这个
略小于1的数字
这就是L2范数正则化又被称为权重衰减的原因
因为它就像普通的梯度下降
更新w为w减去alpha乘以从反向传播得到的原梯度
但现在你还会让w乘以这个
略小于1的项
因此L2正则化又称为权重衰减
我不会使用那个名称
它被称为权重衰减的原因是第一项等于这个
你只是让权重矩阵乘以了一个略小于1的数字
以上就是在神经网络中实现L2正则化的方式
可能有人会问 嘿Andrew
为什么正则化能够防止过拟合?
让我们继续看下一个视频
其中介绍了正则化能防止过拟合的原因