神经网络前向和后向传播推导(一):前向传播和梯度下降

大家好~本文介绍了前向传播、梯度下降算法,总结了神经网络在训练和推理阶段执行的步骤。

在后面的文章中,我们会从最简单的神经网络开始,不断地增加不同种类的层(如全连接层等),推导每种层的前向传播、后向传播、梯度计算、权重和偏移更新的数学公式

神经网络前向和后向传播推导(一):前向传播和梯度下降
神经网络前向和后向传播推导(二):全连接层

神经元

image
如上图所示,一个神经元具有一个偏移值b和多个权重值w,接受多个输入值x,返回一个输出值y

计算公式为:

y=f(wTx+b)

其中:

w=[w1,w2]

x=[x1x2]

f

我们可以将b表示为wb,合并到w中;并且把y表示为向量。这样就便于向量化编程
计算公式变为:

y=f(wTx)

其中:

w=[w1,w2,wb]

x=[x1x21]

y=[y]

神经网络

一个神经网络由多层组成,而每层由多个神经元组成。
如下图所示是一个三层神经网络,由一层输入层+两层全连接层组成:
image

这个网络中最左边的层称为输入层,包含输入神经元;最右边的层称为输出层,包含输出神经元;中间的层则被称为隐藏层

本文以该神经网络为例进行推导

前向传播

从输入层开始,输入层的输出作为隐藏层的输入传入隐藏层,计算出输出:y
y作为输出层的输入传入输出层,计算出输出:y,作为整个网络的输出。

公式为:

y=f(Wx)

y=f(Wy)

其中:W为权重矩阵

这就是前向传播算法,也就是从输入层开始,依次传入每层,直到输出层,从而得到每层的输出。

前向传播用来做什么呢?它在训练和推理阶段都有使用:
在训练阶段,前向传播得到了输出层的输出和其余各层的输出,其中计算正确率需要前者,计算后向传播需要前者和后者;
在推理阶段,前向传播得到了输出层的输出,作为推理的结果。比如根据包含一个人的体重、身高这样的一个样本数据,得到了这人是男人还是女人的输出。

梯度下降

推理阶段使用前向传播得到输出值,而前向传播需要知道每层的权重和偏移。
为了在推理阶段能够得到接近真实值的输出值,每层的权重和偏移应该是某个合适的值。那么合适的值应该是多少呢?
我们可以在训练阶段给每层一个初始的权重和偏移(比如说都设为0);然后输入大量的样本,不断地更新每层的权重和偏移,使得它们逐渐接近合适的值。
那么,什么值才是合适的值呢?
我们可以构建一个目标函数,用来在训练阶段度量输出层的输出值和真实值的误差大小:

e=E(y,y)

其中y为输出层的输出值,y为真实值,E为目标函数,e为误差

当误差e最小时,输出层的输出值就最接近真实值。因为E是输出层的权重和偏移(w))的函数(因为Ey的函数,而y又是w的函数,所以Ew的函数),所以此时的w就是合适的值

如何求E的最小值点呢?对于计算机来说,可以一步一步的去把函数的极值点试出来,如下图所示:
image

首先,我们随便选择一个点开始,比如上图的x0。接下来,每次迭代修改Xx1,x2,x3......经过数次迭代后最终达到函数最小值点。

你可能要问了,为啥每次修改X,都能往函数最小值那个方向前进呢?这里的奥秘在于,我们每次都是向函数y=f(x)的梯度的相反方向来修改X
什么是梯度呢?梯度是一个向量,它指向函数值上升最快的方向。显然,梯度的反方向当然就是函数值下降最快的方向了。
我们每次沿着梯度相反方向去修改X,当然就能走到函数的最小值附近。
之所以是最小值附近而不是最小值那个点,是因为我们每次移动的步长不会那么恰到好处,有可能最后一次迭代走远了越过了最小值那个点。步长的选择是门手艺,如果选择小了,那么就会迭代很多轮才能走到最小值附近;如果选择大了,那可能就会越过最小值很远,收敛不到一个好的点上。

按照上面的讨论,我们就可以写出梯度下降算法的公式:

xnew=xoldηdf(x)dx

其中df(x)dx是梯度,η是步长,也称作学习率

只要把f替换为EX分别替换为WWx0分别替换为初始的w、初始的w,就可以得到使E达到最小值的梯度下降算法的公式:

Wnew=WoldηdEdwWnew=WoldηdEdw

其中Wnew为输出层的权重矩阵,Wnew为隐藏层的权重矩阵,w为输出层的权重值,w为隐藏层的权重值,

总结

神经网络的使用可以分成两个阶段:
训练和推理

训练阶段

先进行前向传播,得到每层的输出;
然后进行后向传播,根据每层的误差项而计算出上一层的误差项,并且计算每层的梯度(关于后向传播详见神经网络前向和后向传播推导(二):全连接层->推导后向传播);
最后按照梯度下降算法,更新每层的权重和偏移。

可以用下面的公式来表达训练:
每层的权重和偏移=训练(大量的样本)

W=(i)

其中W为包含每层的权重和偏移向量的矩阵

推理阶段

使用训练阶段得到的每层的权重和偏移,进行前向传播,得到输出层的输出作为推理结果。

可以用下面的公式来表达推理:

y=(i,W)

参考资料

零基础入门深度学习 | 第二章:线性单元和梯度下降
零基础入门深度学习 | 第三章:神经网络和反向传播算法

posted @   杨元超  阅读(1506)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示