李宏毅机器学习总结

人工智能与机器学习与深度学习之间的关系

在这里插入图片描述

机器学习的三类任务

第一类是无监督学习,指的是从信息出发自动寻找规律,并将其分成各种类别,有时也称"聚类问题"。

第二类是监督学习,监督学习指的是给历史一个标签,运用模型预测结果。如有一个水果,我们根据水果的形状和颜色去判断到底是香蕉还是苹果,这就是一个监督学习的例子。

最后一类为强化学习,是指可以用来支持人们去做决策和规划的一个学习方式,它是对人的一些动作、行为产生奖励的回馈机制,通过这个回馈机制促进学习,这与人类的学习相似,所以强化学习是目前研究的重要方向之一。

机器学习相关技术

在这里插入图片描述

误差

误差 = 方差 + 偏差 + 噪音 组成,一般来说,随着模型复杂度的增加,方差会逐渐增大,偏差会逐渐减小

在这里插入图片描述

偏差(Bias)

偏差(bias):偏差衡量了模型的预测值与实际值之间的偏离关系。通常在深度学习中,我们每一次训练迭代出来的新模型,都会拿训练数据进行预测,偏差就反应在预测值与实际值匹配度上,比如通常在keras运行中看到的准确度为96%,则说明是低偏差;反之,如果准确度只有70%,则说明是高偏差。

方差(Variance)

方差(variance):方差描述的是训练数据在不同迭代阶段的训练模型中,预测值的变化波动情况(或称之为离散情况)。从数学角度看,可以理解为每个预测值与预测均值差的平方和的再求平均数。通常在深度学习训练中,初始阶段模型复杂度不高,为低方差;随着训练量加大,模型逐步拟合训练数据,复杂度开始变高,此时方差会逐渐变高。

噪声(Noise)

噪声的存在是学习算法所无法解决的问题,数据的质量决定了学习的上限。假设在数据已经给定的情况下,此时上限已定,我们要做的就是尽可能的接近这个上限。

过拟合、欠拟合、恰好

方差的数学公式为:E [(h(x) - h(x))2] ,也就是说为每个预测值与预测均值差的平方和再求平均数,可以表现为一种波动变化,低方差意味低变化,高方差意味高变化。那我们可以通过训练的不同阶段来直观感受方差的变化。

在这里插入图片描述

上图为训练初始阶段,我们的模型(蓝线)对训练数据(红点)拟合度很差,是高偏差,但蓝线近似线性组合,其波动变化小,套用数学公式也可知数值较小,故为低方差,这个阶段也称之为欠拟合(underfitting),需要加大训练迭代数。

在这里插入图片描述

上图为训练的后期阶段,可明显看出模型的拟合度很好,是低偏差,但蓝线的波动性非常大,为高方差,这个阶段称之为过拟合(overfitting),问题很明显,蓝线模型很适合这套训练数据,但如果用测试数据来检验模型,就会发现泛化能力差,准确度下降。

在这里插入图片描述

上图这个蓝色模型可认为是“恰好”的一个模型,既能跟训练数据拟合,又离完美拟合保持一定距离,模型更具通用性,用测试数据验证会发现准确度也不错。

如何做到恰好

  • 加大数据量,数据越多,自然其泛化能力也越强。但现实情况我们不能像大公司那样拥有很多资源,那怎么办?一种可行的办法就是根据已有的数据做数据增强,比如旋转、反转、白增强等操作造出很多数据;
  • 正则化(regularization),通常来说有dropout、L2、L1等正则化手段;
  • 提早结束训练,防止训练过拟合化。

梯度下降(Gradient Descent)

首先来看看梯度下降的一个直观的解释。比如我们在一座大山上的某处位置,由于我们不知道怎么下山,于是决定走一步算一步,也就是在每走到一个位置的时候,求解当前位置的梯度,沿着梯度的负方向,也就是当前最陡峭的位置向下走一步,然后继续求解当前位置梯度,向这一步所在位置沿着最陡峭最易下山的位置走一步。这样一步步的走下去,一直走到觉得我们已经到了山脚。当然这样走下去,有可能我们不能走到山脚,而是到了某一个局部的山峰低处。

