深度学习入门(9)神经网络Affine与Softmax层的计算图表示方式及其误差反向传播的代码实现

简介: 深度学习入门(9)神经网络Affine与Softmax层的计算图表示方式及其误差反向传播的代码实现

1 Affine与Softmax层的实现


1.1 Affine层


神经元的加权和可以用Y = np.dot(X, W) + B计算出来。然后,Y 经过激活函数转换后,传递给下一层。这就是神经网络正向传播的流程。


神经网络的正向传播中进行的矩阵的乘积运算在几何学领域被称为仿射变换。将进行仿射变换的处理实现为“Affine

fe9ab3f162b049d2bd6b4d0ee680e377.png


Y = np.dot(X, W) + B,计算图如下:


f49c396201b446cd890c4a4bb52379ab.png

c517d45f9c8b4582908a8593a63692cf.png


式中WTT表示转置。转置操作会把W的元素(i, j)换成元素(j, i)


f0cbce80a795444a99988731f630f82e.png

5c6cc468e4f84905a2d6d43712a00cfb.png


X和αL/αX形状相同,WαL/αW形状相同。从下面的数学式可以很明确地看出X

αL/αX形状相同。


image.png


1.2 批量版的Affine层


前面介绍的Af ne层的输入X是以单个数据为对象的。现在我们考虑N个数据一起进行正向传播的情况,也就是批版本的Affine层。


image.png

image.png


1.3 Softmax-with-Loss层


softmax函数会将输入值正规化之后再输出。比如手写数字识别时,Softmax层的输出如图所示。


image.png


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


下面来实现Softmax层。考虑到这里也包含作为损失函数的交叉熵误差( cross entropy error),所以称为“ Softmax-with-Loss层”。 Softmax-withLoss层( Softmax函数和交叉熵误差的计算图如下图所示。


注意:交叉熵函数中的log是默认以e为底的。


image.png

计算图简化版:

image.png


softmax函数记为Softmax层,交叉熵误差记为Cross Entropy Error层。这里假设要进行3类分类,从前面的层接收3个输入(得分)。如图5-30所示, Softmax层将输入( a1, a2, a3)正规化,输出( y1,y2, y3)。 Cross Entropy Error层接收Softmax的输出( y1, y2, y3)和教师标签( 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)这样“漂亮”的结果。实际上,这样“漂亮”  的结果并不是偶然的,而是为了得到这样的结果,特意设计了交叉熵误差函数。回归问题中输出层使用“恒等函数”,损失函数使用“平方和误差”,也是出于同样的理由(3.5节)。也就是说,使用“平方和误差”作为“恒等函数”的损失函数,反向传播才能得到( y1 -t1, y2 - t2, y3 - t3)这样“漂亮”的结果。


softmax-with-Loss层的代码实现:


image.png

请注意反向传播时,将要传播的值除以批的大小( batch_size)后,传递给前面的层的是单个数据的误差。



目录
打赏
0
0
0
0
129
分享
相关文章
云栖大会 | Terraform从入门到实践:快速构建你的第一张业务网络
云栖大会 | Terraform从入门到实践:快速构建你的第一张业务网络
鸿蒙应用开发从入门到入行 - 篇7:http网络请求
在本篇文章里,您将掌握鸿蒙开发工具DevEco的基本使用、ArkUI里的基础组件,并通过制作一个简单界面掌握使用
124 8
图卷积网络入门:数学基础与架构设计
本文系统地阐述了图卷积网络的架构原理。通过简化数学表述并聚焦于矩阵运算的核心概念,详细解析了GCN的工作机制。
248 3
图卷积网络入门:数学基础与架构设计
网络编程懒人入门(十六):手把手教你使用网络编程抓包神器Wireshark
Wireshark是一款开源和跨平台的抓包工具。它通过调用操作系统底层的API,直接捕获网卡上的数据包,因此捕获的数据包详细、功能强大。但Wireshark本身稍显复杂,本文将以用抓包实例,手把手带你一步步用好Wireshark,并真正理解抓到的数据包的各项含义。
180 2
深度学习入门:用Python构建你的第一个神经网络
在人工智能的海洋中,深度学习是那艘能够带你远航的船。本文将作为你的航标,引导你搭建第一个神经网络模型,让你领略深度学习的魅力。通过简单直观的语言和实例,我们将一起探索隐藏在数据背后的模式,体验从零开始创造智能系统的快感。准备好了吗?让我们启航吧!
141 3
构建高效的Python网络爬虫:从入门到实践
本文旨在通过深入浅出的方式,引导读者从零开始构建一个高效的Python网络爬虫。我们将探索爬虫的基本原理、核心组件以及如何利用Python的强大库进行数据抓取和处理。文章不仅提供理论指导,还结合实战案例,让读者能够快速掌握爬虫技术,并应用于实际项目中。无论你是编程新手还是有一定基础的开发者,都能在这篇文章中找到有价值的内容。
PyTorch代码实现神经网络
这段代码示例展示了如何在PyTorch中构建一个基础的卷积神经网络(CNN)。该网络包括两个卷积层,分别用于提取图像特征,每个卷积层后跟一个池化层以降低空间维度;之后是三个全连接层,用于分类输出。此结构适用于图像识别任务,并可根据具体应用调整参数与层数。
123 9
如何可视化神经网络的神经元节点之间的连接?附有Python预处理代码
该博客展示了如何通过Python预处理神经网络权重矩阵并将其导出为表格,然后使用Chiplot网站来可视化神经网络的神经元节点之间的连接。
114 0
如何可视化神经网络的神经元节点之间的连接?附有Python预处理代码

热门文章

最新文章