深度学习-神经网络的学习(rush_peng)
文章目录
一. 神经网络的学习
这里所说的“学习”是指从训练数据中自动获取最优权重参数的过程。为了使神经网络能进行学习,将导入损失函数这一指标。而学习的目的就是以该损失函数为基准,找出能使它的值达到最小的权重参数。
(一)数据驱动
比如手写数字 5 的识别
1.传统机器方法:
先从图像中提取特征量,然后再用机器学习中的 SVM 、KNN 等分类器进行学习。
计算机视觉中,常用的特征向量包括:SIFT. SURF.HOG 等
2.深度学习的方法:
连特征量的选择也不需要人为的选择了
深度学习是一种端到端的学习,机器学习极力的避免人为的介入,而神经网络或者深度学习,比以往的机器学习方法更避免人为的介入。
(二)损失函数
损失函数衡量的是:当前的神经网络和和训练数据,在多大程度上不一致。
损失函数可以使用任意的函数,但一般用 均方误差 和 交叉熵误差
1.均方误差
以手写数字识别为例:
y = [0.1, 0.05, 0.6, 0.0, 0.05, 0.1, 0.0, 0.1, 0.0, 0.0]
t = [0, 0, 1, 0, 0, 0, 0, 0, 0, 0]
def mean_squared_error(y, t):
return 0.5 * np.sum((y-t)**2)
注意:
- 将正确标签表示为1,其他标签表示为0的表示方法称为 one hot 表示
- Python实现这个代码的时候,y 和 t 都是 NumPy数组
- 输出结果的值越小,说明越吻合
2.交叉熵误差
这个其实比上边更简单,因为使用 one-hot 的表示方法,只有正确的标签是1,其他的都是0,所以,其他的不用乘,t(k)也始终等于 1 ,就是 - ln(正确标签的概率)。
3.mini-batch 学习
原则上来讲:计算损失函数时必须将所有的训练数据作为对象。也就是说,如果训练数据有100个的话,我们就要把这100个损失函数的总和作为学习的指标。
前边的例子都是针对单个数据的损失函数,如果要求所有训练数据的损失函数的中和,以交叉熵为例,公式如下:
看着复杂,其实就是加起来除以总数求平均。
但是如果遇到大数据,数据量会有几百万、几千万之多,这种情况下以全部数据为对象计算损失函数是不现实的。因此,我们从全部数据中选出一部分,作为全部数据的“近似”。神经网络的学习也是从训练数据中选出一批数据(称为mini-batch,小批量),然后对每个mini-batch进行学习。
4.为什么要用损失函数
很多人要问,为什么要引入损失函数?而不是直接把准确率作为指标?
在神经网络的学习中,寻找最优参数(权重和偏置)时,要寻找使损失函数的值尽可能小的参数。为了找到使损失函数的值尽可能小的地方,需要计算参数的导数(确切地讲是梯度),然后以这个导数为指引,逐步更新参数的值
比如从100笔训练数据中,训练出来了32笔,那么准确率就是32%,你轻微的调节参数,算出来的也还是32笔,所以准确率还是32%,它的值也不会像32.0123 … %这样连续变化,而是变为33 %、34 %这样的不连续的、离散的值。这样就没办法求导数了。
同样的道理,为什么我们选择激活函数,使用 sigmoid 函数,而不是阶跃函数。
(三)数值微分
1.导数
导数就是某个瞬间的变化量。
2.偏导数
偏导数是有两个向量。其中的一个就是偏导数。
3.梯度的概念
梯度的本意是一个向量(矢量),表示某一函数在该点处的方向导数沿着该方向取得最大值,即函数在该点处沿着该方向(此梯度的方向)变化最快,变化率最大(为该梯度的模)。
梯度就是把全部变量的偏导汇总二层的向量,称为梯度:
例如:下面是 f(x0 +x1)=x02 + x12 的梯度图。
4.梯度法
机器学习的主要任务是在学习时寻找最优参数。即损失函数取得最小值时候的参数。
函数的极小值点称为 鞍点,但是当函数很复杂并且呈扁平状的时候,学习会陷入 “局部最优解”,无法前进的停滞期。
梯度法的叫法,严格来说有两种:
- 寻求最小值的梯度法称为梯度下降法
- 寻找最大值的梯度法称为梯度上升法
下面使用数学的方式来表示梯度法:
注意:
- η 表示的是学习率
- 这里只是展示的有两个变量的时候,如果有多个变量,也是通过类似的式子进行更新。
- 但是一般而言,学习率过大或过小,都抵不过一个好位置
像学习率这样的参数称为超参数。这是一种和神经网络的参数(权重和偏置)性质不同的参数。相对于神经网络的权重参数是通过训练数据和学习算法自动获得的,学习率这样的超参数则是人工设定的。一般来说,超参数需要尝试多个值,以便找到一种可以使学习顺利进行的设定。
5.学习算法实现的步骤
神经网络需要合适的权重和偏置,调整权重和偏置以便拟合训练数据的过程称为”学习“
第一步( mini-batch )
从训练数据中随机选出一部分数据,这部分数据称为mini-batch。我们
的目标是减小mini-batch的损失函数的值。
第二步(计算梯度)
为了减小mini-batch的损失函数的值,需要求出各个权重参数的梯度。梯度表示损失函数的值减小最多的方向。
第三步(更新参数)
将权重参数沿梯度方向进行微小更新。
第四步(重复)
重复步骤1、步骤2、步骤3。
因为这里使用的数据是随机选择的mini batch数据,所以又称为随机梯度下降法(stochastic gradient descent)。“随机”指的是“随机选择的”的意思,因此,随机梯度下降法是“对随机选择的数据进行的梯度下降法”。深度学习的很多框架中,随机梯度下降法一般由一个名为SGD的函数来实现。SGD来源于随机梯度下降法的英文名称的首字母。
6.测试评价
为了防止过拟合,就要在定期评价神经网络的泛化能力,就必须使用不包含在训练数据里的数据,定期对训练数据和测试数据记录识别精度,这样每经过一个 epoch,就会记录训练数据和测试数据的识别精度。
epock [i:pok 新纪元,新时代],是一个单位,一个epoch表示学习中 所有训练数据 均被使用过一次的更新次数,比如:。比如,对于10000笔训练数据,用大小为100 笔数据的mini-batch进行学习时,重复随机梯度下降法100次,所有的训练数据就都被“看过”了。此时,100次就是一个epoch