吴恩达深度学习课程第二课笔记 — 改善深层神经网络(1)

感觉第二课难度提升了,课程看一遍都没太懂,很多原理都比较模糊,需要多查找资料进行补充。这里记录第一周:深度学习的实践层面。

1.1 训练,验证,测试集
(1)在配置训练、验证和测试数据集的过程中做出正确决策会在很大程度上帮助大家创建高效的神经网络。训练神经网络时,我们需要做出很多决策,例如:

  • 神经网络分多少层
  • 每层含有多少个隐藏单元
  • 学习速率是多少
  • 各层采用哪些激活函数

(2)在机器学习中,我们通常将样本分成训练集,验证集和测试集三部分,其中训练集用于训练模型,然后通过验证集或者简单交叉验证集来选择最好的模型,经过选择之后再在测试集上进行无偏估计,评估算法的运行情况。在机器学习发展的小数据量(一般100-10000条数据)时代,常见做法是将所有数据三七分,就是人们常说的70%验证集,30%测试集,如果没有明确设置验证集,也可以按照60%训练,20%验证和20%测试集来划分。数据集规模较大的,验证集和测试集要小于数据总量的20%或10%。

(3)例子:现代深度学习的另一个趋势是越来越多的人在训练和测试集分布不匹配的情况下进行训练,假设你要构建一个用户可以上传大量图片的应用程序,目的是找出并呈现所有猫咪图片,可能你的用户都是爱猫人士,训练集可能是从网上下载的猫咪图片,而验证集和测试集是用户在这个应用上上传的猫的图片,就是说,训练集可能是从网络上抓下来的图片。而验证集和测试集是用户上传的图片。结果许多网页上的猫咪图片分辨率很高,很专业,后期制作精良,而用户上传的照片可能是用手机随意拍摄的,像素低,比较模糊,这两类数据有所不同,针对这种情况,可以建议大家要确保验证集和测试集的数据来自同一分布。因为你们要用验证集来评估不同的模型,尽可能地优化性能。如果验证集和测试集来自同一个分布就会很好。

1.2神经网络中的偏差与方差
当我们的模型表现不佳时,通常是出现两种问题,一种是 高偏差 问题,另一种是 高方差 问题。识别它们有助于选择正确的优化方式,
(1)偏差与方差主要与两个因素有关:训练集误差(train set error)、验证集误差(dev set error)。

(2)高偏差问题代表目标函数欠拟合(训练集误差与验证集误差均较高且相近),而高方差问题代表过拟合(训练集误差与验证集误差相差较大)。
吴恩达深度学习课程第二课笔记 — 改善深层神经网络(1)_第1张图片
(3)解决高方差问题:正则化或者准备更多数据
详细情况:神经网络中的偏差与方差,及其解决方法(转载)
吴恩达机器学习:方差与偏差(转载)

1.3正则化
(1)L2正则化过程
下图为逻辑回归模型正则化过程,其中λ是正则化参数,L是神经网络层数。
吴恩达深度学习课程第二课笔记 — 改善深层神经网络(1)_第2张图片
深层神经网络L2正则化
吴恩达深度学习课程第二课笔记 — 改善深层神经网络(1)_第3张图片
吴恩达深度学习课程第二课笔记 — 改善深层神经网络(1)_第4张图片

  • 因为代价函数J后加上含w的式子后,所以“dw”(即dJ/dw)也需要加上该式子对w的求导即(λ/m)*w[l],w[l]也会随之更新,其中backprop会给出J对w​的偏导数。
    最后进行公式汇总发现w[l]前系数一直小于1,所以L2正则化也被称为“权重衰减”。

  • 正则化对减轻过拟合现象的原因可能很不明显,但如果要简要的去说明,那么我们只能说:由于正则项的存在,使得模型的权值趋于衰减,由于权值普遍的衰减,甚至有部分的权值接近于0,这样就相当于模型的复杂度得到降低。

详细说明正则化:深度神经网络之正则化(转载)
神经网络的提升方法(2)——正则化(转载)

(2)dropout(随机失活)正则化
Dropout相对于L1,L2而言,则是一种更为暴力的正则化方法。L1,L2根本方式都是在损失函数上增加一个惩罚项,使得模型在训练的过程中对高模型复杂度也进行惩罚,但Dropout是不通过损失而直接对网络本身进行修改。和我们之前讲过的L2正则化类似,实施dropout的结果是它会压缩权重,并完成一些预防过拟合的外层正则化。下面我们来用网络结构图说明Dropout的工作方式。
吴恩达深度学习课程第二课笔记 — 改善深层神经网络(1)_第5张图片
假设你在训练上图这样的神经网络,它存在过拟合,这就是dropout所要处理的,我们复制这个神经网络,dropout会遍历网络的每一层,并设置消除神经网络中节点的概率。假设网络中的每一层,每个节点都以抛硬币的方式设置概率,每个节点得以保留和消除的概率都是0.5,设置完节点概率,我们会消除一些节点,然后删除掉从该节点进出的连线,最后得到一个节点更少,规模更小的网络,然后用backprop方法进行训练。
吴恩达深度学习课程第二课笔记 — 改善深层神经网络(1)_第6张图片
以下为inverted dropout (反向随即失活)的完整步骤。它是通过在训练阶段除以keep_prob的值来保证期望值不变。

d3 = np.random.rand(a3.shape[0],a3.shape[1]) < keep_prob
a3 = np.multiply(a3,d3)
a3 /= keep_prob

