200字范文,内容丰富有趣,生活中的好帮手!
200字范文 > 深度学习的基础知识(机器学习 损失函数 梯度下降 反向传播 基础模型一网打尽)

深度学习的基础知识(机器学习 损失函数 梯度下降 反向传播 基础模型一网打尽)

时间:2019-01-29 21:03:21

相关推荐

深度学习的基础知识(机器学习 损失函数 梯度下降 反向传播 基础模型一网打尽)

1.预备信息

1.1了解技术的发展阶段

技术一般存在几个阶段:1.发展期、2.高峰期、3.冰河期、4.应用期

就是先达到一个高峰,但是在达到高峰之后就会被发现很多问题,然后热度就会不断地下降,到达一个冰河期,经历磨难,如果最终走出冰河期,才能顺利的走入平稳的应用期。发展期变化会非常大,时常更新。这样我们就不难理解为什么tensorflow和pytorch几乎每个月都要更新,c语言这种却是很久也不更新一次。同样的,更新速度快,也同时决定了机器学习支持库使用环境配置的必要性。

1.2机器学习初步

将人进行处理的过程,用算法来进行替代的情况下。在机器学习的过程中,我们大概率是使用监督学习。传统的算法又有哪些呢?

1.穷举法

2.贪心法:梯度下降其实就是一个贪心的思想

3.分治法

4.动态规划

机器学习中的算法,并不是我们人工设计出来的,而是从数据集当中挖出来算法。一般来时我们可以描述为,我们有一个数据集,之后我们提一个模型,之后再用模型来学习,如果好我们就采用。

人工智能 -》机器学习-》表示学习(其实是原来数据的特征提取)-》深度学习。所以我们可以看到深度学习是其中一个非常小的分支,但是原来越热门。但是现在也有不足,例如可解释性比较差。但是依然不影响其流行性。

2.AI

这里的标号主要是体现各个内容之间的相互关系

2.1 rule—base

这种程序其实是基于确定的一些过程,一些处理,最终得到一个结果。主要的缺陷就是可变性比较差。在逐渐改变这种状态的情况下,我们发明了使用程序来完善这个过程。用程序来发现这个固定的函数的求解。

这个系统的最关键的就是这个规则如何来制定,但是对于一些复杂目标的程序,想要说明白这些规则的时候就变得逐渐困难。逐渐的超出了人类的可维护范围。

2.2 机器学习

首先第一步就是将我们原来的输入进行第一步的处理,例如我们这一部分将图片变成一个个的向量来进行处理。这一步叫做提取Features的过程。之后我们就是将得到的向量和最后的输出相联系,使用机器学习的方式找到联系。

2.2.1表示学习

表示学习其实在features的提取部分做了优化,在features的提取的过程中也不在用人工了。也使用学习的方式来产生。

这个过程其实来自于到底选择多少维度的数据,我们可以简单地将这个问题概括为:到底选择维度的时候多大才合适呢?

维度的诅咒:如果你的输入样本的features的数量越多,那么我们需要的样本数量也就更大了。其实我们可以这样理解,在一个数轴上进行采样,之后在二维象限中进行采样。这时候,想要达到同样的数据密度的时候就需要更多的点了。

这时候我们想另外一个问题,数据级是一个很贵的东西,尤其是打过标签的数据集,是更贵的。又结合之前的维度诅咒的情况,所以我要努力降低feature的维度。这样就可以降低样本的需求。

所以,因此我们就产生了一个转化feature的过程将10维的转化为3维的,这样就可以有效的降低样本数据的数量需求了。可以节省项目经费。但是这种转化如果人工转移显然不太合理,所以就出现了使用机器来完成的思想。

其实就是在一个高维的空间形成了一个低维的流形。

流形:例如我们在一个三维坐标系,用一个平面来转移,将{x,y,z}转化为{u,v}

2.2.1.1深度学习

想要更好的理解深度学习的内容,我们应当理解深度学习和基础的表示学习是有什么区别的地方开始理解,在基础的表示学习的过程中,我们获得features提取的训练过程和mapping from features学习器是相互分开的。是分开进行的两个部分。但是在机器学习的过程中最开始输入的是最最简单的features之后直接将features提取和学习器合成一个整体进行。直接得到output。

因此,深度学习也被称作端到端的学习。

