Skip to content

第 1 章:什么是神经网络

1.1 从一个问题出发

给你看这张图(来自我们实际使用的 MNIST 数据集,28×28 像素):

真实数据集中的手写数字 8

你一眼就能认出这是数字 "8"。注意它是倾斜的,两个圈大小不一,笔画粗细也不均匀——这才是真实世界里人类写的 8。

但如果让你用代码写出"怎么判断一张图是8",你会怎么写?

传统方法很难——每个人写的 "8" 笔画粗细不同、倾斜角度不同、位置不同。规则太多、太复杂,很难穷举。

神经网络的思路完全不同: 它不需要你写规则,而是从大量例子中自动学习规律。给它看一万张带标签的手写数字图片,它自己找出"什么样的像素组合对应数字几"的规律。

这种"从数据中学习"的过程就叫做机器学习,而神经网络是机器学习中最强大的方法之一。


1.2 生物神经元 → 人工神经元

人脑有约 860 亿个神经元。每个神经元从其他神经元接收信号,当信号强度超过某个阈值时,它就会被激活,向下一个神经元发出信号

                    信号输入
          x₁ ——→ [权重 w₁] ——→
          x₂ ——→ [权重 w₂] ——→  [求和 + 阈值判断] ——→ 激活/不激活 ——→ 输出
          x₃ ——→ [权重 w₃] ——→

人工神经元模仿这个结构:

  1. 接收多个输入 x₁, x₂, ..., xₙ
  2. 每个输入乘以对应权重 w₁, w₂, ..., wₙ(权重越大,这个输入越"重要")
  3. 求和 z = w₁x₁ + w₂x₂ + ... + wₙxₙ + b(b 是偏置,相当于阈值的调节)
  4. 通过激活函数 决定输出多少信号

用数学公式写就是:

z = w₁x₁ + w₂x₂ + ... + wₙxₙ + b
输出 = 激活函数(z)

1.3 层:神经元的组织方式

一个神经元能做的事情很有限。真正强大的是把很多神经元组织成层

输入层        隐藏层         输出层
  x₁  ——→   [神经元 1]  ——→  [神经元 A]
  x₂  ——→   [神经元 2]  ——→  [神经元 B]   ——→ 最终输出
  x₃  ——→   [神经元 3]  ——→  [神经元 C]
  x₄  ——→   [神经元 4]
             [神经元 5]

输入层(Input Layer)

  • 不做任何计算,只负责把原始数据"喂"进来
  • 对于 MNIST 手写数字,每张图片是 28×28 像素的灰度图
  • 把 28×28 的二维图片拉直成一维向量:784 个像素值
  • 所以输入层有 784 个节点,每个节点对应一个像素
原始图片 (28×28):         展平后 (784,):
┌───────────────┐        [0.0, 0.0, 0.1, 0.8, 0.9, ..., 0.0]
│  ░░░░░░░░     │         ↑      ↑     ↑
│  ░        ░   │        像素₁  像素₂  像素₃  ...  像素₇₈₄
│  ░░░░░░░░     │
│  ░        ░   │   → 这 784 个数就是神经网络的"眼睛看到的东西"
│  ░░░░░░░░     │
└───────────────┘

隐藏层(Hidden Layer)

  • 位于输入层和输出层之间,"对外不可见",故称隐藏层
  • 真正做特征提取的地方
  • 每个隐藏层节点从所有输入层节点接收信号,计算出一个激活值
  • 本项目隐藏层有 50 个节点

隐藏层学到的东西难以用人类语言描述,但可以理解为:

  • 前几个节点可能学会"识别横线"
  • 其他节点可能学会"识别圆弧"
  • 还有节点可能学会"识别竖线"
  • 这些基础特征组合后就能识别数字

输出层(Output Layer)

  • 给出最终的分类结果
  • 对于 0-9 十个数字,输出层有 10 个节点
  • 每个节点输出一个概率值(0到1之间),表示"输入图片是这个数字的概率"
  • 10 个概率值之和 = 1
输出层示例(输入图片是数字 "7"):
  节点 0 → 0.02(是0的概率:2%)
  节点 1 → 0.01(是1的概率:1%)
  ...
  节点 7 → 0.91(是7的概率:91%)  ← 最高,预测为7
  节点 8 → 0.03(是8的概率:3%)
  节点 9 → 0.03(是9的概率:3%)

1.4 "两层"神经网络是什么意思?

一个重要的概念:层数的计数方式

"两层神经网络"中的"两层",指的是有权重(参数)的层,即执行计算的层:

输入层(784) ——[第一层权重]——> 隐藏层(50) ——[第二层权重]——> 输出层(10)
              W1, b1                          W2, b2
              ↑                               ↑
              第1层(权重层)                   第2层(权重层)
  • 输入层不算一层(它不做计算)
  • 隐藏层 + 它左边的权重矩阵 = 第 1 层
  • 输出层 + 它左边的权重矩阵 = 第 2 层

所以:两层神经网络 = 一个隐藏层 + 一个输出层


1.5 本项目网络结构全貌

输入层          隐藏层          输出层
(784节点)  →   (50节点)   →   (10节点)

每张图片         中间特征         0-9的概率
784个像素值      50个特征值        分布

参数数量:
  W1: 784×50 = 39,200 个权重
  b1:     50 个偏置
  W2:  50×10 =    500 个权重
  b2:     10 个偏置
  ─────────────────────────
  合计:39,760 个参数

训练的过程,就是不断调整这 39,760 个参数,使得网络对训练数据的预测越来越准确。


1.6 小结

概念记忆方法
神经元接收输入 → 加权求和 → 激活函数 → 输出
输入层原始数据的入口,不做计算(784个节点)
隐藏层特征提取,对外不可见(50个节点)
输出层给出最终概率分布(10个节点)
两层网络指两个有权重的层(隐藏层+输出层)

下一章,我们来解决一个关键问题:神经网络实际上是怎么用矩阵来高效计算的?维度是怎么变化的?


← 返回目录 | 第 2 章:矩阵与维度 →

基于 Kaggle MNIST 数据集,使用纯 numpy 从零实现