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

文章目录

    • 前言
    • 一、恒等函数和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”。

在这里插入图片描述


在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Disk Map for Mac,让您的Mac更“轻”松

还在为Mac磁盘空间不足而烦恼吗?Disk Map for Mac来帮您轻松解决!通过独特的TreeMap视觉显示技术,让您一眼就能看出哪些文件和文件夹占用了大量空间。只需简单几步操作,即可快速释放磁盘空间,让您的Mac更“轻”松。快来…

el-checkbox选中后的值为id,组件显示为label中文

直接上代码 方法一 <el-checkbox v-for"item in list" :key"item.id" :label"item.id">{{中文}} </el-checkbox> 方法二 <el-checkbox-group class"flex_check" v-model"rkStatusList" v-for"item…

prometheus、mysqld_exporter、node_export、Grafana安装配置

工具简介 Prometheus&#xff08;普罗米修斯&#xff09;&#xff1a;是一个开源的服务监控系统和时间序列数据库 mysqld_exporter&#xff1a; 用于监控 mysql 服务器的开源工具&#xff0c;它是由 Prometheus 社区维护的一个官方 Exporter。该工具通过连接到mysql 服务器并执…

EasyNmon服务器性能监控工具环境搭建

一、安装jdk环境 1、看我这篇博客 https://blog.csdn.net/weixin_54542209/article/details/138704468 二、下载最新easyNmon包 1、下载地址 https://github.com/mzky/easyNmon/releases wget https://github.com/mzky/easyNmon/releases/download/v1.9/easyNmon_AMD64.tar.…

openssl 生成证书步骤

本地测试RSA非对称加密功能时&#xff0c;需要用到签名证书。本文记录作者使用openssl本地生成证书的步骤&#xff0c;并没有深入研究openssl&#xff0c;难免会有错误&#xff0c;欢迎指出&#xff01;&#xff01;&#xff01; 生成证书标准流程&#xff1a; 1、生成私钥&am…

单位学校FM调频电台直放站系统

随着教育技术的不断发展&#xff0c;校园广播系统的建设已成为现代学校必不可少的一部分。作为传统有线广播的有效补充&#xff0c;基于无线电信号传输的 FM 调频电台在学校的使用日益广泛&#xff0c;尤其是在紧急通知、日常信息传播及教学辅助等方面发挥着重要作用。为了增强…

msvcp140dll怎么修复,分享5种有效的解决方法

MSVCP140.dll文件丢失这一现象究竟是何缘由&#xff0c;又会引发哪些令人头疼的问题呢&#xff1f;在探索这个问题的答案之前&#xff0c;我们先来深入了解这个神秘的DLL文件。MSVCP140.dll是Microsoft Visual C Redistributable Package的一部分&#xff0c;它扮演着至关重要的…

IP地址定位技术在网络安全中的作用

在当今数字化时代&#xff0c;网络安全已经成为企业、政府和个人面临的重要挑战之一。随着互联网的普及和网络攻击的增加&#xff0c;保护个人隐私和防止网络犯罪变得尤为重要。在这一背景下&#xff0c;IP地址定位技术作为网络安全的重要组成部分之一&#xff0c;发挥着关键作…

【Shell】shell编程之循环语句

目录 1.for循环 例题 2.while循环 例题 3.until循环 1.for循环 读取不同的变量值&#xff0c;用来逐个执行同一组命令 for 变量 in 取值列表 do 命令序列 done [rootlocalhost ~]# for i in 1 2 3 > do > echo "第 $i 次跳舞" > done 第 1 次跳舞 第 …

Redis经典问题:数据不一致

大家好,我是小米,今天我想和大家聊一聊Redis的一个经典问题——数据不一致。在使用Redis的过程中,你是否曾遇到过这样的问题?缓存和数据库中的数据不一致,可能导致应用程序的功能异常。下面,我将详细介绍数据不一致的原因,以及一些有效的解决方案。 什么是数据不一致 …

WordPress插件Plus WebP,可将jpg、png、bmp、gif图片转为WebP

