机器学习|李宏毅机器学习13、14-深度学习和反向传播
李宏毅机器学习13、14-深度学习和反向传播 深度学习的步骤
- Step1:神经网络(Neural network)
- Step2:模型评估(Goodness of function)
- Step3:选择最优函数(Pick best function)
全连接前馈神经网络 神经网络可以有很多不同的连接方式,会产生不同的结构(structure)。全连接前馈神经网络是其中的一种。
全链接和前馈的理解 前馈(feedforward)也可以称为前向,从信号流向来理解就是输入信号进入网络后,信号流动是单向的,即信号从前一层流向后一层,一直到输出层,其中任意两层之间的连接并没有反馈(feedback),亦即信号没有从后一层又返回到前一层。
- 全链接Fully Connect:layer1与layer2之间两两都有连接;
- 前馈Feedforward:传递的方向是由前往后传。
- 输入层(Input Layer):1层
- 隐藏层(Hidden Layer):N层
- 输出层(Output Layer):1层
文章图片
矩阵运算加速
文章图片
本质:隐藏层-特征提取器 把隐藏层通过特征提取来替代原来的特征工程,最后一个隐藏层输出的就是一组新的特征(相当于黑箱操作)。而对于输出层,其实是把前面的隐藏层的输出当做输入(经过特征提取得到的一组最好的特征)然后通过一个多分类器(可以是softmax函数)得到最后的输出 y y y。
文章图片
问题
- 多少层? 每层有多少神经元?
用尝试加上直觉的方法来进行调试。对于有些机器学习相关的问题,我们一般用特征工程来提取特征,但是对于深度学习,我们只需要设计神经网络模型的结构。
- 结构可以自动确定吗?
有方法可以让机器自动找到神经网络的结构的,比如进化人工神经网络(Evolutionary Artificial Neural Networks) 。
- 可以设计网络结构吗?
可以的,比如 CNN卷积神经网络(Convolutional Neural Network )。
Step2:模型评估(Goodness of function) 一般采用损失函数来反应模型的好差,比如对于用于分类的神经网络来说,我们采用交叉熵(cross entropy)函数来对 y y y和 y ^ \hat{y} y^?的损失进行计算,调整参数,让交叉熵越小越好。
文章图片
总体损失 不单单要计算一笔数据的,而是要计算整体所有训练数据的损失加起来,得到一个总体损失 L L L。然后在function set里面找到一组函数能最小化这个总体损失 L L L,或者说找一组神经网络的参数 θ \theta θ,来最小化总体损失 L L L。
文章图片
Step3:选择最优函数(Pick best function) 用梯度下降的方式找到最优的函数和最好的一组参数。
具体流程:
- θ \theta θ是一组包含权重和偏差的参数集合,随机找一个初始值;
- 计算一下每个参数对应偏微分,得到的一个偏微分的集合 ? L \nabla{L} ?L(梯度);
- 利用这些偏微分,不断更新梯度得到新的参数,这样不断反复进行;
- 最终能得到一组最好的参数使得损失函数的值最小。
文章图片
反向传播Backpropagation 反向传播Backpropagation是一个有效率的梯度下降算法。
链式法则
- 连锁影响(可以看出x会影响y,y会影响z)
- BP主要用到了chain rule
文章图片
取出一个Neuron进行分析
文章图片
可以把计算梯度分成两个部分:
- 计算 ? z ? w \frac{\partial z}{\partial w} ?w?z?(Forward pass的部分)
- 计算 ? l ? z \frac{\partial l}{\partial z} ?z?l?( Backward pass的部分 )
文章图片
forward pass-计算 ? z ? w \frac{\partial z}{\partial w} ?w?z? 根据求微分原理,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 ?w1??z?=x1??w2??z?=x2?
所以计算得到的 x 1 x_1 x1?和 x 2 x_2 x2?恰好就是输入的 x 1 x_1 x1?和 x 2 x_2 x2? 。
文章图片
也就是说,对于每一层的 ? z ? w \frac{\partial z}{\partial w} ?w?z?都是其输入:
文章图片
backward pass-计算 ? l ? z \frac{\partial l}{\partial z} ?z?l? 计算所有激活函数的偏微分,激活函数有很多,这里使用Sigmoid函数为例:
文章图片
使用链式法则(Chain Rule)的case1,可以把 ? l ? z \frac{\partial l}{\partial z} ?z?l?拆分为:
? l ? z = ? a ? z ? l ? a \frac{\partial l}{\partial z} = \frac{\partial a}{\partial z}\frac{\partial l}{\partial a} ?z?l?=?z?a??a?l?
进一步根据链式法则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''} ?z?l?=?z?a??a?l??σ′(z)?a?l?=?a?z′??z′?l?+?a?z′′??z′′?l?
根据forward pass的结论得到:
文章图片
则 ? l ? z \frac{\partial l}{\partial z} ?z?l?式子为:
文章图片
观察这个式子,我们可以反向看待一下:
文章图片
如何求 ? l ? z ′ \frac{\partial l}{\partial z'} ?z′?l?和 ? l ? z ′ ′ \frac{\partial l}{\partial z''} ?z′′?l?呢?
- 【机器学习|李宏毅机器学习13、14-深度学习和反向传播】case1 该层后直接接到output layer
假设 ? l ? z ′ \frac{\partial l}{\partial z'} ?z′?l?和 ? l ? z ′ ′ \frac{\partial l}{\partial z''} ?z′′?l?是最后一层的隐藏层,那么y1与y2是输出值,可以根据损失函数直接计算得出结果 :
文章图片
- case2 该层后还有隐藏层,而不是output layer
但是如果不是最后一层,计算 ? l ? z ′ \frac{\partial l}{\partial z'} ?z′?l?和 ? l ? z ′ ′ \frac{\partial l}{\partial z''} ?z′′?l?需要继续往后一直通过链式法则算下去。继续乘 w 5 w_5 w5?和 w 6 w_6 w6?得到 ? l ? z ′ \frac{\partial l}{\partial z'} ?z′?l?,如果 ? l ? z a \frac{\partial l}{\partial z_a} ?za??l?和 ? l ? z b \frac{\partial l}{\partial z_b} ?zb??l?仍然不知道,那么就继续往后面层计算,一直到碰到输出值(case1),得到输出值之后再反向往输入方向传。
文章图片
文章图片
对上图,可以从最后一个 ? l ? z 5 \frac{\partial l}{\partial z_5} ?z5??l?和 ? l ? z 6 \frac{\partial l}{\partial z_6} ?z6??l?看,因为 ? l ? z 5 \frac{\partial l}{\partial z_5} ?z5??l?和 ? l ? z 6 \frac{\partial l}{\partial z_6} ?z6??l?可以通过output求出来,然后继续往前(反向的前)求 ? l ? z 3 \frac{\partial l}{\partial z_3} ?z3??l?和 ? l ? z 4 \frac{\partial l}{\partial z_4} ?z4??l?,再继续求 ? l ? z 1 \frac{\partial l}{\partial z_1} ?z1??l?和 ? l ? z 2 \frac{\partial l}{\partial z_2} ?z2??l?,最后我们就得到下图的结果 :
文章图片
如此,实际上进行backward pass时候和向前传播的计算量差不多。
李宏毅机器学习视频2019春季
推荐阅读
- 由浅入深理解AOP
- 继续努力,自主学习家庭Day135(20181015)
- python学习之|python学习之 实现QQ自动发送消息
- 一起来学习C语言的字符串转换函数
- 定制一套英文学习方案
- 漫画初学者如何学习漫画背景的透视画法(这篇教程请收藏好了!)
- 《深度倾听》第5天──「RIA学习力」便签输出第16期
- 如何更好的去学习
- 【韩语学习】(韩语随堂笔记整理)
- 焦点学习田源分享第267天《来访》