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

4深度学习Pytorch-神经网络--损失函数(sigmoid、Tanh、ReLU、LReLu、softmax)

目录

激活函数

1. Sigmoid

2. Tanh 函数(双曲正切)

3. ReLU 函数

4. Leaky ReLU (LReLU)

5. Softmax

总结对比表

损失函数选择


激活函数

激活函数是神经网络中每个神经元(节点)的核心组成部分。它接收上一层所有输入的加权和(加上偏置项),并产生该神经元的输出。其主要作用是引入非线性,使得神经网络能够学习和逼近任意复杂的函数关系。如果没有非线性激活函数,无论网络有多少层,最终都等价于一个线性变换(单层感知机),能力极其有限。

1. Sigmoid

  • 公式:f(x) = \sigma(x) = \frac{1}{1 + e^{-x}}

  • 原理: 将输入压缩到 (0, 1) 区间。输出值可以被解释为概率(尤其是在二分类问题的输出层)。它平滑、易于求导。

  • 特征:

    • 输出范围: (0, 1)

    • 单调递增: 函数值随输入增大而增大。

    • S型曲线: 中间近似线性,两端饱和(变化缓慢)。

    • 导数:\sigma'(x)=\sigma(x)\cdot(1-\sigma(x))        最大值为0.25(当x=0时)。

  • 缺点:

    • 梯度消失: 当输入 x 的绝对值很大时(处于饱和区),导数 σ'(x) 趋近于0。在反向传播过程中,梯度会逐层连乘这些接近0的小数,导致深层网络的梯度变得非常小甚至消失,使得网络难以训练(权重更新缓慢或停滞)。

    • 信息丢失:输入100和输入10000经过sigmoid的激活值几乎都是等于 1 的,但是输入的数据却相差 100 倍。

    • 输出非零中心化: 输出值始终大于0。这可能导致后续层的输入全为正(或全为负),使得权重更新时梯度全部朝同一方向(正或负)移动,降低收敛效率(呈“之”字形下降路径)。

    • 计算相对较慢: 涉及指数运算。

  • 函数绘制:

    • x -> -∞ 时,σ(x) -> 0 (左水平渐近线 y=0)。

    • x = 0 时,σ(0) = 0.5

    • x -> +∞ 时,σ(x) -> 1 (右水平渐近线 y=1)。

    • 图像是一条平滑的、从接近0上升到接近1的S形曲线,关于点(0, 0.5)中心对称。导数曲线是一个钟形曲线,在x=0处达到峰值0.25,向两边迅速衰减到0。

2. Tanh 函数(双曲正切)

  • 公式:{tanh}(x) = \frac{e^x - e^{-x}}{e^x + e^{-x}}

  • 原理: 将输入压缩到 (-1, 1) 区间。是Sigmoid函数的缩放和平移版本。解决了 Sigmoid 输出均值非零的问题,更适合作为隐藏层激活函数。

  • 特征:

    • 输出范围: (-1, 1)

    • 单调递增: 函数值随输入增大而增大。

    • S型曲线: 中间近似线性,两端饱和。

    • 零中心化: 输出关于原点对称(tanh(-x) = -tanh(x))。这是相比于Sigmoid的主要优势,通常能使后续层的输入具有更理想的均值,有助于加速收敛。

    • 导数: tanh'(x) = 1 - tanh²(x),最大值为1(当x=0时)。

  • 缺点:

    • 梯度消失: 和Sigmoid类似,当 |x| 很大时,导数趋近于0,仍然存在梯度消失问题(虽然比Sigmoid稍好,因为其导数值更大)。

    • 计算相对较慢: 同样涉及指数运算。

  • 函数绘制:

    • x -> -∞ 时,tanh(x) -> -1 (左水平渐近线 y=-1)。

    • x = 0 时,tanh(0) = 0

    • x -> +∞ 时,tanh(x) -> 1 (右水平渐近线 y=1)。

    • 图像是一条平滑的、从接近-1上升到接近1的S形曲线,关于原点(0,0)中心对称。导数曲线是一个钟形曲线,在x=0处达到峰值1,向两边衰减到0。整体形状比Sigmoid更陡峭,饱和区变化更快。

