【通俗易懂说模型】反向传播(附多元回归与Softmax函数)

🌈 个人主页:十二月的猫-CSDN博客
🔥 系列专栏: 🏀深度学习_十二月的猫的博客-CSDN博客

💪🏻 十二月的寒冬阻挡不了春天的脚步,十二点的黑夜遮蔽不住黎明的曙光 

目录

1. 前言

2. 多元分类

2.1 softmax函数

2.2 Softmax函数对比Sigmoid函数

3. 反向传播

3.1 反向传播与神经网络

3.2 总体观

3.3 逐级观(数学推理,仅仅想会使用不需要理解)

3.4 反向传播思想总结

4. 梯度反向传播的完整例子

Step1:前向传播

Step2:反向传播

Step3:梯度下降

5. 总结


1. 前言

        进入这篇文章之前,想必大家已经阅读过前面的系列文章:【通俗易懂说模型】线性回归(附深度学习、机器学习发展史)-CSDN博客

【通俗易懂说模型】非线性回归和逻辑回归(附神经网络图详细解释)-CSDN博客

        通过前面的文章, 猫猫希望友友们对机器学习、深度学习等基础概念,以及发展历史有一个宏观的理解。同时对回归(线性、非线性、逻辑回归)有一个深入的认识。然后接下来,就让我们收拾收拾行囊,准备出发!下一站——多元分类、反向传播🥰🥰~

        网络上有很多关于反向传播的文章,但是猫猫看了都不是很满意。之前一遍又一遍看结果就是仍然不能理解。直到最近重新拿起反向传播思考才有更深入的认识,于是打算写这样一篇文章,希望能为大家入门深度学习理解反向传播提供一个全新的思路~~

2. 多元分类

        逻辑回归是二元分类,属于多元分类的一种特殊情况。在生活中,多元分类问题十分常见。无论是看完一部电影,给电影评星,还是将一本书归到某一类的书架上,都属于多元分类的问题。这一节,我们就详细介绍如何用神经网络进行多元分类。

2.1 softmax函数

        多元分类问题与二元分类问题类似,区别在于用softmax函数替代sigmoid函数。多元分类的神经网络要求输出层的神经元数目与所需分类的类别数保持一致。图3-26展示了多元分类的模型结构。假设分类的类别数为k,那么softmax函数需要输人k个值(n1,n2,...,nk),然后输出k个概率(π1,π2,...,πk)。softmax函数实际上是sigmoid函数的推广。softmax函数将所有分类的分数值(n1,n2,...,nk)转化为概率(π1,π2,...,πk),且各概率的和为1。

softmax函数的数学公式如下:

\pi_l=\frac{\mathrm{e}^{n_l}}{\sum_{j=1}^k\mathrm{e}^{\eta_l}}

softmax函数可以巧妙地将多个分类的分数转化为(0,1)的值并且和为1

\sum_{i=1}^{k}\pi_{i}=1

2.2 Softmax函数对比Sigmoid函数

Sigmoid函数:

        线性神经元的输出为\overrightarrow{x}*\overrightarrow{w},随后经过一个非线性的sigmoid函数(公式中常把它简写作sign),此函数的图像如下图所示。sigmoid函数的定义域为(-\infty,+\infty),值域为(0,1),表达式为:

\operatorname{sigm}(x)=\frac{1}{1+\mathrm{e}^{-x}}

Softmax函数:

        Softmax函数是用于多类分类问题的激活函数,在多类分类问题中,超过两个类标签则需要类成员关系。对于长度为K的任意实向量,Softmax函数可以将其压缩为长度为K,值在[0,1]范围内,并且向量中元素的总和为1的实向量。

\pi_l=\frac{\mathrm{e}^{n_l}}{\sum_{j=1}^k\mathrm{e}^{\eta_l}}

区别

  • Softmax所有分类概率总和为1。
  • Sigmoid值是为1这个类的概率a。无论输出结果多大,通过Sigmoid都限制在[0,1]之间。
  • Sigmoid另一个类0的概率就是1-a。

