机器学习与深度学习自用笔记

一.欠拟合和过拟合

(1)偏差:Bias反映的是模型在样本上的输出与真实值之间的误差,即模型本身的精准度,即算法本身的拟合能力。
    方差:Variance反映的是模型每一次输出结果与模型输出期望之间的误差,即模型的稳定性。反应预测的波动情况。

(2)“高偏差”指的是“欠拟合”,而“高方差”指的是“过拟合”,两者均指的是无法很好的泛化(generalize)新样本。
          当一个机器学习系统建立后,我们接下来该如何进行优化,有哪些可以简单而有效地提高算法精度?首先,我们需要检测出算法是否处于高偏差还是高方差状态。
       接着,可以按照以下的方法进行优化:
       高方差(过拟合):
                    1)尝试更少的特征(人工或者PCA之类的算法)
                    2)获得更多样本来训练。(请结合学习曲线来确定
                    3)尝试正则化或者增加正则项的λ(注意均值归一化(mean normalization)和特征                            缩放(feature scaling))
       高偏差(欠拟合):
                    1)尝试更多的特征(欠拟合增加数据样本没用)
                    2)尝试增加hθ(x)的特征多项式
                    3)尝试减少正则项的λ

(3)在高偏差/欠拟合的情况下,增加数据到训练集不一定能有帮助。
         在高方差/过拟合的情况下,增加更多数据到训练集可能可以提高算法效果。

(4)偏差(Bias)和方差(Variance)是机器学习领域非常重要的两个概念和需要解决的问题。
         在传统的机器学习算法中,Bias和Variance是对立的,分别对应着欠拟合和过拟合,我们常常需要在Bias和Variance之间进行权衡。
         而在深度学习中,我们可以同时减小Bias和Variance,构建最佳神经网络模型。

(5)机器学习中基本的一个诀窍就是避免出现high bias和high variance。
         首先,减少high bias的方法通常是增加神经网络的隐藏层个数、神经元个数,训练时间延长,选择其它更复杂的NN模型等。
         在base error不高的情况下,一般都能通过这些方式有效降低和避免high bias,至少在训练集上表现良好。
         其次,减少high variance的方法通常是增加训练样本数据,进行正则化Regularization,选择其他更复杂的NN模型等。
        这里有几点需要注意的。
        第一,解决high bias和high variance的方法是不同的。
        实际应用中通过Train set error和Dev set error判断是否出现了high bias或者high variance,然后再选择针对性的方法解决问题。
        第二,Bias和Variance的折中tradeoff。传统机器学习算法中,Bias和Variance通常是对立的,减小Bias会增加Variance,减小Variance会增加Bias。
        而在现在的深度学习中,通过使用更复杂的神经网络和海量的训练样本,一般能够同时有效减小Bias和Variance。
        这也是深度学习之所以如此强大的原因之一。

(6)过拟合过于强调拟合原始数据,而丢失了算法的本质——预测新数据。
        我们可以看出,若给出一个新的值让其预测,它将表现的很差,是过拟合(Overfitting),虽然能非常好地适应我们的训练集但在新输入变量进行预测时可能会效果不好;

(7)过拟合问题,应该如何解决?
         1)丢弃一些不能帮助我们正确预测的特征。可以是手工选择保留哪些特征,或者使用一些模型选择的算法来帮忙(例如PCA);
         2)正则化。 保留所有的特征,但是减少参数的大小。包括L1、L2(L2 regularization也叫weight decay)
         3)early stopping
         4)数据集扩增(Data augmentation)
         5)dropout。

(8)当模型特征很多,而数据量很少的话,容易过拟合。

         因为目标函数为了尽可能的拟合较少的数据,不断复杂多个特征,从而拟合一个比较好(非常好)的函数,在数据内可以很好的预测(几乎百分百)。
         但过多的参数(特征复杂度)导致函数很复杂,当新数据到来时很难通过该函数得到正确的结果,即在样本外表现不佳,导致过拟合。

(9)使用较小的神经网络,类似于参数较少的情况,容易导致高偏差和欠拟合,但计算代价小;
         使用较大的神经网络,类似于参数较多的情况,容易导致高方差和过拟合,虽然计算代价比较大,但是可以通过正则化手段来调整而更加适应数据。
         所以使用一个较大的神经网络并采用正则化来修正过拟合问题通常比使用较小的神经网络效果要好。

