其他分享
首页 > 其他分享> > PyTorch入门一 || 基础知识回顾,手动搭建模型,理解前馈、反向传播

PyTorch入门一 || 基础知识回顾,手动搭建模型,理解前馈、反向传播

作者:互联网

一、 维度诅咒

属性 = 特征,特征越多所需要的数据就越多

维度越高(特征越多)对数据的需求就越大,

比如一维特征 只需要10个数据,那么二维特征想要达到相同的数据密度就需要 102 个数据,N维特征就需要10N 个数据。

由于数据集需要人工标注,所以我们需要降低维数,将高维数据映射成低维数据

如何降低维数?

可以通过线性代数的方式

比如有一个 N 维特征的数据,需要降低为 3 维特征的数据,那么我们找到一个 3 * N 的矩阵即可。

image-20220127153309434

这一过程为降维,也是表示学习

二、反向传播

image-20220127155654407

反向传播一般使用链式法则来求导,如果有不同路径则需要求导相加

三、过拟合

在训练集上表现很好,但是在测试集上表现很差,原因是把训练集的噪声也给学进去

四、评估模型

即预测值和真实值的差的平方和,也称为loss

image-20220127174044184

平均平方误差 MSE

五、梯度下降

image-20220128154425964

左走为负,右走为正,那么参数应该往偏导数的负方向走,α是学习率,这是一种贪心算法

非凸函数

image-20220128154805171

鞍点

image-20220128155258704

在一个平面上看是最大值,在另一个平面上看是最小值

image-20220128162240049一般来说在机器学习中,梯度下降用得还是比较少的,用得最多的是随机梯度下降

image-20220128162546049

梯度下降是用N个loss的偏导数求平均来计算梯度值方向,而随机梯度下降则是任挑一个loss的偏导数而不是全部求平均

image-20220128165214882

梯度下降是把所有样本的偏导均值求出来后再更新参数,而随机梯度下降则是一个训练样本计算完后更新参数,下一个训练样本的参数依赖上一个训练样本,故时间复杂度高;

梯度下降速度快,但不能决绝鞍点问题,随机梯度下降依赖随机噪声可以解决鞍点问题

image-20220128165834437

由于全部一起训练,性能低,而分开一个一个训练时间开销会多,故折中引入batch的概念!

批量随机梯度下降(batch)

反向传播

image-20220129110442482

如果没有对输出结果进行非线性变化,则最终结果都可以简化为一层,增加层数就显得没有必要。

故我们需要对每一层的结果进行非线性转化,sigmoid函数,然后该表达式就不能被化简

image-20220129110751694

反向传播过程:

image-20220129111837751

image-20220129113541350

走完前馈过程,再返回走反向传播的过程,以此来更新梯度,

先算损失(loss)再更新梯度

PyTorch

在pytorch中,基本单位是tensor,里面保存权重本身的值和loss对该权重的偏导数,

tensor包含 data 和 grad

import torch

x_data = [1.0,2.0,3.0]
y_data = [2.0,4.0,6.0]

w = torch.tensor([1.0])
w.requires_grad = True

def forward(x):
   return x*w

def loss(x,y):
   y_head=forward(x)
   return (y_head-y)**2

print("predict befor training",4,forward(4).item())

for epoch in range(100):
   for x,y in zip(x_data,y_data):
       l = loss(x,y)   #此时执行了前馈运算,保存进变量l
       l.backward()    #l已完成前馈运算,此时调用方法执行反向传播,同时释放计算图,只要做完反向传播就释放计算图

       #输出时用.item() , 加减乘除时用 .data
       #w.grad.item() 的item() 是取w的标量,防止产生计算图,tensor在做+-时会产生计算图
       print('\tgrad:',x,y,w.grad.item())
       #此处要写 w.data 只对w做纯数值的修改,否则会重新建立计算图,就乱套了
       w.data = w.data - 0.01*w.grad.data

       #对当前输入数据的梯度值清零,再计算下一个数据的梯度,注意数值还在
       w.grad.data.zero_()
   print("progress:",epoch,l.item())


print("predict after training",4,forward(4).item())

作业

image-20220129153117165

标签:loss,grad,梯度,前馈,基础知识,item,PyTorch,反向,data
来源: https://blog.csdn.net/qq_56039091/article/details/122744416