李宏毅机器学习13、14-深度学习和反向传播

李宏毅机器学习13、14-深度学习和反向传播

深度学习的步骤

  • Step1:神经网络(Neural network)
  • Step2:模型评估(Goodness of function)
  • Step3:选择最优函数(Pick best function)

Step1:神经网络(Neural network)

神经元之间的连接方式

全连接前馈神经网络

神经网络可以有很多不同的连接方式,会产生不同的结构(structure)。全连接前馈神经网络是其中的一种。

全链接和前馈的理解

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

  • 全链接Fully Connect:layer1与layer2之间两两都有连接;
  • 前馈Feedforward:传递的方向是由前往后传。
全连接前馈神经网络结构
  • 输入层(Input Layer):1层
  • 隐藏层(Hidden Layer):N层
  • 输出层(Output Layer):1层 img
深度Deep

Deep = Many hidden layer。(留下一个疑问为什么deep好(相对少的神经元多层)而不是fat(单层超多神经元)好?)

矩阵运算加速

img

本质:隐藏层-特征提取器

把隐藏层通过特征提取来替代原来的特征工程,最后一个隐藏层输出的就是一组新的特征(相当于黑箱操作)。而对于输出层,其实是把前面的隐藏层的输出当做输入(经过特征提取得到的一组最好的特征)然后通过一个多分类器(可以是softmax函数)得到最后的输出 y y yimg

问题

  1. 多少层? 每层有多少神经元?

    用尝试加上直觉的方法来进行调试。对于有些机器学习相关的问题,我们一般用特征工程来提取特征,但是对于深度学习,我们只需要设计神经网络模型的结构。

  2. 结构可以自动确定吗?

    有方法可以让机器自动找到神经网络的结构的,比如进化人工神经网络(Evolutionary Artificial Neural Networks) 。

  3. 可以设计网络结构吗?

    可以的,比如 CNN卷积神经网络(Convolutional Neural Network )。

在这里插入图片描述

Step2:模型评估(Goodness of function)

一般采用损失函数来反应模型的好差,比如对于用于分类的神经网络来说,我们采用交叉熵(cross entropy)函数来对 y y y y ^ \hat{y} y^的损失进行计算,调整参数,让交叉熵越小越好。

img

总体损失

不单单要计算一笔数据的,而是要计算整体所有训练数据的损失加起来,得到一个总体损失 L L L。然后在function set里面找到一组函数能最小化这个总体损失 L L L,或者说找一组神经网络的参数 θ \theta θ,来最小化总体损失 L L Limg

Step3:选择最优函数(Pick best function)

用梯度下降的方式找到最优的函数和最好的一组参数

具体流程:

  1. θ \theta θ是一组包含权重和偏差的参数集合,随机找一个初始值;
  2. 计算一下每个参数对应偏微分,得到的一个偏微分的集合 ∇ L \nabla{L} L(梯度);
  3. 利用这些偏微分,不断更新梯度得到新的参数,这样不断反复进行;
  4. 最终能得到一组最好的参数使得损失函数的值最小。

img

反向传播Backpropagation

反向传播Backpropagation是一个有效率的梯度下降算法。

链式法则

  • 连锁影响(可以看出x会影响y,y会影响z)
  • BP主要用到了chain rule

img

取出一个Neuron进行分析

在这里插入图片描述

可以把计算梯度分成两个部分:

  • 计算 ∂ z ∂ w \frac{\partial z}{\partial w} wz(Forward pass的部分)
  • 计算 ∂ l ∂ z \frac{\partial l}{\partial z} zl( Backward pass的部分 )

如下图所示,我们的目标是要计算 ∂ z ∂ w \frac{\partial z}{\partial w} wz(Forward pass的部分)和计算 ∂ l ∂ z \frac{\partial l}{\partial z} zl ( Backward pass的部分 ),然后把 ∂ z ∂ w \frac{\partial z}{\partial w} wz ∂ l ∂ z \frac{\partial l}{\partial z} zl相乘,得到 ∂ l ∂ w \frac{\partial l}{\partial w} wl。然后就可以得到神经网络中所有的参数,用梯度下降不断更新,得到损失最小的函数 。

img

forward pass-计算 ∂ z ∂ w \frac{\partial z}{\partial w} wz

