李宏毅《机器学习》Task04 - 深度学习介绍和反向传播机制

一、深度学习介绍

1.1 回顾DL的历史

  • 1958: Perceptron (linear model)【感知机】
  • 1969: Perceptron has limitation
  • 1980s: Multi-layer perceptron【和今天的DNN相比没有特别大的差别】
  • 1986: Backpropagation【通常超过三个隐藏层的训练结果不会很好】
  • 1989: 1 hidden layer is “good enough”, why deep?
  • 2006: RBM initialization1 (breakthrough)
  • 2009: GPU【加速矩阵运算】
  • 2011: Start to be popular in speech recognition
  • 2012: win ILSVRC image competition

感知机(Perceptron)非常像逻辑回归,只不过是没有sigmoid激活函数。

1.2 深度学习的步骤

《机器学习 Task 1》 中,我们知道机器学习有三个步骤,对于深度学习也是三个步骤:
步骤
即:神经网络、模型评估、函数择优。也就是将机器学习的“建立模型”换成了“神经网络”。

Step 1:神经网络

神经网络

  • 类似于人的神经系统,神经网络的节点就相当于神经元
  • 不同的神经网络连接方式会产生不同的网络结构
  • 神经网络中的参数(Network parameter θ \theta θ)都有自己的 权重偏差

这些神经元的连接方式需要我们自己手动设计。

1. 全连接前馈神经网络(Fully Connect Feedforward Network)

前馈(feedforward)也可以称为前向,从信号流向来理解就是输入信号进入网络后,信号流动是 单向的,即信号从输入层流动到输出层,其中任意两层之间的连接并没有反馈(feedback),亦即信号没有反向传递。

全连接前馈神经网络

  • 全连接:相邻两层的每个神经元之间都有连接
    • 对每一层的神经元来说,输入为前一层的每一个单元
  • 前馈:传递方向为 Layer 1→2→3,即传递的方向是由后往前传(向输出层传递)
  • 输入层(Input Layer)不是神经元所构成的
  • 最后一层神经元的输出就是最终输出,称为 输出层(Output Layer)
  • 中间的层称为 隐藏层(Hidden Layer)
  • 例子中的 激活函数 S i g m o i d Sigmoid Sigmoid

Q:为什么要使用激活函数?2

  • 如果不用激活函数,每一层输出都是上层输入的线性函数,无论神经网络有多少层,输出都是输入的线性组合,这种情况就是最原始的 感知机
  • 如果使用的话,激活函数给神经元引入了 非线性因素,使得神经网络可以任意逼近任何非线性函数,这样神经网络就可以应用到众多的非线性模型中。
2. 对“深度”的理解(为什么需要深度学习?)

对于深度学习,Deep = Many Hidden Layers

对“深度”的理解

神经网络层数错误率
2012 AlexNet816.4%
2014 VGG197.3%
2014 GoogleNet226.7%
2015 Residual Net1523.57%

随着层数变多,错误率降低,随之运算量增大,通常都是超过亿万级的计算。对于这样复杂的结构,肯定不能使用loop循环。

这里我们就引入 矩阵计算(Matrix Operation) 能使得我们的运算的速度以及效率高很多

3. 矩阵计算

神经元权重的计算可利用矩阵乘法性质进行简化:

  • 计算方法: s i g m o i d ( sigmoid( sigmoid( 权 重 w 权重 w w × 输 入 输入 + + + 偏 移 量 b 偏移量 b b ) = 输 出 )= 输出 )=

在这里插入图片描述

从结构上看每一层的计算都是一样的,即用计算机进行并行矩阵运算,这样可以使用GPU加速。这样做的本质是 通过隐藏层进行特征转换

  • 隐藏层使用 特征提取 来替代原来的特征工程,这样在最后一个隐藏层输出的就是一组新的特征(相当于黑箱操作)
  • 输出层把前面隐藏层的输出做为输入—— 经过特征提取得到的一组最好的特征,然后通过一个多分类器(可以是softmax函数)得到最后的输出y通过隐藏层进行特征转换

举个手写识别的例子:

  • 输入:一张16*16=256像素的图片,对机器来说,它就是一个256维的列向量 x ⃗ \vec x x (有颜色的地方就是1,空白的为0)。
  • 输出:10维向量 y ⃗ \vec y y y i y_i yi 每个维度代表某一个数字的几率。
    手写识别

方案:

  • 需要一个函数(即,神经网络),将输入和输出层连接起来:输入是256维的向量,输出是10维的向量
  • 神经网络的结构决定了函数集(function set)
    方案
4. Q&A
  • Q:神经网络需要多少层?每个层需要多少神经元?
    A:尝试 + 直觉
  • Q:结构可以自动确定吗?
    A:能。例如进化人工神经网络(Evolutionary Artificial Neural Networks),但这些方法并不普及。
  • Q:我们能自行设计网络结构吗?
    A:可以,比如 CNN卷积神经网络。

Step 2:模型评估

