深度学习入门:从理论到PyTorch实践
深度学习入门:从理论到PyTorch实践
在当今人工智能迅猛发展的时代,深度学习已成为推动技术进步的核心动力。无论是图像识别、自然语言处理,还是推荐系统,深度学习都在其中扮演着至关重要的角色。本文将带你从深度学习的基本概念出发,逐步深入到PyTorch框架的使用,并通过一个线性回归案例,完成一次完整的深度学习实践之旅。
为什么我们需要深度学习?
传统的机器学习方法依赖于人工设计特征(feature engineering),即由专家根据领域知识提取数据的关键属性,然后送入模型进行训练。这种方法在处理结构化数据时表现良好,但在面对图像、文本、音频等非结构化数据时却显得力不从心。
这些数据的特征并不直观,难以手动提取。例如,如何用数字描述一张猫的图片?是耳朵的形状?眼睛的颜色?还是整体轮廓?这些问题让传统机器学习的效果大打折扣。
于是,深度学习应运而生。它最大的优势在于:能够自动从原始数据中提取特征,无需人工干预。这使得模型可以直接“看”图片、“读”文本、“听”声音,从而在复杂任务上取得远超传统方法的性能。
什么是深度学习?
深度学习是机器学习的一个分支,其核心是人工神经网络(Artificial Neural Network)。它通过模拟人脑神经元的工作方式,构建多层网络结构,对数据进行逐层抽象和特征学习。
- “深度” 指的是网络中包含多个隐藏层。
- 低层网络学习简单特征(如图像中的边缘、颜色)。
- 高层网络则组合这些简单特征,识别更复杂的模式(如人脸、物体)。
与传统机器学习相比,深度学习的最大区别在于:它不需要人工特征工程,而是由算法自动完成特征提取。
深度学习的发展简史
- 2006年:深度学习概念正式提出。
- 2012年:AlexNet在ImageNet图像识别大赛中夺冠,引爆深度学习热潮。
- 2017年:Transformer架构诞生,为大语言模型(如ChatGPT)奠定基础。
- 2022年:ChatGPT发布,将深度学习推向公众视野。
深度学习的特点
优点
- 自动特征提取:无需人工设计特征,模型自行学习。
- 高精度:在图像、语音、NLP等领域性能远超传统算法,某些任务甚至超越人类。
- 强大的拟合能力:可以拟合任意复杂的非线性关系。
- 丰富的框架支持:如PyTorch、TensorFlow等,开发者无需“造轮子”。
缺点
- 黑箱问题:模型内部运作机制不透明,可解释性差。
- 参数庞大:现代大模型动辄数十亿甚至上千亿参数(如7B、32B、128B)。
- 算力需求高:训练时间长,依赖GPU等高性能计算资源。
- 依赖大数据:在小数据集上容易过拟合,表现不佳。
主要应用场景
1. 自然语言处理(NLP)
- 机器翻译:Google翻译、实时语音翻译。
- 情感分析:分析社交媒体评论的情感倾向。
- 文本生成:自动写作、新闻生成。
- 语音识别:Siri、Alexa等智能助手。
2. 大模型(Large Language Models)
- Prompt Engineering:提示词工程。
- RAG(检索增强生成):结合外部知识生成更准确的回答。
- Fine-Tuning:微调模型以适应特定任务。
3. 计算机视觉(CV)
- 图像分类:人脸识别、物体识别。
- 目标检测:在图像中定位并识别多个对象。
- 图像生成:风格迁移、超分辨率重建。
4. 推荐系统
- 电商推荐:淘宝、亚马逊的商品推荐。
- 内容推荐:抖音、Instagram的个性化内容推送。
PyTorch:深度学习的利器
深度学习是一种思想,而PyTorch是实现这种思想的工具之一。它是一个基于Python的深度学习框架,与TensorFlow、Keras、PaddlePaddle等并列。
PyTorch的核心是张量(Tensor),它类似于NumPy的数组,但支持GPU加速,极大提升了计算效率。
PyTorch安装与环境配置
# 查看现有环境
conda env list
# 创建新环境
conda create -n dl python=3.8.8
# 激活环境
conda activate dl
# 安装PyTorch
pip install torch==2.4.1 -i https://pypi.tuna.tsinghua.edu.cn/simple/
# 卸载
pip uninstall torch
# 删除环境
conda remove -n dl --all
PyTorch核心:张量(Tensor)
张量是深度学习中的基本数据结构,本质上是一个多维数组。
| 维度 | 名称 | 示例 | Shape |
|---|---|---|---|
| 0维 | 标量(Scalar) | 3 | () |
| 1维 | 向量(Vector) | [1, 3, 5, 7] | (4,) |
| 2维 | 矩阵(Matrix) | [[1,3],[5,7]] | (2,2) |
| 3维及以上 | 高维张量 | [[[1,3]]] | (1,1,2) |
张量的创建
import torch
# 创建标量
t1 = torch.tensor(10)
# 创建数组
t2 = torch.tensor([[10., 20., 30.], [40., 50., 60]])
# 创建全1、全0、指定值张量
ones = torch.ones(2, 3)
zeros = torch.zeros(3, 2)
full = torch.full((2, 3), 3)
# 创建随机张量
torch.manual_seed(22)
rand = torch.randn(2, 3)
张量与NumPy的互转
import numpy as np
# NumPy -> Tensor
np_array = np.array([[1, 2], [3, 4]])
tensor = torch.from_numpy(np_array) # 共享内存
tensor = torch.tensor(np_array) # 不共享内存
# Tensor -> NumPy
np_back = tensor.numpy() # 共享内存
张量的基本运算
1. 基本数学运算
data = torch.randint(0, 10, (2, 3))
print(data.add(1)) # 加
print(data.sub(1)) # 减
print(data.mul(2)) # 乘
print(data.div(2)) # 除
print(data.neg()) # 取负
带下划线的方法(如add_)会修改原张量。
2. 矩阵乘法
*或mul():点乘(Hadamard积),对应元素相乘。@或torch.matmul():矩阵乘积,满足(n,m) x (m,p) = (n,p)。torch.mm():仅用于二维矩阵。torch.bmm():用于三维张量的批量矩阵乘法。
3. 常用运算函数
data = torch.randn(3, 2)
print(data.mean()) # 均值
print(data.sum()) # 求和
print(data.sqrt()) # 平方根
print(data.exp()) # 指数
print(data.log()) # 对数
张量的索引与形状操作
索引操作
data = torch.randint(0, 10, (4, 5))
print(data[2]) # 第2行
print(data[:, 2]) # 第2列
print(data[:2, :3]) # 前2行前3列
print(data[data > 5]) # 布尔索引
形状操作
data = torch.tensor([[10, 20, 30], [40, 50, 60]])
# reshape
data = data.reshape(3, 2)
# 增加/删除维度
data = data.unsqueeze(-1) # 增维
data = data.squeeze() # 降维
# 转置
data = data.transpose(0, 1)
data = data.permute(1, 0)
# 拼接
data1 = torch.randn(1, 2, 3)
data2 = torch.randn(1, 2, 3)
cat = torch.cat([data1, data2], dim=0)
自动微分:反向传播的核心
深度学习依赖梯度下降优化模型参数。PyTorch通过autograd模块实现自动求导。
x = torch.tensor(3., requires_grad=True)
y = x ** 2
y.backward() # 反向传播
print(x.grad) # 输出梯度:6.0
关键点:
- 需要计算梯度的张量设置
requires_grad=True。 - 使用
loss.backward()触发反向传播。 - 梯度通过
grad属性访问。 - 每次更新参数前需调用
optimizer.zero_grad()清零梯度。
实战:PyTorch线性回归
我们使用PyTorch的标准组件构建一个线性回归模型:
import torch
import torch.nn as nn
import torch.optim as optim
from sklearn.datasets import make_regression
from torch.utils.data import DataLoader, TensorDataset
# 1. 生成数据
def get_dataset():
x, y, coef = make_regression(n_samples=100, n_features=1, noise=10, coef=True, random_state=22)
return torch.tensor(x, dtype=torch.float32), torch.tensor(y, dtype=torch.float32), coef
# 2. 构建模型
model = nn.Linear(1, 1)
loss_fn = nn.MSELoss()
optimizer = optim.SGD(model.parameters(), lr=0.01)
# 3. 训练
x, y, true_coef = get_dataset()
dataset = TensorDataset(x, y)
dataloader = DataLoader(dataset, batch_size=8, shuffle=True)
for epoch in range(100):
for x_batch, y_batch in dataloader:
y_pred = model(x_batch)
loss = loss_fn(y_pred, y_batch.reshape(-1, 1))
optimizer.zero_grad()
loss.backward()
optimizer.step()
if epoch % 20 == 0:
print(f"Epoch {epoch}, Loss: {loss.item():.4f}")
# 4. 可视化结果
import matplotlib.pyplot as plt
plt.scatter(x, y)
plt.plot(x, model(x).detach(), label='Predicted')
plt.plot(x, x * true_coef + 1.5, label='True')
plt.legend()
plt.show()
总结
本文从深度学习的基本概念出发,介绍了其优势、应用场景,并通过PyTorch框架展示了张量操作、自动微分和模型训练的完整流程。深度学习虽然复杂,但借助PyTorch这样的高级框架,我们可以高效地构建和训练模型。
更多推荐



所有评论(0)