d3表示一个三层的dropout向量,其中一个要选择的参数是keep-prob,它代表每一层上保留单元的概率。如果你担心某些层比其它层更容易发生过拟合,可以把某些层的keep-prob值设置得比其它层更低。
详细请看:Dropout正则化(转载)

(3)其他正则化方法

  • 数据扩增
    通过旋转、裁剪、方法、反转等操作对原数据集进行处理,但是这些额外的假数据无法获得更多的信息,但是却更加的廉价,除了一些对抗性代价,其余代价几乎为零。以这种方式扩充数据集从而进行正则化的方法比较廉价。

  • early stopping:代表提早停止训练神经网络
    机器学习可以看成是两个重要部分的组合,一是最小化代价函数J,例如梯度下降、Momentum、RMSprop、Adam等等;二是防止过拟合,例如前面所说的正则化,扩充数据集和early stopping等。在机器学习中,超参数数量剧增,导致选出合适的算法也变得越来越复杂,我们通常使用的是一种“正交化”的思想,就是同一时间只考虑一件事情。即在最小化代价函数的时候,我们只需要考虑w,b这两个参数,让代价函数J的值变得越小越好,其他的现象(比如是否发生了过拟合)都不需要考虑。然后再进行其他的任务,比如进行正则化来减小方差,抑制过拟合。

    early stopping的主要缺点是不能独立的处理上述的两个问题,在抑制过拟合的过程中也停止了优化代价函数J,用一种方法考虑两种问题往往会使问题变得更加复杂。如果不使用early stopping的方法,那么另一种常见的方法就是正则化,然而,使用正则化往往会增加超参数的数量,增加神经网络训练的时间,尝试大量超参数的计算代价太高。

1.4归一化输入
训练神经网络,其中一个加速训练的方法就是归一化输入。假设一个训练集有两个特征,输入特征为2维,归一化需要两个步骤:(实际是标准化操作)
(1)零均值
(2)归一化方差;
注意下图公式有错,其实是y = (x - mean)/σ,不是σ的平方,它是基于原始数据的均值(mean)和标准差(standard deviation)进行数据的标准化,经过处理的数据符合标准正态分布,即均值为0,标准差为1。
吴恩达深度学习课程第二课笔记 — 改善深层神经网络(1)_第7张图片在这里插入图片描述在这里插入图片描述
如果你用它来调整训练数据,那么用相同的μ和 σ来归一化测试集。其中μ和 σ是由训练集数据计算得来的。

归一化输入的原因:
吴恩达深度学习课程第二课笔记 — 改善深层神经网络(1)_第8张图片
左图为非归一化输入特征后代价函数的表现情况,右图为归一化输入特征值后代价函数的表现情况。如果你归一化特征,代价函数平均起来看更对称,如果你在左图这样的代价函数上运行梯度下降法,你必须使用一个非常小的学习率。因为如果是在这个位置,梯度下降法可能需要多次迭代过程(一般会走“之”字型),直到最后找到最小值。但如果函数是一个更圆的球形轮廓,那么不论从哪个位置开始,梯度下降法都能够更直接地找到最小值,你可以在梯度下降法中使用较大步长,而不需要像在左图中那样反复执行(也就是步长走多走少方向总是对的,不会走偏)。

1.5神经网络的权重初始化
(1)梯度消失/梯度爆炸
训练神经网络,尤其是深度神经所面临的一个问题就是梯度消失或梯度爆炸,也就是你训练神经网络的时候,导数或坡度有时会变得非常大,或者非常小,甚至于以指数方式变小,这加大了训练的难度。如下图所示,
在这里插入图片描述
容易看出输出公式为:
在这里插入图片描述
如果每一层的参数W都大于1,则梯度就会变得很大,反之梯度就会很小,这种现象称为梯度爆炸/梯度消失。这种现象在很长一段时间中是训练深度学习的一个障碍,虽然有一个不能彻底解决此问题的方案,但是在如何选择权重初始化问题上提供了很多帮助。

(2)神经网络的权重初始化
为了避免梯度消失与梯度爆炸,权重初始化是当前一个比较好的解决方法,所谓的权重初始化就是在初始化W的时候再乘上一个系数:

  • 激活函数为tanh时,令W的方差为1/n:激活函数为tanh时,令W的方差为1/n:
w[l] = np.random.randn(n[l],n[l-1])*np.sqrt(1/n[l-1])
  • 激活函数是ReLU,权重w的初始化一般令其方差为2/n :
w[l] = np.random.randn(n[l],n[l-1])*np.sqrt(2/n[l-1]) 
  • Yoshua Bengio提出一种初始化w的方法,令其方差为 2/(n[l-1]+n[l]):
w[l] = np.random.randn(n[l],n[l-1])*np.sqrt(2/(n[l-1]+n[l])) 

深度学习中神经网络的几种权重初始化方法(转载)

1.6梯度的数值逼近与梯度检验
(1)梯度的数值逼近
(2)梯度检验
吴恩达深度学习课程第二课笔记 — 改善深层神经网络(1)_第9张图片

这一章节我理解起来有点吃力,计划先看CNN和提高python编程再回来补充。
参考博客:吴恩达深度学习系列笔记:第二课 改善深层神经网络(转载)
滴滴滴~~挖坑打卡。。

你可能感兴趣的:(神经网络,机器学习)