1sigmoid函数
sigmoid函数曲线平滑可以很好的使用但是如果数据长时间不更新会出现失去梯度的状况也叫梯度弥散。
求sigmoid函数的梯度
当然我们可以使用pytorch实现sigmoid函数。代码如下。
import torchatorch.linspace(-100,100,10)torch.sigmoid(a)得到结果为tensor([0.0000e00, 1.6655e-34, 7.4564e-25, 3.3382e-15, 1.4945e-05, 9.9999e-01,1.0000e00, 1.0000e00, 1.0000e00, 1.0000e00])
2Tanh函数
可以将Tanh函数视为sigmoid函数的一种线性变化所以同样存在梯度弥散的现象。
其梯度为
对于Tanh函数我们也可以通过代码实现
import torchbtorch.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激活函数。
3Relu函数
relu函数在z>0的时候梯度恒为1。
我们利用代码实现Relu函数有两种方法可以
import torchfrom torch.nn import functional as Fatorch.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])
4Mean Squared Error均方差
简写为MSE公式为Loss
用程序进行对MSE的梯度计算
第一种方法使用autograd包里的函数
#模型predx*wbimport torchfrom torch.nn import functional as Fxtorch.ones(1)#x初始化为1wtorch.full([1],2)#w初始化为dim为1长度为1值为2的tensormseF.mse_loss(torch.ones(1),x*w)torch.autograd.grad(mse,[w])#对于这个模型mse接受pred[w]接收w1w2等等#但是这里会报错说w不需要求导我们求了,所以我们需要对w的数据进行更新w.requires_grad_()#对w数据进行更新torch.autograd.grad(mse,[w])#再次报错因为没有更新图mseF.mse_loss(torch.ones(1),x*w)#使用这个把图重新计算一遍torch.autograd.grad(mse,[w])
另一种方法使用loss.backward
#模型predx*wbimport torchfrom torch.nn import functional as Fxtorch.ones(1)#x初始化为1wtorch.full([1],2)#w初始化为dim为1长度为1值为2的tensormseF.mse_loss(torch.ones(1),x*w)mseF.mse_loss(torch.ones(1),x*w)#使用这个把图重新计算一遍mse.backward()#自动从后往前传播完成这条路径上所有的需要梯度的tensor的计算计算后的grad不会再返回出来w.grad#输出tensor[2.])
5Cross Entropy Loss常用于二分类多分类
使用二分类
多分类
和softmax激活函数同时使用
6softmax适用于多分类
我们把数据分类时的出现频率转化为概率把概率最大的情况作为我们的预测值当我们使用softmax函数进行压缩为概率时还应要求所有出现的情况加起来概率等于1。而sigmoid不太准确会出现加起来等于3的情形。
softmax函数求导时
当ij时
当i不等于j的时候
使用代码实现softmax
#softmaximport torchfrom torch.nn import functional as Fatorch.rand(3)#随机生成dim为1长度为3的tensora.requires_grad_()#标注一下grad函数pF.softmax(a,dim0)torch.autograd.grad(p[1],[a],retain_graphTrue)torch.autograd.grad(p[2],[a])#结果为# (tensor([-0.1537, -0.0906, 0.2443]),)