扫描二维码关注公众号,回复: 14715336 查看本文章

(10)过拟合表现在训练数据上的误差非常小,而在测试数据上误差反而增大。其原因一般是模型过于复杂,过分得去拟合数据的噪声和outliers. 
           正则化则是对模型参数添加先验,使得模型复杂度较小,对于噪声以及outliers的输入扰动相对较小。
           过拟合的时候,拟合函数的系数往往非常大,过拟合,就是拟合函数需要顾忌每一个点,最终形成的拟合函数波动很大。在某些很小的区间里,函数值的变化很剧烈。
           这就意味着函数在某些小区间里的导数值(绝对值)非常大,由于自变量值可大可小,所以只有系数足够大,才能保证导数值很大。
           而正则化是通过约束参数的范数使其不要太大,所以可以在一定程度上减少过拟合情况。

(11)当训练集误差很大,训练集误差和交叉验证集误差近似时为偏差/欠拟合情况;

           当训练集误差很小,交叉验证集误差远大于训练集误差时为方差/过拟合情况。

(12)在高偏差/欠拟合的情况下,增加数据到训练集不一定能有帮助。
           在高方差/过拟合的情况下,增加更多数据到训练集可能可以提高算法效果。

(13)获得更多的训练样本——解决高方差;
           尝试减少特征的数量——解决高方差;
           尝试获得更多的特征——解决高偏差;
           尝试增加多项式特征——解决高偏差;
          尝试减少正则化程度λ——解决高偏差;
          尝试增加正则化程度λ——解决高方差。

二.正则化

(1)正则化可以改善或者减少过度拟合的问题。

(2)正则化指的是在代价函数中加入有关θ的惩罚项,θ出现的目的是抑制某些特征的作用,纠正过拟合。

(3)如果出现了过拟合,即high variance,则需要采用正则化regularization来解决。
         虽然扩大训练样本数量也是减小high variance的一种方法,但是通常获得更多训练样本的成本太高,比较困难。所以,更可行有效的办法就是使用regularization。

(4)λ又称为正则化参数 (Regularization Parameter)。根据惯例,我们不对 θ0(常数项)项进行惩罚。为什么只对w进行正则化而不对b进行正则化呢?其实也可以对b进行正则化。但是一般w的维度很大,而b只是一个常数。
     相比较来说,参数很大程度上由w决定,改变b值对整体模型影响较小。所以,一般为了简便,就忽略对b的正则化了。

(5)与L2 regularization相比,L1 regularization得到的w更加稀疏,即很多w为零值。其优点是节约存储空间,因为大部分w为0。
     然而,实际上L1 regularization在解决high variance方面比L2 regularization并不更具优势。
     而且,L1的在微分求导方面比较复杂。所以,一般L2 regularization更加常用。
     L1、L2 regularization中的λ就是正则化参数(超参数的一种)。可以设置λ为不同的值,在Dev set中进行验证,选择最佳的λ。

三.Logistic回归

(1)Logistic回归算法是一种分类算法,它适用于标签取值离散的情况,它的输出值永远在0到1之间。


(2)一个常用的Logistic函数为S形函数 (Sigmoid function)

(3)对于二元分类,神经网络只有一个输出单元,其输出值y不是0就是1,即SL=1。对于多类别分类,神经网络有K个输出单元,即SL=K。


(4)在Logistic回归中,我们只有一个输出变量y,又称标量(scalar);但是在神经网络中,我们可以有很多个输出变量,hθ(x)是一个维度为K的向量,因此神经网络的代价函数会比Logistic回归更加复杂一些。

(5)应该尽量避免使用for循环而使用向量化矩阵运算。在python的numpy库中,我们通常使用np.dot()函数来进行矩阵运算。
      我们将向量化的思想使用在逻辑回归算法上,尽可能减少for循环,而只使用矩阵运算。
      值得注意的是,算法最顶层的迭代训练的for循环是不能替换的。而每次迭代过程对J,dw,b的计算是可以直接使用矩阵运算。


四.神经网络

