上接:第一课时第四章:深度神经网络
应用深度学习是一个典型的迭代过程,需要多次循环往复才能为应用程序找到一个称心的神经网络,而循环该过程的效率往往由是否具备高质量的训练数据集、验证集和测试集所决定。
对于一个需要解决的问题的样本数据,在建立模型的过程中,我们通常会将问题的data划分为以下几个部分:
在机器学习发展的小数据时代,比如输入量仅为100、1000、10000样式大小时,人们对于数据的合理划分是:
而在大数据时代,对于一个问题,我们拥有的data的数量可能是百万级别的,那么验证集和测试集所占数据总量的比重会趋向于变得更小。因为验证集的目的是为了验证不同的算法哪种更加有效,所以验证集只要足够大能够验证大约2-10种算法哪种更好就足够了,不再需要占总数据20%的份额作为验证集(例如百万数据中往往只抽取1万的数据作为验证集就足够了),测试集的主要目的是评估模型的的性能,如在单个分类器中,往往在百万级别的数据中,我们选择其中1000条数据足以评估单个模型的性能所以现如今人们对于数据的合理划分是:
值得注意的是:建议验证集要和训练集来自于同一个分布,可以使得机器学习算法变得更快;如果不需要用无偏估计来评估模型的性能,则可以不需要测试集。
面对数据集,当我们对其进行拟合时,往往会得到一个逻辑回归拟合。
1) 欠拟合
所得的逻辑回归拟合并不能很好的拟合数据集,会导致偏差很高
2) 过度拟合
当拟合一个非常复杂的分类器,比如深度神经网络或含有隐藏单元的神经网络就可能非常适合这个数据集,但是这看起来也不是一种很好的拟合方式,分类器实质偏差较高,数据过度拟合
3) 适度拟合
介于过拟合和欠拟合中间的一类,但其数据偏差值合理
例如在小猫图片识别的神经网络搭建的实例中,我们肉眼识别几乎不会出错,假定训练集错误率是1%,为方便论证,假设验证集的错误率是11%;这样对比下来我们可以看出训练集拟合得非常好但是验证集效果却差强人意,这很有可能是因为逻辑回归实际过拟合数据集了,在这种情况下,验证集就没有充分利用交叉验证集的作用,同时我们常称这种情况为“高偏差”。
假定训练集错误率是15%,验证集的错误率是16%;这样对比肉眼识别的近乎0%而言结果也不是很好,但是训练集对于验证机产生的结果确是合理的。这种假设对应的算法偏差高,因为它甚至不能拟合训练集。假定训练集错误率是15%,验证集的错误率是30%;训练集的结果非常糟糕,算法偏差也高(因为它在训练集上结果不理想,方差也很高)。
假定训练集错误率是0.5%,验证集的错误率是1%;可见效果很好,方差偏差都很低,就是适度拟合的情况。
最有误差(基本误差)是接近于0%的情况。
逻辑回归是否拟合数据集决定偏差的高低;训练集和验证集误差值差距决定方差高低.
在初始模型训练完成后,我们需要知道算法的偏差高不高,如果偏差较高,我们需要评估训练集和训练数据的性能。 解决High bias 和High variance 的过程:
1.如果存在High bias (高偏差),解决的思路有:
2.如果存在High variance,解决的思路有:
在深度学习早期时间中,我们没有很好的工具能够在降低偏差的同时不影响方差,而在大数据时代,只要持续训练一个更大的网络,准备更多的数据,同时正则适度,就可以二者达到均忧的局面。而这就是深度学习赋予监督式学习的益处,也是我们不用太过关注如何平衡偏差和方差的一个重要原因。
可以达到训练一个更大的网络同时几乎没有任何负面影响的效果,而训练一个大型神经网络的主要代价也只是计算时间 。正则化可以有助于避免过度拟合或者减少网络误差。
正则化的作用原理:
在逻辑回归实现设想(求成本函数J的最小值)过程中添加参数λ
(也就是正则化参数)
另外前面的知识中我们学习到,成本函数J参数包含一些训练数据和不同数据中个体预测的损失。(w、b是逻辑回归的两个参数,w是一个多维度参数矢量,b是一个实数)
实际上L1正则化使模型变得稀疏,却没有降低太多存储内存,人们在训练模型时,往往趋向于L2。
λ是正则化参数,往往通过使用验证集或交叉验证来配置这个参数。λ是另外一个需要调整的超级参数(注意在python代码中,lambda是一个保留字段,所以我们实际表示参数λ时往往使用“lambd”)
在神经网络中实现正则化:
对应的成本函数为:
其中
因为w的大小为( n^[ L − 1 ], n^ [ l ]
) ,n^[L-1]
表示隐藏单元的数量,n[l]表示l层单元的数量。该矩阵范数被称作Frobenius(弗洛贝尔乌斯范数),即——一个矩阵中所有元素的平方和。
对应的梯度下降:
则梯度更新公式变为:
带入dw中得到:
其中,( 1 − α λ/ m ) <1
的项,会给原来的W[l]一个衰减的参数,所以L2范数正则化也被称为“权重衰减(Weight decay)”
。
看下面例子以作体会(左图是高偏差,右图是高方差,中间是just right的图像):
假设下图是一个过饱和的神经网络:
其正则化后的代价函数为:
我们可以看到我们实质是对L2范数进行了压缩。直观上的解释就是:当正则化λ设置得足够大,权重矩阵W会被设置为接近于0的值。
直观理解就是:我们试着把多隐藏单元的权重设为0,于是基本上消除了这些隐藏单元的许多影响。
这样一来原本过拟合的大型神经网络就可以被简化为一个很小的网络(但是深度是不变的),它将使得这个神经网络从过拟合状态向高偏差状态进行过渡,而随着我们对于λ的测试,我们可以在这个过程中找到”just right“状态!
当然实际上隐藏层的神经元依然存在,只是他们的影响变小了,便不会导致过拟合。
假设神经元中使用的激活函数为g ( z ) = tanh ( z )
,在加入正则化项后:
当λ增大,导致W^[ l ]
减小,Z [ l ] = W [ l ] a [ l − 1 ] + b [ l ]
也会减小,由上图可知,在z较小的区域里,tanh ( z ) 函数近似线性,所以每层的函数就近似线性函数,整个网络就成为一个简单的近似线性的网络,从而不会发生过拟合。
但是L2正则化的不足有:
dropout重点在于随即删除网络中的神经单元,进而对神经网络进行化简。
①inverted dropout(反向随机失活)
举例(以一个三层网络为例,只说明在某一层中实施dropout)说明如下:
本质而言就是我们给不同的输入特征向量增加一点权重,然后传播所有的权重,dropout将会产生收缩权重的平方范数的效果,并完成一些预防过拟合的外层正则化。上文提到L2对于不同权重的衰减是不同的,它往往取决于倍增的激活函数的大小。
如果担心某些隐藏层比其他层更容易发生过拟合,就可以这些层对应的keep_pro值设置得比其他层更低;缺点是:为了使用交叉验证,你要搜索更多的超级参数。
综上所述:
dropout虽然赋予我们更简便的神经网络,但是代价函数J不再被明确定义,每次迭代,都会随机移除一些节点,由于这种随机性,使得成本函数的复查变得困难。
当我们收集新数据消耗过大时,为了节约成本(以收集猫咪数据集为例)我们可以:
early stopping的作用原理与L2正则化(选择参数w范数较小的神经网络以避免神经网络的过度拟合)类似,它可以在成本J变化的不那么激烈时停止,避免参数w迭代变得很大。同时它只运行一次坡度下降,只需要获得w得较小值,中间值,较大值即可,无需像L2正则化一样要反复测试超级参数λ得值。
early stopping的不足在于:他无法同时处理:
假设我们有一个训练集,他有两个输入特征,所以输入特征X是二维的。
归一化输入的步骤:
第一步:零均值化——移动训练集直到它完成零均值化
①减去均值得到对称的分布:x : = x − μ
②计算每个输入特征占所有样本数据的均值:
第二步:归一化方差
注意上图中,特征X1的方差比特征X2的方差要大得多,而我们要做的就是给σ 赋值为1:
σ2是一个向量,它的每个特征都有方差,而由于此时我们对于每个输入特征量x(i)都完成了零均值化,则此时得到的方差就等于x(i)的平方。
上述是老师的讲法,观看的时候有不少争议,可取的一个解释是老师实际讲的是”0均值标准化“,上述公式中x=x/σ比较合理
归一化特征量,可以使得代价函数平均起来更对称,也更加方便找到梯度下降的最优解:
当我们在训练神经网络时,导数或坡度有时会变得非常大或非常小。
以一个单个神经元为例:
我们可以看到参数w1、w2、w3、w4……wl的值直接影响输出z的大小,如果我们想要获取一个数值较为合理的z,那么w(i)相应的就应该设置得比较小,例如我们可以设置:
Var(wi)=1/n
#其中n是输入的神经元个数
#称为Xavier initialization
参数初始化可以写作:
WL = np.random.randn(WL.shape[0],WL.shape[1])* np.sqrt(1/n)
不同激活函数的 Xavier initialization:
其中n是输入的神经元个数,也就是n^[l − 1 ]
如ppt所示,以函数f(θ)=θ3为例,其导函数设为g(θ)=3θ2:
当θ=1时,g(θ)=1
观察图像写出双边导数有:
当θ=1,f‘(θ)=3.0001
对于单边导数有:
当θ=1,f‘(θ)=3.0301
结论:
使用双边误差的方法会更逼近实际导数值,使得精确度大大提高;从而在梯度检验和反向传播中使用该方法 会更加准确。
我们的神经网络中各个不同的隐藏层具有不同的参数w,为了做梯度检验,我们可以把参数全部连接起来,将输入特征X的维度变为一个一维的向量θ 。
同时对dW[1], db[1], ⋯ ,dW[ L]执行同样的操作,如图所示:
然后去求出dθ与代价函数J的梯度或坡度之间的差距大不大,若差距大于10-5则需要排查各层计算: