【神经网络】输出层的设计

文章目录

    • 前言
    • 一、恒等函数和softmax函数
      • 恒等函数
      • softmax 函数
      • python实现softmax函数
    • 二、实现softmax函数时的注意事项
      • 函数优化
      • python实现
    • 三、softmax函数的特征
      • 计算神经网络的输出
      • 输出层的softmax函数可以省略
      • “学习”和“推理”阶段
    • 四、输出层的神经元数量

前言

神经网络可以用在分类问题和回归问题上,不过需要根据情况改变输出 层的激活函数。一般而言,回归问题用恒等函数,分类问题用softmax函数。

机器学习的问题大致可以分为分类问题和回归问题

  • 分类问题是数据属于哪一个类别的问题。比如,区分图像中的人是男性还是女性的问题就是分类问题
  • 回归问题是根据某个输入预测一个(连续的)数值的问题。比如,根据一个人的图像预测这个人的体重的问题就是回归问题(类似“57.4kg”这样的预测)

一、恒等函数和softmax函数

恒等函数

恒等函数会将输入按原样输出,将恒等函数的处理过程用神经网络图来表示,则如下图所示。

在这里插入图片描述

softmax 函数

分类问题中使用的 softmax 函数可以用下面的式子表示
y k = exp ⁡ ( a k ) ∑ i = 1 n exp ⁡ ( a i ) y_k=\frac{\exp \left(a_k\right)}{\sum_{i=1}^n \exp \left(a_i\right)} yk=i=1nexp(ai)exp(ak)
exp ⁡ ( x ) \exp (x) exp(x) 是表示 e x \mathrm{e}^x ex 的指数函数 ( e \mathrm{e} e 是纳皮尔常数 2.7182 ⋯ ) \left.2.7182 \cdots\right) 2.7182)

上式表示假设输出层共有 n n n 个神经元, 计算第 k k k 个神经元的输出 y k y_k yk

  • 分子是输人信号 a k a_k ak 的指数函数
  • 分母是所有输人信号的指数函数的和。

下图表示softmax函数。函数的输出通过箭头与所有的输入信号相连,这是因为, 输出层的各个神经元都受到所有输入信号的影响(从上式可以看出)

在这里插入图片描述

python实现softmax函数

import numpy as np# 定义输入向量a
a = np.array([0.3, 2.9, 4.0])# 计算指数函数
exp_a = np.exp(a)
print("指数函数结果:", exp_a)  # [  1.34985881  18.17414537  54.59815003]# 计算指数函数的和
sum_exp_a = np.sum(exp_a)
print("指数函数的和:", sum_exp_a)  # 74.1221542102# 计算softmax
y = exp_a / sum_exp_a
print("softmax:", y)  # [ 0.01821127  0.24519181  0.73659691]

代码按照softmax函数实现,下面把它定义成如下的Python函数

def softmax(a):exp_a = np.exp(a)sum_exp_a = np.sum(exp_a)y = exp_a / sum_exp_areturn y

二、实现softmax函数时的注意事项

函数优化

上面的 softmax 函数在运算上存在溢出问题,因为计算机表示的数值范围是有限的。