(1)从广义上说深度学习的网络结构也是多层神经网络的一种。深度学习中最著名的卷积神经网络是由Lecun等人提出的,是第一个真正多层结构学习算法,它利用空间相对关系减少参数数目以提高训练性能。
     在原来多层神经网络的基础上,加入了特征学习部分,这部分是模仿人脑对信号处理上的分级的。
     具体操作就是在原来的全连接的层前面加入了部分连接的卷积层与降维层,而且加入的是一个层级:输入层-卷积层-降维层-卷积层-降维层- ....-隐藏层-输出层。
     深度学习做的步骤是:信号->特征->值,特征是由网络自己选择。

(2)构建一个深度学习的流程是首先产生Idea,然后将Idea转化为Code,最后进行Experiment。
     接着根据结果修改Idea,继续这种Idea->Code->Experiment的循环,直到最终训练得到表现不错的深度学习网络模型。
     如果计算速度越快,每一步骤耗时越少,那么上述循环越能高效进行。

(3)我们都知道神经网络能处理很多问题,而且效果显著。其强大能力主要源自神经网络足够“深”,也就是说网络层数越多,神经网络就更加复杂和深入,学习也更加准确。

先来看人脸识别的例子。

经过训练,神经网络第一层所做的事就是从原始图片中提取出人脸的轮廓与边缘,即边缘检测。这样每个神经元得到的是一些边缘信息。
     神经网络第二层所做的事情就是将前一层的边缘进行组合,组合成人脸一些局部特征,比如眼睛、鼻子、嘴巴等。
     再往后面,就将这些局部特征组合起来,融合成人脸的模样。
     可以看出,随着层数由浅到深,神经网络提取的特征也是从边缘到局部特征到整体,由简单到复杂。可见,如果隐藏层足够多,那么能够提取的特征就越丰富、越复杂,模型的准确率就会越高。

(4)尽管深度学习有着非常显著的优势,Andrew还是建议对实际问题进行建模时,尽量先选择层数少的神经网络模型,这也符合奥卡姆剃刀定律(Occam’s Razor)。对于比较复杂的问题,再使用较深的神经网络模型。

五.训练技巧

(1)训练调参:1)epoch;2)batch_size, iteration = batch = N / batch_size ;3)learning rate;4)激活函数relu、sigmoid、tanh等;5)损失函数MSE(Mean squared error),均方误差;Cross Entropy Loss,交叉熵损失函数等;6)优化器SGD、Adam等。

(2)不同代的训练,其实用的是同一个训练集的数据。第 1 代和第 10 代虽然用的都是训练集的五万张图片,但是对模型的权重更新值却是完全不同的。因为不同代的模型处于代价函数空间上的不同位置,模型的训练,代越靠后,越接近谷底,其代价越小。

(3)数据的归一化和标准化是特征缩放(feature scaling)的方法,是数据预处理的关键步骤。

(4)选择最佳的训练集(Training sets)、验证集(Development sets)、测试集(Test sets)对神经网络的性能影响非常重要。
         除此之外,在构建一个神经网络的时候,我们需要设置许多参数,例如神经网络的层数、每个隐藏层包含的神经元个数、学习因子(学习速率)、激活函数的选择等等。
         实际上很难在第一次设置的时候就选择到这些最佳的参数,而是需要通过不断地迭代更新来获得。
        这个循环迭代的过程是这样的:我们先有个想法Idea,先选择初始的参数值,构建神经网络模型结构;
        然后通过代码Code的形式,实现这个神经网络;
        最后,通过实验Experiment验证这些参数对应的神经网络的表现性能。
        根据验证结果,我们对参数进行适当的调整优化,再进行下一次的Idea->Code->Experiment循环。
        通过很多次的循环,不断调整参数,选定最佳的参数值,从而让神经网络性能最优化。

(5)尽量保证Dev sets和Test sets来自于同一分布。
         值得一提的是,训练样本非常重要,通常我们可以将现有的训练样本做一些处理,例如图片的翻转、假如随机噪声等,来扩大训练样本的数量,
         从而让该模型更加强大。即使Train sets和Dev/Test sets不来自同一分布,使用这些技巧也能提高模型性能。

(6)经过T次循环之后,所有m个训练样本都进行了梯度下降计算。这个过程,我们称之为经历了一个epoch。对于Batch Gradient Descent而言,一个epoch只进行一次梯度下降算法;而Mini-Batches Gradient Descent,一个epoch会进行T次梯度下降算法。

        值得一提的是,对于Mini-Batches Gradient Descent,可以进行多次epoch训练。而且,每次epoch,最好是将总体训练数据重新打乱、重新分成T组mini-batches,这样有利于训练出最佳的神经网络模型。

