线性回归从零到实战:深度学习基础与大模型入门必学指南!
初衷
费曼学习法是一种高效的学习方法,其核心思想是 “以教促学” ,通过尝试向他人解释一个概念来检验自己的理解,因此从来没有自媒体经验的我,在此开辟一个“栏目”,名曰“深度学习:从线性回归到AIGC”,意在分享学习成果和见解。“栏目”所分享的内容偏实践,纵然理解和解释一件事物的方法有千万种,实践最直接,因此以下内容有较多代码实现,读者朋友可能需要具备一些编程基础。
1 线性回归
机器学习的基础任务有两类:回归问题和分类问题。线性回归是解决回归问题最基础、最简单的算法之一,核心思想在于建立特征变量与目标变量之间的线性关系模型,即试图找到一个线性函数(在二维空间中是一条直线,在高维空间中是一个超平面)来拟合或预测连续数值型的目标变量。多元数学公式如下(w为权重,b为偏置项):
ounter(line
y = w_1x_1 + w_2x_2 + ... + w_nx_n + b
2 代码实现
2.1 手搓线性回归
所有的机器学习或深度学习算法都是基于数据,对限定的问题进行求解,数据是所有模型的基础,通常情况下,模型训练中需要具备训练数据集、校验数据集和测试数据集,但为了方便,以下线性回归模型的训练仅采用训练数据集。
准备训练数据:
本文采用的数据集是Scikit-learn 库中一个经典的糖尿病进展程度数据集,该数据集源自斯坦福大学的一项研究,最早于2004年由Bradley Efron等人使用,用于根据生理指标预测一年后糖尿病病情的进展程度,包含442个样本,每个样本有10个特征变量和1个连续数值型的目标变量,特征数据经过了标准化处理(均值为0,方差为1)。
ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(line
def diabetes_dataloader(batch_size, train_test_split_ratio = 0.1):
diabetes = load_diabetes()
X = diabetes.data # 特征数据
y = diabetes.target # 目标变量(糖尿病进展指数)
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=train_test_split_ratio, random_state=42)
X_train_tensor = torch.tensor(X_train, dtype=torch.float32)
y_train_tensor = torch.tensor(y_train, dtype=torch.float32).view(-1, 1) # view(-1,1) 将标签转为列向量
X_test_tensor = torch.tensor(X_test, dtype=torch.float32)
y_test_tensor = torch.tensor(y_test, dtype=torch.float32).view(-1, 1)
# 创建 TensorDataset
train_dataset = TensorDataset(X_train_tensor, y_train_tensor)
test_dataset = TensorDataset(X_test_tensor, y_test_tensor)
# 创建 DataLoader
train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True)
test_loader = DataLoader(test_dataset, batch_size=batch_size, shuffle=False)
return train_loader,test_loader,train_dataset,test_dataset
train_iter, test_iter ,train_dataset,test_dataset= diabetes_dataloader(16)
查看数据:
ounter(lineounter(line
plt.figure(figsize=(12,6))
plt.scatter(train_dataset.tensors[0][:,0].detach().numpy(),train_dataset.tensors[1].detach().numpy())

定义模型:
ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(line
# 初始化权重和偏置
weight = torch.normal(0,0.01,size=(10,1),requires_grad=True)
bias = torch.zeros(1,requires_grad=True)
def linear_regression(X):
"""线性回归模型"""
return X @ weight + bias
损失函数(Loss Function):
机器学习中一个非常核心的概念,用于量化模型预测值与真实值之间的差异程度,通过反向传播计算损失函数关于模型参数的梯度,然后通过梯度下降等优化算法调整参数,目标是让损失函数的值减小。回归任务通常使用均方误差(MSE)作为损失函数。
ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(line
# 定义损失函数,均方误差
def MSE(y_hat,y,reduction='mean'):
"""
输入:预测值y_hat,真实值y
输出:均方误差
"""
assert y_hat.shape == y.shape
assert reduction in ['mean','sum','none']
if reduction == 'mean':
return ((y_hat - y.view(y_hat.shape)) ** 2).mean()
elif reduction == 'sum':
return ((y_hat - y.view(y_hat.shape)) ** 2).sum()
elif reduction == 'none':
return ((y_hat - y.view(y_hat.shape)) ** 2)
优化器:
采用随机梯度下降,不懂的观众请自行查阅
ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(line
def SGD(params, lr):
"""
随机梯度下降
"""
with torch.no_grad():
for param in params:
param.data -= lr * param.grad
模型训练:
ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(line
# 超参数
model = linear_regression
loss_fn = MSE
learning_rate = 0.1
epochs = 200
loss_recorder = []
for epoch in range(epochs):
loss_epoch = []
for x,y in train_iter:
y_hat = model(x)
loss = loss_fn(y_hat,y)
loss.backward()
SGD([weight,bias],learning_rate)
weight.grad.zero_()
bias.grad.zero_()
# 记录损失
loss_epoch.append(loss.item())
loss_recorder.append(sum(loss_epoch)/len(loss_epoch))
print(f'epoch {epoch+1}, loss {sum(loss_epoch)/len(loss_epoch):f}')
可视化训练损失:
ounter(lineounter(lineounter(lineounter(lineounter(lineounter(line
plt.figure(figsize=(12,6))
x = range(len(loss_recorder))
plt.plot(x, loss_recorder)
plt.xlabel('epoch')
plt.ylabel('loss')
plt.show()

使用模型进行预测:
ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(line
preds,labels = [],[]
for data in test_iter:
x, label = data[0], data[1]
pred = model(x)
preds.append(pred)
labels.append(label)
preds = torch.cat(preds, dim=0)
labels = torch.cat(labels, dim=0)
ounter(lineounter(lineounter(lineounter(lineounter(lineounter(line
plt.figure(figsize=(12,6))
plt.plot(range(len(labels)), labels.detach().numpy(), 'o', label="labels")
plt.plot(range(len(preds)), preds.detach().numpy(), 'o', label="preds")
plt.legend()
plt.grid()
plt.show()

2.2 使用pytorch框架内置功能实现
ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(line
# 训练数据
train_iter, test_iter ,train_dataset,test_dataset= zero.data.diabetes_dataloader(16)
# 定义模型
class linear_regression(nn.Module):
def __init__(self, input_dim, output_dim):
super().__init__()
self.linear = nn.Linear(input_dim, output_dim)
def forward(self, x):
out = self.linear(x)
return out
model = linear_regression(10,1)
# 超参数
learning_rate = 0.1
epochs = 200
loss_fn = nn.MSELoss(reduction='mean')
optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate)
# 初始化参数
def init_xavier(m):
if type(m) == nn.Linear:
nn.init.xavier_uniform_(m.weight)
nn.init.zeros_(m.bias)
model.apply(init_xavier)
模型训练的过程与前面演示的内容类似:
ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(line
模型训练
loss_recorder = []
for epoch in range(epochs):
loss_epoch = []
for x,y in train_iter:
y_hat = model(x)
loss = loss_fn(y_hat,y)
optimizer.zero_grad() # 清零梯度
loss.backward()
optimizer.step()
# 记录损失
loss_epoch.append(loss.item())
loss_recorder.append(sum(loss_epoch)/len(loss_epoch))
print(f'epoch {epoch+1}, loss {sum(loss_epoch)/len(loss_epoch):f}')
可视化训练损失:
ounter(lineounter(lineounter(lineounter(lineounter(lineounter(line
plt.figure(figsize=(12,6))
x = range(len(loss_recorder))
plt.plot(x, loss_recorder)
plt.xlabel('epoch')
plt.ylabel('loss')
plt.show()
使用训练的模型进行预测,观察新模型预测数据和前面预测的数据相近:
ounter(lineounter(lineounter(lineounter(lineounter(lineounter(line
plt.figure(figsize=(12,6))
plt.plot(range(len(labels)), labels.detach().numpy(), 'o', label="labels")
plt.plot(range(len(preds)), preds.detach().numpy(), 'o', label="preds")
plt.legend()
plt.grid()
plt.show()

虽然线性回归是最简单的机器学习算法,但麻雀虽小,五脏俱全,线性回归模型的训练包含了所有深度学习模型训练的全部过程。
如何学习AI大模型?
如果你对AI大模型入门感兴趣,那么你需要的话可以点击这里大模型重磅福利:入门进阶全套104G学习资源包免费分享!
这份完整版的大模型 AI 学习和面试资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】

这是一份大模型从零基础到进阶的学习路线大纲全览,小伙伴们记得点个收藏!

第一阶段: 从大模型系统设计入手,讲解大模型的主要方法;
第二阶段: 在通过大模型提示词工程从Prompts角度入手更好发挥模型的作用;
第三阶段: 大模型平台应用开发借助阿里云PAI平台构建电商领域虚拟试衣系统;
第四阶段: 大模型知识库应用开发以LangChain框架为例,构建物流行业咨询智能问答系统;
第五阶段: 大模型微调开发借助以大健康、新零售、新媒体领域构建适合当前领域大模型;
第六阶段: 以SD多模态大模型为主,搭建了文生图小程序案例;
第七阶段: 以大模型平台应用与开发为主,通过星火大模型,文心大模型等成熟大模型构建大模型行业应用。
100套AI大模型商业化落地方案

大模型全套视频教程

200本大模型PDF书籍

👉学会后的收获:👈
• 基于大模型全栈工程实现(前端、后端、产品经理、设计、数据分析等),通过这门课可获得不同能力;
• 能够利用大模型解决相关实际项目需求: 大数据时代,越来越多的企业和机构需要处理海量数据,利用大模型技术可以更好地处理这些数据,提高数据分析和决策的准确性。因此,掌握大模型应用开发技能,可以让程序员更好地应对实际项目需求;
• 基于大模型和企业数据AI应用开发,实现大模型理论、掌握GPU算力、硬件、LangChain开发框架和项目实战技能, 学会Fine-tuning垂直训练大模型(数据准备、数据蒸馏、大模型部署)一站式掌握;
• 能够完成时下热门大模型垂直领域模型训练能力,提高程序员的编码能力: 大模型应用开发需要掌握机器学习算法、深度学习框架等技术,这些技术的掌握可以提高程序员的编码能力和分析能力,让程序员更加熟练地编写高质量的代码。
LLM面试题合集

大模型产品经理资源合集

大模型项目实战合集

👉获取方式:
😝有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【保证100%免费】🆓

鲲鹏昇腾开发者社区是面向全社会开放的“联接全球计算开发者,聚合华为+生态”的社区,内容涵盖鲲鹏、昇腾资源,帮助开发者快速获取所需的知识、经验、软件、工具、算力,支撑开发者易学、好用、成功,成为核心开发者。
更多推荐
所有评论(0)