【深度学习】4-3 误差反向传播法 - Affine/Softmax层的实现

news/2025/1/24 19:11:35/

Affine层

神经网络的正向传播中进行的矩阵的乘积运算(也就是Y = np.dot(X, W) + B)在几何学领域被称为“仿射变换”。因此,这里将进行仿射变换的处理实现为“Affine层”。

几何中,仿射变换包括一次线性变换和一次平移,分别对应神经网络的加权和运算与加偏置运算。

在这里插入图片描述

下面考虑上面计算图的反向传播,可以得到下面的式子:
在这里插入图片描述

根据上面的式子,尝试画出计算图的反向传播
在这里插入图片描述

这里要特别注意矩阵的形状,因为矩阵的乘积运算要求对应维度的元素数保持一致,通过确认一致性。
因此这个特点可以推导出矩阵的乘积的反向传播

批版本的Affine层
前面介绍的Affine层的输入X是以单个数据为对象的。现在我们考虑N个数据一起进行正向传播的情况,也就是批版本的Affine层
下面是计算图
在这里插入图片描述

加上偏置时,需要特别注意。正向传播时,偏置被加到X·W的各个数据上。
正向传播时,偏置会被加到每一个数据(第1个、第2个…)上。因此反向传播时,各个数据的反向传播的值需要汇总为偏置的元素。用代码显示如下:

>>> dY = np.array([[12,3,],[456]])
>>> dY
array([[123],[456]])
>>>
>>> dB = np.sum(dY,axis=0)
>>> dB
array([579])

这个例子中,假定数据有2个(N=2)。偏置的反向传播会对这2个数据的导数按元素进行求和。因此,这里使用了np.sum()对第0轴方向上的元素进行求和

综上所述,Affine的实现如下所示:

class Affine:def __init__(self,W,b):self.W = Wself.b = bself.x = Noneself.dW = Noneself.db = Nonedef forward(self,x):self.x = xout = np.dot(x, self.W) + self.breturn outdef backward(self, dout):dx = np.dot(dout, sellf.W.T)self.dW = np.dot(self.x.T, dout)self.db = np.sum(dout, axis = 0)

Softmax-with-Loss 层

手写数字识别时,Softmax 层的输出如图:
在这里插入图片描述
输入图像通过 Affine 层和 ReLU 层进行转换,10 个输入通过 Softmax 层进行正规化。在这个例子中,“0”的得分是 5.3,这个值经过 Softmax 层转换为 0.008(0.8%);“2”的得分是 10.1,被转换为 0.991(99.1%)
在上图中,Softmax 层将输入值正规化(将输出值的和调整为 1)之后再输出。另外,因为手写数字识别要进行 10 类分类,所以向Softmax 层的输入也有 10 个。

下面来实现 Softmax 层。考虑到这里也包含作为损失函数的交叉熵误差(cross entropy error),所以称为“Softmax-with-Loss 层”。
在这里插入图片描述
可以看到,Softmax-with-Loss 层有些复杂。这里只给出了最终结果
鉴于上面的计算图过于复杂,将其简化为如下图:
在这里插入图片描述
softmax 函数记为 Softmax 层,交叉熵误差记为 Cross Entropy Error 层。这里假设要进行 3 类分类,从前面的层接收 3 个输入(得分)。如图所示,Softmax 层将输入 正规化,Cross Entropy Error 层接收 Softmax 的输出 和教师标签 ( t1,t2,t3) ,从这些数据中输出损失 L。

注意的是反向传播的结果。Softmax 层的反向传播得到了 (y1-t1, y2-t2, y3-t3)这样“漂亮”的结果。由于(y1, y2, y3) 是 Softmax 层的输出,(t1, t2, t3)是监督数据,所以(y1-t1, y2-t2, y3-t3) 是 Softmax 层的输出和教师标签的差分。神经网络的反向传播会把这个差分表示的误差传递给前面的层,这是神经网络学习中的重要性质。