3. ReLU 函数

  • 公式: \text{ReLU}(x) = \max(0, x)

  • 原理: ReLU 是目前最常用的隐藏层激活函数之一,通过简单的线性分段

    \text{ReLU}(x)=\begin{cases}x,&\text{if } x>0\\0,&\text{if }x\leq0\end{cases}

  • 特征:

    • 输出范围: [0, +∞)

    • 计算极其高效: 只需比较和取最大值操作,没有指数等复杂运算。

    • 缓解梯度消失: 在正区间 (x > 0),导数为1,梯度可以无损地反向传播,有效缓解了梯度消失问题,使得深层网络训练成为可能。这是其成功的关键。

    • ReLU 函数的导数是分段函数:
      \text{ReLU}'(x)=\begin{cases}1,&\text{if } x>0\\0,&\text{if }x\leq0\end{cases}

    • 生物学合理性: 更接近生物神经元的稀疏激活特性(只有一部分神经元被激活)。

    • 稀疏激活:x \leq 0  时输出为 0,使网络具有 “稀疏性”(仅部分神经元激活),模拟生物神经元的工作模式。

  • 缺点:

    • 死亡ReLU (Dying ReLU): 在负区间 (x < 0),导数为0。如果一个神经元的加权和输入在训练过程中大部分时间都小于0(例如,学习率过高或负的偏置过大),那么它的梯度在反向传播时始终为0,导致该神经元的权重无法再更新,永远“死亡”(输出恒为0,不再参与训练)。

    • 输出非零中心化: 输出始终 >= 0。

    • x=0 处不可导: 实践中通常将 x=0 处的导数设为0或1(通常设为0)。

  • 函数绘制:

    • x < 0 时,ReLU(x) = 0 (沿x轴负半轴)。

    • x >= 0 时,ReLU(x) = x (沿y=x直线在第一象限)。

    • 图像是一个简单的折线:在原点(0,0)左侧是水平线(y=0),在原点右侧是一条45度角的直线(y=x)。导数图像:在x<0处是y=0的水平线;在x>0处是y=1的水平线;在x=0处不连续(通常画一个空心点)。

4. Leaky ReLU (LReLU)

  • 公式:

    \text{Leaky ReLU}(x)=\begin{cases}x,&\text{if } x>0\\\alpha x,&\text{if } x\leq0\end{cases}

     

    (其中 α 是一个很小的正数常数,如0.01)

  • 原理: 针对标准ReLU的“死亡”问题进行的改进。在负区间给予一个很小的非零斜率 α

  • 特征:

    • 输出范围: (-∞, +∞) (理论上,但负值部分很小)

    • 缓解死亡ReLU: 在负区间有小的梯度 α,(x<0)时输出(\alpha x)(非零),即使输入为负,神经元也有机会更新权重,避免了永久性“死亡”。

    • 计算高效: 和ReLU一样高效。

  • 缺点:

    • 效果依赖 α 需要人工设定或尝试 α 值。虽然通常设0.01有效,但并非最优。

    • x=0 处不可导: 同样的问题。

    • 负区间表现可能不一致: 微小的负斜率可能不足以完全解决某些场景下的问题,或者引入不必要的复杂性。

  • 函数绘制:

    • x >= 0 时,LReLU(x) = x (沿y=x直线在第一象限)。

    • x < 0 时,LReLU(x) = αx (一条斜率为 α 的直线,在第三象限,非常平缓)。

    • 图像在原点右侧与ReLU相同(y=x),在原点左侧是一条斜率很小(接近水平)的直线。导数图像:在x>0处是y=1的水平线;在x<0处是y=α的水平线(非常接近0);在x=0处不连续。

