深度学习入门(1)

57 阅读3分钟

开启新的篇章,做AI时代的同行者

第一篇是一个简单的热身,假定读者也有一定的线性代数和机器学习基础。

背景

计划用半年的业余时间,系统的学习AI

子项内容时间
深度学习常见的深度算法、优化2个月
大模型常见的大模型使用、部署、调优1个月
PE、agentAI偏工程的应用开发技术1个月
产品实践尝试用AI能力做出一款产品,推向市场2个月

第一本书

先从深度学习开始,通读一本书《深度学习详解》,配合李宏毅老师的视频课程,建立深度学习的认知框架。

实践

以《深度学习详解》的作业为参考,进行实践,逐步强化对深度学习的理解

深度学习前置知识

开发语言 python

框架 pytorch

神经网络训练流程

整个神经网络的训练流程如上图,往大了划分,就两个阶段,一是加载数据,二是训练:

  1. Load Data (准备数据&加载数据)
  • Trainging (训练阶段使用的数据)
  • Validation (训练阶段使用的校验数据)
  • Testing (测试使用的数据)
  1. Training(训练)
  • Define Neural Network (定义网络模型)

  • Loss Function (定义损失函数)

  • Optimization Algorithm(优化方法)

    优化方法值的是,怎么能快速的将损失函数的值降到最低

极简Demo

两行代码讲下torch使用

pytorch环境配置的教程网上有很多,不再赘述了

demo 1,只有一个线性层的model

import torch
print(torch.__version__)
print(torch.cuda.is_available())

# 将模型移到 GPU
model = torch.nn.Linear(5, 1).to("cuda:0")

# 将输入张量 x 也移到 GPU
x = torch.randn(5).to("cuda:0")  # 修改这里,将 x 移到 GPU

# 进行前向计算
y = model(x)
print(y)
print(x.shape)
model.weight.shape

# 输出
# 2.6.0+cu124
# True
# tensor([0.4126], device='cuda:0', grad_fn=<ViewBackward0>)
# torch.Size([5])
# torch.Size([1, 5])

注意,torch.nn.Linear(5, 1)实际上声明了一个(1,5)的矩阵,而实际计算时会进行转置再右乘,这和我们直观的理解为左乘是不一样的。

XinputWTX_{input} * W^{T}

如果输入是一个样本5个特征,则矩阵相乘的情况是:

[11111][11111]\begin{bmatrix} 1 & 1 & 1 & 1 & 1 \end{bmatrix} * \begin{bmatrix} 1\\ 1\\ 1\\ 1\\ 1\\ \end{bmatrix}

输出是1个值:[5]

这样的好处是,方便批处理。如果输入是2样本,即X(2 * 5),则矩阵相乘的情况是:

[1111122222][11111]\begin{bmatrix} 1 & 1 & 1 & 1 & 1 \\ 2 & 2 & 2 & 2 & 2 \\ \end{bmatrix} * \begin{bmatrix} 1\\ 1\\ 1\\ 1\\ 1\\ \end{bmatrix}

输出的结果是[5,10]T[5,10]^T (2行一列)

demo 2 加上bias

nn.Linear实际在后面还有个bias(偏移):

y=XinputWT+biasy = X_{input} * W^{T} + bias

看个demo

import torch

x = torch.tensor([1.0, 2.0, 3.0, 4.0, 5.0])
model = torch.nn.Linear(5, 1)

# 手动设置权重和偏置值(固定值)
model.weight.data = torch.tensor([[0.1, 0.2, 0.3, 0.4, 0.5]])  # 权重 W,形状 [1, 5]
model.bias.data = torch.tensor([0.5])  # 偏置项 b,形状 [1]

# 前向计算
y = model(x)  # 结果 y 的 shape: [1, 1]

print(y)

实际的计算是

y=(10.1)+(20.2)+(30.3)+(40.4)+(50.5)+0.5=6.0y=(1⋅0.1)+(2⋅0.2)+(3⋅0.3)+(4⋅0.4)+(5⋅0.5)+0.5=6.0

实际一个线性层的权重参数会比较多,而一个深度学习模型也远不止一个线性层,而是有多个先形成ReLU层,加上其他的池化操作像搭积木一样堆叠而成。

如果某个线性层input是32个参数,output是64个参数,则整个链路如下(注意,实际在torch框架中输入input X是行向量,权重W是转置后再右乘,即下图中W 和X互换位置):