激活函数与loss的梯度

激活函数:
最开始由生物学家对青蛙的神经元机制进行研究发现,青蛙的神经元有多个输入x0、x1、x2,响应值是他们加权后的结果,但响应值如果小于阈值,则不会响应,而只有大于阈值时,才会有固定的响应。
在这里插入图片描述
这就类似于阶梯函数
在这里插入图片描述
但阶梯函数由于不连续,故不可导。科学家提出了连续光滑的激活函数:sigmoid / logistic

sigmoid

使用的范围比较广,因为它能把输出值的范围压缩在0-1之间,如概率,还有像素值RGB都是0-1的大小。
在这里插入图片描述
当输入很小的时候,响应接近于0,当输入很大的时候,响应接近于1。

对sigmoid函数进行求导
在这里插入图片描述
但sigmoid函数有缺陷:
在趋近于正无穷的地方,σ的导数接近于0,则参数θ更新后仍为θ,长时间参数得不到更新这个情况也叫做梯度离散。
在这里插入图片描述
sigmoid在pytorch上的实现

import torch
a = torch.linspace(-100, 100, 10)
a

torch.sigmoid(a)
# 也可以用F.sigmoid(a)
# from torch.nn import function as F

在这里插入图片描述
在这里插入图片描述

tanh

该激活函数在RNN中用的较多

由sigmoid变换得到,值的区间为 -1~1
在这里插入图片描述
将tanh进行求导:
在这里插入图片描述
与sigmoid相似之处是,只要有激活函数的值,导数的值也可直接得到。

a = torch.linspace(-1, 1, 10)

torch.tanh(a)

在这里插入图片描述

ReLU

深度学习的经典激活函数,比较简单基础
在这里插入图片描述
在x<0时,梯度为0,在x>=0时,梯度为1,在向后传播时梯度计算非常方便,且不会放大和缩小梯度,避免梯度离散和梯度爆炸。

a = torch.linspace(-1, 1, 10)

torch.relu(a)

F.relu(a)

在这里插入图片描述

MSE_LOSS

一般用的是均方误差MSE,还有一种用于分类问题的误差留到之后学习。

MSE的基本形式,以线性感知机xw+b为例:
在这里插入图片描述
在这里插入图片描述在torch用L2-norm实现再加平方即为loss
在这里插入图片描述
loss求导:
在这里插入图片描述
使用pytorch自动求导
先计算mse
使用的是最简单的线性感知机,且此时b=0,x初始化为1,w的dim=1,初始化为2
在这里插入图片描述
在这里插入图片描述
自动求导

直接求导会报错
在这里插入图片描述
w初始化没有设置为需要导数信息,直接求导会报错,故要对w信息进行更新。
在这里插入图片描述
w更新后图也要进行更新,故mse也要进行更新,否则还是报错
在这里插入图片描述
在这里插入图片描述

w.requires_grad_()

mse = F.mse_loss(torch.ones(1), x*w)

torch.autograd.grad(mse, [w])

在这里插入图片描述
loss = (1-2)**2 = 1
grad 是 loss对w的求导:
2(1 - x*w) * (-x) = 2 (1-2) (-1) = 2

补充:
在loss上调用backward(),会从后往前完成这条路径上的梯度计算,然后再手动查看如:w.grad

#同样需要更新w和图
w.requires_grad_()

mse = F.mse_loss(torch.ones(1), x*w)

mse.backward()

w.grad

在这里插入图片描述

autograd方法与backward方法对比:

在这里插入图片描述

Cross Entropy Loss

是用于分类中的误差,之后再深入了解。这次主要了解与它紧密结合使用的激活函数–softmax。

作用:以模型最终输出三个结果值为例,将他们转化为概率值,且和为1,可以发现,转化后的结果相较于转化前,较大值与较小值相差倍数更大,金字塔效应。
在这里插入图片描述
softmax函数求导:
在这里插入图片描述

在这里插入图片描述
其中i和j取值范围一样,分别表示第几个概率值和第几个输入

两种情况
1、 i = j时
导数结果为正数 Pi(1-Pj)
在这里插入图片描述
2、i ≠ j时
导数结果为负数 -PiPj
在这里插入图片描述
总结:
在这里插入图片描述
pytorch实现

a = torch.rand(3)
a.requires_grad_()

p = F.softmax(a, dim=0)

torch.autograd.grad(p[0], [a], retain_graph=True)
							#保留图,若没有保留,下次还有重新更新求导信息
torch.autograd.grad(p[1], [a])							

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
选取损失函数和激活函数深度学习模型设计中的重要步骤。下面我将分别解释如何选取损失函数和激活函数。 选取损函数: 1. 根据任务类型选择损失函数:根据你的任务类型,例如分类、回归或生成等,选择适合的损失函数。例如,对于分类任务,常用的损失函数有交叉熵损失函数(Cross Entropy Loss),对于回归任务,常用的损失函数有均方误差损失函数(Mean Squared Error Loss)等。 2. 考虑输出的特点:根据输出的特点,选择合适的损失函数。例如,如果输出是概率分布,可以选择交叉熵损失函数;如果输出是实数值,可以选择均方误差损失函数。 3. 考虑数据分布:根据数据分布的特点,选择合适的损失函数。例如,如果数据存在明显的类别不平衡问题,可以选择加权损失函数来平衡各个类别的重要性。 选取激活函数: 1. 考虑非线性能力:选择具有非线性能力的激活函数,以便模型可以学习非线性关系。常用的激活函数有ReLU、Sigmoid、Tanh等。 2. 避免梯度消失和梯度爆炸:选择激活函数时要注意避免梯度消失和梯度爆炸问题。例如,ReLU函数可以有效地避免梯度消失问题。 3. 适应输出范围:根据输出范围的要求选择激活函数。例如,如果需要将输出限制在特定范围内,可以选择Sigmoid或Tanh函数。 4. 网络结构的要求:根据网络结构的要求选择激活函数。例如,如果需要稀疏性,可以选择稀疏激活函数(如ReLU)。 需要注意的是,损失函数和激活函数的选择也可以通过实验和调参来确定,根据具体问题的特点进行适当调整。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值