softmax 函数的实现中要进行指数函数的运算,但是此时指数函数的值很容易变得非常大。比如, e 10 e^{10} e10 的值会超过 20000 , e 100 20000, e^{100} 20000,e100 会变成一个后面有 40 多个 0 的超大值, e 1000 e^{1000} e1000 的结果会返回一个表示无穷大的inf。如果在这些超大值之间进行除法运算, 结果会出现 不确定的情况。
softmax函数的实现可以像下式这样改进
y k = exp ⁡ ( a k ) ∑ i = 1 n exp ⁡ ( a i ) = C exp ⁡ ( a k ) C ∑ i = 1 n exp ⁡ ( a i ) = exp ⁡ ( a k + log ⁡ C ) ∑ i = 1 n exp ⁡ ( a i + log ⁡ C ) = exp ⁡ ( a k + C ′ ) ∑ i = 1 n exp ⁡ ( a i + C ′ ) \begin{aligned} y_k=\frac{\exp \left(a_k\right)}{\sum_{i=1}^n \exp \left(a_i\right)} & =\frac{\mathrm{C} \exp \left(a_k\right)}{\mathrm{C} \sum_{i=1}^n \exp \left(a_i\right)} \\ & =\frac{\exp \left(a_k+\log \mathrm{C}\right)}{\sum_{i=1}^n \exp \left(a_i+\log \mathrm{C}\right)} \\ & =\frac{\exp \left(a_k+\mathrm{C}^{\prime}\right)}{\sum_{i=1}^n \exp \left(a_i+\mathrm{C}^{\prime}\right)} \end{aligned} yk=i=1nexp(ai)exp(ak)=Ci=1nexp(ai)Cexp(ak)=i=1nexp(ai+logC)exp(ak+logC)=i=1nexp(ai+C)exp(ak+C)

  • 首先在分子和分母上都乘上 C \mathrm{C} C 这个任意的常数 (因为同时对分母和分子乘以相同的常数, 所以计算结果不变)

  • 然后把这个 C \mathrm{C} C 移动到指数函数 (exp) 中, 记为 log ⁡ C \log \mathrm{C} logC

    • 这个步骤利用了指数函数的性质: exp ⁡ ( x + y ) = exp ⁡ ( x ) ⋅ exp ⁡ ( y ) \exp(x+y) = \exp(x) \cdot \exp(y) exp(x+y)=exp(x)exp(y)
    • 分子部分: exp ⁡ ( a k ) ⋅ C = exp ⁡ ( a k ) ⋅ exp ⁡ ( log ⁡ C ) = exp ⁡ ( a k + log ⁡ C ) \exp(a_k) \cdot \mathrm{C} = \exp(a_k) \cdot \exp(\log \mathrm{C}) = \exp(a_k + \log \mathrm{C}) exp(ak)C=exp(ak)exp(logC)=exp(ak+logC)
    • 分母部分: ∑ i = 1 n exp ⁡ ( a i ) ⋅ C = ∑ i = 1 n exp ⁡ ( a i ) ⋅ exp ⁡ ( log ⁡ C ) = ∑ i = 1 n exp ⁡ ( a i + log ⁡ C ) \sum_{i=1}^n \exp(a_i) \cdot \mathrm{C} = \sum_{i=1}^n \exp(a_i) \cdot \exp(\log \mathrm{C}) = \sum_{i=1}^n \exp(a_i + \log \mathrm{C}) i=1nexp(ai)C=i=1nexp(ai)exp(logC)=i=1nexp(ai+logC)
  • 最后把 log ⁡ C \log \mathrm{C} logC 替换为另一个符号 C ′ \mathrm{C}^{\prime} C

上式说明, 在进行 softmax 的指数函数的运算时, 加上 (或者减去)某个常数并不会改变运算的结果。这里的 C ′ \mathrm{C}^{\prime} C 可以使用任何值, 但是为了防止溢出, 一般会使用输人信号中的最大值。

python实现

下面来看一个具体的例子

import numpy as np# 定义输入向量a
a = np.array([1010, 1000, 990])# 直接计算softmax函数会出现数值溢出的问题
# np.exp(a) / np.sum(np.exp(a)) # 结果为 [nan, nan, nan]# 解决方法:将输入向量减去最大值,然后再计算softmax函数
c = np.max(a) # 最大值为 1010
a_shifted = a - c
softmax_output = np.exp(a_shifted) / np.sum(np.exp(a_shifted))
print(softmax_output) # 结果为 [  9.99954600e-01,   4.53978686e-05,   2.06106005e-09]

通过减去输入信号中的最大值(上例中的c),原本为nan(not a number,不确定)的地方,现在被正确计算了。

所以可以像下面这样实现softmax函数

def softmax(a):c = np.max(a)exp_a = np.exp(a - c) # 溢出对策sum_exp_a = np.sum(exp_a)y = exp_a / sum_exp_areturn y

三、softmax函数的特征

计算神经网络的输出

使用softmax()函数,可以按如下方式计算神经网络的输出。

# 定义输入向量a
a = np.array([0.3, 2.9, 4.0])# 计算softmax函数
y = softmax(a)
print(y)  # [ 0.01821127  0.24519181  0.73659691]# 验证概率分布的性质,softmax函数的输出应该是一个概率分布,所有元素的和应该为1
print(np.sum(y))  # 1.0

softmax函数的输出是0.0到1.0之间的实数,并且 softmax 函数的输出值的总和是1。输出总和为1是softmax函数的一个重要性质。正因为有了这个性质,我们才可以把softmax函数的输出解释为“概率”。

比如,上面的例子可以解释成y[0]的概率是0.018(1.8%), y[1]的概率 是0.245(24.5%), y[2]的概率是0.737(73.7%)。从概率的结果来看,可以 说“因为第2个元素的概率最高,所以答案是第2个类别”。而且,还可以回答“有 74%的概率是第2个类别,有25%的概率是第1个类别,有1%的概 率是第0个类别”。也就是说,通过使用softmax函数,我们可以用概率的(统计的)方法处理问题。

输出层的softmax函数可以省略

