神经网络基础 - 从零理解 AI 的"计算单元" / Neural Network Fundamentals from Artificial Neurons
📅 创建时间:2026-04-28 🏷️ 标签:#神经网络 #基础 #神经元 📚 前置知识:无(本系列第一篇)
📋 本章目标
- 理解什么是神经元(Neuron)
- 掌握权重(Weight)和偏置(Bias)的作用
- 理解激活函数(Activation Function)的必要性
- 理解多层神经网络(MLP)的工作原理
- 为后续理解 Transformer 打下基础
第1部分:什么是神经元?
1.1 基本概念
神经元是神经网络的基本计算单元,模拟了生物神经元的工作方式。
形象类比:
生物神经元:
输入信号 → [处理] → 输出信号
人工神经元:
输入数据 → [加权求和 + 激活] → 输出结果1.2 神经元的组成部分
一个神经元由三部分组成:
┌─────────────────────────────────────────────────────────┐
│ 神经元 │
├─────────────────────────────────────────────────────────┤
│ │
│ 输入 x₁ ──→ × w₁ ──┐ │
│ │ │
│ 输入 x₂ ──→ × w₂ ──→ ⊕ ──→ 激活函数 ──→ 输出 y │
│ │ │
│ 输入 x₃ ──→ × w₃ ──┘ ↑ │
│ │ │
│ + 偏置 b ──→ ⊕ │
│ │
└─────────────────────────────────────────────────────────┘
公式:y = f(w₁·x₁ + w₂·x₂ + w₃·x₃ + b)第2部分:权重和偏置详解
2.1 权重(Weight)是什么?
权重 = 重要性系数,决定了每个输入对输出的影响程度。
具体例子:判断一篇文章是否值得阅读
输入:
- x₁ = 点赞数(比如 1000)
- x₂ = 评论数(比如 200)
- x₃ = 转发数(比如 50)
权重设置:
w₁ = 0.3 (点赞数比较重要)
w₂ = 0.6 (评论数最重要)
w₃ = 0.1 (转发数不太重要)计算加权和:
总分 = 0.3 × 1000 + 0.6 × 200 + 0.1 × 50
= 300 + 120 + 5
= 425权重的作用总结:
| 权重值 | 含义 |
|---|---|
| 正数且大 | 这个输入很重要,正向影响 |
| 正数且小 | 这个输入不太重要 |
| 接近0 | 这个输入几乎被忽略 |
| 负数 | 这个输入起反作用 |
2.2 偏置(Bias)是什么?
偏置 = 调整基准,决定了神经元激活的难易程度。
类比:就像考试中的"基础分"
没有偏置:y = w × x
- 当 x = 0 时,y 必然 = 0
有偏置:y = w × x + b
- 即使 x = 0,y 也可以 = b
- 调整了"起点"位置具体例子:判断是否下雨
场景:根据湿度判断下雨概率
情况1:b = -60
- 需要 湿度 > 60 才能让结果 > 0(会下雨)
情况2:b = -40
- 只需要 湿度 > 40 就能让结果 > 0(降低门槛)
情况3:b = -80
- 需要 湿度 > 80 才下雨(提高门槛)2.3 为什么权重和偏置重要?
没有权重和偏置的问题:
所有输入的影响都一样,无法区分重要性
y = 1×x₁ + 1×x₂ + 1×x₃ ← 每个输入权重都是1有权重和偏置后:
可以学习复杂的非线性关系
y = 0.5×x₁ + 2×x₂ - 0.3×x₃ + 10 ← 每个输入权重不同第3部分:激活函数
3.1 为什么需要激活函数?
问题:如果只有线性计算,神经网络只能学习直线关系。
现实世界:很多关系不是直线!
例子:气温与舒适度的关系
气温(°C): -10 0 15 25 35 40
↓ ↓ ↓ ↓ ↓ ↓
舒适度: 低 中 高 高 中 低
这是一个"倒U型"曲线,不是直线!激活函数 = 引入非线性,让神经网络能够学习曲线、复杂形状。
3.2 常见激活函数对比
ReLU(Rectified Linear Unit)- 最常用
公式:
ReLU(x) = max(0, x)数值示例:
输入 x │ 输出 y = max(0, x)
─────────┼─────────────────────
-10 │ 0 (负数变0)
-5 │ 0 (负数变0)
-1 │ 0 (负数变0)
0 │ 0 (临界点)
1 │ 1 (正数保留)
5 │ 5 (正数保留)
10 │ 10 (正数保留)图像:
y
│ /
│ /
│ /
│ /
│/____________ x
0特点:
- 计算简单,速度快
- 能解决梯度消失问题
- 是 Transformer 中 MLP 层使用的激活函数
Sigmoid - 用于概率输出
公式:
Sigmoid(x) = 1 / (1 + e^(-x))数值示例:
输入 x │ e^(-x) │ 输出 y
─────────┼─────────────┼──────────
-10 │ 22026.47 │ 0.00005 ≈ 0
-5 │ 148.41 │ 0.0067 ≈ 0
-2 │ 7.39 │ 0.119 ≈ 0.12
-1 │ 2.72 │ 0.269 ≈ 0.27
0 │ 1.00 │ 0.500 = 0.5
1 │ 0.37 │ 0.731 ≈ 0.73
2 │ 0.14 │ 0.881 ≈ 0.88
5 │ 0.0067 │ 0.993 ≈ 1
10 │ 0.00005 │ 0.99995 ≈ 1特点:
- 输出范围 [0, 1],适合表示概率
- S 形曲线,梯度平滑
- 缺点:对于极端值(很大或很小),梯度接近0(梯度消失)
图像:
y
│╲
│ ╲
│ ╲________
│ ╲ ╱
│ ╲ ╱
│ ╲ ╱
│_______╲_╱___________ x
0Tanh(双曲正切)- 双向输出
公式:
Tanh(x) = (e^x - e^(-x)) / (e^x + e^(-x))数值示例:
输入 x │ 输出 y
─────────┼──────────
-10 │ -0.99999 ≈ -1
-5 │ -0.9933 ≈ -1
-2 │ -0.9640 ≈ -0.96
-1 │ -0.7616 ≈ -0.76
0 │ 0.0000 = 0
1 │ 0.7616 ≈ 0.76
2 │ 0.9640 ≈ 0.96
5 │ 0.9933 ≈ 1
10 │ 0.99999 ≈ 1特点:
- 输出范围 [-1, 1],可以是负数
- 以0为中心,比 Sigmoid 收敛更快
- 同样存在梯度消失问题
图像:
y
1│ /
│ ╱
│ ╱
│ ╱
──┼╱────────────────
│╲
│ ╲
│ ╲
-│ ╲
│ ╲
└────────────────── x
0GELU(Gaussian Error Linear Unit)- Transformer标配
公式:
GELU(x) = x × Φ(x)其中 Φ(x) 是标准正态分布的累积分布函数(CDF)。
数值示例(近似计算):
输入 x │ 输出 y(近似)
─────────┼───────────────
-2 │ -0.0455
-1 │ -0.1587
0 │ 0.0000
1 │ 0.8413
2 │ 1.9545特点:
- Transformer(GPT、BERT 等)中最常用的激活函数
- 比 ReLU 更"平滑",但计算更复杂
- 可以看作是 ReLU 和 Sigmoid 的混合
为什么 Transformer 用 GELU:
- 更平滑的梯度流动
- 乘以一个概率权重(由输入决定)
- 在大量实验中被证明效果更好
第4部分:完整的神经元计算
4.1 单个神经元的完整流程
公式:
y = activation(w · x + b)步骤分解:
步骤1:计算加权和 z = w · x + b
步骤2:应用激活函数 y = activation(z)4.2 具体数值示例
输入:
x = [2, 3, 1] (3个输入)权重和偏置:
w = [0.5, -0.3, 0.8] (3个权重)
b = 0.1 (偏置)步骤1:计算加权和
z = w · x + b
= 0.5×2 + (-0.3)×3 + 0.8×1 + 0.1
= 1.0 - 0.9 + 0.8 + 0.1
= 1.0步骤2:应用 ReLU 激活
y = ReLU(1.0)
= max(0, 1.0)
= 1.0如果加权和是负数:
假设 z = -0.5
y = ReLU(-0.5)
= max(0, -0.5)
= 0 ← 负数被"截断"为04.3 神经元的工作可视化
输入数据
│
▼
┌──────────────────────────────────────┐
│ 加权求和:z = w · x + b │
│ │
│ 0.5×2 = 1.0 ──────────────────┐ │
│ -0.3×3 = -0.9 ─────────────────┤ │
│ 0.8×1 = 0.8 ─────────────────┤ + │
│ + 0.1 │
│ ──┤ │
│ ▼ │
│ z = 1.0 │
└──────────────────────────────────────┘
│
▼
┌──────────────────────────────────────┐
│ 激活函数:y = ReLU(1.0) │
│ │
│ ReLU(x) = max(0, x) │
│ │
│ y = max(0, 1.0) = 1.0 │
└──────────────────────────────────────┘
│
▼
输出结果:y = 1.0第5部分:多层神经网络(MLP)
5.1 从单个到多个神经元
单神经元:
输入(3) → [单个神经元] → 输出(1)多层网络:
输入(3) → [神经元1] ─┐
→ [神经元2] ─┼→ 输出
→ [神经元3] ─┘5.2 全连接层(Fully Connected Layer)
全连接 = 每个输入都连接到每个输出
示意图:
输出 h₁ h₂ h₃
输入 ┌────────────────
x₁ ───┼──●────●────●
x₂ ───┼──●────●────●
x₃ ───┼──●────●────●
└──●────●────●
每个圆点代表一个连接
每个连接都有权重
"全连接"因为每个输入都连到每个输出5.3 矩阵表示(更简洁)
单个神经元计算:
h = w · x + b
w 是一个向量:[w₁, w₂, w₃]
x 是一个向量:[x₁, x₂, x₃]多个神经元(全连接层)计算:
H = X · W + B
X 是输入矩阵:(batch_size, input_dim)
W 是权重矩阵:(input_dim, output_dim)
B 是偏置向量:(output_dim,)
H 是输出矩阵:(batch_size, output_dim)具体数值示例:
输入向量:
X = [1.0, 0.5] (2维)
权重矩阵 W (2×3):
h₁ h₂ h₃
x₁ [ 0.5 0.2 -0.1]
x₂ [-0.3 0.4 0.6]
偏置向量 B = [0.1, -0.2, 0.3]
计算过程:
h₁ = 1.0×0.5 + 0.5×(-0.3) + 0.1 = 0.5 - 0.15 + 0.1 = 0.45
h₂ = 1.0×0.2 + 0.5×0.4 + (-0.2) = 0.2 + 0.2 - 0.2 = 0.2
h₃ = 1.0×(-0.1) + 0.5×0.6 + 0.3 = -0.1 + 0.3 + 0.3 = 0.5
输出向量:H = [0.45, 0.2, 0.5]第6部分:MLP(多层感知机)
6.1 什么是 MLP?
MLP = Multi-Layer Perceptron(多层感知机)
就是多个全连接层 + 激活函数堆叠在一起。
基本结构:
输入 → [线性变换 → 激活] → [线性变换 → 激活] → ... → 输出6.2 两层 MLP 示例
结构:
输入(2) → 隐藏层(4) → 激活 → 输出(3)数值计算:
输入:
x = [1.0, 0.5]第一层(输入2 → 隐藏4):
W₁ = [[0.5, -0.3, 0.2, 0.1], (2×4矩阵)
[0.1, 0.4, -0.1, 0.3]]
b₁ = [0.1, -0.2, 0.3, 0.0]
hidden_pre = x · W₁ + b₁
hidden_pre[0] = 1.0×0.5 + 0.5×0.1 + 0.1 = 0.5 + 0.05 + 0.1 = 0.65
hidden_pre[1] = 1.0×(-0.3) + 0.5×0.4 + (-0.2) = -0.3 + 0.2 - 0.2 = -0.3
hidden_pre[2] = 1.0×0.2 + 0.5×(-0.1) + 0.3 = 0.2 - 0.05 + 0.3 = 0.45
hidden_pre[3] = 1.0×0.1 + 0.5×0.3 + 0.0 = 0.1 + 0.15 + 0 = 0.25
hidden_pre = [0.65, -0.3, 0.45, 0.25]应用 ReLU 激活:
hidden = ReLU(hidden_pre)
hidden[0] = max(0, 0.65) = 0.65
hidden[1] = max(0, -0.3) = 0 ← 负数变0
hidden[2] = max(0, 0.45) = 0.45
hidden[3] = max(0, 0.25) = 0.25
hidden = [0.65, 0, 0.45, 0.25]第二层(隐藏4 → 输出3):
W₂ = [[0.8, -0.5, 0.3], (4×3矩阵)
[0.2, 0.6, -0.1],
[0.3, -0.2, 0.4],
[0.1, 0.3, 0.2]]
b₂ = [0.1, -0.1, 0.2]
output = hidden · W₂ + b₂
output[0] = 0.65×0.8 + 0×0.2 + 0.45×0.3 + 0.25×0.1 + 0.1
= 0.52 + 0 + 0.135 + 0.025 + 0.1
= 0.78
output[1] = 0.65×(-0.5) + 0×0.6 + 0.45×(-0.2) + 0.25×0.3 + (-0.1)
= -0.325 + 0 - 0.09 + 0.075 - 0.1
= -0.44
output[2] = 0.65×0.3 + 0×(-0.1) + 0.45×0.4 + 0.25×0.2 + 0.2
= 0.195 + 0 + 0.18 + 0.05 + 0.2
= 0.625
output = [0.78, -0.44, 0.625]应用最终激活(假设用 ReLU):
final = ReLU(output) = [0.78, 0, 0.625]第7部分:MLP 在 Transformer 中的作用
7.1 Transformer 的基本结构
一个 Transformer Encoder Block:
输入
↓
┌─────────────────────────────────────┐
│ Self-Attention 层 │ ← 收集信息
│ (理解输入之间的关系) │
└─────────────────────────────────────┘
↓
┌─────────────────────────────────────┐
│ Add & Norm(残差 + 层归一化) │
└─────────────────────────────────────┘
↓
┌─────────────────────────────────────┐
│ MLP 层 ← 这就是我们要理解的! │ ← 处理信息
│ (两层全连接 + 激活) │
└─────────────────────────────────────┘
↓
┌─────────────────────────────────────┐
│ Add & Norm(残差 + 层归一化) │
└─────────────────────────────────────┘
↓
输出7.2 Transformer MLP 的特点
标准配置(以 BERT-base 为例):
d_model = 768 (输入/输出维度)
d_ff = 3072 (隐藏层维度 = 4 × d_model)
输入(768) → 线性变换(W₁) → 隐藏层(3072) → 激活(GELU) → 线性变换(W₂) → 输出(768)为什么隐藏层要扩大:
类比理解:
原始信息(768维) → 展开分析(3072维) → 提炼总结(768维)
就像:
读一篇文章(768字) → 头脑风暴想很多点(3072个想法) → 写总结(768字)7.3 SwiGLU:更先进的 MLP
现代 LLM(如 LLaMA、ChatGLM)使用 SwiGLU 替代标准 MLP:
传统 MLP:
output = GELU(x · W₁) · W₂SwiGLU:
gate = SiLU(x · W_gate) ← 门控信号
up = x · W_up ← 信息通道
output = (gate ⊙ up) · W_down ← 门控后的信息直观理解:
传统 MLP:一条路
输入 → [激活] → 输出
SwiGLU:两条路,门控决定信息量
输入 ─→ [门控] ─┐
├─→ ⊙ → 输出
输入 ─→ [信息] ─┘核心总结
总结1:神经元的本质
神经元 = 加权求和 + 激活函数
y = activation(w₁×x₁ + w₂×x₂ + ... + wₙ×xₙ + b)总结2:权重和偏置的作用
| 组件 | 作用 | 类比 |
|---|---|---|
| 权重 w | 决定输入的重要性 | 考试中各科的分值比例 |
| 偏置 b | 调整激活的基准 | 考试的及格线 |
总结3:激活函数的作用
| 激活函数 | 输出范围 | 特点 | 使用场景 |
|---|---|---|---|
| ReLU | [0, +∞) | 简单高效 | Transformer MLP |
| Sigmoid | (0, 1) | 平滑S曲线 | 二分类概率 |
| Tanh | (-1, 1) | 以0为中心 | LSTM门控 |
| GELU | (-∞, +∞) | 平滑近似 | Transformer标配 |
总结4:MLP 的结构
输入 → [线性变换 → 激活] × N层 → 输出
Transformer MLP:
输入(d_model) → W₁ → 隐藏层(4×d_model) → GELU → W₂ → 输出(d_model)章节测试
测试1:神经元计算
假设一个神经元有输入 [1, 2, 3],权重 [0.5, -0.3, 0.2],偏置 0.1。 使用 ReLU 激活函数,输出是多少?
测试2:权重作用
如果要强调某个输入的重要性,应该把这个输入的权重设置得更大还是更小?
测试3:激活函数选择
如果要输出一个概率值(0到1之间),应该选择哪个激活函数?
测试4:MLP 结构
一个 MLP 第一层输入维度是 100,输出维度是 200;第二层输入维度是 200,输出维度是 50。请问第二层权重矩阵的形状是什么?
测试5:Transformer MLP
在 Transformer 中,为什么 MLP 的隐藏层维度通常设置为输入维度的 4 倍?
参考答案
测试1答案
步骤1:计算加权和
z = 0.5×1 + (-0.3)×2 + 0.2×3 + 0.1
= 0.5 - 0.6 + 0.6 + 0.1
= 0.6步骤2:应用 ReLU
y = max(0, 0.6) = 0.6答案:0.6
测试2答案
答案:更大
解析:权重越大,该输入对输出的影响越大。权重为负数时,该输入会反向影响输出。
测试3答案
答案:Sigmoid
解析:Sigmoid 的输出范围是 (0, 1),适合表示概率。ReLU 输出可以是任意非负数,Tanh 输出可以是负数。
测试4答案
答案:(200, 50)
解析:权重矩阵的形状是 (输入维度, 输出维度),所以第二层权重矩阵形状是 (200, 50)。
测试5答案
答案:为了增加模型的表达能力,同时保持计算效率。
解析:
- 表达能力:更大的隐藏层可以学习更复杂的特征表示
- 信息筛选:先扩展再压缩,强迫模型提炼关键信息
- 效率平衡:4倍是一个经验值,在表达能力和计算成本之间取得平衡
- 历史传承:这个比例来自 original Transformer 论文,被后续模型广泛采用
相关笔记
- [[02 - Token 与上下文窗口]] - LLM 的基本单位
- [[08 - Transformer 原理]] - Self-Attention 与 MLP
- [[SwiGLU 详解]] - 现代 LLM 的 MLP 变体
下一步学习
- [ ] 阅读 02 - Token 与上下文窗口
学习状态:✅ 已完成