这是Datawhale本期最后一次学习,对学习内容做一个总结:
机器学习简介
首先讲了
[ 🔗 机器学习介绍 ]
,介绍了什么是机器学习,人工智能、机器学习、深度学习的关系,以及常见的几种机器学习领域:
- 监督学习(回归、分类、结构化学习)
- 半监督学习(元学习、迁移学习)
- 无监督学习
- 强化学习
回归模型介绍
然后着重学习了
[ 🔗 回归模型 ]
。回归模型是如何拟合的呢?需要模型假设、模型评估。
模型假设就是说,我们要找出一个由特征、权重、偏移组成的函数,使得这个函数能够根据已有数据进行模型拟合。
模型评估的意思是说,找出一个loss function,让模型的loss function找到最小值点,这就说明我们的拟合函数和真实数据拟合的好,拟合的最相近。
然后就是如何去找这个最小值点,我们就要通过「
梯度下降法
」去找。
那么在模型拟合这里,我们为了拟合的更准确,往往会使用更多的特征去拟合,或者说使用更高阶的函数去拟合,那么对于一个线性模型,如果特征的次方越来越高,模型可能准确了,但是又引入了新的问题,那就是过拟合,所以我们学习了如何去解决过拟合问题,主要方法罗列了三个点:
- 将多个模型合并起来,然后根据类似于数字电路中的电平信号,来选取合适的项,其他项权重制为0
- 引入更多的特征,也就是之前提到的,将「单特征」模型变为「多特征」模型
-
加入正则化,正则化的引入使得模型的拟合可以变的「曲折」或者「平滑」,这取决于正则项中
λ\lambda
λ
值的大小
误差和梯度下降
误差
因为之前学回归模型的时候,对梯度下降只是简要说明了一下,接下来本节
[ 🔗 误差和梯度下降 ]
内容则是对梯度下降与误差的详细说明,我们之前讲回归模型中的线性模型,拟合函数和原始数据之间无法完全拟合,一定存在误差,那么误差到底来自哪里呢?误差、模型的拟合度其实受到了「偏差」、「方差」的影响。
我们拿一个「靶心」作为例子,靶的正中心就是真正的值,但实际上我们拟合的时候是有误差的,总结下来关于「偏差」和「方差」的内容就两点:
- 偏差决定了与中心位置的偏移距离,偏差越大,那么离中心位置就越远;反之则越近。
- 方差代表了数据点的混乱程度,方差越小,则说明点和点之间越混乱,越没有那么紧凑。
那你可能会问,为了效果,是不是可以让偏差越小,然后方差也越小就行了呢?其实这两个无法完全做到同时很小,随着偏差的增大,方差会越来越小;反之随着偏差的减小,方差会越来越大。实际上这两项被同时考虑时,就体现出了实际的误差变化。(还有就是,以上我们讨论的内容,假设方差、偏差、误差之间的转换不涉及噪音误差。)
实际观测到的误差先是减小然后又增大,因此实际误差为最小值的那个点,即为偏差和方差的误差之和最小的点,就是表现最好的模型。如果实际误差主要来自于方差很大,这个状况就是过拟合;如果实际误差主要来自于偏差很大,这个状况就是欠拟合。
梯度下降
接下来学习了如何去计算梯度下降,以及梯度下降中学习率大小对我们进行梯度下降的影响。
学习率就是所谓的「步长」,步子太大了就可能走不到最低点就跳出去了;步子迈的太小吧,迭代到最低点的速度就非常非常慢,甚至当我们把迭代次数设置的太少的时候,可能压根就无法走到最低点;步子长度刚刚好的时候,反而就很顺利的找到一个loss最低点。当然梯度下降很可能找到的只是局部的极小值,不一定是全局的最小值,这点需要注意,所以如何梯度下降也是门学问。
除了说梯度下降的理论,还介绍了些梯度下降的类型,比如Adaptive Learning rates(自适应的梯度下降,可以学习并调整学习率)、Adagrad(也是一种自适应梯度下降)、SGD随机梯度下降、Mini-batch梯度下降等等,还介绍了特征缩放,以及GPU下并行的矩阵计算等等。
以上就是对误差分析和梯度下降这一章节的总结,具体可以看下我的第三篇文章
[ 🔗 误差和梯度下降 ]
。
深度学习、反向传播
接下来在原始机器学习基础上,介绍了
[ 🔗 深度学习中的反向传播 ]
。我们如何用一个神经网络去学习更新参数,来进行更高维度、更复杂的拟合。神经网络大致分三层:输入层、隐藏层、输出层。神经网络中每一个输入都是一个特征,比如现在有两个特征,那么输入是一个二位向量,隐藏层的第一层有两个神经元,那么总共就有四条线可连接,意味着有四个权重,我们把它以矩阵的形式组织起来,每一个输入对应的权重排成一行:
然后通过激活函数sigmoid function
σ
\sigma
σ
进行激活,将值映射到[0~1]内。那么以上是深度学习网络中各个神经元和特征之间的关系。在进行梯度下降的过程中,需要网络的前向传播和反向传播。前向传播很好理解,就是根据当前权重计算一次输出。反向传播则是为了更新权重。反向传播用到了链式法则,但是为何要通过反向传播更新参数呢?李宏毅老师在课堂上说的是,反向传播的方式去更新参数会更加高效,对于近百万维的向量来说,计算的更快。
最后我也使用pytorch在kaggle上实现了下手写数字识别MNIST的demo,链接:
[🔗 MNIST手写数字识别-kaggle-pytorch]
,感兴趣的小伙伴可以看看。
神经网络训练不起来怎么办?
我们在训练神经网络时,有个模型评估那就是loss function。在训练、迭代的过程中,往往无法找到那个特别理想的最小值,使得我们的loss function始终降不下来,甚至有时候我们越训练,反而loss值越大。那么本节则是分析为什么我们的
[🔗神经网络无法训练起来]
。
本节内容学习的时候,主要介绍了critical point是什么,其可能的点有两个,分别是:local minima和saddle point,这两者均是影响神经网络训练的因素,甚至教我们如何使用Hessian矩阵判断当前位置是遇到了local minima还是saddle point(这里蛮有意思的)。
除此之外介绍了什么是batch,我们在训练神经网络时,通常是分batch去训练的,多batch组成了一个epoch,batch的大小对训练结果也是有影响的。总的来说就是:大的batch-size会让我们倾向于走到峡谷里面,而小的batch-size倾向于我们走到盆地里面。那么走到盆地的话,更有助于我们模型的泛化。这篇文章对此进行了说明:
[🔗 On Large-Batch Training For Deep Learning,Generalization Gap And Sharp Minima]
。
除此之外,介绍了梯度下降结合monmentum。我们可以理解monmentum为动量,就像你在物理中让小球向前滚动一样,小球会产生惯性,momentum就是这个模拟惯性才定义出来的变量,在梯度下降迭代的时候,最终的方向是由momentum和梯度方向一同决定的。然后介绍了自适应学习率,如root mean square、RMSProp等。
最后说说在分类任务上,应该如何优化神经网络,从optimization的角度,cross-entropy比Mean Square Error更加适合用在分类上。使用cross-entropy这个loss function时,pytorch自动帮你把softmax加到你的Network的最后一层。
卷积神经网络
最后在深度学习、神经网络的基础上,学习了卷积神经网络CNN。以图像识别为例,对卷积神经网络每一层进行了理论可行性的解释。然后说明了卷积神经网络是如何运算的。
对比卷积神经网络和全连接网络,
前者减少了很多参数
,只提取重要的信息,卷积神经网络的每一层提取前一层输入的「局部节点」进行下一轮输出训练,多个节点之间还可共享参数使用。
在学习的过程中,遇到了这样一个问题:
有这样一个问题(我之前也一直有这样的疑问,最后终于理解每次卷积实际上是整个Channel上的卷积运算,下一次Channel的个数和当前filter数量有关系):假设我第一个convolution有25个filter,通过这些filter得到25个feature map,然后repeat的时候第二个convolution也有25个filter,那这样做完,我是不是会得到
25
2
25^2
2
5
2
个feature map?
我也理清了思路,就是说,在做卷积运算时,第三维度并非是一个平面,如果Channel并非为1,那么每次卷积操作是对所有Channel进行一次运算,这点很重要。具体细节也可参考我的这篇文章的内容:
[🔗 卷积神经网络]
。
最后介绍了max pooling、flatten以及一些卷积神经网络的应用,对此进行了学习。
以上就是对本次Datawhale开源学习的总结(2022-11-28)。Datawhale开源学习,机器学习课程,项目地址:https://github.com/datawhalechina/leeml-notes