神经网络学习的目的就是通过调整权重参数,使神经网络的输出(Softmax的输出)接近监督标签。因此,必须将神经网络的输出与监督标签的误差高效地传递给前面的层。刚刚的 (y1-t1, y2-t2, y3-t3)正是 Softmax层的输与监督标签的差,直截了当地表示了当前神经网络的输出与监督标签的误差

如果这个误差大,Softmax层前面的层会从这个大的误差中学习到“大”的内容。
如果这个误差小,Softmax层前面的层会从这个大的误差中学习到“小”的内容。

下面来看Softmax-with-Loss层的实现,实现过程如下:

class SoftmaxWithLoss: def __init__(self):self.loss = Noneself.y = Noneself.t = Nonedef forward(self, x, t):self.t = tself.y = softmax(y)self.loss = cross_entropy_error(self.y, self,t)return self.lossdef backward(self, dout=1):batch_size = self.t.shape[0]dx = (self.y - self.t) / batch_sizereturn dx

http://www.ppmy.cn/news/482237.html

相关文章

android xda-developers.com,华为麦芒5 lineageos15.1 安卓8.1

1、Download the ROM and put it on sdcard. Root isn‘t included in ROM yet. You can grab the lineage addon here (removal addon here). If you want GAPPS too, then download MindTheGapps (mirror or Open Gapps too (choose arm64, 8.1 and pico or other variant if…

麦芒7能升级鸿蒙,华为鸿蒙系统升级名单

华为鸿蒙系统之前已经在发布会上公布了,在发布会上也公布了目前支持鸿蒙系统的手机,那么鸿蒙系统具体支持哪些手机?相信很多网友都不知道吧,下面就跟着小编一起来看看吧! 华为鸿蒙系统升级名单一览 华为消费者业务软件…

【系统开发】尚硅谷 - 谷粒商城项目笔记(五):分布式缓存

文章目录 分布式缓存缓存使用场景redis作缓存中间件引入redis依赖配置redis堆外内存溢出 缓存失效问题缓存穿透缓存雪崩缓存击穿 Redisson分布式锁导入依赖redisson配置类可重入锁读写锁缓存一致性解决 缓存-SpringCache简介Cacheable自定义缓存配置CacheEvictCachePut原理与不…

持久畅快的使用体验 华为麦芒7与年轻人加速前行

2018年9月12日,华为在广州举办了主题为“生而无畏,加速前行”的麦芒新品发布会,华为消费者业务手机产品线总裁何刚向公众发布了最新的华为麦芒7。一路走来,麦芒品牌始终坚持麦芒系列特有的“无畏生长”的品牌精神,延续…

C# 调用C++库函数时,DllImport 参数详解

本文讲述:C# 调用C库函数时,DllImport 参数详解 [AttributeUsage(AttributeTargets.Method)] public class DllImportAttribute: System.Attribute {public DllImportAttribute(string dllName) {…} //定位参数为dllNamepublic CallingConvention Call…

环境多介质逸度模型

查看原文>>>环境多介质逸度模型实践技术与典型案例【代码】应用 内容简述: 专题一:基本理论 1.逸度的定义 2.逸度模型的基本原理 3.各介质物质逸度的计算 4.对流在逸度模型中的反映 5.降解 6.介质间的迁移 专题二:平衡&…

【软件工程题库】第六章 编码和测试

🕺作者: 迷茫的启明星 学习路线C语言从0到1C初阶数据结构从0到1 😘欢迎关注:👍点赞🙌收藏✍️留言 🏇码字不易,你的👍点赞🙌收藏❤️关注对我真的很重要&…

7款文章写作工具推荐

论文写作中,不少工具都能够辅助写作,有提供框架的,有自动改写的,有修改语法的等等…这类都可以帮助我们在论文写作中提高效率和质量,下面推荐7款,不防试试吧。 写作猫: 是一款AI智能写作内容辅助写作工具…