本篇用于记录《深度学习入门-基于python的理论与实现》中第4章神经网络的学习的随笔(主要是因为脑子笨,看了就忘,就想还不如写下来,毕竟写的时候会稍微过一下脑子,嘿嘿^_^)
神经网络的重要特种就是能够从数据中学习。所谓的“学习”是指可以根据输入数据自动决定权重参数。在之前的介绍中我们直到感知机中的权重是人通过真值表确定下来的,但是当输入因素较多时,在人工确定权重参数显然是不太可能的,有了神经网络就能很好的解决这一问题。
根据上面的介绍可以发现数据是机器学习的核心,这种数据驱动的方法摆脱了往往以人为中心的方法,能够极大的降低对于人的依赖。
那如何从数据中学习的呢?以手写识别为例进行介绍,识别数据中哪些是数字5。
首先了解我们的目标是希望能够通过手写数据识别出任何的数字5,假设我们想要教一个小孩在认识数字,我们可能会先给他看一下哪些是数字5(可能是不同颜色写的5,也可能是大小不一样的,这一部分数据成为训练数据)这个过程是为了让他认识数字5,之后再给他看一些没有看过的(其他颜色或者类似的5, 这一部门数据称为测试数据)这个过程是为了验证他是否能够认识其他形式的5。当然我们肯定是希望他能够认识足够多的5,而不是只认识某一颜色或者某一大小的5,对于机器学习而言这一能力称之为泛化能力。
好的在回到课本的例子,为解决这一问题,一种方案是(机器学习方案),先从图像中提取特征量,再用机器学习技术学习这些特征量的模式。这里所说的“特征量”是指可以从输入数据(输入图像)找那个准确的提取本质数据(重要的数据)的转换器。图像的特征量通常表示为向量的形式。常用的特征量包括(SIFT, SURF和HOG等)使用这些特征量将图像数据转换为向量,然后对转换后的向量使机器学习中的SVM,KNN等分类器进行学习。 注意这个过程是机器学习的过程,对于特征量的设计依然是需要人工参与,对于不同的数据必须使用合适的特征量(必须设计专门的特征量)
另外一种是神经网络(深度学习)深度学习有时也称为端到端机器学习,这里所说的端到端是指从一端到另一端的意思也就是从原始数据(输入)中获得目标结果(输出)的意思。
神经网络的优点是对所有的问题都是可以使用相同的处理流程,不需要像机器学习那样不停的更换特征量。神经网络都是通过不断的学习所提供的数据,尝试发现待求解的问题的模式,与待求解的问题无关,神经网络可以将数据直接作为原始数据,进行端到端的学习。
前面提到训练数据和测试数据。在机器学习中一般将数据分为:训练数据和测试数据。首先,使用训练数据进行学习,寻找最优的参数。然后使用测试数据评价训练得到的模型的实际能力。使用测试数据是为了正确评价模型的泛化能力。泛化能力是指处理未被观察的数据(不包含在训练数据中的数据)的能力。获得泛化能力是机器学习的最终目标。只对某个数据集过度过度拟合的状态成为过拟合
那应该采用什么样的指标评价训练得到的模型的?又如何根据这一指标训练在神经网络中以该指标为线索寻找最优参数(权重和偏置)呢?
在神经网络中将用于评价模型的指标成为损失函数,损失函数可以使用任意函数,一般使用:均方误差和交叉熵误差。
损失函数是表示神经网络性能的“恶劣程度“的指标,这种称呼好像不太符合大众的想法(一般我们都是说这个模型有多好,而不是多坏),因此通常将损失函数成上一个负值,就可以解释为”在多大程度上不坏“或者”性能有多好“,虽然乘上一个负数但是效果都是一样的,都是为使损失函数的数值绝对值接近0。
均方差:均方差的计算公式为:
这里,表示神经网络的输出,
表示监督数据,k表示数据的维数。例如在进行标签表示的时候,通常使用one-hot表示方法,例如表示数字识别中的数字2时,
= [0, 0, 1, 0, 0, 0, 0, 0, 0, 0] 此时一共是10个分类,则k最大为9。
交叉熵误差:计算公式为:
log表示以e为底的自然对数,,表示神经网络的输出,
表示监督数据,k表示数据的维数。注意这里是针对某个输出和某个监督数据,只是计算某一个结果的均方差计算公式。如果是多输入的则需要将所有的计算结果汇总起来。例如:假设输入数据有N个,则表示有N个输出结果(因为每个输入都有一个计算结果呀)则交叉熵误差E的计算公式为:
为什么这里我们使用损失函数评价训练得出的网络呢?当使用一个函数评价网络,则函数的结果是根据神经网络的输出以及监督数据间的关系不断变化的,因为我们直到神经网络的输出是受权重参数影响的,如果将神经网络的输出y,使用与输入以及权重参数有关的函数替换也就是另外一个含义:权重参数对于模型输出结果间的关系。 这样就像一个结果是受某些因素影响的,我们可以通过调整这些影响因素得到想要的结果。可能会提出疑问为什么不直接使用准确率确定呢?
使用函数表达式的形式我们可以通过当前的计算结果,反推出如何调整权重使得神经网络的结果更加符合我们想要的结果。因为函数表达式的取值如果用图像表示的话是一个连续的线或面,可以通过微小的调整权重得到连续的输出结果及误差变化是连续的。
但是如果使用准确率,那将是一个固定数值,假设我们想要的数字识别的准确率为98%,但是最开始模型肯定是没这么准确的,如最开始得到的准确率为50%,那我们如果调整权重是他更加解决98%呢?权重参数众多,难道一个一个试试吗?是将哪些调大哪些调小呢?不好搞哟。
关于求导和偏导(有多个变量的函数的导数称为偏导数)我就不详细介绍啦,自己去刷高数吧,哈哈,主要还是我懒。但是这里要说几个概念:
利用微小的差分求导的过程分为”数值微分numerical differentiation“。而给予数学公式的推导求导数的过程则用”解析性“一词,称为”解析性求解“或者”解析性求导“ 解析性求导得到的导数是不含误差的”真的导数“。
梯度:有全部变量的偏导数汇总而成的向量称为梯度。对于得出的导数,当导数为正的时候表示随着该影响因素的数值增加,最终的计算结果的数值将是变大的。但是在神经网络中,对误差损失函数中的权重进行求导的,是为了获取更小的误差。因此我们更希望能够通过调整权重是的误差函数的结果更加接近0,即负梯度方向。如的梯度画在图上可以表示为:
图像引用自:不同函数的梯度图像_tugouxp的专栏-CSDN博客_z=x+y图像
梯度会只想各点出的函数数值降低的方向, 更严格的讲,梯度指示的方向是个点处的函数值减少最多的方向。
梯度法:机器学习重要的任务是在学习的过程中寻找最优参数。同样的深度学习也必须在学习中找到最优参数(权重和偏置)但是通常神经网络中的损失函数复杂且参数空间庞大,很难确定在何处寻找最小值。而通过巧妙的使用梯度来寻找函数最小值的方法称为梯度法。注意梯度表示的是各点出的函数值减少最多的方向。 因此无法保证梯度所只想的方向是函数的最小值或者真正应该前进的方向。特别是在复杂的函数中,梯度提示的方向基本上都不是函数值最小处。
函数的最小值,极小值以及被称为鞍点的地方梯度为0.极小值是局部最小,也就是限定在某个范围内的最小值,即局部最小值,但是不一定是全局最小值。通过不断的沿着梯度方向前进,逐渐减少函数值的过程称为梯度法。
使用梯度法能够直到权重对于误差损失函数的影响,每次调整权值的时候调整多少比较合适呢?此时就引入了学习率,学习率就是每次迭代的过程中调整权值的比例,当学习率为,则权重更新公式为:
学习率过大的话会发散成一个很大的值(一不小心越过了极小值);反过来,学习率过小的话,基本上没怎么更细就结束了(更新的太慢啦,导致损失函数的值变化的太小了)
像学习率这样的参数称为超参数,和权重参数不同,学习率这样的超参数是通过人工设定的。一般学习率需要多次尝试。
关于实验部门下周我在更新哟。
本章内容
- 机器学习中使用的数据集分为训练数据和测试数据。
- 神经网络用训练数据进行学习,并用测试数据评价学习到的模型的泛化能力。
- 神经网络的学习以损失函数为指标,更新权重参数,以使损失函数的值减小。
- 利用某个给定的微小值得差分求导的过程,称为数值微分
- 利用数值微分,可以计算权重参数的梯度