SVM family是之前的基础表示学习。现在一般是使用各种深度学习的神经网络。

3.神经网络

从上面的过程中我们可以看出神经网络是十分重要的。

SVM受到哪些限制

1.人想到的内容有限。

2.svm不可以处理大数据。

3.无结构的数据(没有明确特征,eg:图片、视频、声音等)处理能力不行。需要额外再来做一个提取器。

起源

最早来自于神经的历史。来自于寒武纪的物种大爆发。寒武纪之前大多生物都是浮游生物,在寒武纪前后生物进化出来了眼睛的结构,早起也是比较简单,只是感知光的明暗,因此出现了有目标的运动,进而促进生物的大爆发。

1959年神经科学实验证明,给猫看各种图片,判断猫的神经元的变化,但是并没有得出显著的反应。最后,发现在切换的时候猫的神经元有明显的反应,最后发现哺乳动物的大脑是个分层,底层的只是处理简单的信息,高层的则是继续实现更复杂的功能。这个实验是对神经网络有十分明显的影响的。

用仿生学来做一个神经元。被称为一个感知机,之后感知机连接起来之后就形成了一个神经网络。

这里一个关键就是反向传播(核心是计算图),利用这个计算图就可以求出来各种的偏导数了。最终的目标时,我们要求一个最终的结果对于最开始输入的偏导数的问题。其实这里是要求我们求出:各个变量到损失函数的导数,只要使用这种计算图(复合求导函数)就可以最终得到我们想要的结果。

神经网络这个领域每年都会提出特别的模型,我们不是要学习所有的模型,而是要学习其中的套路,以此来形成自己的模型。其实是使用一些基本块来完成神经网络个构造任务。

深度学习能够进展如此之快因为:

1.算法的完善。

2.数据集的数据量增大。

3.算力的提升。

从头到尾从框架搭建是不要求的,因为本身这些框架和硬件结合已经十分有效了。现在比较主流的模型如下:

Tensorflow架构是谷歌在进行维护caffe是Facebook在进行维护PyTorch也是Facebook在进行维护,现在已经和Caffe合并了。

TF是最早使用的静态图现在也使用的是动态图,Pytorch是一个动态图,方便我们构造非常灵活的模型。

4.1深度学习的主要步骤

主要步骤如下:

1.数据的收集

2.模型选择(简单模型或是神经网络)

3.神经网络(有些模型可能不需要训练,例如knn模型):这里比较简单一般是人工就可以完成了。

4.测试和推理:应用到实际的数据当中。主要是表现为训练模型看不到最终的结果。

4.1测试部分的问题

4.1训练好了不能直接上线,必须进行测试来评估性能。测试集当中的结果我们其实是知道的,但是我们不能告诉数据集。

4.1.1拿到数据集之后一般是随机分成两个部分:1.一部分进行训练使用,2.另外一部分进行测试使用。如果我们不这样分配,直接使用训练集进行测试,那么泛化能力不能得到成分的测试,因为训练集当中可能有一些我们本来没有注意到的特性。

4.1.2同时训练集为了充分代表各种用户的输入,我们应当从多个方面收集数据集

4.1.3过拟合的问题,我们可能将训练集中的噪声也学习到了我们的模型当中,这是不好的。所以我们可以将训练集分成两个部分,一个是训练集一个开发集,用训练集开发,之后用开发集验证模型中防止过拟合的设计是否达到了预期的效果。

4.2模型选择的问题

到底什么样子的模型对于这数据是合适的,就是要找的f(x)设置为什么模板是合理的。一般是先使用一个线性模型来做一个最基础的架构出来,发现模型不合适我们可以之后再更换模型。

模型最开始的模型的权重是不确定的,我们一般是先生成一个随机数,再依据差距loss函数,之后求这个loss函数(一般是用累加等方式让loss函数可以反映全体数据的情况)对于当前参数的偏导数,分析loss函数随着权重变化的情况,来调整当前这个参数,在这个参数的获得过程中,其实还有一个问题就是怎么获得这个参数,其实只需要找到偏导数为0的时候我们就可以找到这个权重了(这里其实有一个贪心算法的思想)。以将平均损失降到最低为目标来不断修正这个模型,让模型来逐渐可以预测结果。

