《深度学习入门》学习记录 Part2

这周主要是学习了《深度学习入门》的第四、五章节,了解了损失函数、数值微分、梯度、计算图、误差反向传播法和「神经网络学习」的整个过程。

在计算权重函数的梯度时,切实感受到了数值微分方法与误差反向传播法的差距。在使用数值微分算法实现神经网络学习的时,我电脑的呼呼呼的,等了好久好久都没计算成功。但是在使用误差反向传播法时,不到一分钟就处理完了。
《深度学习入门》学习记录 Part2_第1张图片

概念

  • 鞍点(saddle point)
  • 学习高原:函数很复杂且呈扁平状时,学习会进入的平坦区。
  • 超参数:人工设定的参数,有别于通过训练数据和学习算法自动获得的权重和偏置
  • 正向传播(forward propagation)
  • 反向传播(backward propagation)
  • 复合函数:由多个函数构成的函数

神经网络的学习

从训练「数据」中「自动」获取最优权重参数的过程。

  • 数据是学习的核心
  • 自动是很了不起的

与其绞尽脑汁从零开始想出一个算法,不如考虑通过有效利用数据来解决问题。

  • 问题 -> 想到的算法 -> 答案
  • 问题 -> 想到的特征量 -> 机器学习 -> 答案
  • 问题 -> 神经网络(深度学习) -> 答案

泛化能力
处理未被观察过的数据的能力,是机器学习的终极目标。
为了正确评价模型的泛化能力,必须划分「训练数据」和「测试数据」。

  • 训练数据:用来学习,寻找最优参数,也称为「监督数据」
  • 测试数据:用来评价模型的能力,避免过拟合(over fitting)

损失函数(loss function)

损失函数是神经网络的学习中使用的指标,表示当前的神经网络对监督数据在多大程度上不拟合。
Q:神经网络的学习的目标其实是获得使识别精度尽可能高的神经网络,那为什么不用设别精度作为指标?
A:识别精度对微小的参数变化非常不敏感,即使有反应,其值也是不连续、离散的。

一般使用均方误差(mean squared error)和交叉熵误差(cross entropy error)。两个参数:神经网络输出y + 监督数据t(正确解标签)
- 均方误差(mean squared error):f(y, t) = 0.5 * np.sum((y-t)**2)
- 交叉熵误差(cross entropy error): f(y, t) = -np.sum(t * np.log(y + 1e-7))

数值微分(numerical differentiation)

数值微分是用数值的方法近似求解函数的导数的过程。相对应的是「解析性求导」,指基于数学式的推导求导数的过程。

  • 导数:表示某个瞬间的变化量, d(f, x) = (f(x+h) - f(x-h)) / (2*h)
  • 偏导数:有多个变量的函数的导数,求解时需将多个变量的某一个变量定位「目标变量」,并将其他变量固定为某个值,即分别计算变量的导数。f(x) = x[0]**2 + x[1]**2
  • 梯度(gradient):由全部便导数汇总而成的向量。梯度指示的方向是各点处的函数值减小最多的方向。简单的可理解为梯度指向函数的「最低处」。numerical_gradient(f, x), 即f函数对x数组内对各个元素求数值微分。

梯度法

神经网络必须在学习时找到最优参数(权重和偏置),即「损失函数」取最小值时的参数,可以通过梯度来完成。

通过梯度来寻找损失函数的最小值的方法,不断地沿梯度方向前进,逐渐减小损失函数值的过程,就叫梯度法。寻找最小值的梯度法叫梯度下降法(gradient descent method)
gradient_descent(f, init_x, lr, step_num)
x = x - lr * numerical_gradient(f, x)

  • lr: 学习率,决定在一次学习中,应该学习多少,以及在多大程度上更新参数
  • step_num:梯度法的重复次数

神经网络的学习中的梯度是指损失函数关于权重函数的梯度,即dL/dW。

神经网络的学习步骤(数值微分版)

神经网络存在合适的「权重」和「偏置」,调整权重和偏置以便拟合训练数据的过程称为「学习」。目标是减小mini-batch的损失函数的值。

  1. mini-batch:从训练数据中随机选出一部分数据,设置batch_mask
  2. 计算梯度:求出各个权重参数的「梯度」,而这个梯度就是表示损失函数的值减小最多的方向。通过数值微分的梯度numerical_gradient(f, x)
  3. 更新参数:将权重沿梯度方向进行微小更新。通过梯度下降法来实现gradient_descent(f, init_x, lr, step_num)
  4. 重复

以上方法使用的数据是随机选择的mini batch,因此称为「随机梯度下降法」(stochastic gradient descent,SGD),指对随机选择的数据进行的梯度下降法。

最后还需通过测试数据来对神经网络的泛化能力进行评价。
Epoch:学习中所有训练数据均被使用过一次时的更新次数(因为我们在学习时用的是mini batch)。

计算图(computational graph)

将计算过程用数据结构图表示出来,通过多个节点和边表示。有以下优点:

  1. 可通过「 局部计算」获得最终结果
  2. 可以将中间的计算结果全部保存起来
  3. 可以通过反向传播高效计算导数

链式法则(chain rule):如果某个函数由复合函数表示,则该复合函数的导数可以用构成复合函数的各个函数的导数的乘积表示。

计算图的反向传播(backword propagation):沿着正方向相反的方向,乘上局部导数。

  • 加法节点的反向传播:将上游的值「原封不动」的输出到下游
  • 乘法节点的反向传播:将上游的值乘以正向传播时的输入信号的「翻转值」后传递给下游。需要用到正向传播的输入信号值。

激活函数的反向传播

  • ReLU层
  • Sigmoid层,其反向传播只根据正向传播的输出就能计算出来
    《深度学习入门》学习记录 Part2_第2张图片
  • Affine层(仿射变换):Y = np.dot(X, W) + B。在反向传播中,矩阵需要转置,为了保证矩阵的乘积运算的元素个数的一致性。
    《深度学习入门》学习记录 Part2_第3张图片
  • Softmax-with-Loss层:softmax函数将输入值正规化后再输出,运用在神经网络的学习阶段(推理阶段只需一个答案,不需最大值的「得分」)。softmax层的反向传播得到的是(y-t)结果,即softmax层的输出和监督标签的差分,这个结果会反向传递给前面的层。
    • 神经网络学习的目的就是通过调整权重参数,使神经网络的输出(softmax的输出)接近监督标签。

      《深度学习入门》学习记录 Part2_第4张图片

神经网络的学习步骤(误差反向传播法版)

神经网络存在合适的「权重」和「偏置」,调整权重和偏置以便拟合训练数据的过程称为「学习」。目标是减小mini-batch的损失函数的值。

  1. mini-batch:从训练数据中随机选出一部分数据,设置batch_mask
  2. 计算梯度:求出各个权重参数的「梯度」,而这个梯度就是表示损失函数的值减小最多的方向。通过误差反向传播法计算梯度gradient(f, x, t)
  3. 更新参数:将权重沿梯度方向进行微小更新。通过梯度下降法来实现gradient_descent(f, init_x, lr, step_num)
  4. 重复
  • 将神经网络的层保存为有序字典OrderedDict,以「层」的方式实现神经网络的组成元素,这种模块化的实现可以轻松的构建神经网络
  • 梯度确认(gradient check):确认数值微分求出的梯度结果和误差反向传播求出的结果是否一致(非常相近)的操作。因为数值微分方法实现简单,一般情况下不太容易出错。

Q:为什么误差反向传播法会更快速高效?
A:这其实是解析性求解数学式的方式来计算梯度,通过激活函数层的计算图可知,激活函数的节点可以被「集约化」,可以省略反向传播中的计算过程,因此有更高的计算效率。

接下来的学习内容

  • 《深度学习入门》的第6章节,并复习前面章节
  • 数据结构的知识

你可能感兴趣的:(AI,Deep,Learning)