神经网络基础部件-激活函数详解

news2025/1/17 6:01:10

本文分析了激活函数对于神经网络的必要性,同时讲解了几种常见的激活函数的原理,并给出相关公式、代码和示例图。

一,激活函数概述

1.1,前言

人工神经元(Artificial Neuron),简称神经元(Neuron),是构成神经网络的基本单元,其主要是模拟生物神经元的结构和特性,接收一组输入信号并产生输出。生物神经元与人工神经元的对比图如下所示。

neuron

从机器学习的角度来看,神经网络其实就是一个非线性模型,其基本组成单元为具有非线性激活函数的神经元,通过大量神经元之间的连接,使得多层神经网络成为一种高度非线性的模型。神经元之间的连接权重就是需要学习的参数,其可以在机器学习的框架下通过梯度下降方法来进行学习。

深度学习一般指的是深度神经网络模型,泛指网络层数在三层或者三层以上的神经网络结构。

1.2,激活函数定义

激活函数(也称“非线性映射函数”),是深度卷积神经网络模型中必不可少的网络层。

假设一个神经元接收 D D D 个输入 x 1 , x 2 , ⋯ , x D x_1, x_2,⋯, x_D x1,x2,,xD,令向量 x = [ x 1 ; x 2 ; ⋯ ; x 𝐷 ] x = [x_1;x_2;⋯;x_𝐷] x=[x1;x2;;xD] 来表示这组输入,并用净输入(Net Input) z ∈ R z \in \mathbb{R} zR 表示一个神经元所获得的输入信号 x x x 的加权和:

z = ∑ d = 1 D w d x d + b = w ⊤ x + b z = \sum_{d=1}^{D} w_{d}x_{d} + b = w^\top x + b z=d=1Dwdxd+b=wx+b

其中 w = [ w 1 ; w 2 ; ⋯ ; w 𝐷 ] ∈ R D w = [w_1;w_2;⋯;w_𝐷]\in \mathbb{R}^D w=[w1;w2;;wD]RD D D D 维的权重矩阵, b ∈ R b \in \mathbb{R} bR 是偏置向量。

以上公式其实就是带有偏置项的线性变换(类似于放射变换),本质上还是属于线形模型。为了转换成非线性模型,我们在净输入 z z z 后添加一个非线性函数 f f f(即激活函数)。

a = f ( z ) a = f(z) a=f(z)

由此,典型的神经元结构如下所示:
典型的神经元架构

1.3,激活函数性质

为了增强网络的表示能力和学习能力,激活函数需要具备以下几点性质:

  1. 连续并可导(允许少数点上不可导)的非线性函数。可导的激活函数 可以直接利用数值优化的方法来学习网络参数。
  2. 激活函数及其导函数要尽可能的简单,有利于提高网络计算效率。
  3. 激活函数的导函数的值域要在一个合适的区间内,不能太大也不能太小,否则会影响训练的效率和稳定性.

二,Sigmoid 型函数

Sigmoid 型函数是指一类 S 型曲线函数,为两端饱和函数。常用的 Sigmoid 型函数有 Logistic 函数和 Tanh 函数。

相关数学知识: 对于函数 f ( x ) f(x) f(x),若 x → − ∞ x \to −\infty x 时,其导数 f ′ → 0 {f}'\to 0 f0,则称其为左饱和。若 x → + ∞ x \to +\infty x+ 时,其导数 f ′ → 0 {f}'\to 0 f0,则称其为右饱和。当同时满足左、右饱和时,就称为两端饱和。

2.1,Logistic(sigmoid)函数

对于一个定义域在 R \mathbb{R} R 中的输入,sigmoid 函数将输入变换为区间 (0, 1) 上的输出(sigmoid 函数常记作 σ ( x ) \sigma(x) σ(x)):

σ ( x ) = 1 1 + e x p ( − x ) \sigma(x) = \frac{1}{1 + exp(-x)} σ(x)=1+exp(x)1

sigmoid 函数的导数公式如下所示:

d d x sigmoid ( x ) = e x p ( − x ) ( 1 + e x p ( − x ) ) 2 = sigmoid ( x ) ( 1 − sigmoid ( x ) ) \frac{\mathrm{d} }{\mathrm{d} x}\text{sigmoid}(x) = \frac{exp(-x)}{(1+exp(-x))^2} = \text{sigmoid}(x)(1 - \text{sigmoid}(x)) dxdsigmoid(x)=(1+exp(x))2exp(x)=sigmoid(x)(1sigmoid(x))

sigmoid 函数及其导数曲线如下所示:

sigmoid 函数及其导数图像

注意,当输入为 0 时,sigmoid 函数的导数达到最大值 0.25; 而输入在任一方向上越远离 0 点时,导数越接近 0

目前 sigmoid 函数在隐藏层中已经较少使用,原因是 sigmoid 的软饱和性,使得深度神经网络在过去的二三十年里一直难以有效的训练,如今其被更简单、更容易训练的 ReLU 等激活函数所替代。

当我们想要输出二分类或多分类、多标签问题的概率时,sigmoid 可用作模型最后一层的激活函数。下表总结了常见问题类型的最后一层激活和损失函数。

问题类型最后一层激活损失函数
二分类问题(binary)sigmoidsigmoid + nn.BCELoss(): 模型最后一层需要经过 torch.sigmoid 函数
多分类、单标签问题(Multiclass)softmaxnn.CrossEntropyLoss(): 无需手动做 softmax
多分类、多标签问题(Multilabel)sigmoidsigmoid + nn.BCELoss(): 模型最后一层需要经过 sigmoid 函数

nn.BCEWithLogitsLoss() 函数等效于 sigmoid + nn.BCELoss

2.2,Tanh 函数

Tanh(双曲正切)函数也是一种 Sigmoid 型函数,可以看作放大并平移的 Sigmoid 函数,公式如下所示:

tanh ( x ) = 2 σ ( 2 x ) − 1 = 2 1 + e − 2 x − 1 \text{tanh}(x) = 2\sigma(2x) - 1 = \frac{2}{1 + e^{-2x}} - 1 tanh(x)=2σ(2x)1=1+e2x21

Sigmoid 函数和 Tanh 函数曲线如下图所示:

Logistic函数和Tanh函数

对应的两种激活函数实现和可视化代码(复制可直接运行)如下所示:

# example plot for the sigmoid activation function
from math import exp
from matplotlib import pyplot
import matplotlib.pyplot as plt

# sigmoid activation function
def sigmoid(x):
    """1.0 / (1.0 + exp(-x))
    """
    return 1.0 / (1.0 + exp(-x))

def tanh(x):
    """2 * sigmoid(2*x) - 1
    (e^x – e^-x) / (e^x + e^-x)
    """
    # return (exp(x) - exp(-x)) / (exp(x) + exp(-x))
    return 2 * sigmoid(2*x) - 1

def relu(x):
    return max(0.0, x)

def gradient_relu(x):
    """1 * (x > 0)"""
    if x < 0.0:
        return 0
    else:
        return 1

def gradient_sigmoid(x):
    """sigmoid(x)(1−sigmoid(x))
    """
    a = sigmoid(x)
    b = 1 - a
    return a*b

# 1, define input data
inputs = [x for x in range(-6, 7)]

# 2, calculate outputs
outputs = [sigmoid(x) for x in inputs]
outputs2 = [tanh(x) for x in inputs]

# 3, plot sigmoid and tanh function curve
plt.figure(dpi=100) # dpi 设置
plt.style.use('ggplot') # 主题设置

plt.plot(inputs, outputs, label='sigmoid')
plt.plot(inputs, outputs2, label='tanh')

plt.xlabel("x") # 设置 x 轴标签
plt.ylabel("y")
plt.title('sigmoid and tanh') # 折线图标题
plt.legend()
plt.show()

另外一种 Logistic 函数和 Tanh 函数的形状对比图:

Logistic 函数和 Tanh 函数的形状

图片来源: 《神经网络与深度学习》图4.2。

Tanh 函数及其导数曲线如下所示:

tanh_and_gradient

结合前面的 Sigmoid 函数及其导数曲线进行对比分析,可以看出 SigmoidTanh 函数在输入很大或是很小的时候,输出都几乎平滑且梯度很小趋近于 0,不利于权重更新;不同的是 Tanh 函数的输出区间是在 (-1,1) 之间,而且整个函数是以 0 为中心的,这个特点比 Sigmoid 的好。

