pytorch中的梯度、激活函数和loss

文章目录

  • 梯度
  • 激活函数
    • torch.sigmoid()
    • torch.tanh()
    • torch.relu()
    • nn.LeakyReLU()
    • softmax
  • loss函数
    • 均方差 (Mean Squared Error)
    • Cross Entropy

梯度

pytorch中的梯度、激活函数和loss_第1张图片
pytorch中的梯度、激活函数和loss_第2张图片
梯度包括大小和方向,是一个向量。

寻找最小值:
pytorch中的梯度、激活函数和loss_第3张图片
learning rate设置为0.001

激活函数

torch.sigmoid()

pytorch中的梯度、激活函数和loss_第4张图片

torch.tanh()

pytorch中的梯度、激活函数和loss_第5张图片

torch.relu()

pytorch中的梯度、激活函数和loss_第6张图片

nn.LeakyReLU()

ReLU在小于零的情况下,也有可能出现梯度弥散,这时候使用Leaky ReLU激活函数。
pytorch中的梯度、激活函数和loss_第7张图片

softmax

在分类问题中常配合 Cross Entropy Loss 使用
pytorch中的梯度、激活函数和loss_第8张图片
梯度:
pytorch中的梯度、激活函数和loss_第9张图片

import torch
import torch.nn.functional as F

a = torch.FloatTensor([1.,2.,3.])
print(a)  # tensor([1., 2., 3.])
p = F.softmax(a,dim=0)  # 构建图。dim指定维度,在第0维上操作
print(p)  # tensor([0.0900, 0.2447, 0.6652])

loss函数

均方差 (Mean Squared Error)

pytorch中的梯度、激活函数和loss_第10张图片

import torch
import torch.nn.functional as F

x = torch.ones(1)
print('x:', x)  # x: tensor([1.])

w = torch.full([1], 2, dtype=torch.float)
print('w:', w)  # w: tensor([2.])
w.requires_grad_()  # 对w进行更新,_告诉pytorchw参数是需要grad梯度信息的

mse = F.mse_loss(torch.ones(1), x*w)  # 动态图建图。完成计算mse_loss的过程。(laber value,predicted value)
print('mse:', mse)  # mse: tensor(1., grad_fn=)
mse.backward()  # 自动从后往前传播,计算出的gradent会附加在成员变量的.grad参数上
print(w.grad)  # tensor([2.])

Cross Entropy

分类算法不能使用最大化准确度作为目标,因为:
pytorch中的梯度、激活函数和loss_第11张图片
Entropy:用来表述不确定性,不确定性越高,Entropy越大。

a =torch.full([4],1/4)
print(a)  # tensor([0.2500, 0.2500, 0.2500, 0.2500])
print(-(a*torch.log2(a)).sum())  # tensor(2.)

a = torch.tensor([0.1, 0.1, 0.1, 0.7])
print(-(a*torch.log2(a)).sum())  # tensor(1.3568)

a = torch.tensor([0.001, 0.001, 0.001, 0.997])
print(-(a*torch.log2(a)).sum())  # tensor(0.0342)

Cross Entropy:表述两个分布的差距
在这里插入图片描述
pytorch中的梯度、激活函数和loss_第12张图片

以二元猫狗分类为例:
pytorch中的梯度、激活函数和loss_第13张图片
最小化H(P,Q):

  • 当y=1时,最大化log( p ),最大化p
  • 当y=0时,最大化log(1-p),最小化p

pytorch中的梯度、激活函数和loss_第14张图片
当预测准确度越高时,H(P1,Q1)越小。

Pytorch中,Softmax和Cross-entropy有一个现成的结构。Softmax和Cross-entropy如果分开的话,会出现数据不稳定的情况。所以最好得到Logit以后,直接使用现有结构处理。

torch.nn.functional.cross_entropy函数相当于:先做了softmax操作;然后做log操作;最后做了nll_loss操作。

import torch
from torch.nn import functional as F

x = torch.randn(1,784)
w = torch.randn(10,784)

logits = x@w.t() # x*w+b   b为零
print('logits:',logits)

pred = F.softmax(logits,dim=1)
print('pred:',pred)

pred_log = torch.log(pred)  # e对数

print(F.cross_entropy(logits, torch.tensor([3])))  # torch.tensor([3])在这里是真实值
'''使用cross_entropy()的时候,使用的是logits,而不是pred'''

print(F.nll_loss(pred_log,torch.tensor([3])))
'''如果想使用pred做cross_entropy运算,需要先对pred做log运算,然后使用F.nll_loss'''

'''cross_entropy函数相当于:先做了softmax操作;然后做log操作;最后做了nll_loss操作'''

你可能感兴趣的:(机器学习)