需要注意的是,即便使用了softmax函数,各个元素之间的大小关系也不会改变。这是因为指数函数(y=exp(x))是单调递增函数。实际上, 上例中a的各元素的大小关系和y的各元素的大小关系并没有改变。

比如,a 的最大值是第2个元素,y的最大值也仍是第2个元素。 一般而言,神经网络只把输出值最大的神经元所对应的类别作为识别结果。 并且,即便使用softmax函数,输出值最大的神经元的位置也不会变。

因此, 神经网络在进行分类时,输出层的softmax函数可以省略。在实际的问题中, 由于指数函数的运算需要一定的计算机运算量,因此输出层的softmax函数一般会被省略。

“学习”和“推理”阶段

求解机器学习问题的步骤可以分为“学习”和“推理”两个阶段

  • 首先,在学习阶段进行模型的学习
  • 在推理阶段,用学到的模型对未知的数据进行推理(分类)

如前所述,推理阶段一般会省略输出层的softmax函数。在输出层使用softmax函数是因为它和神经网络的学习有关系。

四、输出层的神经元数量

输出层的神经元数量需要根据待解决的问题来决定。对于分类问题,输出层的神经元数量一般设定为类别的数量。

比如,对于某个输入图像,预测是图中的数字0到9中的哪一个的问题(10类别分类问题),可以像下图这样, 将输出层的神经元设定为10个。输出层的神经元从上往下依次对应数字 0, 1, …, 9。图中输出层的神经元的值用不同的灰度表示。这个例子中神经元 y 2 y_2 y2 颜色最深,输出的值最大。这表明这个神经网络预测的是 y 2 y_2 y2 对应的类别,也就是“2”。

在这里插入图片描述


在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1420439.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【SpringMVC 】什么是SpringMVC(三)?基于springmvc的文件上传、基于springmvc的拦截器、基于springmvc的邮件发送

文章目录 SpringMVC第五章1、SpringMVC文件上传1、基本步骤1-2345-82、邮件发送1、基本步骤1-234-5567-8 简单邮件带附件的邮件第六章1、拦截器的使用使用步骤232、调度的使用基本步骤1-56-8调度规则3、shiro安全框架核心概念基本语法1、基于ini文件的认证**测视类**2、基于rea…

【系统架构师】-选择题(十三)数据库基础

1、在某企业的营销管理系统设计阶段,属性"员工"在考勤管理子系统中被称为"员工",而在档案管理子系统中被称为"职工",这类冲突称为( 命名冲突)。 同一个实体在同系统中存在不同的命名&am…

用户登录:断点看流程认证

参考原文Security认证流程 第一步:先认识一下令牌 开始断点 执行new UsernamePasswordAuthenticationToken 1.Authentication接口: 它的实现类,表示当前访问系统的用户,封装了用户相关信息。(我们实现类是UsernamePasswordAuthenticationToken) 点击…

【ARM 嵌入式 C 入门及渐进 16.1 -- C 代码实现CRC32校验函数】

请阅读【嵌入式开发学习必备专栏】 文章目录 CRC32校验函数CRC32 表与函数CRC32 测试函数测试结果 对比测试结果 CRC32校验函数 在C语言中,实现CRC32计算的函数需要一个CRC算法的实现。以下是一个使用查表法实现CRC32的简单例子。这种方法通过预先计算好的CRC表来快…

windows编译opencv4.9

opencv很多人在windows上编译感觉特别麻烦,没有linux下方便,设定以下三点,我们几乎会无障碍。 1 安装cuda,cudnn 安装好cuda,cudnn,把cudnn的头文件,库等等拷贝到cuda的安装目录下面&#xff…

Chatgpt的应用场景

文案创作类: 作为一名大型语言模型,ChatGPT可以为使用者提供多种文本处理和文字创作方面的服务,例如: 文本生成和创作 ChatGPT可以基于您提供的主题、关键词或文本段落,生成符合使用者要求的新文本。这些文本可以是文…

从JSON数据到Pandas DataFrame:如何解析出所需字段

目录 一、引言 二、JSON数据的基本结构 三、使用Pandas从JSON数据中读取数据 四、从DataFrame中解析出所需字段 解析对象字段 解析嵌套对象字段 解析数组字段 五、案例与代码示例 六、总结 一、引言 在数据分析和处理的日常工作中,我们经常需要从各种…

FPGA第1篇,FPGA现场可编程门阵列,从0开始掌握可编程硬件开发(FPGA入门指南)

简介:FPGA全称Field-Programmable Gate Array,是一种可编程逻辑器件,它通过可编程的逻辑单元和可编程的连接网络实现了灵活的硬件实现。与固定功能的集成电路(ASIC)相比,FPGA具有更高的灵活性和可重新配置性…