(7)对于一般的神经网络模型,使用Batch gradient descent,随着迭代次数增加,cost是不断减小的。然而,使用Mini-batch gradient descent,随着在不同的mini-batch上迭代训练,其cost不是单调下降,而是受类似noise的影响,出现振荡。但整体的趋势是下降的,最终也能得到较低的cost值。之所以出现细微振荡的原因是不同的mini-batch之间是有差异的。例如可能第一个子集是好的子集,而第二个子集包含了一些噪声noise。出现细微振荡是正常的。

(8)如何选择每个mini-batch的大小,即包含的样本个数呢?有两个极端:如果mini-batch size=m,即为Batch gradient descent,只包含一个子集;如果mini-batch size=1,即为Stachastic gradient descent,每个样本就是一个子集,共有m个子集。

        我们来比较一下Batch gradient descent和Stachastic gradient descent的梯度下降曲线。如下图所示,蓝色的线代表Batch gradient descent,紫色的线代表Stachastic gradient descent。Batch gradient descent会比较平稳地接近全局最小值,但是因为使用了所有m个样本,每次前进的速度有些慢。Stachastic gradient descent每次前进速度很快,但是路线曲折,有较大的振荡,最终会在最小值附近来回波动,难以真正达到最小值处。而且在数值处理上就不能使用向量化的方法来提高运算速度。

(9)实际使用中,mini-batch size不能设置得太大(Batch gradient descent),也不能设置得太小(Stachastic gradient descent)。这样,相当于结合了Batch gradient descent和Stachastic gradient descent各自的优点,既能使用向量化优化算法,又能叫快速地找到最小值。mini-batch gradient descent的梯度下降曲线如下图绿色所示,每次前进速度较快,且振荡较小,基本能接近全局最小值。

(10)一般来说,如果总体样本数量m不太大时,例如m≤2000m≤2000,建议直接使用Batch gradient descent。如果总体样本数量m很大时,建议将样本分成许多mini-batches。推荐常用的mini-batch size为64,128,256,512。这些都是2的幂。之所以这样设置的原因是计算机存储数据一般是2的幂,这样设置可以提高运算速度。

(11)梯度消失爆炸的解决方案主要包括以下几个部分:

                - 预训练加微调
                - 梯度剪切、权重正则(针对梯度爆炸)
                - 使用不同的激活函数
                - 使用batchnorm
                - 使用残差结构
                - 使用LSTM网络

(12)动量梯度下降算法,其速度要比传统的梯度下降算法快很多。做法是在每次训练时,对梯度进行指数加权平均处理,然后用得到的梯度值更新权重W和常数项b。

           原始的梯度下降算法如上图蓝色折线所示。在梯度下降过程中,梯度下降的振荡较大,尤其对于W、b之间数值范围差别较大的情况。此时每一点处的梯度只与当前方向有关,产生类似折线的效果,前进缓慢。而如果对梯度进行指数加权平均,这样使当前梯度不仅与当前方向有关,还与之前的方向有关,这样处理让梯度前进方向更加平滑,减少振荡,能够更快地到达最小值处。
 

六.微调

(1)fine-tuning 就是使用已用于其他目标、预训练好模型的权重或者部分权重,作为初始值开始训练。
      那 fine-tuning 的具体做法是?
      1)复用相同层的权重,新定义层取随机权重初始值
      2)调大新定义层的的学习率,调小复用层学习率

(2)在大数据集上进行 pretrain 的目的之一是为了获得丰富、一般化的底层特征,换言之就是学到丰富的“基础几何形状”。
         有了这些丰富的基础几何形状,等过渡到小数据集上 finetune 的时候,就可以通过它们组合出上层具有强判别力的特征。
        此时,如果你再将组合出来的上层特征可视化,就会发现它们已经有模有样了。
        反之,如果你直接在小数据集上训练,那么就难以获得丰富的、一般化的基础几何形状,也就难以“描绘出”栩栩如生的上层特征。
        底层特征非常重要,如果底层特征不够好,特征类型不够充分,很可能训练不出来好的高层抽象。这就是为什么需要在大规模数据集上进行genertive training的原因之一。

