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

反向传播算法——矩阵形式递推公式——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进行),这只需要加法和乘法。然而,它不是内存高效的;前向传递中的中间值必须全部存储,这可能会限制可以训练的模型的大小。

相关文章:

  • HVV蓝队实战面试题
  • Flink实时统计任务CPU异常排查与解决方案
  • 技术选型不当,如何避免影响项目进展
  • 1. Go 语言环境安装
  • 计算机图形学编程(使用OpenGL和C++)(第2版)学习笔记 10.增强表面细节(一)过程式凹凸贴图
  • 初探 Skynet:轻量级分布式游戏服务器框架实战
  • gitlab提交测试分支的命令和流程
  • 【ESP32-S3】Guru Meditation Error 崩溃分析实战:使用 addr2line 工具 + bat 脚本自动解析 Backtrace
  • Kali Linux 桌面环境安装与配置指南
  • Python操作MySQL 连接加入缓存层完整方案
  • R语言学习--Day02--实战经验反馈
  • 数据库故障排查指南:从理论到实践的深度解析
  • 透明代理IP、匿名代理IP与高匿代理IP的技术辨析与实战指南
  • AWS CloudTrail日志跟踪启用
  • 《隐私计算:数据安全与隐私保护的新希望》
  • 【RabbitMq】无法打开 RabbitMq 管理插件的问题
  • 全球首个投影机息屏显示专利授权:九天画芯重新定义设备交互与节能显示新范式
  • 运维日志管理全解析:从存储优化到合规审计
  • 国产大模型 “五强争霸”,决战 AGI
  • Python环境管理工具深度指南:pip、Poetry、uv、Conda
  • 上海锦江乐园摩天轮正在拆除中,预计5月底6月初拆完
  • 玉渊谭天丨卢拉谈美国降低对华关税:中国的行动捍卫了主权
  • 基金经理调仓引发大金融板块拉升?公募新规落地究竟利好哪些板块
  • 光明日报:家长孩子共同“息屏”,也要保证高质量陪伴
  • 京东CEO许冉:外卖日单量接近2000万单,看到外卖对平台拉动和转化效应
  • 王毅谈中拉论坛第四届部长级会议重要共识