1.4 正则化(regularization) 如果你的神经网络出现了过拟合(训练集与验证集得到的结果方差较大),最先想到的方法就是正则化(regularization).另一个解决高方差的方法就是准备更多的数据,这也是非常可靠的方法. 正则化公式简析 L1 范数:向量各个元素绝对值之和 L2 范数:向量各个元素的平方求和然后求平方根 Lp 范数:向量各个元素绝对值的 p 次方求和然后求 1/p 次方 L∞ 范数:向量各个元素求绝对值,最大那个元素的绝对值 L2 正则化 :你需要做的就是在 cost function 后面加上正则化参数.
J(W, b)=\frac{1}{m}\sum^{m}_{i=1}{L(\hat{y}^{(i)},y^{i})}+\frac{\lambda}{2m}(\parallel w\parallel _2)^{2}
w 的欧几里得范数的平方等于
W_{j} (j 值从 1 到 nx)平方的和.
\mit{L2} regulazation =(\parallel w \parallel_2)^{2}=\sum^{n_{x}}_{j=1}{W_j}^{2}=w^{T}w
\frac{\lambda}{2m}b^{2} .但是 Ng 常常胜省略不写,因为 W 已经是一个高维参数矢量,已经可以表达高偏差问题.
L1 正则化 : L2 正则化公式是最常见的正则化公式,你也许听说过 L1 正则化公式,正则化项 为\frac{\lambda}{2m}\sum^{n_{x}}_{j=1}|w|=\frac{\lambda}{2m}\parallel w \parallel_1 现在人们越来越趋向于使用 L2 正则化来正则化数据. 正则化参数 \lambda :
\lambda 是另外一个需要调整的超参数.因为 python 中 lambda 是 python 语言的保留字段,所以我们使用 lambd 来命名和表示这个超参数而防止和保留字段重名.
使用 L2 正则化的关键原因是因为在 BP 算法中权值 W 的每次梯度下降会额外减去一个 (1-\frac{\alpha\lambda}{m})W 的值称之为"权重衰减"即"Weight decay"
1.5 为什么正则化可以减少过拟合 L2 正则化 J(W, b)=\frac{1}{m}\sum^{m}_{i=1}{L(\hat{y}^{(i)},y^{i})}+\frac{\lambda}{2m}(\parallel w\parallel _2)^{2}
\lambda 设置的很大时,足够大,权重矩阵 w 被设置为接近于 0 的值,因为正则项十分大,则前一项的影响被降低到很小.
直观上理解就是把多隐藏层单元的权重设为 0,于是基本上消除了这些隐藏单元的许多影响(如图中所表示的样子) 此时这个被大大简化了的神经网络会变成一个很小的网络,小到如同一个逻辑回归单元,但是深度却很大,它会使 \lambda 高方差的状态,如同最右边的图接近于左图的高偏差状态,但是
\lambda 会存在一个中间值,于是会有接近于"Just right"的状态.
我们直觉上认为大量隐藏单元被完全消除了,其实不然,实际上是该神经单元的所有隐藏单元依然存在,只是它们的影响变得更小. 从权值改变和激活函数理解 \lambda 变大,激活函数的参数 z 会相对小,因为代价函数的参数变大了,如果 w 变的很小,z 也会变的很小.实际上,z 的取值范围很小,这个激活函数(此处为 tanh)在此处相对呈线性,每层几乎都呈线性,整个网络趋向于一个线性网络,即使是一个非常深的网络,也会因具有线性激活函数的特征使得整个神经网络会计算离神经网络近的值.这个线性函数十分简单,并不是一个极复杂的高度非线性函数,所以不会发生过拟合.
1.6 Dropout 正则化 假设你训练的网络如图所示
Dropout :假设你在训练如图的神经网络,如果它存在过拟合,Dropout 会遍历网络的每一层,并设置消除神经网络中节点的概率.假设每一层的每个节点都以抛硬币的方式设置概率.每个节点得以保留和消除的概率都是 0.5.设置完节点概率,我们会消除一些节点,然后删除从该节点进出的连线.最后得到一个节点更少,规模更小的网络.然后用 backprop 方法进行训练.这是网络结构经过 Dropout 函数精简后的结果: 对于每个训练节点,我们都会采用一个精简后的神经网络训练它. 1.7 理解 Dropout(随机失活) 直观理解 Dropout1: 每次迭代后神经网络都会变得更小,看起来更小的神经网络和 L2 正则化的效果一样. 直观理解 Dropout2:
PS:每层的 keep_prob 值都可以设置为不同的值,对于神经元数极少的网络层我们可以将 keep_prob 设置为 1 即保存所有神经元节点不使用 Dropout 方法,对于神经元数较多,可能产生过拟合含有诸多参数的网络层我们可以将 keep_prob 设置为较小的数值表明保存较少的神经元节点.
应用 在计算机视觉中需要输入很多的图像像素数据,所以有些计算机视觉研究人员非常喜欢使用 Dropout 方法.几乎是一种默认的选择.但是请牢记一点Dropout 是一种正则化方法,它有助于防止过拟合,因此除非算法过拟合,不然我是不会使用 Dropout 方法的,所以它在其他领域应用的比较少 主要存在于计算机视觉领域,因为我们通常没有足够多的数据,所以一直存在过拟合.这就是有些计算视觉研究人员如此钟情 dropout 函数的原因. dropout 正则化方法缺点 dropout 函数一大缺点就是代价函数 J 不再被明确定义,每次迭代,都会移除一些节点,如果再三复查 J 函数,实际上我们是很难对其进行复查的.明确定义的代价函数 J 每次迭代后都会下降.因为使用 dropout 方法后我们所优化的代价函数 J 实际上并没有明确定义或者很难被计算,所以我们很难绘制出代价函数 J 的下降趋势图形. 1.8 其他正则化方法 方法 1--扩增数据集 假设你正在设计一个图片分类器,产生了过拟合问题,但是如果想使用增加训练图片数量的方法来防止过拟合需要的代价太大了,我们可以使用添加水平翻转图片 ,放大后剪裁图片 .这种方式正则化数据集,减少过拟合比较廉价. 对于光学字符识别,我们可以通多添加数字,随意旋转或扭曲数字来扩增数据.把这些数据添加到数据集他们仍然是数字. 方法 2--early stopping 红色的线表示验证集上的分类误差或验证集上的代价函数/逻辑损失/对数损失等.会发现误差会通常先呈下降趋势然后在某个节点开始上升. early stopping 作用是说"神经网络你到现在的迭代训练中表现已经非常好了,我们停止训练吧" 原理是:当你还未在神经网络中进行太多次迭代过程的时候,参数 w 接近 0,因为随机初始化 W 值时,它的值可能都是较小的随机值.在迭代过程和训练过程中,w 的值会越来越大,也许经过最终的迭代其值已经变得很大了. 所以 early stopping 要做的就是在中间点停止迭代过程.得到一个 w 中等大小的弗罗贝尼乌斯范数.术语early stopping 表示提前停止训练神经网络. early stopping 的缺点 NG 认为机器学习包含两个很重要的步骤选择一个算法来优化代价函数 J(梯度下降,Momentum,RMSprop,Adam) 优化函数后我也不想发生过拟合,也有一些工具可以解决该问题,比如正则化,扩增数据等等. NG 认为在训练时简化这两方面权衡的方法是首先只关注优化代价函数 J,只需留意 w 和 b,使得 J 代价函数更小即可,然后才是关注预防过拟合的问题. 然而 early stopping 这个方法没有独立的解决这两个问题,为了避免过拟合而提前结束了梯度下降的过程,这样就没有能使 J 代价函数降低到最低值,J 的值可能不够小.这样做的结果是需要同时考虑的东西会更复杂. early stopping 和 L2 正则化的权衡 \lambda ,这样我要不停地寻找
\lambda 的值使能达到效果,训练神经网络的计算代价会变得更高.
early stopping 的优点是,只运行一次梯度下降,那你就可以找到 w 的较小值,中间值和较大值,而无需尝试 L2 正则化超参数 \lambda 的很多值.
参考资料 [1]
吴恩达老师课程原地址: https://mooc.study.163.com/smartSpec/detail/1001319001.htm