如何在计算机上安装两个系统并引导?这里有详细步骤

序言 大多数计算机附带一个操作系统,但你可以在一台电脑上安装多个操作系统。安装两个操作系统,并在启动时在它们之间进行选择。 谷歌和微软终止了英特尔的双启动Windows和Android PC计划,但你可以在安装Windows 7的同时安装Windows 8.1&am…

SpringCloud使用Nacos作为配置中心实现动态数据源切换

一、Nacos-Server 了解Nacos可以直接阅读官方文档 使用Nacos,我们需要有Nacos-Server,此处就不使用官方提供的release版本了,而是自己编译,因为本来就是Java开发的,所以对于Javaer来说也没啥难度! git c…

不训练也能给模型加上各种超能力?

之前我写过一篇 Sakana 与 Jamba (qq.com) Sakana也好,Jamba也罢,其实都是模型合并的一种比较好的项目实践,今天我们可以讨论一下普通开发者是否能像做一个项目一样,合并多个模型,达到自己想要的效果(GPU的连载后面写,东西太多,再给2篇也不知道能不能写完 ) 不同于Sakan…

交互验证和人机识别对抗升级,AIGC如何应用在验证安全?保证用户体验才是王道

交互验证和人机识别对抗再升级,滑动拼图、文字点选、语义空间和人工智能的对抗,俗话说,道高一尺,魔高一丈, 图形验证可以挑战人工智能吗? AIGC如何应用在身份验证业务 ? 1 交互验证被破解现状 …

【雷音系·雷修】倪琴古琴,倪诗韵亲签古琴

雷音系列雷修:“修”字取意善、美好的,更有“使之完美”之意。精品桐木或普通杉木制,栗壳色,纯鹿角霜生漆工艺。方形龙池凤沼。红木配件,龙池上方有“倪诗韵”亲笔签名,凤沼下方位置处有“雷•修”等级葫芦…

超详细 springboot 整合 Mock 进行单元测试!本文带你搞清楚!

文章目录 一、什么是Mock1、Mock定义2、为什么使用3、常用的Mock技术4、Mokito中文文档5、集成测试和单元测试区别 二、API1、Mockito的API2、ArgumentMatchers参数匹配3、OngoingStubbing返回操作 三、Mockito的使用1、添加Maven依赖2、InjectMocks、Mock使用3、SpringbootTes…

Att论文解读|ICLR 2018 《Graph attention networks》图注意力网络

论文地址 论文地址:https://arxiv.org/abs/1710.10903 github:PetarV-/GAT: Graph Attention Networks (https://arxiv.org/abs/1710.10903) (github.com) gordicaleksa/pytorch-GAT: My implementation of the original GAT paper (Veličković et al.). Ive addi…

No module named ‘sklearn.metrics.ranking‘ 解决方法

错误代码 from sklearn.metrics.classification import * from sklearn.metrics.ranking import * 错误原因 sklearn这个文件夹下的_classification和_ranking前面有下划线! 解决方法 第一步:找到sklearn位置,可以打开命令行输入 pip sh…

【自然语言处理】【大模型】DeepSeek-V2论文解析

论文地址:https://arxiv.org/pdf/2405.04434 相关博客 【自然语言处理】【大模型】DeepSeek-V2论文解析 【自然语言处理】【大模型】BitNet:用1-bit Transformer训练LLM 【自然语言处理】BitNet b1.58:1bit LLM时代 【自然语言处理】【长文本…

最佳解决Maven同一依赖多版本共存问题,重复依赖(同一个jar包,多个版本)-maven-shade-plugin

先看链接:原文链接 参照原文链接生成的文件(下面是我放的位置) mvn指令 mvn install:install-file -DfileD:\mavenrepository/maven-shade.jar -DgroupIdcom.wj -DartifactIdmaven-shade -Dversion1.1 -Dpackagingjar如果配置了maven_home 和java_home可以任意打开cmd执行(…

Open CASCADE 教程 – AIS:自定义呈现

文章目录 开始 (Getting Started)呈现构建器 (Presentation builders)基元数组 (Primitive arrays)基元外观 (Primitive aspects)二次构建器 (Quadric builders)计算选择 (Computing selection)突出显示选择所有者 (Highlighting selection owner)突出显示的方法 (Highlighting…

网络Http和Socket通讯(基于面试)

每日一句:想得到世上最好的东西,先得让世界看到最好的你 目录 面试问OSI或TCP/IP,怎么回答? 面试问HTTP? 面试问Get类型,Pot类型区别? 面试什么是Socket套接字? 面试问什么是数据粘包&…