深度学习入门:从感知机到手写数字识别实现

109 阅读4分钟

从感知机到神经网络:手写数字识别原理与实现

一、前置知识回顾

在深入理解神经网络之前,我们需要掌握几个关键的数学概念:

1. 向量与矩阵

  • 向量:一维数组,可用于表示单个数据样本的特征
  • 矩阵:二维数组,可高效表示多个数据样本或进行线性变换
  • 矩阵乘法:神经网络中前向传播和反向传播的核心运算

2. 微分与导数

  • 用于计算梯度,指导模型参数的更新方向
  • 反向传播算法的数学基础

二、感知机:神经网络的基础单元

2.1 感知机模型

感知机是神经网络的基本构建块,其数学模型为:

text

y = f(w₁x₁ + w₂x₂ + ... + wₙxₙ + b)

其中:

  • x₁, x₂, ..., xₙ:输入特征
  • w₁, w₂, ..., wₙ:权重参数
  • b:偏置项
  • f:激活函数(通常为阶跃函数)

image.png

2.2 感知机的局限性

单一感知机只能解决线性可分问题,无法处理复杂的非线性关系,如著名的"异或"问题。这促使了多层感知机(神经网络)的发展。

三、神经网络:从感知机到深度学习

3.1 神经网络结构

神经网络通过将多个感知机组合成层,并通过非线性激活函数连接这些层,从而能够学习复杂的非线性关系。

image.png

典型的三层神经网络包括:

  1. 输入层:接收原始数据
  2. 隐藏层:进行特征提取和变换
  3. 输出层:产生最终预测结果

3.2 激活函数

激活函数引入了非线性,使神经网络能够学习复杂模式。常用的激活函数包括:

  • Sigmoid函数
  • ReLU函数
  • Tanh函数

四、MNIST手写数字识别实战

1、数字库 MNIST的图像数据是28像素×28像素的灰度图像(1通道)​,各个像素的取值在0到255之间。每个图像数据都相应地标有“7”​“2”​“1”等标签。

image.png

2、想象一下计算过程

image.png

3、转换为向量

image.png

4、训练数据和测试数据

4、样本数据里面,每张图片包含一个tk标记(监督数据),训练数据对比计算误差(均方误差)

image.png

均方误差公式

image.png

反向传播示意图

image.png

训练过程

image.png

4.1 MNIST数据集介绍

MNIST是一个经典的手写数字识别数据集,包含:

  • 60,000个训练样本
  • 10,000个测试样本
  • 每个样本是28×28像素的灰度图像
  • 标签为0-9的数字

image.png

4.2 网络架构设计

对于MNIST分类任务,我们设计如下神经网络:

text

输入层: 784个神经元 (28×28像素)
隐藏层: 128个神经元 (可调整)
输出层: 10个神经元 (对应0-9十个数字)

4.3 前向传播过程

前向传播计算预测结果:

python

# 伪代码示例
def forward_propagation(X, W1, b1, W2, b2):
    # 输入层到隐藏层
    Z1 = X.dot(W1) + b1
    A1 = relu(Z1)  # 使用ReLU激活函数
    
    # 隐藏层到输出层
    Z2 = A1.dot(W2) + b2
    A2 = softmax(Z2)  # 使用softmax激活函数进行多分类
    
    return A2, Z2, A1, Z1

4.4 损失函数与反向传播

使用交叉熵损失函数衡量预测与真实标签的差异:

python

def compute_loss(Y, Y_hat):
    # Y: 真实标签 (one-hot编码)
    # Y_hat: 预测概率
    m = Y.shape[0]
    loss = -np.sum(Y * np.log(Y_hat)) / m
    return loss

通过反向传播计算梯度并更新参数:

python

def backward_propagation(X, Y, Y_hat, W1, b1, W2, b2, A1, Z1, learning_rate):
    m = X.shape[0]
    
    # 输出层梯度
    dZ2 = Y_hat - Y
    dW2 = (A1.T).dot(dZ2) / m
    db2 = np.sum(dZ2, axis=0, keepdims=True) / m
    
    # 隐藏层梯度
    dA1 = dZ2.dot(W2.T)
    dZ1 = dA1 * (Z1 > 0)  # ReLU导数
    dW1 = (X.T).dot(dZ1) / m
    db1 = np.sum(dZ1, axis=0, keepdims=True) / m
    
    # 参数更新
    W1 = W1 - learning_rate * dW1
    b1 = b1 - learning_rate * db1
    W2 = W2 - learning_rate * dW2
    b2 = b2 - learning_rate * db2
    
    return W1, b1, W2, b2

4.5 训练流程

完整的训练过程包括:

  1. 数据预处理:归一化像素值,one-hot编码标签

  2. 参数初始化:随机初始化权重和偏置

  3. 迭代训练

    • 前向传播计算预测值
    • 计算损失函数
    • 反向传播计算梯度
    • 使用梯度下降更新参数
  4. 模型评估:在测试集上评估模型性能

4.6 实现效果

经过充分训练后,简单的神经网络在MNIST数据集上可以达到约95-97%的准确率。更复杂的网络结构(如卷积神经网络)可以进一步提升性能至99%以上。

5、基于向量降维模式,可以实现图片压缩

6、幻觉

image.png