生物神经元与人工神经元模型
一句话概述
人工神经元是深度学习的最小计算单元,它从生物神经元的结构和功能中获得灵感,通过加权求和与非线性激活函数将输入信号映射为输出信号。理解神经元模型是理解整个深度学习的基石——从单层感知机到千亿参数的大语言模型,核心计算单元始终是神经元。
💡 核心要点:①生物神经元通过树突接收信号、轴突输出信号,人工神经元通过加权求和模拟这一过程 ②M-P神经元模型是第一个形式化数学模型,带阈值的二值输出 ③感知机是第一个可学习的神经元模型,奠定了监督学习的基础 ④现代人工神经元 = 加权求和 + 偏置 + 激活函数,是深度学习的基本构件
教学与演示
一、生物神经元的结构与工作原理
是什么(定义):生物神经元是动物神经系统的基本结构和功能单位。一个典型的生物神经元由树突、细胞体(胞体)和轴突三部分组成。树突负责接收来自其他神经元的电化学信号,细胞体对这些输入信号进行整合处理,当膜电位超过一定阈值时,神经元"放电",通过轴突将电脉冲传递给下游神经元。
大白话 生物神经元就像一个微型决策器——它综合所有输入信号,超过门槛就输出一个脉冲,没超过就保持静默。这个"要么全有、要么全无"的特性,是人工神经元"激活函数"的生物学原型。
怎么做(实现):生物神经元之间的连接点称为突触。当动作电位到达突触前膜时,会释放神经递质到突触间隙,神经递质与突触后膜的受体结合,改变后膜的离子通透性,从而产生兴奋性或抑制性突触后电位。一个神经元通常与成千上万个其他神经元形成突触连接,人脑中约有860亿个神经元和约100万亿个突触连接。
大白话 突触就像是神经元之间的"音量旋钮"——有的旋钮调大(兴奋性突触,让下游更容易放电),有的旋钮调小(抑制性突触,让下游更难放电)。人工神经网络的"权重"概念正是从这里来的。
什么用(AI关联):生物神经元的研究直接启发了人工神经网络的设计。1943年McCulloch和Pitts提出的M-P模型就是基于生物神经元的"全或无"定律。现代深度学习中的ReLU激活函数(输出0或正值)在某种程度上也呼应了生物神经元的单侧抑制特性。理解生物神经元有助于我们理解为什么某些设计(如稀疏激活、侧抑制)能在人工网络中奏效。
哪些坑(缺点):人工神经元对生物神经元的模拟是高度简化的。真实生物神经元存在脉冲时序编码、树突计算、神经调质等多种复杂机制,这些在标准人工神经元中都被忽略了。因此,不能将人工神经网络与生物大脑简单类比。
二、M-P神经元模型:第一个数学抽象
是什么(定义):M-P(McCulloch-Pitts)神经元模型是1943年由神经科学家Warren McCulloch和数学家Walter Pitts提出的第一个形式化神经元数学模型。该模型将神经元抽象为一个多输入、单输出的二值逻辑单元:输入信号经过加权求和后,与阈值比较,超过阈值输出1,否则输出0。
大白话 M-P模型是最简单的"是或否"决策器:把所有输入的重要性加权求和,看是否超过门槛,超过就点头(输出1),不够就摇头(输出0)。
怎么做(实现):
import numpy as np
# ========================================
# M-P神经元模型(McCulloch-Pitts 神经元)
# 多输入 -> 加权求和 -> 阈值比较 -> 二值输出
# ========================================
def mp_neuron(inputs, weights, threshold):
"""
M-P神经元前向计算
参数:
inputs: 输入信号列表 [x1, x2, ..., xn],每个值为 0 或 1
weights: 权重列表 [w1, w2, ..., wn],可以是任意数值
threshold: 阈值 θ,决定神经元是否激活
返回:
输出 1(激活)或 0(不激活)
"""
# 步骤1:加权求和 —— 每个输入乘以对应权重后累加
weighted_sum = 0.0
for i in range(len(inputs)):
weighted_sum += inputs[i] * weights[i] # xi * wi
# 步骤2:阈值判断 —— 超过阈值输出1,否则输出0
if weighted_sum >= threshold:
return 1 # 神经元激活(放电)
else:
return 0 # 神经元静默
# --- 示例:模拟逻辑"与"运算 ---
# 只有当两个输入都为1时,加权和才超过阈值
inputs_list = [[0, 0], [0, 1], [1, 0], [1, 1]]
weights = [1.0, 1.0] # 两个输入同等重要
threshold = 1.5 # 阈值 = 1.5,意味着需要至少两个都为1
print("M-P神经元实现逻辑与门:")
for inp in inputs_list:
out = mp_neuron(inp, weights, threshold)
print(f" 输入: {inp} -> 输出: {out}")
# --- 示例:模拟逻辑"或"运算 ---
# 只要任一输入为1,加权和就超过阈值
threshold_or = 0.5 # 阈值 = 0.5,任一为1即激活
print("\nM-P神经元实现逻辑或门:")
for inp in inputs_list:
out = mp_neuron(inp, weights, threshold_or)
print(f" 输入: {inp} -> 输出: {out}")
大白话 公式翻译成人话:把所有输入乘以各自的权重加起来,如果总和超过了老板定的KPI线(阈值),就算达标(输出1),否则就是没达标(输出0)。
什么用(AI关联):M-P模型证明了用简单的神经元组合可以实现任意逻辑运算,为后来的神经网络理论奠定了基础。它是感知机、多层感知机乃至现代深度学习的理论起点。
哪些坑(缺点):M-P模型的权重是固定的,不能自动学习。它需要人工设定权重和阈值才能完成特定任务,缺乏从数据中学习的能力。此外,它只能处理二值输入和输出,无法处理连续值。
三、感知机:第一个可学习的神经元
是什么(定义):感知机(Perceptron)由Frank Rosenblatt于1957年提出,是第一个能够从数据中自动学习权重的神经元模型。它在M-P模型的基础上增加了学习算法——感知机学习规则,通过迭代更新权重来最小化分类错误。
大白话 感知机和M-P模型最大的区别是:M-P的权重是手工调的,而感知机能自己从数据中"学"出正确的权重。就像教练(数据)不断纠正运动员(感知机)的动作,直到动作(分类)正确为止。
为什么(原理):感知机的核心思想是:给定训练样本(x, y),如果当前模型的预测与真实标签不一致,就调整权重。调整的方向是:如果预测为0但真实为1,则增加权重(让下次更容易激活);如果预测为1但真实为0,则减小权重(让下次更难激活)。这个简单但有效的规则是后来反向传播算法的萌芽。
怎么做(实现):
import numpy as np
# ========================================
# 感知机模型 —— 带学习能力的神经元
# 使用感知机学习规则训练二分类器
# ========================================
class Perceptron:
"""
单层感知机二分类器
学习算法:感知机学习规则(Perceptron Learning Rule)
"""
def __init__(self, n_features, learning_rate=0.1):
"""
初始化感知机
参数:
n_features: 输入特征数量
learning_rate: 学习率,控制每次更新的步长
"""
# 权重初始化为小的随机值(非零),打破对称性
self.weights = np.random.randn(n_features) * 0.01
# 偏置初始化为0 —— 控制决策边界的平移
self.bias = 0.0
# 学习率
self.lr = learning_rate
def predict(self, X):
"""
前向预测:加权求和 + 符号判断
返回: 1(正类)或 0(负类)
"""
# 线性组合:z = w·x + b
z = np.dot(X, self.weights) + self.bias
# 阶跃激活函数:z >= 0 输出1,否则输出0
return np.where(z >= 0, 1, 0)
def fit(self, X, y, epochs=100):
"""
感知机学习规则训练
参数:
X: 训练样本矩阵,形状 (n_samples, n_features)
y: 标签向量,取值 0 或 1
epochs: 最大迭代轮数
核心思想:
如果预测错误,朝正确方向微调权重
正确的方向 = 真实标签 - 预测标签
"""
n_samples = X.shape[0]
for epoch in range(epochs):
error_count = 0 # 记录本轮错误数
# 遍历每个训练样本
for i in range(n_samples):
xi = X[i] # 第i个样本的特征向量
yi = y[i] # 第i个样本的真实标签(0或1)
y_pred = self.predict(xi.reshape(1, -1))[0] # 预测标签
# 计算误差(这里是分类误差,不是梯度)
error = yi - y_pred # 1-0=1 说明预测为0但实际为1
# 0-1=-1 说明预测为1但实际为0
# 1-1=0 或 0-0=0 说明预测正确
if error != 0: # 预测错误,需要更新
error_count += 1
# 感知机更新规则:
# w_new = w_old + lr * error * x_i
self.weights += self.lr * error * xi
# b_new = b_old + lr * error
self.bias += self.lr * error
# 如果本轮没有错误,说明数据线性可分且已完全拟合
if error_count == 0:
print(f"训练在第 {epoch+1} 轮收敛,所有样本正确分类!")
break
# --- 示例:训练感知机解决线性二分类问题 ---
# 生成简单的线性可分数据
np.random.seed(42)
# 正类:特征值较大的样本
X_pos = np.random.randn(50, 2) + np.array([2.0, 2.0])
y_pos = np.ones(50) # 正类标签 = 1
# 负类:特征值较小的样本
X_neg = np.random.randn(50, 2) + np.array([-2.0, -2.0])
y_neg = np.zeros(50) # 负类标签 = 0
# 合并数据
X = np.vstack([X_pos, X_neg])
y = np.hstack([y_pos, y_neg])
# 打乱数据顺序
indices = np.random.permutation(len(y))
X, y = X[indices], y[indices]
# 训练感知机
p = Perceptron(n_features=2, learning_rate=0.1)
p.fit(X, y, epochs=100)
# 评估准确率
y_pred = p.predict(X)
accuracy = np.mean(y_pred == y)
print(f"\n最终准确率: {accuracy * 100:.1f}%")
print(f"学习到的权重: {p.weights}")
print(f"学习到的偏置: {p.bias:.3f}")
大白话 感知机的学习口诀:"错了就改,方向看标签,步子看学习率"。预测值和真实值不一样时,把权重往正确方向挪一小步,学习率控制每次挪多大的步。
什么用(AI关联):感知机是第一个有学习能力的神经网络模型,它的核心思想——"根据误差调整参数"——贯穿了整个深度学习。今天训练千亿参数大模型的基本逻辑,和1957年的感知机学习规则在哲学上是一脉相承的。
哪些坑(缺点):感知机只能解决线性可分问题。Minsky和Papert在1969年证明了感知机无法解决XOR(异或)问题,直接导致了第一次"AI寒冬"。这个局限促使了多层感知机(MLP)和反向传播算法的发展。
四、现代人工神经元模型
是什么(定义):现代人工神经元是深度学习的基本计算单元,它在感知机的基础上引入了可微分的激活函数,使得多层网络的梯度能够通过链式法则传播。其数学形式为:输出 = 激活函数(加权求和 + 偏置)。
大白话 现代神经元 = 感知机 2.0。核心升级:把感知机的"阶跃函数"换成了平滑的"激活函数"(比如ReLU、Sigmoid),这样误差信号就能顺着网络往回传(反向传播),让多层网络也能学习。
为什么(原理):关键改进在于激活函数的可微性。感知机使用阶跃函数,梯度处处为0或不存在,无法用于多层网络的训练。现代神经元使用可微的激活函数(如Sigmoid、ReLU),使得反向传播算法可以逐层计算梯度,从而让深层网络的学习成为可能。
怎么做(实现):
import numpy as np
# ========================================
# 现代人工神经元 —— 加权求和 + 偏置 + 可微激活函数
# 这是所有深度学习框架中神经元的核心实现
# ========================================
class ModernNeuron:
"""
现代人工神经元
数学形式: y = activation(w·x + b)
其中 activation 是可微的非线性函数
"""
def __init__(self, n_inputs, activation='sigmoid'):
"""
初始化神经元
参数:
n_inputs: 输入特征数量
activation: 激活函数类型 ('sigmoid', 'relu', 'tanh')
"""
# 使用 He 初始化(适合 ReLU)或 Xavier 初始化(适合 Sigmoid/Tanh)
# 这里使用小的随机值初始化权重
self.weights = np.random.randn(n_inputs) * np.sqrt(2.0 / n_inputs)
# 偏置初始化为0
self.bias = 0.0
# 存储中间值,用于反向传播
self.inputs = None # 保存输入x
self.z = None # 保存线性输出 z = w·x + b
self.output = None # 保存最终输出 a = f(z)
self.activation = activation
def _sigmoid(self, z):
"""Sigmoid激活函数: f(z) = 1 / (1 + e^(-z))"""
return 1.0 / (1.0 + np.exp(-z))
def _sigmoid_derivative(self, z):
"""Sigmoid导数: f'(z) = f(z) * (1 - f(z))"""
sig = self._sigmoid(z)
return sig * (1.0 - sig)
def _relu(self, z):
"""ReLU激活函数: f(z) = max(0, z)"""
return np.maximum(0, z)
def _relu_derivative(self, z):
"""ReLU导数: z > 0 时导数为1,否则为0"""
return np.where(z > 0, 1.0, 0.0)
def _tanh(self, z):
"""Tanh激活函数: f(z) = (e^z - e^(-z)) / (e^z + e^(-z))"""
return np.tanh(z)
def _tanh_derivative(self, z):
"""Tanh导数: f'(z) = 1 - tanh^2(z)"""
return 1.0 - np.tanh(z) ** 2
def forward(self, inputs):
"""
前向传播:计算神经元的输出
参数:
inputs: 输入向量,形状 (n_inputs,)
返回:
神经元的输出值 a
"""
# 保存输入,反向传播时会用到
self.inputs = inputs
# 步骤1:线性变换 —— z = w·x + b
self.z = np.dot(self.weights, inputs) + self.bias
# 步骤2:非线性激活 —— a = f(z)
if self.activation == 'sigmoid':
self.output = self._sigmoid(self.z)
elif self.activation == 'relu':
self.output = self._relu(self.z)
elif self.activation == 'tanh':
self.output = self._tanh(self.z)
return self.output
def backward(self, d_loss):
"""
反向传播:计算损失函数对权重和偏置的梯度
参数:
d_loss: 损失函数对神经元输出的梯度 ∂L/∂a
返回:
d_inputs: 损失函数对输入的梯度,继续向前一层传播
"""
# 步骤1:计算激活函数的梯度 ∂a/∂z
if self.activation == 'sigmoid':
d_activation = self._sigmoid_derivative(self.z)
elif self.activation == 'relu':
d_activation = self._relu_derivative(self.z)
elif self.activation == 'tanh':
d_activation = self._tanh_derivative(self.z)
# 步骤2:链式法则 —— ∂L/∂z = ∂L/∂a * ∂a/∂z
d_z = d_loss * d_activation
# 步骤3:计算各参数的梯度
# ∂L/∂w_i = ∂L/∂z * ∂z/∂w_i = d_z * x_i
d_weights = d_z * self.inputs
# ∂L/∂b = ∂L/∂z * ∂z/∂b = d_z * 1 = d_z
d_bias = d_z
# ∂L/∂x_i = ∂L/∂z * ∂z/∂x_i = d_z * w_i(传给前一层)
d_inputs = d_z * self.weights
return d_inputs, d_weights, d_bias
# --- 演示:不同激活函数对输出的影响 ---
# 创建三个神经元,分别使用不同的激活函数
n1 = ModernNeuron(n_inputs=2, activation='sigmoid')
n2 = ModernNeuron(n_inputs=2, activation='relu')
n3 = ModernNeuron(n_inputs=2, activation='tanh')
# 测试一个样本
test_input = np.array([1.0, -0.5])
# 前向传播
out_sigmoid = n1.forward(test_input)
out_relu = n2.forward(test_input)
out_tanh = n3.forward(test_input)
print("同一个输入经过不同激活函数后的输出:")
print(f" 输入: {test_input}")
print(f" Sigmoid 输出: {out_sigmoid:.4f} (范围: 0~1)")
print(f" ReLU 输出: {out_relu:.4f} (范围: 0~+∞)")
print(f" Tanh 输出: {out_tanh:.4f} (范围: -1~1)")
# --- 演示:反向传播 ---
# 假设损失函数对输出的梯度为 0.5
d_loss = 0.5
# 对 Sigmoid 神经元反向传播
d_in_s, d_w_s, d_b_s = n1.backward(d_loss)
print(f"\nSigmoid 神经元反向传播结果(d_loss=0.5):")
print(f" 权重梯度: {d_w_s}")
print(f" 偏置梯度: {d_b_s:.4f}")
print(f" 输入梯度: {d_in_s}")
大白话 现代神经元的计算分两步:第一步做"加减乘除"(线性变换w·x+b),第二步做"非线性魔法"(激活函数f)。非线性这一步是关键——没有它,无论堆多少层都等于一层。
什么用(AI关联):现代人工神经元是所有深度学习架构的基本构建块。全连接网络(MLP)是神经元的直接堆叠;卷积神经网络(CNN)是加上卷积操作的神经元;Transformer是加上自注意力机制的神经元组合。GPT-4中数千亿的参数本质上就是无数个神经元的权重。
哪些坑(缺点):单个神经元的能力有限,真正的威力来自于大量神经元的组合(层级结构)。此外,神经元的激活函数选择至关重要——选错了可能面临梯度消失、死神经元等问题。
概念关系图谱
| 概念 | 输入 | 计算方式 | 激活函数 | 能否学习 | 核心贡献 |
|---|---|---|---|---|---|
| 生物神经元 | 树突接收化学信号 | 膜电位整合 | 阈值放电(全或无) | 突触可塑性 | 提供了人工神经元的灵感来源 |
| M-P神经元 | 二值输入(0/1) | 加权求和 | 阶跃函数 | 不可学习 | 第一个形式化数学模型 |
| 感知机 | 实数输入 | 加权求和+偏置 | 阶跃函数 | 感知机学习规则 | 第一个可学习的神经元 |
| 现代神经元 | 实数输入 | 加权求和+偏置 | 可微函数(Sigmoid/ReLU等) | 梯度下降+反向传播 | 深度学习的基本构件 |
重点答疑
Q1: 人工神经元真的能模拟生物神经元吗?
答案是"部分模拟,高度简化"。人工神经元模拟了生物神经元的三个核心特性:①多输入整合(对应树突的突触输入求和);②非线性阈值行为(对应动作电位的全或无特性);③突触权重可调(对应突触可塑性)。但生物神经元的很多机制在人工模型中被忽略了,包括:脉冲时序编码(信息不仅体现在发放率还体现在精确的发放时间)、树突的局部计算能力、神经调质对网络动态的全局调节、以及神经元之间的复杂拓扑结构(不仅有前馈还有大量的反馈和侧向连接)。
大白话 人工神经元和生物神经元的关系,就像飞机的机翼和鸟的翅膀——灵感来自鸟类,但原理和实现完全不同。我们不要求飞机像鸟一样扑翅,同样也不要求人工神经元完全复刻生物神经元。
Q2: 为什么感知机不能解决XOR问题?
XOR(异或)问题:输入(0,0)→0, (0,1)→1, (1,0)→1, (1,1)→0。在二维平面上,这四个点无法用一条直线将输出为0和输出为1的点分开。感知机的决策边界就是一个超平面(二维中是一条直线),因此它只能解决线性可分的问题。要解决XOR,需要至少一个隐藏层——隐藏层可以将输入映射到一个新的特征空间,在这个空间中XOR变得线性可分。具体来说,一个包含两个隐藏神经元的单隐藏层网络就可以学习XOR函数。
大白话 想象一下和面:感知机只能拿一把刀切一刀(一条直线分开两类),而XOR问题中,两类点交错排列,一刀切不开。加隐藏层就像多了一个步骤——先把面团揉一下(空间变换),再切一刀就能分开了。
Q3: 偏置b到底有什么用?
偏置b可以类比为线性函数 y = wx + b 中的截距。没有偏置时,决策边界必须过原点(w·x = 0),这极大地限制了模型的表达能力。有偏置后,决策边界 w·x + b = 0 可以平移到任意位置。从生物角度理解:偏置对应神经元的"基础兴奋性"——即使所有输入为0,神经元也可能因为有偏置而输出非零值。
章节单词汇总
| 英文 | 音标 | 术语/释义 |
|---|---|---|
| Neuron | /ˈnʊrɑːn/ | 神经元,神经系统的基本单位 |
| Dendrite | /ˈdendraɪt/ | 树突,接收信号的细胞突起 |
| Axon | /ˈæksɑːn/ | 轴突,输出信号的细胞突起 |
| Synapse | /ˈsaɪnæps/ | 突触,神经元之间的连接点 |
| Perceptron | /pərˈseptrɑːn/ | 感知机,第一个可学习的神经元模型 |
| Threshold | /ˈθreʃhoʊld/ | 阈值,激活与否的分界值 |
| Weight | /weɪt/ | 权重,表示输入重要性的参数 |
| Bias | /ˈbaɪəs/ | 偏置,平移决策边界的参数 |
| Activation Function | /ˌæktɪˈveɪʃən ˈfʌŋkʃən/ | 激活函数,引入非线性的函数 |
| Linearly Separable | /ˈlɪniərli ˈsepərəbəl/ | 线性可分,能用超平面分开的数据 |
| XOR | /eks ɔːr/ | 异或,经典的非线性可分问题 |
面试练习
Q1 [单选] 以下关于M-P神经元模型的描述,哪项是错误的?
- A. M-P模型输出二值(0或1)
- B. M-P模型的权重可以通过学习自动调整
- C. M-P模型使用阈值决定输出
- D. M-P模型可以模拟逻辑运算
解答:M-P模型的权重是人工设定的固定值,不能自动学习。可学习权重是后来感知机的贡献。
Q2 [单选] 感知机无法解决以下哪个问题?
- A. AND(与运算)
- B. OR(或运算)
- C. XOR(异或运算)
- D. NOT(非运算)
解答:AND、OR、NOT都是线性可分问题,感知机可以解决。XOR是经典的非线性可分问题,需要至少一个隐藏层。
Q3 [单选] 现代神经元与感知机最本质的区别是什么?
- A. 现代神经元计算更快
- B. 现代神经元使用可微的激活函数
- C. 现代神经元有更多输入
- D. 现代神经元不需要偏置
解答:关键在于激活函数的可微性。可微激活函数使得梯度可以通过链式法则传播,从而支持多层网络的训练(反向传播)。感知机的阶跃函数不可微。
Q4 [多选] 以下关于生物神经元的描述,哪些是正确的?
- A. 树突负责接收来自其他神经元的信号
- B. 动作电位具有"全或无"的特性
- C. 一个神经元只能与一个其他神经元连接
- D. 突触是神经元之间传递信息的结构
解答:生物神经元通过突触与成千上万个其他神经元连接,而不是只连一个。A、B、D均为正确描述。
Q5 [单选] 在感知机学习规则中,当预测值 ŷ=0、真实标签 y=1 时,权重如何更新?
- A. 权重增加:w ← w + η·x
- B. 权重减少:w ← w - η·x
- C. 权重不变
- D. 权重随机变化
解答:误差 e = y - ŷ = 1 - 0 = 1,权重更新为 w ← w + η·1·x = w + η·x,使下次该样本更可能激活。
Q6 [多选] 以下关于偏置(bias)的说法,哪些是正确的?
- A. 偏置可以理解为神经元的"基础兴奋性"
- B. 没有偏置时,决策边界必须过原点
- C. 偏置在训练过程中通常不更新
- D. 偏置允许决策边界在空间中平移
解答:偏置和权重一样,在训练过程中通过梯度下降进行更新。其余选项均正确。
Q7 [单选] 一个现代人工神经元的核心计算步骤顺序是?
- A. 加权求和 → 加偏置 → 激活函数
- B. 激活函数 → 加权求和 → 加偏置
- C. 加偏置 → 激活函数 → 加权求和
- D. 加权求和 → 激活函数 → 加偏置
解答:标准流程为 z = w·x + b(线性变换),然后 a = f(z)(非线性激活)。
Q8 [多选] 以下哪些是人工神经元对生物神经元的简化?
- A. 忽略了脉冲的精确时序信息
- B. 忽略了树突的局部计算能力
- C. 假设突触连接只是简单的加权
- D. 忽略了神经元之间需要传递信号
解答:人工神经元仍然模拟了信号传递,但做了大量简化。A、B、C都是实际存在的简化。
Q9 [单选] 第一次AI寒冬的直接技术原因是什么?
- A. 计算机算力不足
- B. 数据量太少
- C. 感知机被证明无法解决XOR等非线性可分问题
- D. 反向传播算法尚未发明
解答:Minsky和Papert在1969年的《感知机》一书中严格证明了单层感知机的局限性,导致神经网络研究失去了资金和关注。
Q10 [单选] 在反向传播中,激活函数梯度的作用是?
- A. 决定神经元是否激活
- B. 将误差信号从输出端传递到输入端
- C. 初始化权重
- D. 计算损失函数的值
解答:激活函数的梯度 ∂a/∂z 是链式法则中的关键一环,它让损失信号能够"穿过"激活函数传播到前面的层。