3. 反向传播

        反向传播算法(BackpropagationAlgorithm),又被业界称为BP算法,是深度神经网络取得成功的奠基石。深度神经网络实际上是多隐含层神经网络,在早期就已经被提出,但是当时没有找到很好的训练方法,使得深度神经网络的强大实力得不到发挥。直到反向传播算法的出现,深度神经网络才得以崭露头角。如今,反向传播是深度神经网络最重要的训练方法。

3.1 反向传播与神经网络

  1. 神经网络算法很早就被提出来了,但是对于如何找到合适的参数去拟合数据一直是个问题,人工找显然不现实。
  2. 后面梯度下降算法被提出来,我们也就知道了给出一个模型评价标志——loss。也就可以根据loss将目标改为降低loss从而训练模型参数。这时的问题就在于梯度下降算法需要知道函数的梯度。手工通过法则去计算每一个参数在loss中的梯度是不合适的。
  3. 反向传播的出现让求解参数的梯度变得非常简单。利用链式法则从函数的输出结果loss,逐级向前传播就可以一级一级求出每一个参数的梯度值
  4. 于是神经网络的训练模型才被完全建立起来,神经网络模型才有工作的可能性 

3.2 总体观

        现在,我们先讨论一个最简单的例子:隐含层的层数为1的神经网络的前向传播及反向传播的过程。如下图所示,我们的前向传播过程为:输入\overrightarrow{z}^1,经过隐含层得到\overrightarrow{z}^2,再经过输出层得到\overrightarrow{z}^3,经过损失函数得到损失值{z}^4

        接着进行反向传播,为了方便计算和推导,我们定义\overrightarrow{\delta }变量,暂时不去考虑\overrightarrow{\delta }代表什么。我们可以用一种抽象的方式去审视反向传播的过程,如下图所示。这个过程首先将\delta ^4=\frac{dL}{dL}=1作为输入,然后由\delta ^4反向传播至第3层各节点得到\overrightarrow{\delta ^3}\overrightarrow{\delta ^3}反向传播经过第2层各节点得到\overrightarrow{\delta ^2},利用\overrightarrow{z^3}\overrightarrow{\delta ^3}及第2层到第3层之间的权重矩阵W^{(2,3)}求得梯度值\frac{\partial L}{\partial W^{(2,3)} }。接着,\overrightarrow{\delta ^2}继续反向传播得到\overrightarrow{\delta ^1},我们利用\overrightarrow{z^2}\overrightarrow{\delta ^2}及第1层到第2层之间的权重矩阵W^{(1,2)}可以求得梯度值\frac{\partial L}{\partial W^{(1,2)} }

反向传播的理解:

  • 前向传播中一个数据点会生成三个下一层中的中间值。那么在反向传播中,每一个下一层中的中间值都会反向来调整数据点的参数。
  • 反向传播本质上是求解参数相对于最终输出Loss的影响大小(梯度)的
  • 上面有一个词用的非常模糊——反向传播。你可能会很疑惑,这个反向传播是怎么工作的,为什么就求出梯度大小了。下面的逐级观将给你答案
  • 总体观只要关注到\overrightarrow{\delta }即可,不用考虑\overrightarrow{\delta }具体值是什么,这个值又是如何求解的

3.3 逐级观(数学推理,仅仅想会使用不需要理解)

        上面猫猫展示了反向传播的总体过程,如果你还没有完全理解也没关系,下面我们要探讨每
层的细节。如下图所示,我们将神经网络的第1层作为代表进行观察,第1层的输人是,设第I层到第I+1层之间的权重矩阵为W^{(l,l+1)},于是可以将数据经过该层的变换看作函数f^l的运算。

前向传播的数学表达式如下:

\vec{z}^{l+1}=f^{l}(\vec{z}^{l},W^{(l,l+1)})

为了方便描述反向传播的过程,我们定义{\delta ^l_j},数学表达如下:

\delta_{j}^{l}=\frac{\partial L}{\partial z_{j}^{l}}

根据微积分的链式法则,可以得到:

