深度学习入门:从理论到PyTorch实践

在当今人工智能迅猛发展的时代,深度学习已成为推动技术进步的核心动力。无论是图像识别、自然语言处理,还是推荐系统,深度学习都在其中扮演着至关重要的角色。本文将带你从深度学习的基本概念出发,逐步深入到PyTorch框架的使用,并通过一个线性回归案例,完成一次完整的深度学习实践之旅。


为什么我们需要深度学习?

传统的机器学习方法依赖于人工设计特征(feature engineering),即由专家根据领域知识提取数据的关键属性,然后送入模型进行训练。这种方法在处理结构化数据时表现良好,但在面对图像、文本、音频等非结构化数据时却显得力不从心。

这些数据的特征并不直观,难以手动提取。例如,如何用数字描述一张猫的图片?是耳朵的形状?眼睛的颜色?还是整体轮廓?这些问题让传统机器学习的效果大打折扣。

于是,深度学习应运而生。它最大的优势在于:能够自动从原始数据中提取特征,无需人工干预。这使得模型可以直接“看”图片、“读”文本、“听”声音,从而在复杂任务上取得远超传统方法的性能。


什么是深度学习?

深度学习是机器学习的一个分支,其核心是人工神经网络(Artificial Neural Network)。它通过模拟人脑神经元的工作方式,构建多层网络结构,对数据进行逐层抽象和特征学习。

  • “深度” 指的是网络中包含多个隐藏层。
  • 低层网络学习简单特征(如图像中的边缘、颜色)。
  • 高层网络则组合这些简单特征,识别更复杂的模式(如人脸、物体)。

与传统机器学习相比,深度学习的最大区别在于:它不需要人工特征工程,而是由算法自动完成特征提取

深度学习的发展简史

  • 2006年:深度学习概念正式提出。
  • 2012年:AlexNet在ImageNet图像识别大赛中夺冠,引爆深度学习热潮。
  • 2017年:Transformer架构诞生,为大语言模型(如ChatGPT)奠定基础。
  • 2022年:ChatGPT发布,将深度学习推向公众视野。

深度学习的特点

优点

  1. 自动特征提取:无需人工设计特征,模型自行学习。
  2. 高精度:在图像、语音、NLP等领域性能远超传统算法,某些任务甚至超越人类。
  3. 强大的拟合能力:可以拟合任意复杂的非线性关系。
  4. 丰富的框架支持:如PyTorch、TensorFlow等,开发者无需“造轮子”。

缺点

  1. 黑箱问题:模型内部运作机制不透明,可解释性差。
  2. 参数庞大:现代大模型动辄数十亿甚至上千亿参数(如7B、32B、128B)。
  3. 算力需求高:训练时间长,依赖GPU等高性能计算资源。
  4. 依赖大数据:在小数据集上容易过拟合,表现不佳。

主要应用场景

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这样的高级框架,我们可以高效地构建和训练模型。

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