从上面的解释可以看出,梯度下降不一定能够找到全局的最优解,有可能是一个局部最优解。当然,如果损失函数是凸函数,梯度下降法得到的解就一定是全局最优解。

逻辑回归

Logistic Regression逻辑回归

Logistic Regression 虽然被称为回归,但其实际上是分类模型,并常用于二分类。Logistic Regression 因其简单、可并行化、可解释强深受工业界喜爱。

Logistic 回归的本质是:假设数据服从这个分布,然后使用极大似然估计做参数的估计。

Logistic 分布是一种连续型的概率分布,其分布函数密度函数分别为:

在这里插入图片描述

在这里插入图片描述

Logistic 分布是由其位置和尺度参数定义的连续分布。Logistic 分布的形状与正态分布的形状相似,但是 Logistic 分布的尾部更长,所以我们可以使用 Logistic 分布来建模比正态分布具有更长尾部和更高波峰的数据分布。在深度学习中常用到的 Sigmoid 函数就是 Logistic 的分布函数在 在这里插入图片描述
的特殊形式。

深度学习的三大步骤

  • Step1:神经网络(Neural network)
  • Step2:模型评估(Goodness of function)
  • Step3:选择最优函数(Pick best function)

在这里插入图片描述

深度的理解

Deep = Many hidden layer

在这里插入图片描述

反向传播

反向传播是为了减小误差,使得误差最小的权重矩阵的值便是神经网络最终的权重矩阵。对于误差的描述可以采用代价(误差)函数来描述,比如高中学的:在这里插入图片描述
,其中y(x)是神经网络的预测值,label(x)是x对应的真实值,可以看出loss是关于权重矩阵的多元函数,当loss最小时W的取值,便是神经网络权重矩阵最终值。反向传播的核心算法是梯度下降算法,既然反向传播是为了使loss最小,使得loss收敛的最快。根据场论的知识,梯度的方向是函数值增长最快的方向,那么梯度的反方向便是函数值减少最快的方向。基于这一理论,便有了梯度下降法。

1.计算总误差

总误差:(square error) 在这里插入图片描述

2.隐含层---->输出层的权值更新:即前面的在这里插入图片描述
在这里插入图片描述

深度学习技巧

Cross Entropy 交叉熵损失函数+Sigmoid激活函数

二分类时每个样本的交叉熵损失函数的形式:在这里插入图片描述

输出层δL的梯度情况:在这里插入图片描述

可以看出,使用交叉熵,得到的的δl梯度表达式没有了σ′(z),梯度为预测值和真实值的差距,这样求得的Wl,bl的地图也不包含σ′(z),因此避免了反向传播收敛速度慢的问题。通常情况下,如果我们使用了sigmoid激活函数,交叉熵损失函数肯定比均方差损失函数好用。

梯度爆炸梯度消失与ReLU激活函数

在反向传播的算法过程中,由于我们使用了是矩阵求导的链式法则,有一大串连乘,如果连乘的数字在每层都是小于1的,则梯度越往前乘越小,导致梯度消失,而如果连乘的数字在每层都是大于1的,则梯度越往前乘越大,导致梯度爆炸。随着反向传播算法的进行,我们的梯度值随着层数越来越小,甚至接近越0,导致梯度几乎消失,进而导致前面的隐藏层的W,b参数随着迭代的进行,几乎没有大的改变,更谈不上收敛了。

对于梯度爆炸,则一般可以通过调整我们DNN模型中的初始化参数得以解决。

对于无法完美解决的梯度消失问题,目前有很多研究,一个可能部分解决梯度消失问题的办法是使用ReLU(Rectified Linear Unit)激活函数,ReLU在卷积神经网络CNN中得到了广泛的应用,在CNN中梯度消失似乎不再是问题。表达式为:在这里插入图片描述
 也就是说大于等于0则不变,小于0则激活后为0。

tanh

tanh:这个是sigmoid的变种,表达式为:在这里插入图片描述