\delta_{j}^{l}=\frac{\partial L}{\partial z_{j}^{l}}=\sum_{k}\frac{\partial L}{\partial z_{k}^{l+1}}\cdot\frac{\partial z_{k}^{l+1}}{\partial z_{j}^{l}}=\sum_{k}\delta_{k}^{l+1}\frac{\partial z_{k}^{l+1}}{\partial z_{j}^{l}}

        上面公式表明想要求解出l层神经元相对于最终输出L的影响度,则需要求解出\frac{\partial z_k^{l+1}}{\partial z_j^l}的值,同时利用后一层也就是l+1层神经元相对于最终输出L的影响度。而\frac{\partial z_k^{l+1}}{\partial z_j^l}的值就是第l层和第l+1层之间的权重值W,因此核心就在于求出每一层之间的权重。到这里我们就求出了每一个神经元对于输出Loss的梯度。接下去就要思考,这个梯度如何用来更新权重

        知道神经元对于Loss的梯度值后,我们就要根据梯度方向的相反方向去修正神经元的值。修正神经元的值本质就是修正神经元W权重的值。因此为了更新权重,需要计算出损失函数关于神经网络内每个权重的梯度,损失函数关于第l层到第I+1层之间权重矩阵W^{(l,l+1)}的梯度为:

\frac{\partial L}{\partial W^{(l,l+1)}}=\sum_{j}\frac{\partial L}{\partial z_{j}^{l+1}}\frac{\partial z_{j}^{l+1}}{\partial W^{(l,l+1)}}=\sum_{j}\delta_{j}^{l+1}\frac{\partial z_{j}^{l+1}}{\partial W^{(l,l+1)}}

        再来看下图,假设我们要修正W^{(2,3)},此时就需要知道W^{(2,3)}对于L的梯度。这个梯度的求解就要利用到z^3W^{(2,3)}\delta ^3,而这些我们都是已知的,因此这个梯度\frac{\partial L}{\partial W^{(2,3)}}就是已知的,那么就可以根据梯度下降法去梯度更新W^{(2,3)}的值了。​

3.4 反向传播思想总结

        网络上有许多关于反向传播的总结,基本都是带大家走一遍反向传播的流程。这样做自然有它的用处,但是猫猫发现很多时候我们都是走的时候能够看懂,但是让自己写一遍就不能理解了。究其原因就是仅仅知其然,并没有知其所以然。于是我想了这样一个角度去理解反向传播——总体观 和 局部观(逐级观)

        总体观想要告诉我们:

  1. 反向传播从输出值Loss向前面逐级传播
  2. 反向传播研究的是神经元相对于输出Loss的梯度(影响程度),也就是\delta
  3. 总体观要给我们灌输一个思想:神经元对于Loss的梯度本质上就是权重W对于Loss的梯度
  4. 前向传播一个第l层的神经元会参与计算第l+1层所有的神经元。因此反向传播时,所有第l+1层的神经元会反向作用于这个第l层的神经元,影响它的参数变化

        局部观想要告诉我们:

  1. 为什么神经元对于Loss的梯度本质上就是权重W对于Loss的梯度?
  2. 权重W对于Loss的梯度是多少?
  3. 所有第l+1层的神经元会反向作用于这个第l层的神经元,影响它的参数变化
  4. 链式法则的运用使得梯度可以逐层传播

4. 梯度反向传播的完整例子

        现在我们用一个例子来讲解BP,如下图所示,我们选取的例子是最简单的feed forward neural network,它有两层,输入层有两个神经元 x1,x2,隐藏层有两个神经元 h1,h2,最终输出只
有一个神经元y,各个神经元之间全连接。为了直观起见,我们给各个参数赋上具体的数值。我
们令下x1=1,x2=0.5,然后我们令W1,W2,W3,W4的真实值分别是1,2,3,4,令W5,W6的真实值是0.5,0.6。这样我们可以算出 y的真实目标值是t= 4。

        那么为了模拟一个Back Propagation的过程,我们假设我们只知道 x1=1,x2=0.5 ,以及对应的目标 t=4 。我们不知道 w1,w2,w3,w4,w5,w6 的真实值,现在我们需要随机为他们初始化值,假设我们的随机化结果是 w1=0.5,w2=1.5,w3=2.3,w4=3,w5=1,w6=1 。下面我们就开始来一步步进行Back Propagation吧。

