Pytorch(3):梯度下降,激活函数与loss,反向传播算法,交叉熵,MNIST测试实战

1、梯度

梯度是一个反向,函数值变大的方向
在做梯度下降时,自变量和因变量是参数和loss函数,参数的值会沿着梯度的方向即loss值更小的方向更新。

2、learning rate

  • learning rate如果太小,那么梯度下降太慢,计算时间太长
  • learning rate 太大的话,梯度下降可能会反复在局部最小值两端横跳
  • 让lr在梯度较大时,大一些,在梯度较小时,小一些。
  • 可以在lr上加上每次梯度下降时刻的梯度的平方和再开根号来限制lr的变化:AdaGrad

在这里插入图片描述

3、initialization status

梯度下降的初始化会决定最后可以下降到哪个local minimum

4、momentum

可以有助于跳过局部最小值:加入惯性

  • 在当前时刻梯度更新的方向不仅仅取决于当前时刻的梯度,还要通过加权考虑前面几个时刻的梯度。这样当曲面平缓,或落在局部最小值上时,该momentum可以加大惯性,使梯度继续沿着最小值的方向更新下去。

w=w-lr*grad

  • grad:决定方向
  • lr:决定步长
    Adam是同时考虑了方向和步长的梯度更新策略

5、激活函数

常用激活函数

  • relu: 将小于0的部分不响应,大于0线性相应:让梯度经过激活函数后梯度不变。
  • leaky_relu: 小于0的部分也按一定斜率线性相应
  • sigmoid 有缺陷,在两端时梯度接近0,梯度无法更新
  • tanh: 2sigmoid(2x)-1 :映射到[-1,1]
torch.sigmoid(a) 将输入的值全部映射到[0,1]区间
torch.tanh(a)
torch,relu(a)

6、loss及其梯度

  • MSE
  • Cross-entropy

第一种:MSE

在这里插入图片描述

  • L2_norm相比于mse多了一个开根号的步骤
  • 使用norm也可以

使用pytorch自动求导

第一种: torch.autograd.grad

x=torch.ones(1)
w=torch.full([1],2)
#w=torch.tensor([1.],required_grad=True)
w.requires_grad_()#告诉系统这个w需要更新
mse=F.mse_loss(torch.ones(1),x*w)
torch.autograd.grad(mse,[w])

第二种:loss.backward

x=torch.ones(1)
w=torch.full([1],2)
#w=torch.tensor([1.],required_grad=True)
mse=F.mse_loss(torch.ones(1),x*w)
mse.backward()
w.grad()#返回w的梯度信息

7、 softmax:

将输出的结果映射到一个维度,使所有输出的总和为1,符合概率分布的特征。适用于分类的时候。
还会使数值较大的经过softmax后相较于原来的与其他值的比例来说变得更大,可以把数值代表的信息放大。

softmax的求导:(会用在后向算法的计算上)
在这里插入图片描述
在这里插入图片描述

p=F.softmax(a,dim=0)
  • p i 对 a j p_i对a_j
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值