tanh激活函数和sigmoid激活函数的关系为:在这里插入图片描述

tanh和sigmoid对比主要的特点是它的输出落在了[-1,1],这样输出可以进行标准化。同时tanh的曲线在较大时变得平坦的幅度没有sigmoid那么大,这样求梯度变化值有一些优势。当然,要说tanh一定比sigmoid好倒不一定,还是要具体问题具体分析。

损失函数与激活函数总结

1)如果使用sigmoid激活函数,则交叉熵损失函数一般肯定比均方差损失函数好。

2)如果是DNN用于分类,则一般在输出层使用softmax激活函数和对数似然损失函数。

3)ReLU激活函数对梯度消失问题有一定程度的解决,尤其是在CNN模型中。

Regularization(正则化)

假如我们的每个样本的损失函数是均方差损失函数,则所有的m个样本的损失函数为:在这里插入图片描述

则加上了L2正则化后的损失函数是:在这里插入图片描述

其中,λ即我们的正则化超参数,实际使用时需要调参。而w为所有权重矩阵W的所有列向量。

如果使用上式的损失函数,进行反向传播算法时,流程和没有正则化的反向传播算法完全一样,区别仅仅在于进行梯度下降法时,W的更新公式。

不加正则化W的梯度下降更新公式为:在这里插入图片描述

加入L2正则化以后,迭代更新公式变成:在这里插入图片描述

注意到上式中的梯度计算中1/m忽略了,因为α是常数,而除以m也是常数,所以等同于用了新常数α来代替α/m。进而简化表达式,但是不影响损失算法。

集成学习(ensemble)正则化

常用的机器学习Bagging算法中,随机森林是最流行的。它 通过随机采样构建若干个相互独立的弱决策树学习器,最后采用加权平均法或者投票法决定集成的输出。在DNN中,我们一样使用Bagging的思路。不过和随机森林不同的是,我们这里不是若干个决策树,而是若干个DNN的网络。

首先我们要对原始的m个训练样本进行有放回随机采样,构建N组m个样本的数据集,然后分别用这N组数据集去训练我们的DNN。即采用我们的前向传播算法和反向传播算法得到N个DNN模型的W,bW,b参数组合,最后对N个DNN模型的输出用加权平均法或者投票法决定最终输出。

不过用集成学习Bagging的方法有一个问题,就是我们的DNN模型本来就比较复杂,参数很多。现在又变成了N个DNN模型,这样参数又增加了N倍,从而导致训练这样的网络要花更加多的时间和空间。因此一般N的个数不能太多,比如5-10个就可以了。

Dropout正则化(特殊的集成学习)

Dropout指的是在用前向传播算法和反向传播算法训练DNN模型时,一批数据迭代时,随机的从全连接DNN网络中去掉一部分隐藏层的神经元。在对训练集中的一批数据进行训练时,我们随机去掉一部分隐藏层的神经元,并用去掉隐藏层的神经元的网络来拟合我们的一批训练数据。然后用这个去掉隐藏层的神经元的网络来进行一轮迭代,更新所有的W,b。这就是所谓的dropout。

当然,dropout并不意味着这些神经元永远的消失了。在下一批数据迭代前,我们会把DNN模型恢复成最初的全连接模型,然后再用随机的方法去掉部分隐藏层的神经元,接着去迭代更新W,b。当然,这次用随机的方法去掉部分隐藏层后的残缺DNN网络和上次的残缺DNN网络并不相同。

总结下dropout的方法: 每轮梯度下降迭代时,它需要将训练数据分成若干批,然后分批进行迭代,每批数据迭代时,需要将原始的DNN模型随机去掉部分隐藏层的神经元,用残缺的DNN模型来迭代更新W,b。每批数据迭代更新完毕后,要将残缺的DNN模型恢复成原始的DNN模型。

使用基于dropout的正则化比基于bagging的正则化简单,这显而易见,由于dropout会将原始数据分批迭代,因此原始数据集最好较大,否则模型可能会欠拟合。

增强数据集正则化

