PyTorch笔记10----激活函数与常见Loss
梯度下降,激活函数,与常见Loss
梯度下降
新值 = 当前值 - 学习率 * 梯度
- 可能会收敛到局部极小值
- 学习率不能太大
- 逃离局部最小值:添加一个动量(惯性)
- 使用sigmoid函数当x很大的时候导数趋向于0,数据会得不到更新,这种现象叫做梯度弥散
一些激活函数
Sigmoid
z = torch.linspace(-100, 100, 10) |
tanh
tanh(x) = 2sigmoid(2x) - 1
类似sigmoid,值域(-1, 1)
a = torch.linspace(-1, 1, 10) |
ReLU (Rectified Linear Unit)
- 使用很多,奠基石
- 减少了梯度弥散和梯度爆炸的出现
- 使用
torch.relu(a)
或F.relu(a)
(import torch.nn.functional as F
)
Softmax(soft version of max)
输入y: [y1, y2, ..., yn] ,输出p: [p1, p2, ..., pn]且sum(p) = 1
S(yi) = exp(yi) / sum(exp(y))
如y:[2.0, 1.0, 0.1] --->
p: [0.7, 0.2, 0.1] 会让大的更大,小的压缩在一个更密集的空间
梯度dpi_daj
: - i = j: dpi_dai = pi * (1 - pi)
> 0 - i != j:dpi_daj = - pj * pi
< 0
a = torch.rand(3) |
Loss及其梯度
均方差MSE(Mean Squared Error)
loss = sum((y - y_pred) ** 2)
不是L2-norm
L2-norm = sqrt(sum((y - y+pred) ** 2))
可以使用norm()函数
loss = norm.norm(y - y_pred, 2).pow(2)
梯度:dloss_dx = 2 * sum(y - y_pred) * dy_pred_dx
使用PyTorch求导 x = torch.ones(1)
w = torch.full([1], 2)
mse = F.mse_loss(x * w, torch.ones(1)) #第一个参数为predict值,第二个参数为label
#tensor(1.)
torch.autograd.grad(mse, [w])
#第一个参数y,第二个参数[x1, x2, ...]
#tensor定义时默认不需要求导信息,所以w无法求导
--------ERROR--------
#对w进行更新或者在定义w时加入参数requires_grad = True
w.requires_grad_()
#tensor([2.], requires_grad = True)
#这时求梯度仍然会报错,因为PyTorch是动态图(做一步计算一步图),要先更新一下mse
mse = F.mse_loss(x * w, torch.ones(1))
torch.autograd.grad(mse, [w]) #tensor([2.])
mse.backward()
mse.grad #tensor([2.])
Cross Entropy Loss
之后介绍