问题与目标
传统机器学习中的线性回归和逻辑回归,都是将多个特征加权汇总。神经网络并没有抛开这个起点,而是将线性变换和非线性激活反复组合,从数据中学习更复杂的边界。
本篇用 NumPy 搭建一个两层网络的前向计算。输入是三条二维样本,输出是每条样本的二分类概率。完成后应能根据权重形状推导每一层的输出形状,并解释隐藏层为什么需要激活函数。

线性层负责组合上一层特征,隐藏层的非线性激活让多层网络不再等价于一次线性变换。
核心概念
从一个神经元开始
一个神经元先计算线性组合:
z = x₁w₁ + x₂w₂ + ... + xₙwₙ + b
x 是输入特征,w 是需要从数据中学习的权重,b 是偏置。对一批样本使用矩阵计算:
Z = XW + b
假设 X 的形状是 (样本数, 输入特征数),W 是 (输入特征数, 神经元数),输出 Z 就是 (样本数, 神经元数)。偏置形状为 (神经元数,),通过广播加到每条样本上。
没有非线性,多层仍然只是一层
两个线性变换连在一起:
(XW₁ + b₁)W₂ + b₂
= X(W₁W₂) + (b₁W₂ + b₂)
它仍可合并成一次线性变换。隐藏层加入 ReLU、Tanh 等非线性激活后,多层网络才能表达弯曲的决策边界。
| 激活 | 输出特点 | 常见位置 | 主要边界 |
|---|---|---|---|
| ReLU | 负数变 0,正数不变 | 隐藏层 | 负区间梯度为 0 |
| Tanh | -1 到 1 | 序列模型隐状态 | 绝对值大时易饱和 |
| Sigmoid | 0 到 1 | 二分类概率解释 | 隐藏层中易梯度变小 |
| Softmax | 各类概率和为 1 | 多分类解释 | 训练损失常直接接收 logits |
隐藏层是中间表示
输入层只负责接收数据,输出层对应最终任务。中间的隐藏层将原始特征重新组合为新表示。“隐藏”不是神秘的含义,只表示它不是直接给定的输入或直接观察的标签。
网络变深会提高表达能力,也会增加优化、过拟合和调试成本。层数不是性能按钮,必须用验证数据判断是否带来稳定改善。
可运行实现
import numpy as np
def relu(values: np.ndarray) -> np.ndarray:
return np.maximum(values, 0.0)
def sigmoid(values: np.ndarray) -> np.ndarray:
return 1.0 / (1.0 + np.exp(-values))
X = np.array([
[0.2, 0.8],
[0.9, 0.1],
[0.7, 0.6],
])
W1 = np.array([
[0.5, -0.3, 0.8],
[0.2, 0.7, -0.4],
])
b1 = np.array([0.1, -0.1, 0.0])
W2 = np.array([[0.6], [-0.5], [0.9]])
b2 = np.array([-0.2])
hidden_linear = X @ W1 + b1
hidden = relu(hidden_linear)
logits = hidden @ W2 + b2
probabilities = sigmoid(logits)
print("X:", X.shape)
print("hidden:", hidden.shape)
print("logits:", logits.shape)
print("probabilities:", np.round(probabilities.ravel(), 3))
数据形状按以下顺序变化:
(3, 2) @ (2, 3) -> (3, 3)
(3, 3) @ (3, 1) -> (3, 1)
这些概率只是随机指定权重的前向结果,并不代表模型已经学到规律。训练的目标就是根据预测与标签的差异,逐步改变 W1、b1、W2 和 b2。
形状检查
修改隐藏层宽度时,W1 的第二维、b1 长度和 W2 的第一维必须同时变化。可在计算前写断言:
assert X.shape[1] == W1.shape[0]
assert W1.shape[1] == b1.shape[0]
assert W1.shape[1] == W2.shape[0]
assert W2.shape[1] == b2.shape[0]
常见问题与排查
- 矩阵乘法维度不匹配:先写每个张量形状,检查前一个层的输出宽度是否等于后一层的输入宽度。
- 认为神经元是对生物神经的完整复制:它只是受启发的数学单元。
- 隐藏层全部使用线性变换:多层可合并为一层,无法增加非线性表达能力。
- 将 logits 直接当概率:logits 没有 0到1 范围约束,只是模型原始得分。
- 只根据网络深度判断模型强弱:还要看数据量、归纳偏置、训练方法和独立评估。
小结
神经网络的前向计算由线性变换和非线性激活组成。权重决定如何组合特征,偏置移动输出范围,激活函数让多层网络能表达非线性关系。下一个问题是:预测不正确时,这些权重怎样得到可计算的调整方向。
许可协议:CC BY-NC 4.0
更新于 1 小时前
觉得文章有帮助?点个赞吧!
0 条评论