对于我们传统的机器学习分类回归方法,增强数据集还是很难的。你无中生有出一组特征输入,却很难知道对应的特征输出是什么。但是对于DNN擅长的领域,比如图像识别,语音识别等则是有办法的。以图像识别领域为例,对于原始的数据集中的图像,我们可以将原始图像稍微的平移或者旋转一点点,则得到了一个新的图像。虽然这是一个新的图像,即样本的特征是新的,但是我们知道对应的特征输出和之前未平移旋转的图像是一样的。

我们现在得到了一个新的训练样本,输入特征和之前的训练样本不同,但是特征输出是一样的,用类似的思路,我们可以对原始的数据集进行增强,进而得到增强DNN模型的泛化能力的目的。

CNN的基本结构

在这里插入图片描述

图中是一个图形识别的CNN模型。可以看出最左边的船的图像就是我们的输入层,计算机理解为输入若干个矩阵,这点和DNN基本相同。

接着是卷积层(Convolution Layer),这个是CNN特有的。卷积层的激活函数使用的是ReLU。我们在DNN中介绍过ReLU的激活函数,它其实很简单,就是ReLU(x)=max(0,x)。在卷积层后面是池化层(Pooling layer),这个也是CNN特有的,我们后面也会专门来讲。需要注意的是,池化层没有激活函数。

卷积层+池化层的组合可以在隐藏层出现很多次,上图中出现两次。而实际上这个次数是根据模型的需要而来的。当然我们也可以灵活使用使用卷积层+卷积层,或者卷积层+卷积层+池化层的组合,这些在构建模型的时候没有限制。但是最常见的CNN都是若干卷积层+池化层的组合,如上图中的CNN结构。

在若干卷积层+池化层后面是全连接层(Fully Connected Layer, 简称FC),全连接层其实就是我们前面讲的DNN结构,只是输出层使用了Softmax激活函数来做图像识别的分类,这点我们在DNN中也有讲述。

从上面CNN的模型描述可以看出,CNN相对于DNN,比较特殊的是卷积层和池化层,如果我们熟悉DNN,只要把卷积层和池化层的原理搞清楚了,那么搞清楚CNN就容易很多了。

CNN中的卷积层

对图像卷积其实就是对输入的图像的不同局部的矩阵和卷积核矩阵各个位置的元素相乘,然后相加得到。

举个例子如下,图中的输入是一个二维的3x4的矩阵,而卷积核是一个2x2的矩阵。这里我们假设卷积是一次移动一个像素来卷积的,那么首先我们对输入的左上角2x2局部和卷积核卷积,即各个位置的元素相乘再相加,得到的输出矩阵S的S00的元素,值为aw+bx+ey+fz。接着我们将输入的局部向右平移一个像素,现在是(b,c,f,g)四个元素构成的矩阵和卷积核来卷积,这样我们得到了输出矩阵S的S01的元素,同样的方法,我们可以得到输出矩阵S的S02,S10,S11,S12的元素。

在这里插入图片描述

最终我们得到卷积输出的矩阵为一个2x3的矩阵S。

CNN中的池化层

相比卷积层的复杂,池化层则要简单的多,所谓的池化,个人理解就是对输入张量的各个子矩阵进行压缩。假如是2x2的池化,那么就将子矩阵的每2x2个元素变成一个元素,如果是3x3的池化,那么就将子矩阵的每3x3个元素变成一个元素,这样输入矩阵的维度就变小了。要想将输入子矩阵的每nxn个元素变成一个元素,那么需要一个池化标准。常见的池化标准有2个,MAX或者是Average。即取对应区域的最大值或者平均值作为池化后的元素值。

下面这个例子采用取最大值的池化方法。同时采用的是2x2的池化,步幅为2,首先对红色2x2区域进行池化,由于此2x2区域的最大值为6.那么对应的池化输出位置的值为6,由于步幅为2,此时移动到绿色的位置去进行池化,输出的最大值为8.同样的方法,可以得到黄色区域和蓝色区域的输出值。最终,我们的输入4x4的矩阵在池化后变成了2x2的矩阵。进行了压缩。

在这里插入图片描述

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梦码城

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值