激活函数与Loss的梯度
激活函数
Sigmoid函数 / Logistic函数
优点:可以将数据压 缩至[0, 1)区间内,有较大实用意义
致命问题:在输入值较小或较大时,Sigmoid函数的梯度趋近于零,会导致网络参数长时间得不到更新,即梯度弥散问题
from torch.nn import functional as F
import torch
x = torch.linspace(-100, 100, 10)
F.sigmoid(x) # 当x为100时,sigmoid(x)就接近于0了
线性整流单元(Rectified Linear Unit, ReLU)
from torch.nn import functional as F
import torch
x = torch.linspace(-100, 100, 10)
F.relu(x)
损失函数
Mean Squared Error 均方误差
-
L2范数是对元素求平方和后再开根号,需要.pow(2)后才可作为损失函数
-
微小的误差可能对网络性能带来极大的影响
Cross Entropy Loss 交叉熵损失
信息熵
Cross Entropy中的Entropy指的是信息熵,可以理解为不确定性。衡量一个概率分布本身的不确定程度。
It's a measure of surprise, higher entrpoy means less information and higher uncertainty.
假设一个离散型随机变量的可能取值为,而取值事件发生的概率为,则其信息熵的定义为
KL散度
在概率论或信息论中,KL散度( Kullback–Leibler Divergence),又称相对熵(relative entropy),是描述两个概率分布P和Q差异的一种方法。
存在两个概率分布P和Q,其离散型随机变量的可能取值为,而取值事件发生 的概率分别为.
KL散度是非对称的,即
特别的,表示当用概率分布Q来拟合真实分布P时,产生的信息损耗,其中P表示真实分布,Q表示P的拟合分布。
交叉熵
衡量两个概率分布P和Q之间的不确定性程度。交叉熵的数学表达为
PyTorch中的CrossEntropyLoss
torch.nn.CrossEntropyLoss相当于torch.softmax + torch.log + torch.nn.nllloss.
import torch.nn as nn
# 使用NLLLoss实现
nllloss = nn.NLLLoss()
predict = torch.Tensor([[2, 3, 1], [3, 7, 9]])
predict = torch.log(torch.softmax(predict, dim=-1))
label = torch.tensor([1, 2])
nllloss(predict, label)
# output: tensor(0.2684)
# 使用CrossEntropyLoss实现
cross_loss = nn.CrossEntropyLoss()
predict = torch.Tensor([[2, 3, 1], [3, 7, 9]])
label = torch.tensor([1, 2])
cross_loss(predict, label)
# output: tensor(0.2684)