现在很多浏览器和CDN都支持WebP格式的图片了&#xff0c;不过我们以前的WordPress网站使用的图片都是jpg、png、bmp、gif&#xff0c;那么应该如何将它们转换为WebP格式的图片呢&#xff1f;推荐安装这款Plus WebP插件&#xff0c;可以将上传到媒体库的图片转为WebP格式图片&am…

picoCTF-Web Exploitation-Trickster

Description I found a web app that can help process images: PNG images only! 这应该是个上传漏洞了&#xff0c;十几年没用过了&#xff0c;不知道思路是不是一样的&#xff0c;以前的思路是通过上传漏洞想办法上传一个木马&#xff0c;拿到webshell&#xff0c;今天试试看…

多线程-线程安全

目录 线程安全问题 加锁(synchronized) synchronized 使用方法 synchronized的其他使用方法 synchronized 重要特性(可重入的) 死锁的问题 对 2> 提出问题 对 3> 提出问题 解决死锁 对 2> 进行解答 对4> 进行解答 volatile 关键字 wait 和 notify (重要…

如何在沉浸式翻译浏览器插件中使用免费的DEEPLX和配置API接口

如何在浏览器插件沉浸式翻译中使用DEEPLX 如何配置免费的DEEPLX翻译功能如何打开PDF翻译功能如何解除翻译额度限制 如何配置免费的DEEPLX翻译功能 假设你已经在浏览器上安装了沉浸式翻译插件&#xff0c;但是不知道如何使用免费的DEEPLX功能 这里以EDGE浏览器为例&#xff0c;…

JVM从1%到99%【精选】-类加载子系统

目录 1.类的生命周期 1.加载 2.连接 3.初始化 2.类的加载器 1.类加载器的分类 2.双亲委派机制 3.面试题&#xff1a;类的双亲委派机制是什么&#xff1f; 4.打破双亲委派机制 1.类的生命周期 类加载过程&#xff1a;加载、链接&#xff08;验证、准备、解析&a…

# 从浅入深 学习 SpringCloud 微服务架构(十七)--Spring Cloud config(1)

从浅入深 学习 SpringCloud 微服务架构&#xff08;十七&#xff09;–Spring Cloud config&#xff08;1&#xff09; 一、配置中心的 概述 1、配置中心概述 对于传统的单体应用而言&#xff0c;常使用配置文件来管理所有配置&#xff0c;比如 SpringBoot 的 application.y…

解决 Content type ‘application/json;charset=UTF-8‘ not supported

文章目录 问题描述原因分析解决方案参考资料 问题描述 我项目前端采用vue-elementUi-admin框架进行开发&#xff0c;后端使用SpringBoot&#xff0c;但在前后端登录接口交互时&#xff0c;前端报了如下错误 完整报错信息如下 前端登录接口JS代码如下 export function login(…

商业数据分析--时间序列图及趋势分析

绘制时间序列图,并指出存在什么样的状态如上两图: 可见状态:从时间序列图可以看出,这些数据存在明显的季节性波动,每年的第4季度值都最高,而第2季度值最低。同时也存在一些下降的趋势。 通过引进虚拟变量,建立多元线性回归模型。答: 通过引入虚拟变量,我们可以建立如下的…

7-Zip:解锁数字世界的压缩艺术

探索数字世界&#xff0c;你需要的不仅是勇气&#xff0c;还有正确的工具。《7-Zip&#xff1a;解锁数字世界的压缩艺术》将带你深入了解7-Zip——这个开源免费的压缩工具&#xff0c;将帮助你在数字世界中更加游刃有余&#xff01; 文章目录 7-Zip 使用介绍1. 引言2. 背景介绍…

Linux系统——VIM编辑工具

vi/vim vi是一个文本编辑器&#xff0c;用于撰写文档&#xff0c;或者开发程序。vim是vi的增强版 功能一致&#xff0c;可视化效果更好一些。去鼠标化 编辑更加方便 可定制化。 vim编辑器是一个模式化文本编辑器 模式以&#xff1a;编辑模式 进入文档后默认的模式 作用&am…