开启新的篇章,做AI时代的同行者
第一篇是一个简单的热身,假定读者也有一定的线性代数和机器学习基础。
背景
计划用半年的业余时间,系统的学习AI
子项 | 内容 | 时间 |
---|---|---|
深度学习 | 常见的深度算法、优化 | 2个月 |
大模型 | 常见的大模型使用、部署、调优 | 1个月 |
PE、agent | AI偏工程的应用开发技术 | 1个月 |
产品实践 | 尝试用AI能力做出一款产品,推向市场 | 2个月 |
第一本书
先从深度学习开始,通读一本书《深度学习详解》,配合李宏毅老师的视频课程,建立深度学习的认知框架。
实践
以《深度学习详解》的作业为参考,进行实践,逐步强化对深度学习的理解
深度学习前置知识
开发语言 python
框架 pytorch
神经网络训练流程
整个神经网络的训练流程如上图,往大了划分,就两个阶段,一是加载数据,而是训练:
- Load Data (准备数据&加载数据)
- Trainging (训练阶段使用的数据)Validation (训练阶段使用的校验数据)Testing (测试使用的数据)
- Training(训练)
Define Neural Network (定义网络模型)
Loss Function (定义损失函数)
Optimization Algorithm(优化方法)
优化方法值的是,怎么能快速的将损失函数的值降到最低
极简Demo
两行代码讲下torch使用
pytorch环境配置的教程网上有很多,不再赘述了
demo 1,只有一个线性层的model
import torchprint(torch.__version__)print(torch.cuda.is_available())# 将模型移到 GPUmodel = torch.nn.Linear(5, 1).to("cuda:0")# 将输入张量 x 也移到 GPUx = 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)的矩阵,而实际计算时会进行转置再右乘,这和我们直观的理解为左乘是不一样的。
如果输入是一个样本5个特征,则矩阵相乘的情况是:
输出是1个值:[5]
这样的好处是,方便批处理。如果输入是2样本,即X(2 * 5),则矩阵相乘的情况是:
输出的结果是 (2行一列)
demo 2 加上bias
nn.Linear实际再后面还有个bias(偏移):
看个demo
import torchx = 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)
实际的计算是
实际一个线性层的权重参数会比较多,而一个深度学习模型也远不止一个线性层,而是有多个先形成ReLU层,加上其他的池化操作像搭积木一样堆叠而成。
如果某个线性层input是32个参数,output是64个参数,则整个链路如下(注意,实际在torch框架中输入input X是行向量,权重W是转置后再右乘,即下图中W 和X互换位置):