Regularization
在逻辑回归中实现L2正则化方法
以逻辑回归为例,看正则化是如何生效的。在逻辑回归中,会尝试用最小化代价函数J,该代价函数定义为,每个训练样本的预测的损失之和,其中w和b是逻辑回归的参数,w是一个x维的参数向量,b是一个实数,要为逻辑回归正则化,需要加上,称为正则化参数。w范数的平方
,参数矢量w的欧几里得范数的平方,这里称为L2正则化(L2 Regularization)。
在这里,只对参数w进行正则化,不把b的相关项也加进去,可省略,因为参数w往往是一个非常高维的适量参数,尤其是在发生高方差问题的情况下,可能w有非常多的参数,没能很好地拟合所有的参数,而b只是单个数字,几乎所有的参数都集中在w中而不是b中,即使你加上了最后一项,实际上也不会起到太大的作用,因为b只是大量参数中的一个参数,在实践中通常就不费力气去包含它了。

在神经网络中实现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范数 ,而是称为矩阵的弗Frobenius范数
如何实现梯度下降,之前使用反向传播计算dw,通过反向传播,能得到J关于w的偏导数,准确的来说是任意给定的l的w,之后更新,为其减去学习速率乘以
,这是为目标函数增加正则化项之前的步骤,现在为目标函数增加了这个正则化项,就要为这个dw加上
添加了额外的项后,L2正则化有时也被称为weight decay权重衰减,如果把带入定义,会得到让矩阵w乘以这个略小于1的数字,这就是L2范数正则化,又被称为权重衰减的原因,因为它就像普通的梯度下降,以上就是神经网络中实现L2正则化的方式。

Why regularization reduces overfitting?
所做的正则化就是添加一些额外的项目,来避免权重矩阵过大,这就是Frobenius范数,那为什么通过压缩L2范式或Frobenius范数或参数项就可以减轻过拟合情况呢?
如果把正则项lambda设置的很大,权重矩阵W就会被设置为非常接近0的值,因此这个直观理解就是,把很多隐藏单元的权重,设置的太接近于零了而导致这些隐藏单元的影响被消除了,如果是这种情况,那么就会使这个大大简化的神经网络变成一个很小的神经网络,实际上这种情况与逻辑回归单元很像,但很可能是网络的深度更大了,因此这就会使这个过拟合网络带到更加接近左边高偏差的状态,但是lambda存在一个中间值,能够得到一个更加接近中间的刚刚好的状态。
w变小,我们直觉上认为这些隐藏单元的影响被完全消除了,其实并不完全正确,实际上网络仍在使用所有的隐藏单元,但每个隐藏单元的影响变得非常小了,但最终你的得到的这个简单的网络,看起来就像一个不容易过拟合的小型的网络。

假设使用的tanh激活函数如图,发现只要Z的值很小,比如Z只涉及很小范围的参数,中间部分,展现线性的条件部分,只有Z的值被允许取到更大的值或像小的值,激活函数才开始展现出它的非线性的能力。因此直觉就是,如果lambda正则化参数被设置的很大的话,那么激活函数的参数实际上会变小,因为代价函数的参数会不能过大,并且如果W很小那么Z也会很小,g(z)函数就会接近于线性函数,因此,每一层几乎都是线性的,就像线性回归一样,如果每层都是线性的那么你的整个网络就是线性网络,因此即使一个很深的神经网络,如果使用线性激活函数,最终只能计算线性的函数,因此就不能拟合那些复杂的决策函数,也不过度拟合那些数据集的非线性决策平面。
正则化非常大,W参数很小,Z会相对很小,暂时忽略b的影响,Z会相对变小,即Z只在小范围取值,那么激活函数如果是tanh的话,这个激活函数就会呈现相对线性,那么你的整个神经网络就只能计算一些离线性函数很近的值,也就是相对比较简单的函数,而不能计算很复杂的非线性函数,因此就不大容易过拟合了。

J代价函数有了新的定义,这里包含第二个项,J就会在每次迭代后都单调递减,否则不会看到单调递减的函数图像,以上就是L2正则化。
Dropout Regularization
除了L2正则化,另一种非常强大的正则化技术是随机失活正则化(丢弃法dropout),假如你训练的神经网络发生过拟合现象,你可以随机失活技术来处理它。
使用随机失活技术,要遍历这个网络的每一层,并且为丢弃(drop)网络中的某个节点置一个概率值,即对于网络中的每一层,我们将对每一个节点做一次公平投币,使每个节点有50%的机率被保留,50%的几率被丢弃,抛完这些硬币,我们会决定消除哪些节点,然后清除那些节点上所有正在进行的运算,所以最后得到的是一个小得多的,被简化了很多的网络,然后再做反向传播训练。对于不同的训练样例,你可以选择其中任意一个网络进行训练,也许这个技术看起来有点疯狂,他们只是按照随机的编码决定这些节点的去留,但这个技术确实有效。

因为对于每一个训练样例,你都在训练一个小得多的网络,这样或许能理解为什么能正则化整个网络,因为被训练的是一些小得多的网络。
有几种方法可以实现随机失活算法,最常用的一种反向随机失活(inverted dropout)
设置一个矢量d,d3表示层3的失活向量,d3将与a3向量shape一样,keep.prob是一个数值,如果d3中的元素小于该值,则该元素为1,将会保留该元素,也就意味着这个隐藏单元有1-keep.prob的几率被丢弃,因此它将生成一个随机矩阵,这个方法也适用于矢量化计算。
然后取层3的激活矩阵,用a3来表示,然后a3与d3相乘,逐元素相乘,这样的作用是对于d3中值为0的元素,每个元素有1-keep.prob的几率取值为0,通过点乘将a3中0值对应位置的元素一一清零。

举个例子,假设第三层有50个单元,或者说50个神经元,如果做矢量化的运算,它的维度是50*m,如果keep.prob为0.8,则每个神经元有80%的几率保留,20%的几率被丢弃,这意味着平均起来,将有10个单元失活或者被清零。现在在看看Z4的值,它的期望值将减少20%,也就是说a3中20%的元素都被清零了,这里为了不减少Z4的期望值,需要除以0.8,因为,它能提供你所需要的大约20%的校正值,这样a3的期望值就不会再被改变,这就是所谓的反向随机失活技术。它的作用在于,你可以将keep.prob的值设为任意值,反向随机失活技术通过除以keep.prob确保a3的期望值不变。
而且你会发现在测试阶段,也就是你要评估一个神经网络时,
网友评论