(3)从我们的实验经验上来看,网络越深,底层的参数越难得到有效训练,这也是为什么经常有人用 vggNet进行finetune 的原因之一.
       使用 backpropagation 进行训练的时候残差逐层传递,有可能到底层的时候残差就很小了(gradient vanishing),导致底层的参数train 不动.   
       这也是楼上辛同学的图里底层 feature map 没有什么改变的原因之一, 因为底层参数本身就很难得到训练.
       finetune 就是直接从别人已经训练好的网络上拷贝参数,然后针对自己的数据训练新的模型。
       这时候需要比较小的 learning_rate, 因为要在不破坏原有模型的情况下 fit 自己的数据,finetune 的好处就是可以直接获得我们难以或者无法训练的底层参数。

七.激活函数

(1)举个算法改进的例子,之前神经网络神经元的激活函数是Sigmoid函数,后来改成了ReLU函数。
       之所以这样更改的原因是对于Sigmoid函数,在远离零点的位置,函数曲线非常平缓,其梯度趋于0,所以造成神经网络模型学习速度变得很慢。
      然而,ReLU函数在x大于零的区域,其梯度始终为1,尽管在x小于零的区域梯度为0,但是在实际应用中采用ReLU函数确实要比Sigmoid函数快很多。

(2)如果是分类问题,输出层的激活函数一般会选择sigmoid函数。但是隐藏层的激活函数通常不会选择sigmoid函数,tanh函数的表现会比sigmoid函数好一些。
       实际应用中,通常会会选择使用ReLU或者Leaky ReLU函数,保证梯度下降速度不会太小。
       其实,具体选择哪个函数作为激活函数没有一个固定的准确的答案,应该要根据具体实际问题进行验证(validation)。

八.评价指标


(1)1)真阳性(True Positive,TP):预测为真,实际为真;
    2)真阴性(True Negative,TN):预测为假,实际为假 ;
    3)假阳性(False Positive ,FP):预测为真,实际为假 ;
    4)假阴性(False Negative,FN):预测为假,实际为真。
       查准率(Precision):真正预测准确的数量 / 预测是准确的数量。公式为:查准率(Precision)=TP/TP+FP
       查全率(Recalll):真正预测准确的数量 / 所有真正准确的数量。公式为查全率(recall)=TP/TP+FN
       查准率和查全率是一对矛盾的指标,一般说,当查准率高的时候,查全率一般很低;查全率高时,查准率一般很低。
       我们希望有一个帮助我们选择阈值的方法——计算F1值(F1 Score),其计算公式为:F1 Score=2PR/P+R, 其中,P为查准率,R为查全率。
       F1值会考虑一部分查准率和查全率的平均值,但是它会给查准率和查全率中较低的值更高的权重,它结合了查准率和查全率,并且在实际应用中,F1值越高代表模型拟合效果越好 。

九.支持向量机


(1)数学上来讲,这条黑线有更大的距离,这个距离叫做间距(margin),这使得支持向量机具有鲁棒性,因为它在分离数据时会尽量用大的间距去分离样本,因此支持向量机有时被称为大间距分类器。

十.K-means算法


(1)K-均值算法是一种迭代求解的聚类分析算法,算法接受一个未标记的数据集,然后将数据聚类成不同的组。
      其步骤是,预将数据分为K组,则随机选取K个对象作为初始的聚类中心,然后计算每个对象与各个种子聚类中心之间的距离,把每个对象分配给距离它最近的聚类中心。
     K-均值算法会做两件事:1. 簇分配;2. 移动聚类中心。
       K-均值最小化问题是要最小化所有的数据点与其所关联的聚类中心点之间的距离之和。
      大部分时候,聚类数量K仍是通过手动、人工输入或者经验来决定,一种可以尝试的方法是使用“肘部原则”,但不能期望它每次都有效果。
      选择聚类数量更好的思路是去问自己运行K-均值聚类算法的目的是什么,然后再想聚类数目K取哪一个值能更好的服务于后续的目的。

十一.主成分分析(PCA)