Step1:前向传播

        首先,在计算反向传播之前我们需要计算Feed Forward Pass,也即是预测的 h1,h2,y 和误差项 E ,其中E=\frac{1}{2}(t-y)^2 。根据网络结构示意图,各个变量的计算公式为:

Step2:反向传播

        现在Feed Forward Pass算完了,我们来计算Backward Pass。 y 是神经网络预测的值,真实的输出是 t=4 。那么,要更新 w5 的值我们就要算\frac{ \partial E}{\partial w_5} ,根据链式法则有:

\frac{\partial E}{\partial w_5}=\frac{\partial E}{\partial y}\cdot\frac{\partial y}{\partial w_5}

因为 E=\frac{1}{2}(t-y)^2,所以:

\begin{aligned}\frac{\partial E}{\partial y}&=2\cdot\frac{1}{2}\cdot(t-y)\cdot(-1)\\&=y-t\\&=5.05-4=1.05\end{aligned}

y=w_5*h1+w_6*h2,所以 :

\frac{\partial y}{\partial w_5}=h_1+0=h_1=1.25

把上面两项相乘我们得到:

\begin{gathered}\frac{\partial E}{\partial w_5}=\frac{\partial E}{\partial y}\cdot\frac{\partial y}{\partial w_5}=(y-t)\cdot h_1\\=1.05\cdot1.25=1.3125\end{gathered}

Step3:梯度下降

        运用之前梯度下降法的公式更新 w5 ,得到新的 w5’ 。其中我们假设 η=0.1 (并且后面所有的 η 都等于 0.1 ):

