美文网首页
吴恩达深度学习课程笔记(精华版)--1.网络基础和系统构建

吴恩达深度学习课程笔记(精华版)--1.网络基础和系统构建

作者: Caucher | 来源:发表于2021-12-28 23:32 被阅读0次

    本系列是编者学习吴恩达deeplearning.ai 深度学习系列课程的笔记。
    编者有一定机器学习基础,也看过Andrew的机器学习课程。由于Andrew的课程非常通俗易懂,笔记中会省略那些帮助理解的例子、图形等,只把最终的观点、解释、结论和解决方案做整理,以供日后查看,另外编者也在某些地方,结合原版论文做出了一些批注和补充,所以称之为精华版。
    本篇是Course1+Course2+Course3,主要讲述NN和DNN的宏观概念,以及激活函数、正则化、优化函数、参数调优、性能评价、网络构建周期、构建思路与处理办法等广泛适用于各种神经网络的基础技术。

    1 深度网络和深度学习

    1.1 深度学习简介

    1.1.2 什么是神经网络

    Example:房价预测

    • 输入为:房屋大小,卧室数量,周边富裕程度等
    • 隐藏单元:可以通过输入组合得到家庭人口数量,周边学校质量,交通便利度等二级指标
    • 输出为房价

    神经网络的实质是一个精细的映射函数

    1.1.3 用神经网络进行有监督学习

    使用神经网络进行有监督学习的第一个问题是要定义好模型的输入和输出。
    根据不同的输入数据类型(特征类型)(结构化、非结构、半结构等),选择不同的网络结构。

    1.1.4 为什么深度学习会兴起

    原因主要是数据量激增。

    • 当标签数据集量不大时,神经网络和机器学习模型很难分出优劣,效果主要取决于算法细节和对数据的处理。
    • 当数据量足够大时,复杂的大规模神经网络,具有相当大的参数空间,可以训练出很强的非线性效果,因此效果稳定比机器学习模型要好。

    另外一个原因是计算力增强:包括效率加速、硬件加速、算法加速(例如从sigmoid激活函数->Relu函数,可以加速梯度下降)等。

    1.2 神经网络基础

    1.2.18 logistic回归代价函数的解释

    首先给出一个符号定义:\hat{y} = p(y=1|x)

    • 即给定x,预测y为1的概率为\hat{y}
    • 那么当y=1时:p(y|x) = \hat{y}
    • 当y=0时:p(y|x) = 1 - \hat{y}

    整合一下,p(y|x) = \hat{y}^y(1-\hat{y})^{1-y}
    如果各个数据点是独立的,那么每次分类都是准的概率为
    \prod_{i=1}^mp(y_i|x_i) = \prod_{i=1}^m\hat{y}_i^{y_i}(1-\hat{y}_i)^{1-y_i}
    这变成了一个极大似然估计的问题,即给定这么多(x_i,y_i)的样本,想要把模型的参数求出来,则需要对上式取最大值,这可以通过先取对数来简化,即
    \sum_{i=1}^my_ilog\hat{y}_i + (1-y_i)log(1-\hat{y}_i)
    这就是logistic回归代价函数的相反数(因为要取最小值)。
    其中\hat{y}_i其实就是模型的输出预测值h_\theta(x_i)

    • 另外补充一下,为什么MSE(均方差)代价函数不适用于logistic回归,主要是因为其用在logistic回归中将产生非凸函数,梯度下降用不了。MSE在回归问题中很好用,但在分类问题中由于预测输出是离散值,就不太好用了。

    1.3 浅层神经网络

    1.3.6 激活函数

    • sigmoid函数是一种,即\frac{1}{1+e^{-z}},但基本上不怎么用,只在做二元分类时输出层用起来比较方便。

      image.png
    • tanh(双曲正切函数)几乎总是比sigmoid函数要好一些,而且由于关于0对称,所以自带数据归一化的功能。
      \frac{e^z-e^{-z}}{e^z+e^{-z}}

      image.png
    • ReLU函数,是最常用的默认激活函数。其好处主要在于导数比较大,尤其是在z比较大的范围之内,而关于z<0的部分,Andrew的解释是神经元较多,一般不会让它小于0。导数较大,意味着做梯度下降时速度快。
      max(0,z)

      image.png
    • leaky ReLU函数,是ReLU的一种变形,可以作为备选。
      max(0.01z,z)

      image.png
    • 总的来说,根据Andrew的语气,激活函数的选择是一个比较玄学的事情,主要是靠经验来选择,目前恐怕主要就是ReLU函数了。

    1.3.7 为什么需要非线性激活函数

    原因:如果是线性激活函数,那么神经网络就是输入的线性组合,训练不出来复杂的非线性关系。
    唯一的可能使用的就是在输出层,做回归任务时,可能就用线性激活。

    1.3.9 神经网络的梯度下降法

    梯度下降本质就是求导了,神经网络里求导(反向传播)着重使用链式法则,这里不多说。
    值得一说的是,可以批量进行梯度下降(mini-batch gradient descent),只需将输入和输出都由向量变成矩阵即可。考虑到代价函数对各个输入的代价是取平均值的,梯度下降时对应的参数调整也要取平均保持一致。

    1.3.11 随机初始化

    • 为什么不能全初始化为0:如果全都初始化为0,所有隐藏单元全都在做一样的事情,所以最后这些隐藏层都没用。
      所以一般是随机初始化。另外初始化时一般都是非常小的随机数,因为如果要用sigmoid/tanh激活函数时,值太大会让梯度下降很慢。
    • 这里涉及一个参数,将随机生成的数字缩小一定的倍数,比如较小的网络,这个数字可以是0.01.

    1.4 深度神经网络

    1.4.1 深度神经网络(DNN)

    logistic回归可以看做是一个单层的神经网络,之后加隐藏层成为一个浅层神经网络,再加隐藏层称为深度神经网络。

    1.4.5 为什么使用深层表示

    DNN奏效的原因可以通过一个例子来解释:

    • 比如一个人脸识别算法,要构造一个DNN,输入图像信息,第一个隐藏层可以捕捉图像中人脸的各种边缘,第二个隐藏层可以识别出小的组成部分,第三个隐藏层就可以是一个整体。复杂的特征需要逐层去构建。

    深层相对于浅层的好处是网络的规模可以得到控制:

    • 比如n个特征做异或,成对异或,logn层的网络就可以完成,神经元个数为n;但是如果只用1个隐藏层,至少需要2^n个隐藏层神经元才能枚举全部可能。

    但是从分析问题角度来讲,一定是由浅入深的:先看看logistic回归是否奏效,然后逐步增加隐藏层数。

    1.4.6 超参数

    DNN的超参数其实很多:学习率,隐藏层数,各隐藏层神经元数,迭代次数,正则化参数等等等等,这些超参会影响最终学习的结果。

    • 但是如何把这些参数调到最好的值呢?只有试。通过一些intuition和调试手段,这个过程在有经验的ML eng. 手上会更快,但不会没有。
    • 另外,如果数据是在变化的(很少有不变的),那么在前几个月调成最优的超参,很可能现在就不适用了,只能继续调参。

    2 提升DNN:调参、正则化和优化

    2.1 神经学习应用

    2.1.1 训练/验证/测试集

    在大数据集和DNN的语境下,验证集和测试集的比例一般会更小。

    • 比如1M的数据集,可能验证集10k,测试集10k,就足以用来选择、测试模型算法。
    • ML中一般是6:2:2,或者7:3之类的,在大数据集下不适用。

    第二点就是三个子集的数据来源应该是同分布的:

    • Andrew举了一个例子,训练集都是高分辨率的摄影网站上的猫咪照片,验证集和测试集用用户自己的随手拍,会导致效果很差。

    2.1.2 偏差/方差

    在训练集和验证集取自同分布,且基本误差(人类误差)较小的情况下:

    • 训练集误差明显小于验证集误差:高方差(过拟合)
    • 训练集误差和验证集误差都很大:高偏差(欠拟合)
    • 训练集误差和验证集误差都很大且训练集误差明显小于验证集误差:既高方差又高偏差(有些数据区域偏差高,即像线性分类器,有些数据区域方差又高,像过拟合的复杂曲线。尤其在高维情况下容易出现)

    2.1.3 优化方案

    • 高偏差(训练集):

      1. 用一个更大的网络是一个稳妥的方案
      2. 多训练一段时间,但未必会奏效
      3. 换网络结构,这个甚至有可能变差
    • 当解决了高偏差问题,如果出现了高方差(验证集)的问题:

      1. 多搞一些数据,如果可以
      2. 正则化
      3. 换网络结构,这是一个需要尝试的事情。

    优化就是这两个部分的来回迭代,先搞好训练集(bias),然后看验证集(variance),有任何修正,需要重新从训练集开始再来一次,直到两个数据子集上都质量合格,任务就完成了。

    • 一个误会:在deep learning早期经常有偏差和方差做trade-off的思想,那是数据量不够的时候,现在只要通过延长训练复杂度,增加数据量等方式,还是可以改善一个而不影响另一个。

    2.1.4 正则化

    正则化就是在正常的代价函数后面再加一项关于参数向量的代价,\lambda为正则化参数。

    • L2正则化(最常见):加参数向量/矩阵的L2范数*\lambda,即到原点的欧式距离。
      • 用于矩阵时,就是对神经网络引入正则化,其中,参数矩阵仅为最后一个隐藏层到输出层的参数矩阵
      • 矩阵的L2范数称为Frobenius norm (F)
      • 这种正则化也被称为权重衰退,因为在求导(反向传播)之后,权重矩阵每个更新,相比于没有正则化时,会首先将原参数矩阵缩小至原来的(1-\frac{\alpha\lambda}{m}),然后再减去原来的反向传播项。
    • L1正则化:加参数向量/矩阵的L1范数*\lambda

    2.1.5 为什么正则化可以减少过拟合

    代价函数中存在一个\lambda,会让参数矩阵普遍偏小,那么算出来的z值(激励前值)就会偏小,假设用tanh激活函数,其在z值于0附近时,几乎是一个线性函数,而用线性函数做激励最多只能反映一个线性关系。

    • 注意在调试学习曲线的时候,把这个正则项拿掉。

    2.1.6 Dropout正则化

    可以翻译为随机失活正则化,其主要思想是训练过程中,随机剔除一些神经元,使得网络变得更简单,趋向于欠拟合。

    • 具体来说,执行训练之前,对每个训练样本,每个需要正则化的层中的每个神经元,我们都随机生成一个数(0或1,1的概率为超参keep_prob)。
    • 在训练过程中,需要dropout的层在计算激励值之后,和生成的随机数乘一下,干掉那些需要忽略的神经元的输出。
    • 最后将剩下的激励值都除以keep_prob,以确保在对下一层的输入没有Scale上的改变。
    • 在测试集上就不需要搞keep_prob,直接用已有的参数做测试就可以了。
    • 这种方式称为inverted dropout

    2.1.7 理解dropout

    • 由于每个神经元都有可能被随机抹除掉,所以某个后层神经元不能把所有权重都压在前面某一个神经元上,而是要分散权重都前一层的所有神经元。
    • 这在事实上让收缩了权重矩阵,和L2正则化起到了类似地作用。(编者注:10^2 > 5^2 + 5^2,分散权重,F范数会小一些)
    • 各层的keep_prob也可以不同,对于复杂的层,keep_prob可以大一些防止过拟合;对于很简单的层,比如输出层,可以让keep_prob直接=1,即不采用此策略。输入层的keep_prob,一般就是1,即不删输入特征,如果一定要用Dropout,keep_prob也要接近1.
    • 本质上dropout只是一个正则化手段:Andrew举了一个例子,在CV里面,特征非常多,但数据量不够,所以容易过拟合(编者:像线性回归中组合了太多高次项),因此常用dropout正则化。但在其他问题上,如果没有出现overfit,就别考虑dropout。
    • 缺点:此时代价函数就没有明确定义了,完全变成了一个概率上的事情,因此学习曲线也没法画了,所以一般是先把keep_prob全都设为1,根据学习曲线确定代码没问题,然后再开dropout。

    2.1.8 其它正则化方法

    • 对原始数据集做一些简单的变化,也是一种扩充数据量的办法,可以作为一种正则化方法来使用。
    • 通过学习曲线,在训练到过拟合之前,就提前中止,前提是这个位置的错误率你很满意。本质上,训练从初始的参数为随机小参数到后来越来越大,我们提前中止,实际上也是收缩了权重,和L2正则化有类似的作用。
    • 优点:运行一次梯度下降看曲线就可以了,计算代价低;而L2正则化就要经常改变\lambda,观察学习曲线。
    • 缺点:对于ML任务来说,如果选定了模型,比如NN,后面的过程有两个正交的组成部分,一个是让代价更低,即学习过程,如梯度下降;另一个是给对应的模型解决过拟合的问题,例如用正则化。而提前中止会让这两个事情耦合在一起,只能同时考虑一大坨超参,会让思考复杂化。

    2.1.9 输入归一化

    主要是让输入特征的数据范围大小一致,如果差的太多,它们对应的参数范围差的也会非常大,代价函数会变得非常“狭长”,不利于梯度下降。归一化后,参数范围也差不多,代价函数更像一个均匀的碗,有利于梯度下降。
    Andrew给的归一化方案是所有数据减均值除方差,在各个特征上都这样做。

    2.1.10 梯度消失和梯度爆炸

    如果一个网络层数非常非常多,那么假设每个权重矩阵都为0.9II为单位矩阵,假设激活函数是a=z,那么输出层的激励值将为0.9^L*x,由于指数爆炸,最后这个激励值将变得非常小。类似地,如果权重矩阵是1.1I,激励值又会非常大。同样的,反向传播中的各级导数(梯度)也有类似地问题。这就是深层网络中的梯度消失和爆炸问题。

    2.1.11 权重初始化

    通过权重初始化可以改善梯度消失和梯度爆炸的问题。之前我们说权重初始化只需要设置为随机小值即可。

    • 进一步,如果特征比较多,我们就希望每个特征的参数权值比较小,否则特征越多,激励越高。
    • Xavier初始化(tanh激励函数)
      • 形式上讲,我们希望对于每一个单个神经元,输入参数权值的方差为1/n。注意到输入参数的期望(均值)一般是0,就是标准正态的均值;输入越多,方差越小,权值和0的距离也越小。
      • 编程上讲,每个权值被设置为标准正态分布的一个随机量*\sqrt{1/n}
      • 在这种情况下,如果输入也被正则化了,那么激励值也就大约在均值为0,方差为1的分布下产生,这就解决了梯度消失和爆炸问题。
    • 当激励函数用ReLU函数时,一般方差为2/n更为合适。\sqrt{\frac{2}{n^{[l-1]}+n^{[l]}}}也是一种选择。

    2.2 优化算法

    2.2.2 mini-batch 梯度下降

    用了mini-batch后,学习曲线的下降(代价函数值下降)将成为抖动的,有噪声的。mini-batch size越小,噪声越大;mini-batch size = 1时,就会退化为随机梯度下降,噪声是极大的。

    2.2.3 指数加权平均

    v_i = \beta v_{i-1} +(1-\beta)\theta_i
    意思是说,当前预测值不仅和当前观测有关,而且和之前的1/(1-\beta)次观测有关。beta越大,考虑之前的权重就越大,预测曲线会越平稳,对于峰值谷值会有更长时间的滞后;beta越小,噪声越大,曲线会不平稳,但是和观测值会很贴近。
    beta一般取0.9,0.95,0.98等
    (编者注:计算机网络中,印象中TCP协议中的延迟预测似乎也用过类似的方案,本质上是一种简单的预测模型)

    2.2.5 指数加权平均偏差修正

    一般来说,v_0=0,这样当\beta比较大时,早期的预测值会非常小,为了减弱早期的误差,公式将输出修正为\frac{v_i}{1 - \beta ^i},这样在i比较小时,可以获得较大补偿,i较大时,补偿基本就没了。

    2.2.6 动量梯度下降(Momentum)

    • 动量梯度下降就利用了指数加权平均的思想,每次进行梯度下降时,不将此次下降完全独立于之前的梯度下降,而是借鉴一部分之前的梯度下降。
    • 具体来说,每次做梯度下降时,算出的dW,db,不直接作用于当前的W,b,首先计算v_{dW} = \beta v_{dW} + (1-\beta)dW,然后让W=W-\alpha v_{dW}, b也同理。Momentum不做偏差修正。
    • 为什么要借鉴之前的梯度呢?一个直观的感觉就是抖动。对于一个狭长的代价函数,如果在宽上来回抖动,会歪曲到达谷值的路径,对之前若干次梯度的平均,基本可以抵消抖动,使得梯度直达谷值,加速优化。

    2.2.7 RMSprop梯度下降(root mean square)

    这个方法和Momentum有点类似,intuition也是差不多的,只要找对了方向,学习率就可以放大一些。
    再具体公式上,RMSprop有一定差异。
    S_{dW} = \beta S_{dW} + (1-\beta)dW^2
    W = W - \alpha \frac{dW}{\sqrt{S_{dW}}}

    • 可以看到,相比于Momentum,RMS为当前梯度增加了平方项,然后在学习时又将其平方根作为分母。
    • 这表示的含义是:假设仍然是一个狭长的代价函数,对于宽来说,少少移动一段,就会导致较大的变化,所以梯度(dW)是较大的,那对应的S_{dW}也是很大的,作为分母时,整体的移动步伐就比较小了。

    2.2.8 Adam优化算法(Adaptive moment estimation)

    Adam基本就是把Momentum和RMSprop的结合。

    • 首先用Momentum算出v_{dW},然后用RMSprop算出S_{dW}
    • 然后分别用对应的参数\beta_1,\beta_2做偏差修正
    • 最后用以下式子进行学习W = W - \alpha \frac{v_{dW}^{corrected}}{\sqrt{S_{dW}^{corrected}} }
      编者:总结一下,根据Andrew所说,目前RMSprop和Adam是在各种网络中都比较有效的。至于其中原因,直觉上就是找对方向,减小错误方向抖动,提高学习率。但具体的证明和推导似乎比较缺乏,优化算法这里更多的可能是实战经验给出的。Andrew也提到早期的优化算法往往没什么适用性,所以人们对其信心也不高,直到RMSprop和Adam算法出现。所以用的时候,直接捞二者之一用即可。

    2.2.9 学习率衰退

    核心思想是当接近local optica时(已经在谷底附近),较小的学习率能够避免在这附近兜圈子。有很多算法会逐步调整学习率,一般的是在过一轮数据之后,降低一些,有多项式的,指数的,甚至有手动的,都可以,有用但不做为主要的超参来看待。

    2.2.10 局部最优的问题

    • 很多人会质疑梯度下降会不会收敛到local optica上。Andrew的解释是,梯度为0的维度可能是极大值,也可能是极小值,如果维度非常多,要找到一个全空间上的local optica概率极小,需要在全部维度上都是极小值才可以。
    • 常见的情况是在一部分维度是极小值,一部分维度是极大值,形成了鞍点
    • 鞍点的问题是周边的梯度都非常平缓,要快速走出去就需要更好的优化算法,比如Adam等。

    2.3 调参和batch norm

    2.3.1-2.3.3 调参

    Andrew给超参的优先级排了个序:

    1. 学习率\alpha
    2. Momentum 参数\beta,决定滞后度和平滑度;隐藏单元数;mini-batch size
    3. 层数L,学习率衰退
    4. Adam优化算法中的其他参数,基本不用调

    至于具体的调参过程,Andrew给的建议是随机取值(相比于grid取值)(在合适范围内,线性or对数,根据含义定)+由粗到细的搜索高维参数空间。
    调参有两种过程,一种要长时间跟踪一个模型,根据学习曲线变化,不断调整超参,改善模型;另一种是先设置一大组超参,然后并行地训练模型,最后做出比较。肯定是后者更优,但是要考虑算力是否足够。

    2.3.4-2.3.7 batch norm

    batch norm怎么做

    batch norm的intuition是对输入的正则化,对于DNN,每一层如果理解为一个logistic回归,那其实应该对每一层的激励值做正则化,但事实上还没做。
    不过从习惯上来看(或者不知道的理由),正则化都是对激励前的值z做的,而非激励值。具体做法是先对各层的z值减均值除方差,像正常正交化一样,得到z_{norm},然后做下式变换:
    \tilde{z} = \gamma z_{norm} + \beta

    • 可以看到,如果\gamma\beta取合适的值,很有可能\tilde{z} = z
    • \gamma\beta已经成为网络的新参数(注意不是超参),和w,b同等地位,同样要通过优化算法来求;
    • 另一方面,如果对z统一减均值,那b偏移参数就被消掉了,所以如果用batch norm,b参数就不用训练了。

    batch norm为什么能加速优化算法呢?

    • 第一个原因和输入归一化一样,能让代价函数均匀点,下降快些;
    • 第二个原因是能让各层的学习相对独立,而不是参数学习都耦合在一起。因为在各层之间都有batch norm能够做正则化,把输入(z值)规范到一定的分布上(\gamma,\beta),这样对后续的影响就没有那么大了。
      • 这里涉及到一个概念叫covariate shift:其意思表示训练集和测试集必须同来源,同分布,如果不一致的话就不要期待有很高的准确率了。
      • 如果把网络前层的激励值看成输入的话,如果这些输入总是在不同分布上,后面的网络总是要做缓慢地调整(因为可能后层已经饱和,z值已经比较大了)来适应前层的学习结果,否则lose就会很高,这称为internal covariate shift。
    • 由于batch norm是在mini-batch size上来做的,所以对z值做归一化时的均值和方差都是不准的,这样就导致后层的输入是有噪声的,误打误撞和Dropout正则化有些类似,也起到了一些正则化的作用,但是别把它当真的正则化来用(解决过拟合)。【编者注:batch norm论文作者认为这可以减少对Dropout的需求,Andrew认为这两者可以结合用,目的不同。Andrew的理解应该更客观些。】

    测试集怎么做batch norm

    由于在测试集上你不可能也做mini-batch,【编者注:测试集和用户输入类似,你不能让用户一次只能输入一大批,用户只会输入一个样本】,这样batch norm中的第一步归一化也没法做了,因为没有均值、方差。
    解决方案就是要估计测试集的各层的\mu,\sigma^2,考虑到测试集、训练集同分布,那么仍然可以采用指数加权平均延续训练集mini-batch的\mu\sigma^2

    2.3.8-2.3.9 softmax回归

    softmax激励函数

    softmax是一个特殊的激励函数,它输入是一个向量,输出是一个向量。

    • 不同于之间的激励函数输入是标量,输出是标量。
    • 其计算方式为对每个元素做t_i = e^{z_i}a_i = t_i/\sum t_i
    • 也就是说要求输出的向量求和为1
    • 主要用于多分类器,表示各个分类的概率,加和为1.

    softmax回归

    • softmax回归是对logistic回归的一种多分类扩展;当分类数只有2的时候,softmax回归就退化成了logistic回归。
    • softmax是对比与hardmax,hardmax会把输出的激励向量,只保留1个1,剩下均为0.
    • 损失函数为(C为分类数):
      L = -\sum_{j=1}^Cy_jlog\hat{y_j}
      • 非当前分类的不计损失,当前分类的按预测的log值计入损失
      • 代价函数为损失函数在各个样本之和。
      • 非常幸运,对于这个代价函数dz^{[L]} = Y-\hat{Y}

    3 结构化机器学习项目

    3.1 机器学习系统优化周期

    1. 首先是在训练集中把模型的准确性做到和人类专家接近。【低偏差】
      • 一般来说,会把人类专家组的错误率当做贝叶斯错误率(理论上最低值)的一个很紧的上界。
      • 模型准确率和人类专家准确率之间的差距称为可避免误差。
      • 可避免误差优化方法:
        1. 训练一个更大的网络;
        2. 梯度下降更久一些,或者选用更高级的优化算法(Momentum, RMSprop, Adam)
        3. 改善网络结构;
        4. 搜索超参。
    2. 其次是让训练集误差和验证集误差较低。【低方差】
      • 方差的优化方法:
        1. 多搞一些数据;
        2. 正则化(L2,dropout,数据扩充等)
        3. 改善网络机构;
        4. 搜索超参。
    3. 如果训练集,验证集都没问题,但是测试集出了问题,说明出现了【验证集过拟合】。
      • 验证集过拟合的优化方法:
        1. 扩充验证集。

    3.2 数据不匹配

    3.2.1-3.2.5 定义与问题识别

    数据不匹配是说训练的数据来源和分布,与测试集的数据来源和分布不一致。Andrew举了一个例子,比如一个识别猫咪的分类器,训练集中的数据都是网络上的高清猫咪,结果算法的实际输入是普通用户拍的高糊猫咪照,这就属于分布不一致的问题。
    一般来说,很可能数据来源于两个部分,其中部分一易于收集、量大,通常用于训练集,部分二量少,不易于收集,通常是用户输入。拿到这两部分数据,如何训模型呢:

    • 方案1:全混一起,然后再分训练集、验证集、测试集。主要问题在于测试集和真实场景的用户输入的分布不太一样。
    • 方案2:将部分二按2:1:1拆成3份,一份进训练集,一份做验证集,一份做测试集。这种方案是可以采纳的。

    仍然存在的问题时,如果按方案二进行分割,验证集很难说明问题,因为验证集效果差有可能是算法高方差导致的,也有可能是数据不匹配导致的。解决方案是从训练集中抽同分布的一小部分做训练验证集

    • 如果训练验证集效果相比于训练集差,那就是高方差问题;
    • 如果训练验证集效果还不错,但验证集效果差,那就是数据不匹配导致的。

    3.2.6-3.2.10 数据不匹配解决方案

    3.2.6 人工合成数据

    人工合成数据使得训练集和测试集的数据分布更接近,比如给数据加噪声,但要注意噪声的分布范围也必须很大(至少和源数据一样大),否则容易在局部噪声上过拟合,这种过拟合人类也很难分辨出来。

    3.2.7 迁移学习

    迁移学习是说,现有两个任务A和B,它们有一定的相关性,比如A是从图像中识别是否是一只猫,B是识别X光。迁移学习就是先把任务A训出来,然后把网络的输出层换掉,然后在最后一层初始化权重,其它层不变,再用B的数据集去训练最后一层权重。

    • 迁移学习主要解决的是任务标签样本少的问题,其思路就是用一个很相关问题(标签样本很充足)的网络做预训练(pre-training),然后在当前问题上做微调(fine-tuning)。
      • 其主要思想是,在前面层学到的是比较初级的特征,在图像的例子里面,前层可能是轮廓,局部特征抽取等等,那这些知识用在X光图片里面也可以用,所以迁移学习实际上是一种知识迁移。
      • 当然如果当前任务标签样本足够多,重新训练全部层全部参数,也是可以的。

    3.2.8 多任务学习

    多任务学习是在一个神经网络里面同时完成多项任务。一个最经典的例子就是在图像识别中同时识别多种物体,比如车、行人、路面标记、指示牌等。相比之下,logistic回归只能做二元分类,softmax回归只能输出某一种分类(损失函数决定的,只在最准的分类上有损失),而多任务学习可以对一个样本同时打多个标签。

    • 能进行多任务学习的一个基础是,这多个任务有很多低层的相似性。比如车、行人、指示牌等都是图像处理中的物体,底层都需要轮廓、拼接等。
    • 第二个就是多个任务的样本量是差不多的,这样放在一起学习要比单独学习的效果要好。
    • 代价函数就是多个标签都有损失。
    • 多任务学习需要一个比较大的网络,如果网络比较小,有可能不如分开学习。

    3.2.9-3.2.10 端到端的深度学习

    端到端的深度学习是说,如果一个任务是由多个部分来完成的,举个例子,一个语音识别系统,可能先要做音节切割,然后拼成单词,然后拼成句子,然后理解语义等等,可以通过一个足够复杂的DNN来直接从输入做到输出,即输入一段话,输出语义。

    • 做end-to-end DL说起来简单,但不是万金油,它需要及其大量的数据,如果数据量非常充足,那么确实是一种捷径,而且往往效果更好。
      • end-to-end DL会摒弃人类对这个任务的理解,以机器的角度去学习理解这个任务,有可能得到更好的结果。当然这也有可能成为一个弊端,因为人类的理解并不一定就是错的。
      • 具体end-to-end如何应用,应用到何种地步,主要是靠实际任务性质和标签数据量来决定的。

    相关文章

      网友评论

          本文标题:吴恩达深度学习课程笔记(精华版)--1.网络基础和系统构建

          本文链接:https://www.haomeiwen.com/subject/jwxeqrtx.html