本文已参与「新人创作礼」活动,一起开启掘金创作之路。
反向传播算法
1、思考:什么是反向传播算法呢 ?
这个问题说起来就比较复杂了,待我一点点慢慢道来。
2、反向传播算法其实是在我们深度学习中一种微调的手段。
当我们使用深度学习建立起了一个模型后,我们还需要对模型进行调参,使其达到更优的状态。那么这个过程就是反向传播算法,好了这个只是写在前面的一些介绍,现在就让我们开始吧。
我们先看一个图。
模型图
比较懵? 别急,我给出一个公式: *f = (x+y)z, 面对这个公式再去看这个图是不是了解的比较好一些呢。 这里再介绍一个名词 前向传播算法,也就是上图从左往右看的情况,往前发展。例如 x = 2 , y = 5, z = 3,则可以计算得到 f = 21。
在这里我们做一个处理: 设 h = x +y, 则 f = h*z。
3、好了有了前面的介绍,我们开始进入正轨介绍后向传播算法。
前面我们提到了,反向传播算法是对传播过程中的参数的一些微调,那么在上图我们需要调整的参数就有 x、y、z。既然要进行微调,那么我们就必须要弄明白,各个参数的影响程度,换句话也就是权重,在换句话就是偏导,OK我们继续往下看
这三个值,每轮反向传播微调的值为: ∂f/∂x ∂f/∂f ∂f/∂z 可能你还不很了解,比如每轮? 微调值?先带着疑问吧。暂且理解为求偏导吧
4、计算偏导
拿到上面的这个公式 *f = (x+y)z,h = x +y 计算下面的值
由上面的函数,我们可以得到
∂h/∂y = 1 ∂h/∂x = 1 ∂f/∂z = h ∂f/∂h = z 上面已知 h = 7、z= 3
得到 *∂f/∂y = ∂f/∂h * ∂h/∂y = z 1 = 3
*∂f/∂x = ∂f/∂h * ∂h/∂x = z 1 = 3
Ok,到这里我们求出了每个参数的梯度,也就是影响权重,趁火打铁,我们结合这个看一个复杂的神经网络结构。
5、神经网络
\
神经网络结构图
好有了上面这个基础,我们我们假设 x0 = 1, x1 = 1,b = -1,并在同时,相应的权重w0 = 0.5, w1 = 0.5,使用 sigmoid 作为激活函数,向前传播计算函数就为
\
将上面的参数值代入我们发现 f = 0.5,令 h = w0x0+w1x1+b
则可以得到
∂h/∂x0 = w0 = 0.5
∂h/∂x1 = w1 = 0.5
根据这个值,再向后传播得到 ∂f/∂x0, ∂f/∂x1
∂f/∂x0 = ∂f/∂h *∂h/∂x0 = ( 1-f(h) ) * f(h) 0.5 = (1-0.5)0.50.5 = 0.125
肯定有人会奇怪 ( 1-f(h) ) * f(h) 从哪里来的 其实我们已知
\
∂f/∂h 求实对 f(h)求导,如有还有疑问,请参考sigmod求导过程sigmoid函数求导----简单手写推导过程_只布布倩-CSDN博客_sigmoid函数求导\
那么同理
∂f/∂x1 = ∂f/∂h *∂h/∂x0 = ( 1-f(h) ) * f(h) 0.5 = (1-0.5)0.50.5 = 0.125
\
比如还有更复杂的神经网络:
其实原理都是一样,因为这个神经网络就比较复杂,暂时就不做演示,后面我专门写一篇计算这个神经网络的文章。