\begin{aligned}w_5^{'}&=w_5-\eta\cdot\frac{\partial E}{\partial w_5}\\&&\mathrm{25}\\&=0.86875\end{aligned}

同理,我们可以按照相同的步骤计算 w6' 的更新公式:

\begin{aligned}w_6^{'}&=w_6-\eta\cdot\frac{\partial E}{\partial w_6}\\&=1-0.1\cdot3.99\\&=0.601\end{aligned}

        下面我们再来看 w1,w2,w3,w4 ,由于这四个参数在同一层,所以求梯度的方法是相同的,因此我们这里仅展示对 w1 的推导。根据链式法则:

 \frac{\partial E}{\partial w_1}=\frac{\partial E}{\partial y}\cdot\frac{\partial y}{\partial h_1}\cdot\frac{\partial h_1}{\partial w_1}

        其中\frac{\partial E}{\partial y}=y-t 在求\frac{\partial E}{\partial w_5}的时候已经求过了。而根据y=w_5\cdot h_1+w_6\cdot h_2我们可以得到:

\frac{\partial y}{\partial h_1}=w_5+0=w_5

又根据 h1=w1⋅x1+w2⋅x2 我们可以得到:

\frac{\partial h_1}{\partial w_1}=x_1+0=x_1

因此我们有下面的公式:

\frac{\partial E}{\partial w_1}=(y-t)\cdot w_5\cdot x_1

现在我们代入数字并使用梯度下降法更新 w1

\begin{aligned}w_1^{'}&=w_1-\eta\cdot\frac{\partial E}{\partial w_1}\\&=w_1-\eta\cdot(y-t)\cdot w_5\cdot x_1\\&=0.5-0.1\cdot1.05\cdot1\cdot1\\&=0.395\end{aligned}

然后重复这个步骤更新w2、w3、w4

\begin{aligned}&w_2^{'}=w_2-\eta\cdot\frac{\partial E}{\partial w_2}\\&=w_2-\eta\cdot(y-t)\cdot w_5\cdot x_2\\&=1.5-0.1\cdot1.05\cdot1\cdot0.5\\&=1.4475\\&w_3^{'}=w_3-\eta\cdot\frac{\partial E}{\partial w_3}\\&=w_3-\eta\cdot(y-t)\cdot w_6\cdot x_1\\&=2.3-0.1\cdot1.05\cdot1\cdot1\\&=2.195\\&w_4^{'}=w_4-\eta\cdot\frac{\partial E}{\partial w_4}\\&=w_2-\eta\cdot(y-t)\cdot w_5\cdot x_2\\&=3-0.1\cdot1.05\cdot1\cdot0.5\\&=2.9475\end{aligned}

        现在我们已经更新了所有的梯度,完成了一次梯度下降法。我们用得到的新的 w+ 再来预测一次网络输出值,根据Feed Forward Pass得到 y’=3.1768 ,那么新的误差是 E‘=0.3388 ,相比于之前的 E=0.55125 确实是下降了呢,说明我们的模型预测稍微准了一点。只要重复这个步骤,不断更新网络参数我们就能学习到更准确的模型啦。

5. 总结

如果想要学习更多深度学习知识,大家可以点个关注并订阅,持续学习、天天进步

你的点赞就是我更新的动力,如果觉得对你有帮助,辛苦友友点个赞,收个藏呀~~~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/14896.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

电脑黑屏按什么键恢复?电脑黑屏的解决办法

电脑黑屏的原因有很多,可能是硬件、软件、系统或者病毒等方面造成的。那么,当我们遇到电脑黑屏时,应该怎么做呢?有没有什么快捷的方法可以恢复正常呢?本文将为您介绍一些常见的电脑黑屏情况及其解决办法。 一、电脑开机…

多智能体协作架构模式:驱动传统公司向AI智能公司转型

前言 在数字化浪潮的席卷下,传统公司的运营模式正面临着前所未有的挑战。随着市场竞争的日益激烈,客户需求的快速变化以及业务复杂度的不断攀升,传统公司在缺乏 AI 技术支撑的情况下,暴露出诸多痛点。在决策层面,由于…

CNN 卷积神经网络处理图片任务 | PyTorch 深度学习实战

前一篇文章,学习率调整策略 | PyTorch 深度学习实战 本系列文章 GitHub Repo: https://github.com/hailiang-wang/pytorch-get-started CNN 卷积神经网络 CNN什么是卷积工作原理深度学习的卷积运算提取特征不同特征核的效果比较卷积核感受野共享权重池化 示例源码 …

云上考场微信小程序的设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…

Intellij IDEA如何查看当前文件的类

快捷键:CtrlF12,我个人感觉记快捷键很麻烦,知道具体的位置更简单,如果忘了快捷键(KeyMap)看一下就记起来了,不需要再Google or Baidu or GPT啥的,位置:Navigate > Fi…

支持多种网络数据库格式的自动化转换工具——VisualXML

一、VisualXML软件介绍 对于DBC、ARXML……文件的编辑、修改等繁琐操作,WINDHILL风丘科技开发的总线设计工具——VisualXML,可轻松解决这一问题,提升工作效率。 VisualXML是一个强大且基于Excel表格生成多种网络数据库文件的转换工具&#…

Python Pandas(5):Pandas Excel 文件操作

Pandas 提供了丰富的 Excel 文件操作功能,帮助我们方便地读取和写入 .xls 和 .xlsx 文件,支持多表单、索引、列选择等复杂操作,是数据分析中必备的工具。 操作方法说明读取 Excel 文件pd.read_excel()读取 Excel 文件,返回 DataF…

查看云机器的一些常用配置

云原生学习路线导航页(持续更新中) kubernetes学习系列快捷链接 Kubernetes架构原则和对象设计(一)Kubernetes架构原则和对象设计(二)Kubernetes架构原则和对象设计(三)Kubernetes常…

网站改HTTPS方法

默认的网站建设好后打开的样子那看起来像是钓鱼网站,现在的浏览器特别只能,就是你新买来的电脑默认的浏览器同样也会出现这样“不安全”提示。 传输协议启动了向全球用户安全传输网页内容的流程。然而,随着HTTPS的推出,传输协议通…

ssti学习笔记(服务器端模板注入)

目录 一,ssti是什么 二,原理 所谓模板引擎(三列,可滑动查看) 三,漏洞复现 1,如何判断其所属的模板引擎? 2,判断清楚后开始注入 (1)Jinja2&a…

解决基于FastAPI Swagger UI的文档打不开的问题

基于FastAPI Swagger UI的文档链接/docs和/redoc在没有外网的状态下无法打开,原因是Swagger依赖的JS和CSS来自CDN。 https://cdn.jsdelivr.net/npm/swagger-ui-dist5/swagger-ui-bundle.js https://cdn.jsdelivr.net/npm/swagger-ui-dist5/swagger-ui.css https://…

07苍穹外卖之redis缓存商品、购物车(redis案例缓存实现)

课程内容 缓存菜品 缓存套餐 添加购物车 查看购物车 清空购物车 功能实现:缓存商品、购物车 效果图: 1. 缓存菜品 1.1 问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得,如果用户端访问量比较大,数据库访问压…

UML学习

定义:UML是一种用于软件系统分析和设计的标准化建模语言。 作用:用于描述系统的结构、行为、交互等。共定义了10种,并分为4类 ①用例图 user case diagram : 从外部用户的角度描述系统的功能,并指出功能的执行者. 静态图(②类图 class diagram ③,对象…

ChatGPT提问技巧:行业热门应用提示词案例-文案写作

ChatGPT 作为强大的 AI 语言模型,已经成为文案写作的得力助手。但要让它写出真正符合你需求的文案,关键在于如何与它“沟通”,也就是如何设计提示词(Prompt)。以下是一些实用的提示词案例,帮助你解锁 ChatG…

w~Transformer~合集5

我自己的原文哦~ https://blog.51cto.com/whaosoft/12406495 #transformer~x1 太可怕了都到6了 太强~~ DeepMind 表示,他们提出的算法蒸馏(AD)是首个通过对具有模仿损失的离线数据进行顺序建模以展示上下文强化学习的方法。同时基于观察…

视频采集卡接口

采集卡的正面有MIC IN、LINE IN以及AUDIO OUT三个接口, MIC IN为麦克风输入,我们如果要给采集到的视频实时配音或者是在直播的时候进行讲解,就可以在这里插入一个麦克风, LINE IN为音频线路输入,可以外接播放背景音乐…

【Linux】29.Linux 多线程(3)

文章目录 8.4 生产者消费者模型8.4.1 为何要使用生产者消费者模型8.4.2 生产者消费者模型优点 8.5 基于BlockingQueue的生产者消费者模型8.5.1 C queue模拟阻塞队列的生产消费模型 8.6. 为什么pthread_cond_wait 需要互斥量?8.7 条件变量使用规范8.8 条件变量的封装8.9 POSIX信…

【漫话机器学习系列】084.偏差和方差的权衡(Bias-Variance Tradeoff)

偏差和方差的权衡(Bias-Variance Tradeoff) 1. 引言 在机器学习模型的训练过程中,我们常常面临一个重要的挑战:如何平衡 偏差(Bias) 和 方差(Variance),以提升模型的泛…

OpenCV:视频背景减除

目录 简述 1. MOG 🔷1.1 主要特点 🔷1.2 代码示例 🔷1.3 运行效果 2. MOG2 🔷2.1 主要特点 🔷2.2 代码示例 🔷2.3 运行效果 3. KNN 4. GMG 5. CNT 6. LSBP 7. 如何选择适合的接口&#xff…

【SpringBoot篇】基于Redis分布式锁的 误删问题 和 原子性问题

文章目录 ??Redis的分布式锁??误删问题 ??解决方法??代码实现 ??原子性问题 ??Lua脚本 ?利用Java代码调用Lua脚本改造分布式锁??代码实现 ??Redis的分布式锁 Redis的分布式锁是通过利用Redis的原子操作和特性来实现的。在分布式环境中,多个应用…