一、线性回归
- 线性回归是对n维输入的加权,外加偏差
- 使用平方损失来衡量预测值与真实值的差异,y与y~,y表示真实值,y~表示预测值
- 线性回归有显示解,其他的大多数没有显示解
- 线性回归可以看作是单层神经网络
二、基础优化方法
最常用的是梯度下降,深度学习默认的求解算法是小批量随机梯度下降,它最稳定最简单。
关于梯度
梯度是使得这个函数值增加最快的方向,梯度下降就是通过不断沿着反梯度方向更新参数求解。
学习率(步长的超参数):沿着这个方向每次走多远
超参数:在学习之前,人为指定的值
为什么采用小批量随机梯度下降
因为计算梯度是很贵的,它需要对每个损失函数求导,这个损失函数是对所有样本的平均损失,所以求梯度需要对所有样本算一次。小批量随机梯度下降是随机采样b个样本来近似损失,这里的b是批量大小,一个重要的超参数。b太小,则计算量太小,不适合并行来最大利用计算资源,b太大,内存消耗增加,浪费计算。
三、代码实现
导包
%matplotlib inline #因为要随机梯度下降和初始化权重,默认嵌入notebook里面
import random
import torch
from d2l import torch as d2l
根据带有噪音的线性模型构造一个人造数据集
def synthetic_data(w, b, num_examples): #给定w和b,生成num个样本
"""生成 y = Xw + b + 噪声。"""
X = torch.normal(0, 1, (num_examples, len(w))) #生成x,其均值为0,方差为1的随机数,假设有n个样本,则其列数为w的长度
y = torch.matmul(X, w) + b #y就是wx+b
#两个张量矩阵相乘,在PyTorch中可以通过torch.matmul函数实现;
y += torch.normal(0, 0.01, y.shape)#加入一个均值为0,方差为0.01,形状跟y一样的遭噪音
return X, y.reshape((-1, 1))#最后将x和y作为一个列向量返回
#y.reshape((-1, 1))的意思是将y转变为列为1,行自动调整,即一个列向量
true_w = torch.tensor([2, -3.4])
true_b = 4.2
features, labels = synthetic_data(true_w, true_b, 1000)
#在进行预测时使用的输入变量。
#features的每一行都包含一个二维数据样本,labels中的每一行都包含一维标签值(一个标量)
#labels 在监督式学习中,标签指样本的“答案”或“结果”部分。
print('features:', features[0], '\nlabel:', labels[0])
结果
features: tensor([-0.9267, -0.2346])
label: tensor([3.1315])
d2l.set_figsize()
d2l.plt.scatter(features[:, 1].detach().numpy(),
labels.detach().numpy(), 1);