深度学习--常见激活函数

梯度下降出现问题:局部最小值、鞍点

影响因素:

  • 初始状态
  • 学习率 :影响收敛速度和收敛精度
  • 动量:如何逃离局部最小值,增加一个惯性

激活函数及其梯度

  1. 阶跃函数
  2. Sigmode/logistic 函数 (0,0.5) y=1/(1-e^(-x)) y'=y(1-y)
import torch

a=torch.linspace(-100,100,10)
print(a)
#tensor([-100.0000,  -77.7778,  -55.5556,  -33.3333,  -11.1111,   11.1111,
#          33.3333,   55.5556,   77.7778,  100.0000])
    
torch.sigmoid(a)
#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])
  1. tanh函数 (0,0) y=(e^x -e^(-x)) /(e^x +e^(-x)) y'=1-y^2 x区间在-1,1之间有效
a=torch.linspace(-1,1,10)
print(a)
#tensor([-1.0000, -0.7778, -0.5556, -0.3333, -0.1111,  0.1111,  0.3333,  0.5556,
#         0.7778,  1.0000])

torch.tanh(a)
#tensor([-0.7616, -0.6514, -0.5047, -0.3215, -0.1107,  0.1107,  0.3215,  0.5047,
#         0.6514,  0.7616])
  1. ReLU(Rectified Linear Unit,整流线性单元) y小于0时,不响应,y‘=0;y大于0时,产生响应,y’=1.
a=torch.linspace(-1,1,10)
print(a)
#tensor([-1.0000, -0.7778, -0.5556, -0.3333, -0.1111,  0.1111,  0.3333,  0.5556,
#         0.7778,  1.0000])

torch.relu(a)
#tensor([0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.1111, 0.3333, 0.5556, 0.7778,
#        1.0000])
  1. Softmax()函数:我的理解是一个归一化占比函数,多个输出,多个输入,(yi/xj)‘=yi*(1 or 0 - yj), 其中,i=j是1
a=torch.rand(3)
print(a)
a.requires_grad_()
p=F.softmax(a,dim=0)
print(p)
#tensor([0.7885, 0.0557, 0.1184])
#tensor([0.5020, 0.2412, 0.2568], grad_fn=<SoftmaxBackward0>)

损失函数

  1. MSE(mean squared error,均方差) 求法:torch.norm(y-prod,2).pow(2)
x=torch.ones(1)
w=torch.full([1],2.)
w.requires_grad_()    #声明需要求梯度

##第一种方法
mse=F.mse_loss(torch.ones(1),x*w)    #建图的过程
torch.autograd.grad(mse,[w])   #进行求导,Loss对w的导数  手动求导
#(tensor([2.]),)

##第二种方法:反向传播
mse=F.mse_loss(torch.ones(1),x*w) 
mse.backward()      #自动化求导,由loss调用
w.grad
#(tensor([2.]),)