根据求微分原理,forward pass的运算规律就是:
∂ z ∂ w 1 = x 1 ∂ z ∂ w 2 = x 2 \frac{\partial z}{\partial w_1} = x_1 \\ \frac{\partial z}{\partial w_2} = x_2 w1z=x1w2z=x2
所以计算得到的 x 1 x_1 x1 x 2 x_2 x2恰好就是输入的 x 1 x_1 x1 x 2 x_2 x2

img

也就是说,对于每一层的 ∂ z ∂ w \frac{\partial z}{\partial w} wz都是其输入:

在这里插入图片描述

backward pass-计算 ∂ l ∂ z \frac{\partial l}{\partial z} zl

计算所有激活函数的偏微分,激活函数有很多,这里使用Sigmoid函数为例:

img

使用链式法则(Chain Rule)的case1,可以把 ∂ l ∂ z \frac{\partial l}{\partial z} zl拆分为:
∂ l ∂ z = ∂ a ∂ z ∂ l ∂ a \frac{\partial l}{\partial z} = \frac{\partial a}{\partial z}\frac{\partial l}{\partial a} zl=zaal
进一步根据链式法则case2计算过程如下:
∂ l ∂ z = ∂ a ∂ z ∂ l ∂ a ⇒ σ ′ ( z ) ∂ l ∂ a = ∂ z ′ ∂ a ∂ l ∂ z ′ + ∂ z ′ ′ ∂ a ∂ l ∂ z ′ ′ \frac{\partial l}{\partial z} = \frac{\partial a}{\partial z}\frac{\partial l}{\partial a} \Rightarrow {\sigma}'(z) \frac{\partial l}{\partial a} = \frac{\partial z'}{\partial a}\frac{\partial l}{\partial z'} +\frac{\partial z''}{\partial a}\frac{\partial l}{\partial z''} zl=zaalσ(z)al=azzl+azzl
根据forward pass的结论得到:

∂ l ∂ z \frac{\partial l}{\partial z} zl式子为:

img

观察这个式子,我们可以反向看待一下:

img

如何求 ∂ l ∂ z ′ \frac{\partial l}{\partial z'} zl ∂ l ∂ z ′ ′ \frac{\partial l}{\partial z''} zl呢?
  1. case1 该层后直接接到output layer

    假设 ∂ l ∂ z ′ \frac{\partial l}{\partial z'} zl ∂ l ∂ z ′ ′ \frac{\partial l}{\partial z''} zl是最后一层的隐藏层,那么y1与y2是输出值,可以根据损失函数直接计算得出结果 :在这里插入图片描述

  2. case2 该层后还有隐藏层,而不是output layer

    但是如果不是最后一层,计算 ∂ l ∂ z ′ \frac{\partial l}{\partial z'} zl ∂ l ∂ z ′ ′ \frac{\partial l}{\partial z''} zl需要继续往后一直通过链式法则算下去。继续乘 w 5 w_5 w5 w 6 w_6 w6得到 ∂ l ∂ z ′ \frac{\partial l}{\partial z'} zl,如果 ∂ l ∂ z a \frac{\partial l}{\partial z_a} zal ∂ l ∂ z b \frac{\partial l}{\partial z_b} zbl仍然不知道,那么就继续往后面层计算,一直到碰到输出值(case1),得到输出值之后再反向往输入方向传。

    img

    img 对上图,可以从最后一个 ∂ l ∂ z 5 \frac{\partial l}{\partial z_5} z5l ∂ l ∂ z 6 \frac{\partial l}{\partial z_6} z6l看,因为 ∂ l ∂ z 5 \frac{\partial l}{\partial z_5} z5l ∂ l ∂ z 6 \frac{\partial l}{\partial z_6} z6l可以通过output求出来,然后继续往前(反向的前)求 ∂ l ∂ z 3 \frac{\partial l}{\partial z_3} z3l ∂ l ∂ z 4 \frac{\partial l}{\partial z_4} z4l,再继续求 ∂ l ∂ z 1 \frac{\partial l}{\partial z_1} z1l ∂ l ∂ z 2 \frac{\partial l}{\partial z_2} z2l,最后我们就得到下图的结果 :img

    如此,实际上进行backward pass时候和向前传播的计算量差不多。

参考资料

李宏毅机器学习笔记

李宏毅机器学习视频2019春季

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值