ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2022-01-29 15:58:00  阅读:159  来源: 互联网

标签:loss grad 梯度 前馈 基础知识 item PyTorch 反向 data


一、 维度诅咒

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

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

比如一维特征 只需要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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有