Logistic 函数和 Tanh 函数都是 Sigmoid 型函数,具有饱和性,但是计算开销较大。因为这两个函数都是在中间(0 附近)近似线性,两端饱和。因此,这两个函数可以通过分段函数来近似。

三,ReLU 函数及其变体

3.1,ReLU 函数

ReLU(Rectified Linear Unit,修正线性单元),是目前深度神经网络中最经常使用的激活函数,它保留了类似 step 那样的生物学神经元机制: 输入超过阈值才会激发。公式如下所示:

R e L U ( x ) = m a x ( 0 , x ) = { x x ≥ 0 0 x < 0 ReLU(x) = max(0, x) = \left \lbrace \begin{matrix} x & x\geq 0 \\ 0 & x< 0 \end{matrix}\right. ReLU(x)=max(0,x)={x0x0x<0

以上公式通俗理解就是,ReLU 函数仅保留正元素并丢弃所有负元素。注意: 虽然在 0 点不能求导,但是并不影响其在以梯度为主的反向传播算法中发挥有效作用。

1,优点:

  • ReLU 激活函数计算简单
  • 具有很好的稀疏性,大约 50% 的神经元会处于激活状态。
  • 函数在 x > 0 时导数为 1 的性质(左饱和函数),在一定程度上缓解了神经网络的梯度消失问题,加速梯度下降的收敛速度。

相关生物知识: 人脑中在同一时刻大概只有 1% ∼ 4% 的神经元处于活跃 状态。

2,缺点:

  • ReLU 函数的输出是非零中心化的,给后一层的神经网络引入偏置偏移,会影响梯度下降的效率
  • ReLU 神经元在训练时比较容易“死亡”。如果神经元参数值在一次不恰当的更新后,其值小于 0,那么这个神经元自身参数的梯度永远都会是 0,在以后的训练过程中永远不能被激活,这种现象被称作“死区”。

ReLU 激活函数的代码定义如下:

# pytorch 框架对应函数: nn.ReLU(inplace=True)
def relu(x):
    return max(0.0, x)

def gradient_relu(x):
    """1 * (x > 0)"""
    if x < 0.0:
        return 0
    else:
        return 1

ReLU 激活函数及其函数梯度图如下所示:

relu_and_gradient_curve

ReLU 激活函数的更多内容,请参考原论文 Rectified Linear Units Improve Restricted Boltzmann Machines

3.2,Leaky ReLU/PReLU/ELU/Softplus 函数

1,Leaky ReLU 函数: 为了缓解“死区”现象,研究者将 ReLU 函数中 x < 0 的部分调整为 γ ⋅ x \gamma \cdot x γx, 其中 γ \gamma γ 常设置为 0.01 或 0.001 数量级的较小正数。这种新型的激活函数被称作带泄露的 ReLULeaky ReLU)。

Leaky ReLU ( x ) = m a x ( 0 , 𝑥 ) + γ   m i n ( 0 , x ) = { x x ≥ 0 γ ⋅ x x < 0 \text{Leaky ReLU}(x) = max(0, 𝑥) + \gamma\ min(0, x) = \left \lbrace \begin{matrix} x & x\geq 0 \\ \gamma \cdot x & x< 0 \end{matrix}\right. Leaky ReLU(x)=max(0,x)+γ min(0,x)={xγxx0x<0

详情可以参考原论文:《Rectifier Nonlinearities Improve Neural Network Acoustic Models》

2,PReLU 函数: 为了解决 Leaky ReLU 中超参数 γ \gamma γ 不易设定的问题,有研究者提出了参数化 ReLU(Parametric ReLU,PReLU)。参数化 ReLU 直接将 γ \gamma γ 也作为一个网络中可学习的变量融入模型的整体训练过程。对于第 i i i 个神经元,PReLU 的 定义为:

Leaky ReLU ( x ) = m a x ( 0 , 𝑥 ) + γ i   m i n ( 0 , x ) = { x x ≥ 0 γ i ⋅ x x < 0 \text{Leaky ReLU}(x) = max(0, 𝑥) + \gamma_{i}\ min(0, x) = \left\lbrace\begin{matrix} x & x\geq 0 \\ \gamma_{i} \cdot x & x< 0 \end{matrix}\right. Leaky ReLU(x)=max(0,x)+γi min(0,x)={xγixx0x<0

详情可以参考原论文:《Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification》

3,ELU 函数: 2016 年,Clevert 等人提出的 ELU (Exponential Linear Units) 在小于零的部分采用了负指数形式。ELU 有很多优点,一方面作为非饱和激活函数,它在所有点上都是连续的和可微的,所以不会遇到梯度爆炸或消失的问题;另一方面,与其他线性非饱和激活函数(如 ReLU 及其变体)相比,它有着更快的训练时间和更高的准确性。

但是,与 ReLU 及其变体相比,其指数操作也增加了计算量,即模型推理时 ELU 的性能会比 ReLU 及其变体慢。 ELU 定义如下:

Leaky ReLU ( x ) = m a x ( 0 , 𝑥 ) + m i n ( 0 , γ ( e x p ( x ) − 1 ) = { x x ≥ 0 γ ( e x p ( x ) − 1 ) x < 0 \text{Leaky ReLU}(x) = max(0, 𝑥) + min(0, \gamma(exp(x) - 1) = \left\lbrace\begin{matrix} x & x\geq 0 \\ \gamma(exp(x) - 1) & x< 0 \end{matrix}\right. Leaky ReLU(x)=max(0,x)+min(0,γ(exp(x)1)={xγ(exp(x)1)x0x<0

γ ≥ 0 \gamma ≥ 0 γ0 是一个超参数,决定 x ≤ 0 x ≤ 0 x0 时的饱和曲线,并调整输出均值在 0 附近。

详情可以参考原论文:《Fast and Accurate Deep Network Learning by Exponential Linear Units (ELUs)》

4,Softplus 函数: Softplus 函数其导数刚好是 Logistic 函数.Softplus 函数虽然也具有单侧抑制、宽 兴奋边界的特性,却没有稀疏激活性。Softplus 定义为:

Softplus ( x ) = l o g ( 1 + e x p ( x ) ) \text{Softplus}(x) = log(1 + exp(x)) Softplus(x)=log(1+exp(x))

Softplus 有兴趣的可以阅读这篇论文: 《Deep Sparse Rectifier Neural Networks》。

注意: ReLU 函数变体有很多,但是实际模型当中使用最多的还是 ReLU 函数本身

ReLU、Leaky ReLU、ELU 以及 Softplus 函数示意图如下图所示:

relu_more

四,Swish 函数

Swish 函数[Ramachandran et al., 2017] 是一种自门控(Self-Gated)激活 函数,定义为

swish ( x ) = x σ ( β x ) \text{swish}(x) = x\sigma(\beta x) swish(x)=xσ(βx)

其中 σ ( ⋅ ) \sigma(\cdot) σ() 为 Logistic 函数, β \beta β 为可学习的参数或一个固定超参数。 σ ( ⋅ ) ∈ ( 0 , 1 ) \sigma(\cdot) \in (0, 1) σ()(0,1) 可以看作一种软性的门控机制。当 σ ( β x ) \sigma(\beta x) σ(βx) 接近于 1 时,门处于“开”状态,激活函数的输出近似于 x x x 本身;当 σ ( β x ) \sigma(\beta x) σ(βx) 接近于 0 时,门的状态为“关”,激活函数的输出近似于 0

Swish 函数代码定义如下:

# sigmoid activation function
def sigmoid(x):
    """1.0 / (1.0 + exp(-x))
    """
    return 1.0 / (1.0 + exp(-x))

def swish(x, beta = 0):
    """swish(𝑥) = 𝑥𝜎(𝛽𝑥)
    beta 是需要手动设置的参数
    """
    return x * sigmoid(beta*x)

结合前面的画曲线代码,可得 Swish 函数的示例图:

Swish 函数

Swish 函数可以看作线性函数和 ReLU 函数之间的非线性插值函数,其程度由参数 β \beta β 控制

五,激活函数总结

常用的激活函数包括 ReLU 函数、sigmoid 函数和 tanh 函数。下表汇总比较了几个激活函数的属性:

activation_function

激活函数的在线可视化移步 Visualising Activation Functions in Neural Networks。

参考资料

  1. Pytorch分类问题中的交叉熵损失函数使用
  2. 《解析卷积神经网络-第8章》
  3. 《神经网络与深度学习-第4章》
  4. How to Choose an Activation Function for Deep Learning
  5. 深度学习中的激活函数汇总
  6. Visualising Activation Functions in Neural Networks

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

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

相关文章

[linux] 冯诺依曼体系及操作系统的概念

文章目录1. 冯诺依曼体系结构1. 为什么要有内存&#xff1f;1. 若内存不存在2. 若内存存在结论12.在硬件层面&#xff0c;单机和跨单机之间数据流是如何流向的&#xff1f;结论22. 操作系统(Operator System)1. 概念2.如何理解操作系统对硬件管理&#xff1f;结论13.管理者和被…

Linux安装 MySQL

1、MySQL安装方式 Linux MySQL安装有很多方式&#xff1a;yum安装、apt-get安装、rpm安装、二进制安装、源码编译安装。 比较通用的做法就是&#xff0c;二进制安装、源码编译安装&#xff0c;但是源码编译安装太麻烦&#xff0c;所以一般都是选择二进制安装。本文就是采用二…

百度百科创建词条参考资料问题汇总

百度百科词条编辑规则是相当复杂的&#xff0c;不是单纯写一写百度词条内容那么简单&#xff0c;还需要准备对应的参考资料来佐证你内容的真实性&#xff0c;很多小伙伴就因为这个参考资料犯了难&#xff0c;每次词条审核不通过的原因也大部分是因为参考资料的问题。 参考资料…

爬虫攻守道 - 2023最新 - Python Selenium 实现 - 数据去伪存真,正则表达式谁与争锋 - 爬取某天气网站历史数据

前言 前面写过3篇文章&#xff0c;分别介绍了反爬措施&#xff0c;JS逆向ajax获取数据&#xff0c;以及正则表达式匹配开头、结尾、中间的用法。第3篇算是本文 Python Selenium 爬虫实现方案的子集&#xff0c;大家可以参照阅读。 另外本意是“攻守”&#xff0c;不知道为何输…

【搞懂AUTOSAR网络管理测试】AUTOSAR网络管理规范需求解读

文章目录前言一、名词解释二、NM报文1.NM报文格式2.NM报文数据场内容三、NM状态机1.NM状态转换图2.状态前言 AUTOSAR Automotive Open System Architecture&#xff0c;汽车开放系统架构&#xff0c;由全球汽车制造商、部件供应商及其他电子、半导体和软件系统公司联合建立&am…

【Nginx】Nginx配置实例-负载均衡

1. 首先准备两个同时启动的 Tomcat2. 在 nginx.conf 中进行配置 1. 首先准备两个同时启动的 Tomcat 2. 在 nginx.conf 中进行配置 在 nginx.conf 中进行配置 随着互联网信息的爆炸性增长&#xff0c;负载均衡&#xff08;load balance&#xff09;已经不再是一个很陌生的话题…

中睿天下入选“2023年网络安全服务阳光行动”成员单位

近日&#xff0c;中国网络安全产业联盟&#xff08;CCIA&#xff09;正式公布了“2023年网络安全服务阳光行动”成员单位名单。中睿天下作为以“实战对抗”为特点的能力价值型网络安全厂商&#xff0c;凭借领先的产品方案、专业的服务支持和优秀的行业自律精神成功入选。为规范…

12、Javaweb_登录添加删除修改多选删除分页查询复杂条件查询案例

1. 综合练习 1. 简单功能 1. 列表查询 2. 登录 3. 添加 4. 删除 5. 修改 2. 复杂功能 1. 删除选中 2. 分页查询 * 好处&#xff1a; 1. 减轻服务器内存的开销 …

C/C++数据类型转换详解

目录 C语言数据类型转换 1、自动类型转换 &#xff08;1&#xff09;算术表达式的自动类型转换 &#xff08;2&#xff09;赋值运算中的自动类型转换 2、强制类型转换 C数据类型转换 1、static_cast<> 2、const_cast<> 3、dynamic_cast<> 4、reint…

【Allegro软件PCB设计120问解析】第78问 如何在PCB中手动添加差分对及自动添加差分对属性呢?

答:设计PCB过程中,若设计中有差分对信号,则需要将是差分的2个信号设置为差分对,设置差分对有2种方式:手动添加及自动添加。 1、 手动添加差分对: 第一步,点击Setup-Constraints-Constraint Manager调出CM规则管理器,然后到Physical规则管理器下点击Net-All Layers,然…

React脚手架+组件化开发+组件生命周期+组件通信

react脚手架&#xff08;create-react-app&#xff09; 1.作用&#xff1a; 帮助我们生成一个通用的目录结构&#xff0c;并且已经将我们所需的工程环境配置好 2.依赖环境 脚手架都是使用node编写的&#xff0c;并且都是基于webpack的&#xff1b; 3.安装node 4.安装脚手架 n…

在哔站黑马程序员学习Spring—Spring Framework—(一)核心容器(core container)学习笔记

一、spring介绍 spring是一个大家族全家桶&#xff0c;spring技术是JavaEE开发必备技能。spring技术解决的问题&#xff1a;一是简化开发&#xff0c;降低企业级开发的复杂性。二是框架整合&#xff0c;高效整合其他技术&#xff0c;提高企业级应用开发与运行效率。 spring技术…

git revert和git reset的差异点和区别

git revert 定义 撤销某次提交,此次撤销操作和之前的commit记录都会保留。 git revert会根据commitid找到此次提交的变更内容&#xff0c;并撤销这些变更并作为一次新commit提交。 ps:此次commit和正常commit相同&#xff0c;也可以被revert revert和reset有本质的差别&#…

使用C#开发ChatGPT聊天程序

使用C#开发ChatGPT聊天程序 总体效果如下&#xff1a; 源码下载 关键点1&#xff1a;无边框窗口拖动 Window中设置AllowsTransparency"True"、 Background"Transparent"以及WindowStyle"None"这样设置的话默认窗口的标题栏为不可见状态&…

cocos tween

缓动接口Tween 属性和接口说明接口说明接口功能说明tag为当前缓动添加一个数值类型&#xff08;number&#xff09;的标签to添加一个对属性进行 绝对值 计算的间隔动作by添加一个对属性进行 相对值 计算的间隔动作set添加一个 直接设置目标属性 的瞬时动作delay添加一个 延迟时…

Spring Cloud服务发现组件Eureka

简介 Netflix Eureka是微服务系统中最常用的服务发现组件之一&#xff0c;非常简单易用。当客户端注册到Eureka后&#xff0c;客户端可以知道彼此的hostname和端口等&#xff0c;这样就可以建立连接&#xff0c;不需要配置。 Eureka 服务端 添加Maven依赖&#xff1a; <…

菜谱分享APP/基于android菜谱分享系统

摘 要随着现代生活水平的不断提升&#xff0c;人们越来越关注健康,关注美食,大部分人都希望吃得美味的同时也要吃得健康,所以,有的人喜欢在家自己动手制作美食,但是却缺少这方面的资讯来源。菜谱分享APP是一个使用Hbuildex作为手机客户端和后台服务系统的开发环境, MySQL作为后…

Node.js+Vue.js全栈开发王者荣耀手机端官网和管理后台(一)

文章目录【全栈之巅】Node.jsVue.js全栈开发王者荣耀手机端官网和管理后台(一)工具安装和环境搭建初始化项目基于ElementUI的后台管理基础界面搭建创建分类&#xff08;客户端&#xff09;创建分类&#xff08;服务端&#xff09;分类列表分类编辑分类删除子分类【全栈之巅】No…

Bubbles原理解析

官方文档 https://developer.android.com/develop/ui/views/notifications/bubbles#the_bubble_api 气泡使用户可以轻松查看和参与对话。 气泡内置于通知系统中。 它们漂浮在其他应用程序内容之上&#xff0c;无论用户走到哪里都会跟随他们。 气泡可以展开以显示应用程序功能和…

如何搭建春节值班智能通知方案

春节期间&#xff0c;为了保证业务的正常运转&#xff0c;或者及时响应用户/客户需求&#xff0c;许多公司会安排一些人员轮流进行值班&#xff0c;解决一些突发情况或者问题。在过去&#xff0c;一般是排好值班表后&#xff0c;全靠人工自觉上线进行值班&#xff0c;容易遗忘或…