《深度学习入门:基于Python的理论与实现》学习笔记——神经网络的学习

《深度学习入门:基于Python的理论与实现》学习笔记——神经网络的学习

  • 神经网络的学习
    • 一、从数据中学习
      • 1.1 数据驱动
      • 1.2 训练数据和测试数据
    • 二、损失函数
      • 2.1 均方误差
      • 2.2 交叉熵误差
    • 三、mini-batch 学习
    • 四、梯度法
      • 3.1导数:
      • 3.2 导数的数值求解方法
      • 3.3 偏导数
      • 3.4 梯度
      • 3.5 梯度法
      • 3.6 神经网络中的梯度
    • 五、学习算法的实现

神经网络的学习

一、从数据中学习

神经网络的特征就是可以从数据中学习。

从数据中学习:可以由数据自动决定权重参数的值。

在参数量较少的感知机模型中,可以通过人工设定合适的参数,但在网络深度较深,甚至参数成千上万的神经网络中,想要通过人工设定所有合适的参数简直是天方夜谭!神经网络的 从数据中学习 完美地解决了这个问题。

1.1 数据驱动

数据是机器学习的核心。数据驱动的方式是脱离了过往以人为中心的方法。

机器学习的方法可以尽可能地避免人为因素的介入,尝试从数据中寻找答案。神经网络或深度学习则比以往的机器学习方法更能避免人为介入。

深度学习有时也称为 端到端机器学习(end-to-end machine learning)。“端到端”指从一端到另一端的意思,即从输入数据获得输出数据的意思。

神经网络的优点就是对所有的问题都可以用同样的流程来解决。

神经网络可以将数据直接作为原始数据,进行 “端到端”的学习,而学习的过程与待处理的问题无关。

也就是说,如果设计一个图像识别的算法,不管是识别人还是动物,还是其他的什么东西,神经网络直接从数据中学习的流程不变,与要识别的目标主体是什么无关。

1.2 训练数据和测试数据

机器学习中,一般将数据分为 训练数据测试数据 两部分来进行学习和实验。

  • 使用训练数据进行学习,寻找最优参数;
  • 使用测试数据进行评价训练得到的模型的实际能力。

泛化能力:泛化能力是指处理 未被观察过的数据(不包含在训练数据中的数据)的能力。

过拟合:仅仅用一个数据集去学习和评价参数,是无法进行正确评价的。这样会导致学习的到参数具有针对性,只对某个数据集过度拟合。

避免过拟合是机器学习中的一个重要课题。


二、损失函数

神经网络中以某个指标为线索寻找最优权重参数。其中所用的指标称为 损失函数(loss function)

损失函数可以使用任意函数,一般用 均方误差交叉误差 等。

损失函数是表示神经网络性能的 “恶劣程度” 的指标,即当前的神经网络对监督数据在多大程度上不拟合,在多大程度上不一致。


2.1 均方误差

针对单个数据的损失函数

均方误差(mean squared error)的数学公式为:
E = 1 2 ∑ k ( y k − t k ) 2 E=\frac{1}{2}\sum_{k}(y_k-t_k)^{2} E=21k(yktk)2

  • y k y_k yk 表示神经网络的输出;
  • t k t_k tk 表示监督数据;
  • k k k 表示数据的维数。

针对所有数据的损失函数
E = 1 2 N ∑ n ∑ k ( y n k − t n k ) 2 E=\frac{1}{2N}\sum_{n}\sum_{k}(y_{nk}-t_{nk})^{2} E=2N1nk(ynktnk)2

  • n n n 为数据量。

one-hot:将正确解标签表示为 1 1 1,其他标签表示为 0 0 0 的表示方法称为 one-hot表示。

2.2 交叉熵误差

针对单个数据的损失函数