(1)主成分分析(PCA)是常用的降维算法。
     在PCA中,我们要做的是找到一个低维平面,当我们将所有数据都投影到该平面上时,希望投影误差(Projection error)能尽可能地小。
      在应用PCA之前,常规的做法是先进性均值归一化和特征归一化,使得特征量均值为0,并且其数值在可比较的范围之内。
      主成分分析与线性回归的区别在于:
      1)线性回归的误差距离是某个点与假设得到的预测值之间的距离;PCA的误差距离是某个点与方向向量之间的正交距离,即最短距离。
      2)主成分分析最小化的是投影误差;线性回归尝试的是最小化预测误差。
      3)线性回归的目的是预测结果,而主成分分析不作任何预测。
    PCA将 n 个特征降维到 k 个,可以用来进行数据压缩,如果100维的向量最后可以用10维来表示,那么压缩率为90%。
     同样图像处理领域的KL变换使用PCA做图像压缩。但PCA要保证降维后,还要保证数据的特性损失最小。
  PCA技术的一大好处是对数据进行降维的处理。我们可以对新求出的“主元”向量的重要性进行排序,根据需要取前面最重要的部分,
     将后面的维数省去,可以达到降维从而简化模型或是对数据进行压缩的效果,同时最大程度的保持了原有数据的信息。
  PCA技术的一个很大的优点是完全无参数限制。在PCA的计算过程中完全不需要人为的设定参数或是根据任何经验模型对计算进行干预,最后的结果只与数据相关,与用户是独立的。
     但这一点同时也可以看作是缺点。如果用户对观测对象有一定的先验知识,掌握了数据的一些特征,却无法通过参数化等方法对处理过程进行干预,可能会得不到预期的效果,效率也不高。


十二.学习曲线


(1)学习曲线是一个很好的工具,它可以判断某一个学习算法是否处于偏差、方差问题。学习曲线就是将训练集误差和交叉验证集误差作为训练集样本数量m mm的函数绘制的图表。
 


十三.广播机制


(1)广播(Broadcasting)。python中的广播机制可由下面四条表示:
       1)让所有输入数组都向其中shape最长的数组看齐,shape中不足的部分都通过在前面加1补齐
       2)输出数组的shape是输入数组shape的各个轴上的最大值
       3)  如果输入数组的某个轴和输出数组的对应轴的长度相同或者其长度为1时,这个数组能够用来计算,否则出错
       4)当输入数组的某个轴的长度为1时,沿着此轴运算时都用此轴上的第一组值


十四.Dropout

(1)除了L2 regularization之外,还有另外一种防止过拟合的有效方法:Dropout。

         Dropout是指在深度学习网络的训练过程中,对于每层的神经元,按照一定的概率将其暂时从网络中丢弃。也就是说,每次训练时,每一层都有部分神经元不工作,起到简化复杂网络模型的效果,从而避免发生过拟合。

(2)对于m个样本,单次迭代训练时,随机删除掉隐藏层一定数量的神经元;然后,在删除后的剩下的神经元上正向和反向更新权重w和常数项b;接着,下一次迭代中,再恢复之前删除的神经元,重新随机删除一定数量的神经元,进行正向和反向更新w和b。不断重复上述过程,直至迭代训练完成。

        值得注意的是,使用dropout训练结束后,在测试和实际应用模型时,不需要进行dropout和随机删减神经元,所有的神经元都在工作。

(3)Dropout通过每次迭代训练时,随机选择不同的神经元,相当于每次都在不同的神经网络上进行训练,类似机器学习中Bagging的方法(三个臭皮匠,赛过诸葛亮),能够防止过拟合。

        除此之外,还可以从权重w的角度来解释为什么dropout能够有效防止过拟合。对于某个神经元来说,某次训练时,它的某些输入在dropout的作用被过滤了。而在下一次训练时,又有不同的某些输入被过滤。经过多次训练后,某些输入被过滤,某些输入被保留。这样,该神经元就不会受某个输入非常大的影响,影响被均匀化了。也就是说,对应的权重w不会很大。这从从效果上来说,与L2 regularization是类似的,都是对权重w进行“惩罚”,减小了w的值。