5. Softmax

  • 公式:              \mathrm{Softmax}(z_i)=\frac{e^{z_i}}{\sum_{j=1}^ne^{z_j}}

     

    (其中 z_i 是第i个神经元的输入,K是输出层神经元的个数/类别数)

    给定输入向量 z=[z_1,z_2,…,z_n]

    1.指数变换:对每个 z_n 进行指数变换,得到t = [e^{z_1},e^{z_2},...,e^{z_n}],使z的取值区间从(-\infty,+\infty)  变为  (0,+\infty)

    2.将所有指数变换后的值求和,得到s = e^{z_1} + e^{z_2} + ... + e^{z_n} = \Sigma_{j=1}^ne^{z_j}

    3.将t中每个e^{z_i} 除以归一化因子s,得到概率分布:


    softmax(z) =[\frac{e^{z_1}}{s},\frac{e^{z_2}}{s},...,\frac{e^{z_n}}{s}]=[\frac{e^{z_1}}{\Sigma_{j=1}^ne^{z_j}},\frac{e^{z_2}}{\Sigma_{j=1}^ne^{z_j}},...,\frac{e^{z_n}}{\Sigma_{j=1}^ne^{z_j}}]
     

    即:        \mathrm{Softmax}(z_i)=\frac{e^{z_i}}{\sum_{j=1}^ne^{z_j}}

     

  • 原理: 将多个神经元的输入(通常是一个向量 z = [z1, z2, ..., zK])转换为一个概率分布。每个输出值在 (0, 1) 区间,且所有输出值之和为1,适合作为多分类任务的输出层。

  • 特征:

    • 输出范围: (0, 1)

    • 归一化: 输出总和为1,非常适合表示K个互斥类别的概率分布(多分类问题)。

      \sum_{i=1}^n\text{Softmax}(z_i)=1

    • 放大差异: 输入值中最大的那个,其对应的输出概率会被显著放大(指数效应),较小的输入对应的概率会被压缩。

    • 在实际应用中,Softmax常与交叉熵损失函数Cross-Entropy Loss结合使用,用于多分类问题。在反向传播中,Softmax的导数计算是必需的。

  • 缺点:

    • 仅用于输出层: 通常只在多分类网络的最后一层使用。

    • 梯度消失:当某个输入远大于其他时,其对应的输出趋近于 1,其他趋近于 0,梯度接近 0。

API

torch.nn.functional.softmax

import torch
import torch.nn as nn
​
# 表示4分类,每个样本全连接后得到4个得分,下面示例模拟的是两个样本的得分
input_tensor = torch.tensor([[-1.0, 2.0, -3.0, 4.0], [-2, 3, -3, 9]])
​
softmax = nn.Softmax()
output_tensor = softmax(input_tensor)
# 关闭科学计数法
torch.set_printoptions(sci_mode=False)
print("输入张量:", input_tensor)
print("输出张量:", output_tensor)

输出结果:

输入张量: tensor([[-1.,  2., -3.,  4.],[-2.,  3., -3.,  9.]])
输出张量: tensor([[    0.0059,     0.1184,     0.0008,     0.8749],[    0.0000,     0.0025,     0.0000,     0.9975]])

总结对比表

