PyTorch笔记10----激活函数与常见Loss

梯度下降,激活函数,与常见Loss

梯度下降

新值 = 当前值 - 学习率 * 梯度

  • 可能会收敛到局部极小值
  • 学习率不能太大
  • 逃离局部最小值:添加一个动量(惯性)
  • 使用sigmoid函数当x很大的时候导数趋向于0,数据会得不到更新,这种现象叫做梯度弥散

一些激活函数

Sigmoid

z = torch.linspace(-100, 100, 10)
z #tensor([-100.0000, -77.7778, -55.5556, -33.3333, -11.1111, 11.1111, 33.3333, 55.5556, 77.7778, 100.0000])
torch.sigmoid(z)
#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])

tanh

tanh(x) = 2sigmoid(2x) - 1 类似sigmoid,值域(-1, 1)

a = torch.linspace(-1, 1, 10)
torch.tanh(a)

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)
a.requires_grad_()

p = F.softmax(a, dim = 0)
#每次求导会将梯度信息清除
#应该在第一次函数内加入retain_graph = True参数

p = F.softmax(a, dim = 0)
torch.autograd.grad(p[1], [a], retain_graph = True)
#tensor([-0.0828, 0.2274, -0.1447]) 索引1为正
torch.autograd.grad(p[2], [a])
#tensor([-0.0979, -0.1447, 0.2425]) 索引2为正


p.backward()
--------ERROR--------
#p是向量,这样.backward()会报错

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

之后介绍