当前位置: 首页 > java >正文

反向传播算法——矩阵形式递推公式——ReLU传递函数

总结反向传播算法。

来源于https://udlbook.github.io/udlbook/,我不明白初始不从 x 0 \boldsymbol{x}_0 x0开始,而是从 z 0 \boldsymbol{z}_0 z0开始,不知道怎么想的。


考虑一个深度神经网络 g [ x i , ϕ ] g[\boldsymbol{x}_i, \boldsymbol{\phi}] g[xi,ϕ],它接受输入 x i \boldsymbol{x}_i xi,具有 N N N个隐藏层和 ReLU 激活函数,并且有单独的损失项 L i = l o s s [ g [ x i , ϕ ] , y i ] L_i = {\rm loss}[g[\boldsymbol{x}_i, \boldsymbol{\phi}], \boldsymbol{y}_i] Li=loss[g[xi,ϕ],yi]。反向传播的目标是计算关于偏差 b ι \boldsymbol{b}_\iota bι和权重 W ι \boldsymbol{W}_\iota Wι的导数 ∂ L i ∂ b ι \frac{\partial L_i}{\partial \boldsymbol{b}_\iota} bιLi ∂ L i ∂ W ι \frac{\partial L_i}{\partial \boldsymbol{W}_\iota} WιLi

前向传递: 计算并存储以下量:

z 0 = b 0 + W 0 x i x ι = f [ z ι − 1 ] ι ∈ { 1 , 2 , … , M } z ι = b ι + W ι x ι . ι ∈ { 1 , 2 , … , M } \begin{aligned} \boldsymbol{z}_0 &= \boldsymbol{b}_0 + \boldsymbol{W}_0 \boldsymbol{x}_i \\ \boldsymbol{x}_\iota &=f[\boldsymbol{z}_{\iota-1}] & \iota \in \{1, 2, \ldots, M\} \\ \boldsymbol{z}_\iota &= \boldsymbol{b}_\iota + \boldsymbol{W}_\iota \boldsymbol{x}_\iota. & \iota \in \{1, 2, \ldots, M\} \end{aligned} z0xιzι=b0+W0xi=f[zι1]=bι+Wιxι.ι{1,2,,M}ι{1,2,,M}

反向传递: 从损失函数 L i L_i Li关于网络输出 z M \boldsymbol{z}_M zM的导数 ∂ L i ∂ z M \frac{\partial L_i}{\partial \boldsymbol{z}_M} zMLi开始,并在网络中反向工作:

∂ L i ∂ b ι = ∂ L i ∂ z ι ι ∈ { M , M − 1 , … , 1 } ∂ L i ∂ W ι = ∂ L i ∂ z ι x ι T ι ∈ { M , M − 1 , … , 1 } ∂ L i ∂ z ι − 1 = I [ z ι − 1 > 0 ] ⊙ ( W ι T ∂ L i ∂ z ι ) , ι ∈ { M , M − 1 , … , 1 } \begin{aligned} \frac{\partial L_i}{\partial \boldsymbol{b}_\iota} &= \frac{\partial L_i}{\partial \boldsymbol{z}_\iota} & \iota \in \{M, M-1, \ldots, 1\} \\ \frac{\partial L_i}{\partial \boldsymbol{W}_\iota} &= \frac{\partial L_i}{\partial \boldsymbol{z}_\iota} \boldsymbol{x}_\iota^{\mathsf T} & \iota \in \{M, M-1, \ldots, 1\} \\ \frac{\partial L_i}{\partial \boldsymbol{z}_{\iota-1}} &= \mathbb{I}[\boldsymbol{z}_{\iota-1} > 0] \odot \left( \boldsymbol{W}_\iota^{\mathsf T} \frac{\partial L_i}{\partial \boldsymbol{z}_\iota} \right), & \iota \in \{M, M-1, \ldots, 1\} \end{aligned} bιLiWιLizι1Li=zιLi=zιLixιT=I[zι1>0](WιTzιLi),ι{M,M1,,1}ι{M,M1,,1}ι{M,M1,,1}

其中 ⊙ \odot 表示逐点乘法,而 I [ z ι − 1 > 0 ] \mathbb{I}[\boldsymbol{z}_{\iota-1} > 0] I[zι1>0]是一个向量,其中在 z ι − 1 \boldsymbol{z}_{\iota-1} zι1大于零的位置包含一,在其他位置包含零。

最后,计算关于第一组偏差和权重的导数:

∂ L i ∂ b 0 = ∂ L i ∂ z 0 ∂ L i ∂ W 0 = ∂ L i ∂ z 0 x i T . \begin{aligned} \frac{\partial L_i}{\partial \boldsymbol{b}_0} &= \frac{\partial L_i}{\partial \boldsymbol{z}_0} \\ \frac{\partial L_i}{\partial \boldsymbol{W}_0} &= \frac{\partial L_i}{\partial \boldsymbol{z}_0} \boldsymbol{x}_i^{\mathsf T}. \end{aligned} b0LiW0Li=z0Li=z0LixiT.

为批次中的每个训练样本计算这些导数,并将它们相加以获取用于 SGD 更新的梯度。

请注意,反向传播算法非常高效;前向和反向传递中最耗计算的步骤是矩阵乘法(分别由 W \boldsymbol{W} W W T \boldsymbol{W}^{\mathsf T} WT进行),这只需要加法和乘法。然而,它不是内存高效的;前向传递中的中间值必须全部存储,这可能会限制可以训练的模型的大小。

http://www.xdnf.cn/news/6050.html

相关文章:

  • 如何保证RabbitMQ消息的顺序性?
  • 简单易懂的JavaScript中的this指针
  • 现代计算机图形学Games101入门笔记(三)
  • Node.js中MongoDB连接的进阶模块化封装
  • hadoop中spark基本介绍
  • 从零构建知识图谱:使用大语言模型处理复杂数据的11步实践指南
  • 【C语言指针超详解(六)】--sizeof和strlen的对比,数组和指针笔试题解析,指针运算笔试题解析
  • LIO-SAM框架理解
  • ECharts:数据可视化的强大引擎
  • MySQL增删查改进阶
  • 小程序 存存上下滑动的页面
  • SQL看最多的数据,但想从小到大排列看趋势
  • 使用大模型预测急性结石性疾病技术方案
  • 进阶数据结构: AVL树
  • Linux复习笔记(五) 网络服务配置(dhcp)
  • CPS联盟+小程序聚合平台分销返利系统开发|小红书番茄网盘CPA拉新推广全解析
  • Golang实践录:在go中使用curl实现https请求
  • 机器学习基础课程-5-课程实验
  • 【Lua】Redis 自增并设置有效期
  • Halcon案例(二):C#联合Halcon回形针以及方向
  • Lighthouse 自定义审计
  • 适用于 iOS 的 开源Ultralytics YOLO:应用程序和 Swift 软件包,用于在您自己的 iOS 应用程序中运行 YOLO
  • AI智能体 | 使用Coze一键制作“假如书籍会说话”视频,18个作品狂吸17.6万粉,读书博主新标杆!(附保姆级教程)
  • LeetCode 820 单词的压缩编码题解
  • Java多线程实现:Thread、Runnable与Callable详解
  • 双向长短期记忆网络-BiLSTM
  • 鸿蒙OSUniApp打造多功能图表展示组件 #三方框架 #Uniapp
  • 行项目违反范围截止值
  • electron结合vue,直接访问静态文件如何跳转访问路径
  • 【IPMV】图像处理与机器视觉:Lec11 Keypoint Features and Corners