1. 从单层到多层:神经网络的结构演进
第一次接触神经网络时,我像大多数人一样从最简单的单层感知机开始。这种结构确实直观——输入数据乘以权重,加上偏置,通过激活函数输出结果。但当我尝试用这种模型解决一个简单的异或(XOR)问题时,立刻发现了它的致命局限:单层神经网络本质上只能表示线性关系。
让我们用数学语言更准确地描述这个局限。假设我们有一个单层网络,输入向量x,权重矩阵W,偏置b,那么输出可以表示为:
y = f(Wx + b)
其中f是激活函数。无论f是什么函数,这个变换本质上都是线性的(或者更准确地说,仿射的)。这意味着它无法解决像异或这样需要非线性决策边界的问题。
1.1 两层神经网络的突破
当我第一次看到两层神经网络的结构图时,那种"啊哈"时刻至今难忘。两层网络通过在隐藏层引入非线性激活函数,理论上可以逼近任何连续函数(这是著名的通用近似定理的核心)。
具体来说,一个典型的两层网络可以表示为:
h = f1(W1x + b1)
y = f2(W2h + b2)
其中f1和f2是激活函数。关键在于第一个激活函数f1的非线性特性。正是这个非线性使得网络能够学习复杂的特征表示。
重要提示:虽然理论上两层网络可以近似任何函数,但在实践中,更深的网络通常能以更少的参数达到更好的效果。这就是为什么现代神经网络往往有多个隐藏层。
1.2 矩阵运算的优雅表达
在实现神经网络时,矩阵运算的表达方式不仅简洁,还能充分利用现代计算硬件的并行能力。让我们看看如何将神经网络的前向传播表示为矩阵运算:
假设我们有:
- 输入数据矩阵X(n_samples × n_features)
- 第一层权重W1(n_features × n_hidden)
- 第一层偏置b1(1 × n_hidden)
那么隐藏层输出为:
H = f1(XW1^T + b1)
第二层类似:
Y = f2(HW2^T + b2)
这种表达方式在NumPy等科学计算库中可以直接实现,而且计算效率极高。我在第一次用矩阵运算实现神经网络时,代码行数减少了70%,而速度提升了数十倍。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 激活函数:神经网络的非线性之源
2.1 为什么需要激活函数
没有激活函数的神经网络,无论有多少层,都等价于一个线性变换。这个结论可以通过简单的数学推导得出:
假设我们有一个"两层"网络,但没有激活函数:
y = W2(W1x + b1) + b2 = W2W1x + (W2b1 + b2)
这显然仍然是一个线性变换。因此,激活函数的引入是神经网络能够学习非线性关系的关键。
2.2 常见激活函数比较
在实践中,我测试过多种激活函数,每种都有其特点和适用场景:
- Sigmoid:经典的激活函数,输出在0到1之间
σ(x) = 1 / (1 + e^{-x})
优点:
