什么是神经网络?

当我们谈到“神经网络”时,很多人脑海里会浮现一种“仿生”的感觉——好像机器在模仿人脑思考。没错,人工神经网络 正是受生物神经系统启发的一类机器学习模型。它由无数个简单的计算单元(我们称之为“神经元”)层层连接组成,最终形成一个能够学习复杂规律的系统。

在神经网络中,数据从输入层进入,逐层传递,经由一个或多个隐含层加工,最后抵达输出层,得到预测结果。这条路径被称为 前向传播。可以把它想象成流水线:输入信号在每一层都要先“加权求和”,再经过一个 激活函数 的非线性转化,才能流向下一层。激活函数的存在至关重要,它让神经网络不只是做“直线拟合”,而是真正具备处理非线性问题的能力。

得到预测结果后,模型会用 损失函数 来衡量预测与真实值的差异。损失越大,说明模型“想错了”的程度越严重。训练的核心目标,就是让这个损失尽量小。

那模型该怎么修正自己的错误呢?这里就是 反向传播。简单说,就是从结果往前倒推误差,计算每个参数“该为这次错误负责多少”。有了这个责任划分,优化算法(例如梯度下降)就能据此调整参数,让模型一步步更接近正确。

整个过程就是一场循环往复的学习:前向传播 → 计算损失 → 反向传播 → 更新参数。随着迭代次数增加,神经网络会越来越聪明,预测也会越来越准确。

神经网络就是一台庞大但可调的“函数机器”。前向传播算结果,损失函数指出差距,反向传播告诉我们如何修正。通过这种迭代学习,它逐渐掌握输入与输出之间的复杂映射关系,从而具备了预测新数据的能力。

神经网络的结构与工作原理

一个典型的前馈神经网络通常由三部分组成:输入层隐含层输出层。每一层里有许多“神经元”,它们通过权重相互连接。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
flowchart LR
subgraph 输入层
i1[ x₁ ]
i2[ x₂ ]
i3[ x₃ ]
end

subgraph 隐含层
h1[ 隐藏单元1 ]
h2[ 隐藏单元2 ]
h3[ 隐藏单元3 ]
h4[ 隐藏单元4 ]
end

subgraph 输出层
o1[ 输出 y₁ ]
o2[ 输出 y₂ ]
end

i1 --> h1
i1 --> h2
i1 --> h3
i1 --> h4

i2 --> h1
i2 --> h2
i2 --> h3
i2 --> h4

i3 --> h1
i3 --> h2
i3 --> h3
i3 --> h4

h1 --> o1
h1 --> o2
h2 --> o1
h2 --> o2
h3 --> o1
h3 --> o2
h4 --> o1
h4 --> o2

单个神经元的计算过程其实很直观:先把来自前一层的输入乘上权重,再加上偏置项,得到一个线性组合 $z$。公式写出来是:
$z = \sum_{i} w_i x_i + b,$
接着,$z$ 会经过一个 非线性激活函数,得到输出 $a = \sigma(z)$。常见的激活函数有 Sigmoid、Tanh 和 ReLU 等。==激活函数的存在,赋予神经网络“弯曲空间”的能力;否则,即使你堆十层八层,整个模型依然只是一个大号的线性函数==。

前向传播,就是不断重复这个动作——“线性变换 + 非线性激活”,逐层把输入转化为输出。

可以想象一个三层全连接网络:输入层有三个特征,隐含层有四个神经元,输出层有两个结果节点。信息像箭头一样单向流动,最终输出 $y_1, y_2$。

激活函数的作用与选择

激活函数决定了网络能不能学会“复杂模式”。

  • Sigmoid:把数值压缩到 $(0, 1)$,很适合输出概率。
  • Tanh:把数值压缩到 $(-1, 1)$,对称性更强。
  • ReLU:负数变 0,正数保持不变,简单高效,几乎成了默认选择。

一般来说,==隐含层常用 ReLU,输出层则要根据任务而定:回归用线性激活,二分类用 Sigmoid,多分类用 Softmax==。

损失函数:误差的标尺