一般用损失函数来评估模型的好坏,对于神经网络,使用 交叉熵(cross entropy)函数来计算 y y y y ^ \hat y y^。之后就是调参,使得最小化交叉熵。
在这里插入图片描述
我们需要得到所有训练数据的损失之和——总体损失 L L L,之后就是进行函数的择优,使得总体损失最小。

Step 3:函数择优

  • 梯度下降法3
  • 反向传播:神经网络中计算损失最好的方法

1.3 小结

  • 深度越深越好?当然!深度
  • 普遍性定理: 对于任何一个连续的函数,都可以用足够多的隐藏层来表示。那为什么我们还需要“深度”学习呢,直接用一层网络表示不就可以了?

二、反向传播机制(Backpropagation, BP)

2.1 背景

梯度下降

  • 假设网络中的参数为 θ = { w 1 , w 2 , . . . , b 1 , b 2 , . . . } \theta=\{w_1,w_2,...,b_1,b_2,...\} θ={w1,w2,...,b1,b2,...},初始化为 θ 0 \theta^0 θ0
  • 参数更新: θ 0 → θ 1 → θ 2 → . . . \theta^0 → \theta^1 →\theta^2→... θ0θ1θ2...
  • 对于百万级别的参数数量,肯定不能使用常规梯度下降
  • BP 也是一种梯度下降算法,它提高了常规梯度下降的效率来计算参数

链式法则(链式求导)

链式求导

2.2 反向传播

反向传播

  • 前向传播:计算 ∂ z ∂ w \frac{\partial z}{\partial w} wz
  • 后向传播:计算 ∂ l ∂ z \frac{\partial l}{\partial z} zl

1. 向前传播(Forward Pass)

前向传播

2. 向后传播(Backward Pass)

先按照向前传播的方法,计算 ∂ C ∂ z \frac{\partial C}{\partial z} zC
在这里插入图片描述
现在把forward过程逆向来看,假设有一个神经元,其中 σ ′ ( z ) \sigma'(z) σ(z)为常数,因为参数 z z z 在计算向前传播的时候就已经确定了:
逆向
现在假设 ∂ C ∂ z ′ \frac{\partial C}{\partial z'} zC ∂ C ∂ z ′ ′ \frac{\partial C}{\partial z''} zC的位置有两种不同的情况:

情形一:输出层

假设 ∂ C ∂ z ′ \frac{\partial C}{\partial z'} zC ∂ C ∂ z ′ ′ \frac{\partial C}{\partial z''} zC是最后一层的隐藏层,即y1与y2是输出值,那么 直接计算 就能得出结果

在这里插入图片描述

情形二:非输出层

∂ C ∂ z ′ \frac{\partial C}{\partial z'} zC ∂ C ∂ z ′ ′ \frac{\partial C}{\partial z''} zC不是输出层,则需要借助 链式求导法则 一直计算下去。
非输出层

  • 继续计算后面绿色的 ∂ C ∂ z a \frac{\partial C}{\partial z_a} zaC ∂ C ∂ z b \frac{\partial C}{\partial z_b} zbC
  • 接着乘以 w 5 w_5 w5 w 6 w_6 w6得到 ∂ C ∂ z ′ \frac{\partial C}{\partial z'} zC

另外:

  • ∂ C ∂ z a \frac{\partial C}{\partial z_a} zaC ∂ C ∂ z b \frac{\partial C}{\partial z_b} zbC都未知,那么继续往后面层计算,直到遇到输出值
  • 得到输出值之后再反向往输入的方向走

backforward pass

  • 对上图,先利用输出值y1、y2计算出 ∂ C ∂ z 5 \frac{\partial C}{\partial z_5} z5C ∂ C ∂ z 6 \frac{\partial C}{\partial z_6} z6C
  • 继续反推出 ∂ C ∂ z 3 \frac{\partial C}{\partial z_3} z3C ∂ C ∂ z 4 \frac{\partial C}{\partial z_4} z4C,进而反推出 ∂ C ∂ z 1 \frac{\partial C}{\partial z_1} z1C ∂ C ∂ z 2 \frac{\partial C}{\partial z_2} z2C
  • 至此计算出所有神经元值

实际上两种传播的计算量差不多

2.3 小结

  • 计算 ∂ z ∂ w \frac{\partial z}{\partial w} wz(前向传播)和 ∂ l ∂ z \frac{\partial l}{\partial z} zl(后向传播)
  • ∂ z ∂ w × ∂ l ∂ z = ∂ l ∂ w \frac{\partial z}{\partial w} ×\frac{\partial l}{\partial z}=\frac{\partial l}{\partial w} wz×zl=wl
  • 得到神经网络中所有的参数
  • 利用梯度下降更新参数,得到损失最小的函数
    总结

  1. 受限玻尔兹曼机(Restricted Boltzmann Machine, RBM) 简介 ↩︎

  2. 激活函数 - 百度百科 ↩︎

  3. 李宏毅《机器学习》Task03 - 误差和梯度下降 ↩︎

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Beta Lemon

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值