激活函数公式输出范围优点缺点适用场景函数绘制描述
Sigmoid\sigma(x) = \frac{1}{1 + e^{-x}}(0, 1)平滑,输出可解释为概率,导数易求梯度消失严重,输出非零中心,计算慢二分类输出层,早期隐藏层S形曲线,从(0,0)附近到(0,1)附近,关于(0,0.5)对称
Tanh\frac{e^x - e^{-x}}{e^x + e^{-x}}(-1, 1)零中心化,梯度比Sigmoid稍大仍有梯度消失,计算慢隐藏层(比Sigmoid更常用)S形曲线,从(0,-1)附近到(0,1)附近,关于(0,0)对称
ReLUmax(0, x)[0, +∞)计算极快,有效缓解梯度消失(正区间),生物学启发,实践效果好死亡ReLU问题,输出非零中心,x=0不可导最常用隐藏层 (CNN, FNN)x<0为水平线(y=0),x>=0为45度线(y=x),原点处转折
Leaky ReLU\begin{cases}x,&\text{if } x>0\\\alpha x,&\text{if } x\leq0\end{cases} (α≈0.01)(-∞, +∞)缓解死亡ReLU,计算快效果依赖α,x=0不可导,负斜率可能非最优隐藏层 (ReLU的改进尝试)x>=0同ReLU(y=x),x<0为斜率很小的直线(y=αx)
Softmax\frac{e^{z_i}}{\sum_{j=1}^ne^{z_j}}(0, 1), Σ=1输出归一化为概率分布,适合多分类仅用于输出层,数值不稳定(需技巧)多分类输出层作用于向量,输出概率向量。最大输入对应最大概率(接近1)

损失函数选择

  • 隐藏层:优先用ReLU,计算快、效果稳。若出现大量 “死神经元”(输出恒为 0),换Leaky ReLU

  • 输出层:

    • 二分类: Sigmoid (输出单个概率)。

    • 多分类: Softmax (输出类别概率分布)。

    • 回归

      • 输出非负(如销量):ReLU

      • 输出可正可负(如温度):线性激活(y=x)Tanh(配合缩放)

    • 循环网络(RNN/LSTM):门控用Sigmoid(控制开关),状态用Tanh(限制范围)。

  • 避免使用: 在深度网络的隐藏层中,通常避免使用Sigmoid(梯度消失问题严重),也较少使用原始Tanh(ReLU族通常更优)。

http://www.lryc.cn/news/614893.html

相关文章:

  • 等保测评-RabbitMQ中间件
  • 直接插入排序算法:可视化讲解与C语言实现
  • Android MediaMetadataRetriever取视频封面,Kotlin(1)
  • 记一次奇异的bug
  • 自动化一键部署 LNMP 环境
  • 【n8n教程笔记——工作流Workflow】文本课程(第二阶段)——5 自动化业务工作流——0 用例 (Use case)
  • 五、RuoYi-Cloud-Plus 前端项目部署以及如何改后端请求地址。
  • 线上排查问题的一般流程是怎么样的?
  • 集成电路学习:什么是RQT图形用户界面工具
  • 搭建商城的关键注意事项:从定位到运营的全链路指南
  • 基于 InfluxDB 的服务器性能监控系统实战(二)
  • 深入解析进程创建与终止机制
  • Linux 信号处理标志sa_flags详解
  • 有限元方法中的数值技术:Cholesky矩阵分解
  • 从零学习three.js官方文档(一)——基本篇
  • 校招秋招春招实习快手在线测评快手测评题库|测评解析和攻略|题库分享
  • 【linux基础】Linux目录和Windows目录的区别
  • 免费开发数字人API
  • Milvus 向量数据库基础操作解析
  • Kubernetes 无法识别你定义的 `CronJob` 资源*逐步解决方案
  • 不足3个细胞怎么做差异分析?
  • 目标检测数据集 - 足球场广告横幅检测数据集下载「包含VOC、COCO、YOLO三种格式」
  • 【Datawhale AI夏令营】从Baseline到SOTA:深度剖析金融问答RAG管道优化之路
  • [CUDA] CUTLASS | `CuTe DSL` 创新
  • 《TypeScript搭建的认知桥梁:游戏化学习应用的深层架构》
  • day22|学习前端ts语言
  • Javaweb - 14.1 - 前端工程化
  • 政府数字化大屏系统 - Flask实现方案
  • 使用LangGraph从零构建多智能体AI系统:实现智能协作的完整指南
  • OpenAI开源大模型 GPT-OSS 开放权重语言模型解析:技术特性、部署应用及产业影响