(4)总结一下,对于同一组训练数据,利用不同的神经网络训练之后,求其输出的平均值可以减少overfitting。Dropout就是利用这个原理,每次丢掉一定数量的隐藏层神经元,相当于在不同的神经网络上进行训练,这样就减少了神经元之间的依赖性,即每个神经元不能依赖于某几个其他的神经元(指层与层之间相连接的神经元),使神经网络更加能学习到与其他神经元之间的更加健壮robust的特征。

        在使用dropout的时候,有几点需要注意。首先,不同隐藏层的dropout系数keep_prob可以不同。一般来说,神经元越多的隐藏层,keep_out可以设置得小一些.,例如0.5;神经元越少的隐藏层,keep_out可以设置的大一些,例如0.8,设置是1。另外,实际应用中,不建议对输入层进行dropout,如果输入层维度很大,例如图片,那么可以设置dropout,但keep_out应设置的大一些,例如0.8,0.9。总体来说,就是越容易出现overfitting的隐藏层,其keep_prob就设置的相对小一些。没有准确固定的做法,通常可以根据validation进行选择。


(5)Dropout在电脑视觉CV领域应用比较广泛,因为输入层维度较大,而且没有足够多的样本数量。值得注意的是dropout是一种regularization技巧,用来防止过拟合的,最好只在需要regularization的时候使用dropout。

十五.其他正则化方法

(1)一种方法是增加训练样本数量。但是通常成本较高,难以获得额外的训练样本。但是,我们可以对已有的训练样本进行一些处理来“制造”出更多的样本,称为data augmentation。例如图片识别问题中,可以对已有的图片进行水平翻转、垂直翻转、任意角度旋转、缩放或扩大等等。如下图所示,这些处理都能“制造”出新的训练样本。虽然这些是基于原有样本的,但是对增大训练样本数量还是有很有帮助的,不需要增加额外成本,却能起到防止过拟合的效果。

(2)还有另外一种防止过拟合的方法:early stopping。一个神经网络模型随着迭代训练次数增加,train set error一般是单调减小的,而dev set error 先减小,之后又增大。也就是说训练次数过多时,模型会对训练样本拟合的越来越好,但是对验证集拟合效果逐渐变差,即发生了过拟合。因此,迭代训练次数不是越多越好,可以通过train set error和dev set error随着迭代次数的变化趋势,选择合适的迭代次数,即early stopping。

 (3)然而,Early stopping有其自身缺点。通常来说,机器学习训练模型有两个目标:一是优化cost function,尽量减小J;二是防止过拟合。这两个目标彼此对立的,即减小J的同时可能会造成过拟合,反之亦然。我们把这二者之间的关系称为正交化orthogonalization。该节课开始部分就讲过,在深度学习中,我们可以同时减小Bias和Variance,构建最佳神经网络模型。但是,Early stopping的做法通过减少得带训练次数来防止过拟合,这样J就不会足够小。也就是说,early stopping将上述两个目标融合在一起,同时优化,但可能没有“分而治之”的效果好。

        与early stopping相比,L2 regularization可以实现“分而治之”的效果:迭代训练足够多,减小J,而且也能有效防止过拟合。而L2 regularization的缺点之一是最优的正则化参数λλ的选择比较复杂。对这一点来说,early stopping比较简单。总的来说,L2 regularization更加常用一些。

十六.标准化

(1)在训练神经网络时,标准化输入可以提高训练的速度。标准化输入就是对训练数据集进行归一化的操作,即将原始数据减去其均值μ后,再除以其方差σ2.

(2)值得注意的是,由于训练集进行了标准化处理,那么对于测试集或在实际应用时,应该使用同样的μ和σ2对其进行标准化处理。这样保证了训练集合测试集的标准化操作一致。

        之所以要对输入进行标准化操作,主要是为了让所有输入归一化同样的尺度上,方便进行梯度下降算法时能够更快更准确地找到全局最优解。假如输入特征是二维的,且x1的范围是[1,1000],x2的范围是[0,1]。如果不进行标准化处理,x1与x2之间分布极不平衡,训练得到的w1和w2也会在数量级上差别很大。这样导致的结果是cost function与w和b的关系可能是一个非常细长的椭圆形碗。对其进行梯度下降算法时,由于w1和w2数值差异很大,只能选择很小的学习因子αα,来避免J发生振荡。一旦αα较大,必然发生振荡,J不再单调下降。

        然而,如果进行了标准化操作,x1与x2分布均匀,w1和w2数值差别不大,得到的cost function与w和b的关系是类似圆形碗。对其进行梯度下降算法时,αα可以选择相对大一些,且J一般不会发生振荡,保证了J是单调下降的。

猜你喜欢

转载自blog.csdn.net/weixin_52950958/article/details/126501008