交叉熵误差(cross entropy error)的数学公式为:
E = − ∑ k t k l o g y k E=-\sum_{k}t_{k}logy_k E=ktklogyk

  • y k y_k yk 是神经网络的输出
  • t k t_k tk 是正确解标签(one-hot表示:正确解的标签为 1 1 1,其他均为 0 0 0

针对所有数据的损失函数
E = − 1 N ∑ n ∑ k t n k l o g y n k E=-\frac{1}{N}\sum_{n}\sum_{k}t_{nk}logy_{nk} E=N1nktnklogynk

  • N N N 为数据量;
  • t n k t_{nk} tnk 表示第 n n n 个数据的第 k k k 个元素的值( y n k y_{nk} ynk 是神经网路的数据, t n k t_{nk} tnk 是监督数据);
  • 此处除以 N N N ,表示对数据进行了正规化;

三、mini-batch 学习

如果以全部数据为对象求损失函数的和,会花费大量的计算时间。当数据量巨大时,以全部数据为对象计算损失函数是不现实的。

因此,可以从全部数据中选出一部分,作为全部数据的 ”近似“。

神经网络的学习可以从训练数据中选出一批数据(称为mini-batch,小批量),然后对每个 mini-batch 进行学习。这种学习方式称为 mini-batch学习

四、梯度法

梯度法使用梯度的信息决定前进的方向。

3.1导数:

导数可以定义为:
d f ( x ) d x = lim ⁡ h → 0 f ( x + h ) − f ( x ) h \frac{df(x)}{dx}=\lim_{h \rightarrow 0}\frac{f(x+h)-f(x)}{h} dxdf(x)=h0limhf(x+h)f(x)

  • d f ( x ) d x \frac{df(x)}{dx} dxdf(x):函数 f ( x ) f(x) f(x) 关于 x x x 的导数,即 f ( x ) f(x) f(x) 相对于 x x x 的变化程度;
  • h h h :表示微小变化。

3.2 导数的数值求解方法

导数的数值解:利用数值微分方法求出来的导数,是近似值。

导数的解析解:利用数学分析方法求出来的导数,是真实值。

数值微分方法:函数的数值微分方法就是用数值方法近似求解函数的导数的过程。

前向差分形式
d f ( x ) d x =   f ( x + h ) − f ( x ) h , h 为 微 小 值 \frac{df(x)}{dx}=\ \frac{f(x+h)-f(x)}{h},h为微小值 dxdf(x)= hf(x+h)f(x)h

后向差分形式
d f ( x ) d x = f ( x ) − f ( x − h ) h , h 为 微 小 值 \frac{df(x)}{dx}=\frac{f(x)-f(x-h)}{h},h为微小值 dxdf(x)=hf(x)f(xh)h
中心差分形式
d f ( x ) d x = f ( x + h ) − f ( x − h ) 2 h , h 为 微 小 值 \frac{df(x)}{dx}=\frac{f(x+h)-f(x-h)}{2h},h为微小值 dxdf(x)=2hf(x+h)f(xh)h

通常情况下,为了减小误差,我们选用 中心差分形式 求解导数值。

3.3 偏导数

若函数 f f f 包含多个变量,则 函数 f f f 关于某一变量的导数,称为关于这一变量的 偏导数

偏导数和单变量的导数一样,都是求某个地方的斜率。

偏导数需要将多个变量中的某一个变量定位目标变量,并将其他变量固定为某个值。

3.4 梯度

由全部变量的偏导数汇总而成的向量称为 梯度(gradient)

3.5 梯度法

机器学习的主要任务是在学习中寻找最优参数。同样的,神经网络也必须在学习时找到最优参数(权重和偏置)。

最优参数是指损失函数取最小值时的参数。

一般而言,损失函数很复杂,参数空间庞大,我们无法确切知道它在何处能够取到最小值。

梯度法 则可以巧妙地使用梯度来寻找函数的最小值。

值得注意的是,梯度表示的是各点处的函数值减小最多的方向。但无法保证梯度所指向的方向就是函数的最小值或者真正应该前进的方向。
实际上,在复杂的函数中,梯度指示的方向基本上都不是函数值最小处。

函数的极小值、最小值以及被称为 鞍点(saddle point) 的地方,梯度为 0 0 0
极小值是局部最小值,是限定在某个范围内的最小值。
鞍点 是从某个方向上看是极大值,从另一个方向上看则是极小值的点。虽然梯度法要寻找梯度为 0 0 0 的地方,但那个地方不一定就是最小值(也有可能是极小值或者鞍点)。

此外,当函数很复杂且呈扁平状时,学习可能会进入一个(几乎)平坦的地区,陷入被称为 “学习高原” 的无法前进的停滞期。

虽然梯度的方向不一定指向最小值,但沿着它的方向能够最大限度地减小函数的值。因此,在寻找函数的最小值(或者尽可能小的值)的位置的任务重,要以梯度的信息作为线索,决定前进的方向。

在梯度法中,函数的取值从当前位置沿着梯度方向前进一定距离,然后再新的地方重新求梯度,再沿着新梯度方向前进,如此反复,不断地沿着梯度的方向前进。

通过不断地沿着梯度的方向前进,逐渐减小函数值的过程就是 梯度法(gradient method)

根据目的是寻找最小值还是最大值,梯度法的叫法有所不同。
严格地讲:

  • 寻找最小值的梯度法称为 梯度下降法(gradient descent method);
  • 寻找最大值的梯度法称为 梯度上升法(gradient ascent method)
    通过反转损失函数的符号,求解最小值的问题与求解最大值的问题可以相互转换,因此在神经网络中,纠结于区分梯度上升法和梯度下降法并无多少意义。
    通常情况下,神经网络(深度学习)中的梯度法主要是指 梯度下降法。

梯度法用数学公式可以表示为:
x 0    =    x 0 − η ∂ f ∂ x 0 x 1    =    x 0 − η ∂ f ∂ x 1 … … x_0\,\,=\,\,x_0-\eta \frac{\partial f}{\partial x_0} \\ x_1\,\,=\,\,x_0-\eta \frac{\partial f}{\partial x_1} \\ …… x0=x0ηx0fx1=x0ηx1f

其中, η \eta η 称为 学习率(learnIng rate),表示更新量。

  • 学习率决定在一次学习中,应该学习多少,以及在多大程度上更新参数。

  • 学习率需要事先初始化,即赋予一个确定的值。一般来说,学习率过大或过小都无法抵达一个 “好的位置”。在神经网络的学习中,一般会一边改变学习率的值,一边确认学习是否正确地进行。

超参数:像学习率这样的参数称为超参数。这是一种和神经网络的参数(权重和偏置)性质不同的参数。

相对于神经网络的权重参数是通过训练数据和学习算法自动获得的,学习率这样的超参数是人工设定的。一般而言,超参数需要尝试多个值,以便找到一种可以使学习顺利进行的设定。

3.6 神经网络中的梯度

神经网络的学习也要求梯度。这里的梯度是指损失函数关于权重参数的梯度。

L L L 表示损失函数, W W W 表示权重参数, ∂ L ∂ W \frac{\partial L}{\partial W} WL 的元素由各个元素关于 W W W 的偏导数构成。

五、学习算法的实现

前提
神经网络存在合适的权重和偏置,调整权重和偏置以便拟合训练数据的过程称为 “学习”。

神经网络的学习分成下面的 4 4 4 个步骤。

步骤01(mini-batch):
从训练数据中随机选出一部分数据,这部分数据称为 mini-batch。我们的目标是减小 mini-batch 的损失函数的值。

步骤02(计算梯度)
为了减小 mini-batch 的损失函数的值,需要求出各个权重参数的梯度。梯度表示损失函数的值减小最多的方向。

步骤03(更新参数)
将权重参数沿梯度方向进行微小的更新。

步骤04(重复)
重复步骤1、步骤2、步骤3。

神经网络的学习按照以上 4 4 4 个步骤进行。

随机梯度下降法(stochastic gradient descent,简称SGD):使用随机机选的 mini-batch 数据,然后通过 梯度下降法 更新参数。

你可能感兴趣的:(深度学习,神经网络)