5.AI入门:从机器学习到生成式AI,普通人也能看懂(五)—— 深度学习入门
系列导读:前面我们学习了传统机器学习,今天进入AI最热门的领域——深度学习。这是近年来AI取得突破性进展的关键技术。
一、什么是深度学习?
1.1 从生物神经元说起
人脑由约860亿个神经元组成,每个神经元通过突触与其他神经元连接,形成复杂的网络。
神经元的工作方式:
输入信号 → 树突 ↓ 细胞体处理(加权求和) ↓ 轴突输出(激活或抑制)1.2 人工神经网络
模拟生物神经网络的计算模型。
人工神经元(感知机): x₁ → w₁ → ┐ x₂ → w₂ → ├→ Σ → 激活函数 → 输出 x₃ → w₃ → ┘ 输出 = 激活函数(w₁x₁ + w₂x₂ + w₃x₃ + b)1.3 深度学习的"深度"
深度 = 神经网络的层数
单层感知机:输入层 → 输出层 浅层网络:输入层 → 1个隐藏层 → 输出层 深度网络:输入层 → 多个隐藏层 → 输出层深度学习 = 使用深层神经网络的机器学习方法。
1.4 与传统机器学习的区别
| 对比项 | 传统机器学习 | 深度学习 |
|---|---|---|
| 特征工程 | 人工设计 | 自动学习 |
| 数据需求 | 相对较少 | 需要大量数据 |
| 计算资源 | CPU即可 | 通常需要GPU |
| 模型复杂度 | 相对简单 | 非常复杂 |
| 可解释性 | 较好 | 较差(黑盒) |
| 表达能力 | 有限 | 强大 |
二、神经网络的基本结构
2.1 层的类型
输入层
接收原始数据。
例如图像分类: 输入层 = 图像像素值 28×28图像 → 784个输入节点隐藏层
进行特征提取和变换。
第1隐藏层:提取低级特征(边缘、角点) 第2隐藏层:提取中级特征(形状、纹理) 第3隐藏层:提取高级特征(物体部件)输出层
输出最终结果。
分类任务:输出各类别的概率 回归任务:输出预测值2.2 前向传播
数据从输入层经过各隐藏层到达输出层的过程。
输入 x ↓ 隐藏层1:h₁ = f(W₁x + b₁) ↓ 隐藏层2:h₂ = f(W₂h₁ + b₂) ↓ 输出层:y = f(W₃h₂ + b₃)2.3 激活函数
引入非线性,使网络能学习复杂模式。
常用激活函数
Sigmoid:
f(x) = 1 / (1 + e^(-x)) 输出范围:(0, 1)ReLU(最常用):
f(x) = max(0, x) x > 0时:f(x) = x x ≤ 0时:f(x) = 0Tanh:
f(x) = (e^x - e^(-x)) / (e^x + e^(-x)) 输出范围:(-1, 1)Softmax(多分类输出):
将输出转换为概率分布,所有类别概率和为1三、神经网络的训练
3.1 损失函数
衡量预测值与真实值的差距。
回归任务:均方误差(MSE) L = (1/n) Σ(y_pred - y_true)² 分类任务:交叉熵损失(Cross Entropy) L = -Σ y_true × log(y_pred)3.2 反向传播
计算损失对各参数的梯度,指导参数更新。
前向传播:计算预测值和损失 ↓ 反向传播:计算梯度 ↓ 参数更新:调整权重和偏置链式法则:
∂L/∂w = ∂L/∂y × ∂y/∂h × ∂h/∂w3.3 梯度下降
沿着梯度的反方向更新参数,使损失减小。
w_new = w_old - learning_rate × ∂L/∂w梯度下降的变种
| 方法 | 特点 |
|---|---|
| 批量梯度下降 | 使用全部数据,稳定但慢 |
| 随机梯度下降(SGD) | 使用单个样本,快但震荡 |
| 小批量梯度下降 | 折中方案,最常用 |
| Adam | 自适应学习率,效果好 |
3.4 训练流程
1. 初始化网络参数 2. for epoch in range(epochs): 3. for batch in data: 4. 前向传播,计算损失 5. 反向传播,计算梯度 6. 更新参数 7. 评估验证集性能 8. 保存最优模型四、常见的神经网络架构
4.1 全连接神经网络(DNN/MLP)
每个神经元与上一层所有神经元连接。
输入层 隐藏层1 隐藏层2 输出层 ○ ──────→ ○ ──────→ ○ ──────→ ○ ○ ──────→ ○ ──────→ ○ ──────→ ○ ○ ──────→ ○ ──────→ ○ ──────→ ○**应用:**表格数据分类/回归
4.2 卷积神经网络(CNN)
专门处理图像数据,通过卷积提取局部特征。
核心组件
卷积层:
用卷积核在图像上滑动,提取特征 原图 卷积核 特征图 ■■□□ ■■ ■■□□ ★ ■■ = ■■■ □□□□池化层:
降采样,减少参数,增强鲁棒性 特征图 最大池化 输出 ■■□□ ■■□□ → ■ → ■ □□■■ ■ ■ □□■■经典CNN架构
LeNet(1998):手写数字识别 AlexNet(2012):ImageNet冠军,深度学习爆发 VGG(2014):深层网络 ResNet(2015):残差连接,解决深层网络训练问题**应用:**图像分类、目标检测、人脸识别
4.3 循环神经网络(RNN)
处理序列数据,具有记忆能力。
时间步t: h_t = f(h_{t-1}, x_t) h₁ → h₂ → h₃ → ... ↑ ↑ ↑ x₁ x₂ x₃LSTM和GRU
解决RNN的长期依赖问题。
LSTM:引入门控机制,选择性记忆和遗忘 - 遗忘门:决定丢弃哪些信息 - 输入门:决定存储哪些新信息 - 输出门:决定输出哪些信息**应用:**文本生成、机器翻译、语音识别
4.4 Transformer
当前最流行的架构,ChatGPT等大模型的基础。
核心机制:自注意力
计算序列中每个位置与其他位置的相关性 Attention(Q, K, V) = softmax(QK^T / √d) V Q:查询矩阵 K:键矩阵 V:值矩阵优势:
- 并行计算(不像RNN需要顺序处理)
- 长距离依赖建模能力强
- 可扩展性好
**应用:**NLP、大语言模型、多模态模型
五、深度学习的关键概念
5.1 批量大小(Batch Size)
一次训练使用的样本数量。
Batch Size = 32:一次用32个样本更新参数 Batch Size = 1:随机梯度下降 Batch Size = 全部数据:批量梯度下降5.2 学习率(Learning Rate)
控制参数更新的步长。
学习率太大:震荡,无法收敛 学习率太小:收敛太慢,可能陷入局部最优5.3 Epoch
遍历整个训练数据集的次数。
10000个样本,Batch Size = 100 1个Epoch = 100次迭代(更新)5.4 正则化
防止过拟合的技术。
| 方法 | 说明 |
|---|---|
| Dropout | 随机丢弃部分神经元 |
| L1/L2正则化 | 在损失函数中加入正则项 |
| Batch Normalization | 批归一化,加速训练 |
| 早停(Early Stopping) | 验证集性能不再提升时停止 |
5.5 数据增强
通过变换增加训练数据多样性。
图像增强: - 翻转、旋转、缩放 - 裁剪、平移 - 颜色调整、添加噪声六、深度学习框架
6.1 主流框架
| 框架 | 开发者 | 特点 |
|---|---|---|
| PyTorch | 动态图,易调试,学术首选 | |
| TensorFlow | 静态图,部署方便,工业首选 | |
| Keras | 高层API | 简单易用,适合入门 |
| JAX | 高性能,自动微分 |
6.2 PyTorch示例
importtorchimporttorch.nnasnnimporttorch.optimasoptim# 定义模型classSimpleNN(nn.Module):def__init__(self):super().__init__()self.fc1=nn.Linear(784,128)self.fc2=nn.Linear(128,10)self.relu=nn.ReLU()defforward(self,x):x=self.relu(self.fc1(x))x=self.fc2(x)returnx# 创建模型model=SimpleNN()criterion=nn.CrossEntropyLoss()optimizer=optim.Adam(model.parameters(),lr=0.001)# 训练循环forepochinrange(10):fordata,targetintrain_loader:optimizer.zero_grad()output=model(data)loss=criterion(output,target)loss.backward()optimizer.step()七、动手实践:神经网络完整示例
7.1 环境准备
pipinstalltorch torchvision numpy matplotlib7.2 手写数字识别完整代码
""" 深度学习入门:手写数字识别(MNIST) 使用PyTorch实现一个完整的神经网络 """importtorchimporttorch.nnasnnimporttorch.optimasoptimfromtorchvisionimportdatasets,transformsfromtorch.utils.dataimportDataLoaderimportmatplotlib.pyplotasplt# 1. 数据准备transform=transforms.Compose([transforms.ToTensor(),transforms.Normalize((0.1307,),(0.3081,))])# 下载MNIST数据集train_dataset=datasets.MNIST('./data',train=True,download=True,transform=transform)test_dataset=datasets.MNIST('./data',train=False,transform=transform)train_loader=DataLoader(train_dataset,batch_size=64,shuffle=True)test_loader=DataLoader(test_dataset,batch_size=1000)print(f"训练集大小:{len(train_dataset)}")print(f"测试集大小:{len(test_dataset)}")# 2. 定义神经网络classNeuralNetwork(nn.Module):def__init__(self):super().__init__()# 输入层 → 隐藏层1 (784 → 256)self.fc1=nn.Linear(784,256)# 隐藏层1 → 隐藏层2 (256 → 128)self.fc2=nn.Linear(256,128)# 隐藏层2 → 输出层 (128 → 10)self.fc3=nn.Linear(128,10)# 激活函数self.relu=nn.ReLU()# Dropout防止过拟合self.dropout=nn.Dropout(0.2)defforward(self,x):# 展平图像 (batch, 1, 28, 28) → (batch, 784)x=x.view(-1,784)# 前向传播x=self.dropout(self.relu(self.fc1(x)))x=self.dropout(self.relu(self.fc2(x)))x=self.fc3(x)returnx# 3. 创建模型device=torch.device("cuda"iftorch.cuda.is_available()else"cpu")model=NeuralNetwork().to(device)print(f"\n使用设备:{device}")print(f"模型结构:\n{model}")# 4. 定义损失函数和优化器criterion=nn.CrossEntropyLoss()optimizer=optim.Adam(model.parameters(),lr=0.001)# 5. 训练函数deftrain(model,loader,criterion,optimizer,epoch):model.train()total_loss=0correct=0fordata,targetinloader:data,target=data.to(device),target.to(device)optimizer.zero_grad()output=model(data)loss=criterion(output,target)loss.backward()optimizer.step()total_loss+=loss.item()pred=output.argmax(dim=1)correct+=pred.eq(target).sum().item()accuracy=100.*correct/len(loader.dataset)returntotal_loss/len(loader),accuracy# 6. 测试函数deftest(model,loader,criterion):model.eval()total_loss=0correct=0withtorch.no_grad():fordata,targetinloader:data,target=data.to(device),target.to(device)output=model(data)total_loss+=criterion(output,target).item()pred=output.argmax(dim=1)correct+=pred.eq(target).sum().item()accuracy=100.*correct/len(loader.dataset)returntotal_loss/len(loader),accuracy# 7. 训练模型print("\n开始训练...")train_losses,test_losses=[],[]train_accs,test_accs=[],[]forepochinrange(1,6):train_loss,train_acc=train(model,train_loader,criterion,optimizer,epoch)test_loss,test_acc=test(model,test_loader,criterion)train_losses.append(train_loss)test_losses.append(test_loss)train_accs.append(train_acc)test_accs.append(test_acc)print(f"Epoch{epoch}: "f"Train Loss={train_loss:.4f}, Acc={train_acc:.2f}% | "f"Test Loss={test_loss:.4f}, Acc={test_acc:.2f}%")# 8. 可视化训练过程fig,(ax1,ax2)=plt.subplots(1,2,figsize=(12,4))ax1.plot(train_losses,label='Train Loss')ax1.plot(test_losses,label='Test Loss')ax1.set_xlabel('Epoch')ax1.set_ylabel('Loss')ax1.set_title('训练和测试损失')ax1.legend()ax1.grid(True,alpha=0.3)ax2.plot(train_accs,label='Train Acc')ax2.plot(test_accs,label='Test Acc')ax2.set_xlabel('Epoch')ax2.set_ylabel('Accuracy (%)')ax2.set_title('训练和测试准确率')ax2.legend()ax2.grid(True,alpha=0.3)plt.tight_layout()plt.savefig('training_history.png',dpi=150)plt.show()print(f"\n最终测试准确率:{test_accs[-1]:.2f}%")输出示例:
训练集大小: 60000 测试集大小: 10000 使用设备: cuda 模型结构: NeuralNetwork( (fc1): Linear(in_features=784, out_features=256, bias=True) (fc2): Linear(in_features=256, out_features=128, bias=True) (fc3): Linear(in_features=128, out_features=10, bias=True) (relu): ReLU() (dropout): Dropout(p=0.2, inplace=False) ) 开始训练... Epoch 1: Train Loss=0.2834, Acc=91.58% | Test Loss=0.1523, Acc=95.42% Epoch 2: Train Loss=0.1423, Acc=95.75% | Test Loss=0.1124, Acc=96.68% Epoch 3: Train Loss=0.1089, Acc=96.78% | Test Loss=0.0956, Acc=97.12% Epoch 4: Train Loss=0.0892, Acc=97.35% | Test Loss=0.0878, Acc=97.34% Epoch 5: Train Loss=0.0756, Acc=97.75% | Test Loss=0.0823, Acc=97.52% 最终测试准确率: 97.52%7.3 预测单张图片
""" 预测单张手写数字图片 """importtorchfromtorchvisionimporttransformsfromPILimportImagedefpredict_digit(model,image_path):"""预测单张图片"""model.eval()# 图像预处理transform=transforms.Compose([transforms.Grayscale(),transforms.Resize((28,28)),transforms.ToTensor(),transforms.Normalize((0.1307,),(0.3081,))])# 加载并处理图片image=Image.open(image_path)image=transform(image).unsqueeze(0).to(device)# 预测withtorch.no_grad():output=model(image)pred=output.argmax(dim=1).item()prob=torch.softmax(output,dim=1)[0][pred].item()returnpred,prob# 使用示例# digit, confidence = predict_digit(model, 'my_digit.png')# print(f"预测结果: {digit}, 置信度: {confidence:.2%}")八、深度学习的应用
| 领域 | 应用 | 架构 |
|---|---|---|
| 计算机视觉 | 图像分类、目标检测 | CNN |
| 自然语言处理 | 文本分类、机器翻译 | Transformer |
| 语音识别 | 语音转文字 | RNN/Transformer |
| 推荐系统 | 个性化推荐 | DNN |
| 游戏AI | AlphaGo、游戏对战 | 强化学习+DNN |
| 自动驾驶 | 环境感知、决策 | CNN+RNN |
| 医疗影像 | 病灶检测、辅助诊断 | CNN |
八、深度学习的挑战
8.1 需要大量数据
深度学习是数据饥渴型技术。
解决方案:
- 迁移学习:用预训练模型微调
- 数据增强:增加数据多样性
- 半监督学习:利用无标签数据
8.2 计算资源需求高
训练大模型需要大量GPU。
解决方案:
- 使用云平台(AWS、阿里云等)
- 使用预训练模型
- 模型压缩和优化
8.3 可解释性差
深度学习是"黑盒",难以解释决策原因。
解决方案:
- 可解释AI研究
- 注意力可视化
- 特征图可视化
8.4 容易过拟合
模型复杂度高,容易记住训练数据。
解决方案:
- 正则化(Dropout、L1/L2)
- 数据增强
- 早停
九、小结
- 深度学习 = 使用深层神经网络的机器学习方法
- 核心:模拟人脑神经元的工作方式
- 训练:前向传播→计算损失→反向传播→参数更新
- 常见架构:DNN、CNN、RNN、Transformer
- 优势:自动特征学习,表达能力强
- 挑战:数据需求大、计算资源高、可解释性差
十、思考题
深度学习与传统机器学习的主要区别是什么?
CNN、RNN、Transformer各适合处理什么类型的数据?为什么?
什么是过拟合?深度学习中如何防止过拟合?
下一篇预告:我们将深入探讨自然语言处理——让机器理解人类语言的技术,这是ChatGPT等应用的基础。
标签:深度学习神经网络CNNRNNTransformerAI入门
版权声明:本文为原创内容,转载请注明出处。