4.3绘图的重要性

真实的训练模型当中,误差可能是逐渐的减少减少,然后维持在一个相对稳定的情况,于此同时,我们同时用开发集来进行测试,可能存在误差是逐渐减少减少,然后稳定一段时间之后就开始增加了。所以我们可能需要绘图来找出这个最为合适的轮数。有时候我们需要visdom来实时绘制一个图片来实时查看训练的情况。因为深度学习可能持续运行很久时间,这时候我们不可能持续的观察,所以实例化、可视化比较重要。同时时间过长之后可能还会出现崩溃的情况,所以我们要经常性的进行存盘。

绘制三维图形要使用到np.meshgrid()这个函数

5.梯度下降算法

什么样的数据集更好地适应我们的权重

5.1尝试

当然我们可以使用穷举法,将所有的可能的值都举出来,但是显然这个不是能正常使用的,因为我们只有一个权重的时候,我们可以画一个二维图来看一下权重哪个是可以的。如果更高维度的将变得十分困难,另外来说维度多了时候运算的数据量将十分大,所以这种情况显然不行。

当然我们还可以使用分治法,我们将所有的可能值分成一块一块的,随机在每个区间找一个代表值,然后来判断最优值可能在哪个区间里面,经过几次分治法来找,我们就可以得到最终的结果了。但是我们想一下有两种情况1.曲线不规则再加上随机取点,最后我们可能会错过我们该取的点;2.如果数据量很大的情况很难找到最优解,运算的数据量十分庞大。

接着我们开始尝试贪心算法来辅助求解,所以梯度下降算法就逐渐进入到了我们的视野当中。我们每次都向着当前最好的位置移动,在移动的过程中我们不断地借助梯度寻找最优的方向。

5.2梯度下降算法中的不利情况

5.2.1步长过大

如果每次我们都迈进一大步,那么就会存在这样一个问题,我们计算的梯度是当前的数据,如果离开这里过于遥远的时候,这个梯度可能就不够准确了,需要我们来进行重新计算。所以我们步长一定要短一点。

5.2.2局部最小值点

我们知道梯度下降算法是使用的贪心算法的方式,贪心算法一个重要的缺陷就是有可能找的不是最优点而是找的一个局部的最优点。这种情况在梯度下降算法当中是确实存在,如果曲线是波动的可能就会出现一个又一个局部的最优点。这将是致命的。不过好在这种问题我们是可以解决的,我们可以在设计损失函数的过程中加以控制。

5.2.3鞍点

其实这种有问题的点还有一种,那就是鞍点,鞍点指的是偏导数为零的点,这时候将会出现损失函数原地踏步的情况,这是我们主要需要解决考虑的问题。

6.反向传播

在图上建立一个梯度的传播,方便进行梯度下降。我们注意是计算损失对权重的导数。如果是简单的模型我们可以使用复合求导公式来进行求解,但是在复杂形势下,我们就很难进行处理了。

如下图我们就很难使用求导公式来顺利完成损失函数对参数的偏导数了。首先,5个输入转化为6个中间值就需要一个6行5列的矩阵来完成,这就是三十个参数之后还会有更多的参数,如果每个参数都算一下可能就没法做了。

我们就必须换一种算法来做了。这时我们就有了反向传播算法了

那么到底什么是反向传播算法呢?

我们可以通过一个简单的例子来理解这个过程。

首先是forward的过程这个过程计算一部分内容。

之后是backward的过程,这个过程应用前方回传的内容。算出计算结果。

从图中我们是可以理解简单的反向传播的,其实是forward和backward。pytorch其实是将中间的梯度存在变量当中的那么再增加一层也是没有问题的。

7.模型的简单例子

MM是矩阵乘法的一个缩写

b1(Bias)是一个偏置量

这就出现了全连接神经网络的第一层和第二层

矩阵求导的问题是一个关键的知识点

如下图所示我们可以发现如果我们是不断地进行线性的变换的话,那么不管有多少层,其实就相当于进行了一层。

所以我们要在每一次结束之后加入某些非线性变换,来打乱这些操作。例如让每个成员都计算一个1/(1+ex)。这样就不可以展开了,就不会让多层退化为单层了。这里其实就是激活函数的一个应用。

pytorch架构实现上述的例子

(待补充)

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。