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

卷积神经网络基础(五)

6.3 Softmax-with-Loss 层

我们最后介绍输出层的softmax函数,之前我们知道softmax函数会将输入值正规化之后再输出。在手写数字识别的例子中,softmax层的输出如下:

输入图像通过Affi ne层和ReLU层进行转换,10个输入通过Softmax层进行正 规化。在这个例子中,“0”的得分是5.3,这个值经过Softmax层转换为0.008 (0.8%) ;“ 2”的得分是10.1,被转换为0.991(99.1%)

softmax函数会将输入值正规化,即输出值的和为1之后再进行输出。手写数字的分类有10个,所以softmax层输入也有十个,输出也是10个,代表各类别的概率。

神经网络中进行的处理有推理(inference)和学习两个阶段。神经网络的推理通常不使用Softmax层。比如,用上面的网络进行推理时, 会将最后一个Affine层的输出作为识别结果。神经网络中未被正规化的输出结果(上图中Softmax层前面的Affine层的输出)有时被称为“得分”。也就是说,当神经网络的推理只需要给出一个答案的情况下,因为此时只对得分最大值感兴趣,所以不需要Softmax层。 不过,神经网络的学习阶段则需要Softmax层。

我们接下来来实现softmax层,由于这里也包含作为损失函数的交叉熵误差(cross entropy error),所以也被称为soft-max-Loss层,其计算图如下:

由于这个计算图较为复杂,我们只给出结果,不进行推理计算,下面是简化后的计算图:

我们假设这里进行三类的分类,接受前面层的三个输入a1 a2和a3,softmax层对输入值进行正规化后输出y1 y2和y3,传递给交叉熵误差层,结合教师标签t,输出损失L。

特别注意在这个计算图中的反向传播中,输入数据的导数为y-t,y是softmax层输出,t是监督数据,所以y-t是输出和教师标签的差分。神经网络的反向传播会把这个差分表示的误差传递给前面的层,这是神经网络学习中的重要性质。

神经网络进行学习的目的就是通过调整权重参数,使神经网络输出softmax层输出y和教师标签t尽可能接近,即输入a的导数值接近0。因此我们需要将y-t这样的误差高效地传递给前面的层。

这里考虑一个实例,教师标签是(0,1,0),softmax层输出为(0.3,0.2,0.5)的情况,softmax层的反向传播的误差是(0.3,-0.8,0.5)这样的,因为这个大的误差会向前面的层传播,所以softmax前面的层会从这个大的误差中学习到“大”的内容。

PS:使用交叉熵误差作为softmax函数的损失函数后,反向传播得到 (y1 − t1,y2 − t2,y3 − t3)这样 “漂亮”的结果。实际上,这样“漂亮” 的结果并不是偶然的,而是为了得到这样的结果,特意设计了交叉 熵误差函数。回归问题中输出层使用“恒等函数”,损失函数使用 “平方和误差”,也是出于同样的理由(3.5节)。也就是说,使用“平 方和误差”作为“恒等函数”的损失函数,反向传播才能得到(y1− t1, y2 − t2, y3 − t3)这样“漂亮”的结果。

再举一个例子,比如思考教师标签是(0,1,0),Softmax层的输出是(0.01, 0.99, 0)的情形(这个神经网络识别得相当准确)。此时Softmax层的反向传播 传递的是(0.01,−0.01,0)这样一个小的误差。这个小的误差也会向前面的层 传播,因为误差很小,所以Softmax层前面的层学到的内容也很“小”。

接下来进行softmax-with-Loss层的实现:

Class SoftmaxwithLoss:def __init__(self):self.loss = None #损失self.y = None #softmax输出self.t = None #监督数据def forward(self,x,t):self.t = tself.y = yself.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

这里直接使用了之前已经实现过的softmax和cross_entropy_error函数。所以实现起来十分简单,在反向传播中,要将传播的值除以批大小后再传递给前面的层才是单个数据的误差。

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

相关文章:

  • 大语言模型(LLM)领域,有几项显著的进展和技术突破
  • JavaSE核心知识点01基础语法01-04(数组)
  • RPM打包格式spec文件设计原理与关键特性说明
  • Python cv2滤波与模糊处理:从原理到实战
  • Matlab/Simulink的一些功能用法笔记(4)
  • AI教你学VUE——Deepseek版
  • 从入门到登峰-嵌入式Tracker定位算法全景之旅 Part 8 |产品化与运维:批量标定、误差监控、OTA 升级与安全防护
  • CSS Border 三角形阴影与多重边框的制作
  • Beetle 树莓派RP2350 - 桌面时钟摆件
  • 内存种类详解
  • tinyrenderer笔记(Shadow Mapping)
  • 方案精读:2024版基于华为IPD与质量管理体系融合的研发质量管理【附全文阅读】
  • AOAAO:算术优化算法与Aquila Optimizer的混合算法
  • langchain4j整合springboot
  • OpenCV的floodFill(漫水填充)分割
  • 静态NAT
  • C++23 新利器:深入解析栈踪迹库 (P0881R7)
  • HTTP协议网络读卡器通讯报文
  • 无法解析导入“pybulletgym”
  • C# System.Text.Json实现高效JSON序列化与反序列化
  • 基于Java多线程实现简单图片下载
  • SLAM算法工程师面经大全:2025年面试真题解析与实战指南
  • 美信监控易:全栈式自主可控的底层架构优势
  • 使用 Poco C++ 库构建轻量级 HTTP 服务器
  • LeetCode 1128. 等价多米诺骨牌对的数量 题解
  • 【了解】通感算一体化网络
  • 深入理解 Web 架构:从基础到实践
  • 【大模型面试每日一题】Day 10:混合精度训练如何加速大模型训练?可能出现什么问题?如何解决?
  • 数据库复习
  • 面试常问系列(一)-神经网络参数初始化-之自注意力机制为什么除以根号d而不是2*根号d或者3*根号d