神经网络要学习,就得知道“我离正确答案差多少”。损失函数正是这把尺子。

  • 回归任务:常用均方误差(MSE)。
  • 分类任务:常用交叉熵(Cross-Entropy)。

损失值越小,模型越接近正确。

神经网络的训练流程

训练过程可以总结为六个步骤:

  1. 初始化参数;
  2. 前向传播;
  3. 计算损失;
  4. 反向传播;
  5. 更新参数;
  6. 判断是否收敛。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
flowchart TD
start([开始训练])
init[初始化网络参数]
fwd[前向传播计算预测]
loss[计算损失(预测 vs 实际)]
back[反向传播计算梯度]
update[更新参数(梯度下降)]
cond{"收敛或达到停止条件?"}
done([训练完成])

start --> init --> fwd --> loss --> back --> update --> cond
cond -->|否| fwd
cond -->|是| done

线性回归任务实例

举一个最简单的没有隐含层的线性回归例子,只是直接用输入的加权和来预测输出。

  • 模型结构
    输入 $\mathbf{x}$ 直接连接输出y:
    $\hat{y}^{(i)} = w_1 x_1^{(i)} + w_2 x_2^{(i)} + \cdots + w_d x_d^{(i)} + b,$
    没有激活函数,输出可以是任意实数。

  • 损失函数(MSE)

$L_{\mathrm{MSE}} = \frac{1}{N} \sum_{i=1}^N \big(\hat{y}^{(i)} - y^{(i)}\big)^2.$
误差越大,惩罚越重。

  • 训练方法
    核心就是用 梯度下降 来不断修正参数:

$w_{j-1} \leftarrow w_j - \eta \frac{\partial L}{\partial w_j}, \quad b_{j-1} \leftarrow b_j - \eta \frac{\partial L}{\partial b},$
因为损失函数是凸的,最终能找到全局最优解。

最终得到的参数 $\mathbf{w}^, b^$,就可以用来对新样本做预测。

这个例子看似简单,却已经把神经网络的“套路”展现出来了:前向计算、损失评估、梯度更新。

分类任务实例

回归预测的是连续数值,而分类任务则是要决定“它属于哪一类”。

假设我们要识别手写数字(0–9 共 10 类)。输入是一张 $28 \times 28$ 的灰度图像(展平成 784 维向量),输出是一个 10 维概率分布。

  • 输出层与 Softmax
    每个类别对应一个神经元,Softmax 把结果转化为概率:
    $$\hat{y}j = \frac{\exp(o_j)}{\sum{k = 1}^{q}\exp(o_k)}, \quad j = 1, 2, \dots, q.$$

Softmax 的结果满足所有$\hat{y}_j \in (0, 1)$且总和为 1,可解释为模型对各类别的置信度。比如在“猫、狗、兔”三分类问题中,若未归一化输出为$[2.0, ,1.0, ,0.1]$,则 Softmax 后得到概率分布$[0.64,0.24,0.12]$。模型最终的预测类别就是概率最大的那一类,即 $\arg\max_j \hat{y}_j$。

  • 损失函数(交叉熵)
    分类任务中广泛采用交叉熵损失(Cross - Entropy Loss)。如果真实标签用独热编码表示(正确类别为1,其余为0),则单个样本的交叉熵损失为:
    $$L_{CE}(y, \hat{y}) = -\sum_{j = 1}^{q}y_j \log \hat{y}_j.$$

  • 如果模型对正确类别的概率很高,损失就很小。

  • 训练过程
    前向传播 → 计算交叉熵 → 反向传播(梯度就是 $\hat{y}_j - y_j$)→ 参数更新。

  • 评价指标
    最直观的是准确率:预测对的样本数 / 总样本数。


小结

从最简单的线性回归,到分类任务中的 Softmax 与交叉熵,我们逐渐揭开了神经网络的学习机制。它并不是一开始就聪明,而是靠着一遍遍的前向试错与反向修正,慢慢学会数据中的规律。所以为什么叫做学习,这种学习和人类的学习本质上是一样的。

理解了神经元、激活函数、损失函数、前向与反向传播这些基本概念,未来无论是卷积神经网络,还是循环神经网络,都不过是在这个框架上叠加了新的结构与思想。