Pytorch:激活函数及其梯度

(1)sigmoid函数

Pytorch:激活函数及其梯度_第1张图片

 sigmoid函数曲线平滑,可以很好的使用,但是如果数据长时间不更新,会出现失去梯度的状况,也叫梯度弥散。

求sigmoid函数的梯度

Pytorch:激活函数及其梯度_第2张图片

当然,我们可以使用pytorch实现sigmoid函数。代码如下。

import torch
a=torch.linspace(-100,100,10)
torch.sigmoid(a)
'''得到结果为
tensor([0.0000e+00, 1.6655e-34, 7.4564e-25, 3.3382e-15, 1.4945e-05, 9.9999e-01,
        1.0000e+00, 1.0000e+00, 1.0000e+00, 1.0000e+00])
'''

(2)Tanh函数

Pytorch:激活函数及其梯度_第3张图片

可以将Tanh函数视为sigmoid函数的一种线性变化,所以同样存在梯度弥散的现象。

其梯度为

Pytorch:激活函数及其梯度_第4张图片

对于Tanh函数,我们也可以通过代码实现

import torch
b=torch.linspace(-1,1,10)
torch.tanh(b)
tensor([-0.7616, -0.6514, -0.5047, -0.3215, -0.1107,  0.1107,  0.3215,  0.5047,
         0.6514,  0.7616])

为了消除梯度弥散现象,我们推出了Relu激活函数。

(3)Relu函数

Pytorch:激活函数及其梯度_第5张图片

 relu函数在z>0的时候,梯度恒为1。

我们利用代码实现Relu函数,有两种方法可以

import torch
from torch.nn import functional as F
a=torch.linspace(-1,1,10)
torch.relu(a)#第一种方法
tensor([0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.1111, 0.3333, 0.5556, 0.7778,
        1.0000])
F.relu(a)#第二种方法
tensor([0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.1111, 0.3333, 0.5556, 0.7778,
        1.0000])

(4)Mean Squared Error(均方差)

简写为MSE,公式为Loss=\sum \left ( y-\bar{y} \right )^{2}=\sum \left ( y-\left ( xw+b \right ) \right )^{2}

L2-norm=\sqrt{\sum \left ( y_{1}-y_{2} \right )^{2}}=\left \| y-\left ( xw+b \right ) \right \|

loss=norm\left ( y-\left ( xw+b \right ) \right )^{2}

当我们对MSE进行求梯度操作

Pytorch:激活函数及其梯度_第6张图片

 用程序进行对MSE的梯度计算

第一种方法,使用autograd包里的函数

#模型pred=x*w+b
import torch
from torch.nn import functional as F
x=torch.ones(1)#x初始化为1
w=torch.full([1],2)#w初始化为dim为1,长度为1,值为2的tensor
mse=F.mse_loss(torch.ones(1),x*w)
torch.autograd.grad(mse,[w])#对于这个模型,mse接受pred,[w]接收w1,w2等等
#但是这里会报错,说w不需要求导,我们求了,所以我们需要对w的数据进行更新
w.requires_grad_()#对w数据进行更新
torch.autograd.grad(mse,[w])#再次报错,因为没有更新图
mse=F.mse_loss(torch.ones(1),x*w)#使用这个把图重新计算一遍
torch.autograd.grad(mse,[w])

另一种方法,使用loss.backward

#模型pred=x*w+b
import torch
from torch.nn import functional as F
x=torch.ones(1)#x初始化为1
w=torch.full([1],2)#w初始化为dim为1,长度为1,值为2的tensor
mse=F.mse_loss(torch.ones(1),x*w)
mse=F.mse_loss(torch.ones(1),x*w)#使用这个把图重新计算一遍
mse.backward()#自动从后往前传播,完成这条路径上所有的需要梯度的tensor的计算,计算后的grad不会再返回出来
w.grad
#输出tensor([2.])

(5)Cross Entropy Loss(常用于二分类,多分类)

使用:<1>二分类

          <2>多分类

          <3>和softmax激活函数同时使用

(6)softmax(适用于多分类)

我们把数据分类时的出现频率转化为概率,把概率最大的情况作为我们的预测值,当我们使用softmax函数进行压缩为概率时,还应要求所有出现的情况加起来概率等于1。(而sigmoid不太准确,会出现加起来等于3的情形。)

Pytorch:激活函数及其梯度_第7张图片

softmax函数求导时

当i=j时

Pytorch:激活函数及其梯度_第8张图片

 当i不等于j的时候

Pytorch:激活函数及其梯度_第9张图片

使用代码实现softmax

#softmax
import torch
from torch.nn import functional as F
a=torch.rand(3)#随机生成dim为1,长度为3的tensor
a.requires_grad_()#标注一下grad函数
p=F.softmax(a,dim=0)
torch.autograd.grad(p[1],[a],retain_graph=True)
torch.autograd.grad(p[2],[a])
#结果为
# (tensor([-0.1537, -0.0906,  0.2443]),)

你可能感兴趣的:(pytorch,深度学习,人工智能)