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

news2024/9/20 10:35:12

文章目录

    • 前言
    • 一、恒等函数和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_a
    return 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_a
    return 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.coloradmin.cn/o/1666865.html

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

相关文章

03.Linux文件操作

1.操作系统与Linux io框架 1.1 io与操作系统 1.1.1 io概念 io 描述的是硬件设备之间的数据交互,分为输⼊ (input) 与输出 (output)。 输⼊:应⽤程序从其他设备获取数据 (read) 暂存到内存设备中;输出:应⽤程序将内存暂存的数据…

FreeRTOS学习笔记-基于stm32(6)时间片调度实验

1、什么是时间片调度 在任务优先级相同的时候,CPU会轮流使用相同的时间去执行它,即时间片调度。这个相同的时间就是时间片。而时间片的大小就是SysTick的中断周期(SysTick的中断周期可以修改)。 比如有三个相同优先级的任务在运行…

基于C++基础知识的指针

一、变量与指针 在C中,变量是用来存储数据的一个标识符,而指针是一个变量,该变量存储的是另一个变量的地址。 变量可以是不同的数据类型,包括整数、浮点数、字符、布尔值等。在声明变量时,需要指定变量的数据类型和标…

差分约束 C++ 算法例题

差分约束 差分约束 是一种特殊的 n 元一次不等式组,m 个约束条件,可以组成形如下的格式: { x 1 − x 1 ′ ≤ y 1 x 2 − x 2 ′ ≤ y 2 ⋯ x m − x m ′ ≤ y m \begin{cases} x_1-x_1^{} \le y_1 \\ x_2-x_2^{} \le y_2 \\ \cdots \\ x_…

TCP的四次挥手过程

TCP连接是双向传输的对等的模式(全双工模式),就是说双方都可以同时向对方发送或接收数据。 而断开的时候,也是双方都可以主动断开,此时需要经过四次挥手的过程,流程如下图所示: 主动方发送FIN包…

HTTP1.1的优化措施

3.2 HTTP/1.1 如何优化? 可以从以下三个方面来优化http/1.1协议: 尽量避免发送 HTTP 请求; 在需要发送 HTTP 请求时,考虑如何减少请求次数; 减少服务器的 HTTP 响应的数据大小; 避免发送HTTP请求 对于…

智能文件夹改名助手:一键秒级恢复原始名称,轻松告别繁琐操作,提升文件管理效率

文件夹管理成为了我们日常工作和生活中不可或缺的一部分。然而,随着文件数量的不断增加和文件夹命名的复杂性,我们经常面临着重命名文件夹的繁琐操作。你是否曾经因为误改文件夹名称而头疼不已?是否曾经为了找回原始名称而耗费大量时间&#…

将CentOS 7安装在U盘上,这时你将体验到......

文章目录 前言一、Linux 是什么?二、使用步骤1.下载安装 VMware Workstation Pro2.下载 CentOS 镜像3.准备一个U盘(最好是32G以上的)4.VMware 里安装 CentOS 总结 前言 随着 Linux 在服务器、嵌入式系统、移动设备等领域的广泛应用&#xff…

【jitsi】jitsi 布署及docker打包

目录 单独的布署 最后总结的成果 旧的架构 单独的布署 最后总结的成果 http://10.30.40.10/dualvenDoc/installjitsi/ 旧的架构 wvp视频调度平台架构布署图_wvp 架构-CSDN博客

Word应用:一键提取手写签名

1、将带有签名的图片插入到word文档中,裁剪出签名部分; 2、点击“格式-颜色”,选择“重新着色”中的“黑白50%”; 3、“格式-颜色”,设置透明色; 4、选择“文件”选项卡,选择打开“选项”,点击“…

【Unity Shader入门精要 第6章】基础光照(二)

1. 获取环境光 unity shader中可以通过 UNITY_LIGHTMODEL_AMBIENT获取当前环境光颜色信息。 fixed4 frag(v2f i) : SV_Target {return UNITY_LIGHTMODEL_AMBIENT; }2. 漫反射 2.1 兰伯特模型 创建Chapter_6_Diffuse_Lambert作为测试材质创建Chapter_6_Diffuse_Lambert作为测…

AI智能写作网站推荐:好用的工具看这几款就够了!

在近年来的科技发展浪潮中,人工智能写作工具以其独特的优势和魅力,引起了行业内外的广泛关注。从技术层面来看,这种工具的应用和发展已经取得了重要的突破,而从应用层面来看,它们对内容创作领域的深远影响更是不可忽视…

关于Speech processing Universal PERformance Benchmark (SUPERB)基准测试及衍生版本

Speech processing Universal PERformance Benchmark (SUPERB)是由台湾大学、麻省理工大学,卡耐基梅隆大学和 Meta 公司联合提出的评测数据集,其中包含了13项语音理解任务,旨在全面评估模型在语音处理领域的表现。这些…

EasyExcel简单使用

EasyExcel简单使用 ​ 之前一直用的Apache POI来做数据的导入导出&#xff0c;但听说阿里的EasyExcel也拥有POI的功能的同时&#xff0c;在处理大数据量的导入导出的时候性能上比POI更好&#xff0c;所以就来尝试使用一下 导入Maven依赖&#xff1a; <dependency><…

图和网络笔记

文章目录 1. 图(节点边) 1. 图(节点边) 一个图可以由节点和边组成&#xff0c;假设我们有一个节点notes &#xff1a;n4,边edges&#xff1a;m5的有向图&#xff0c;表示如下 通过以上电路图可以得到关联矩阵(incident matrix),我们定义边&#xff0c;开始端用-1表示&#x…

Elasticsearch查看集群信息,设置ES密码,Kibana部署

Elasticsearch查看集群信息&#xff0c;设置ES密码&#xff0c;Kibana部署 查看集群信息查看节点信息查看集群健康状态查看分片信息查看其他集群信息 Kibana部署安装设置ES密码 查看集群信息 查看节点信息 curl http://127.0.0.1:9200/_cat/nodes?v 参数说明&#xff1a; ip…

基于大模型的idea提炼:围绕论文和引用提炼idea之ResearchAgent

前言 对本博客比较熟悉的朋友知道&#xff0c;我司论文项目组正在基于大模型做论文的审稿(含CS英文论文审稿、和金融中文论文审稿)、翻译&#xff0c;且除了审稿翻译之外&#xff0c;我们还将继续做润色/修订、idea提炼(包含论文检索)&#xff0c;是一个大的系统&#xff0c;包…

星辰考古:TiDB v1.0 再回首

“ 1.0 版本只是个开始&#xff0c;是新的起点&#xff0c;愿我们一路相扶&#xff0c;不负远途。 前言 TiDB 是 PingCAP 公司自主设计、研发的开源分布式关系型数据库。 近日&#xff0c;TiDB v8.0.0 DMR 发布&#xff0c;详细发版说明戳这里&#xff1a; https://docs.pingca…

【C/C++】C/C++ KTV点歌系统设计与实现(源码+数据+报告)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…