深度学习--常见激活函数
深度学习--常见激活函数
梯度下降出现问题:局部最小值、鞍点
影响因素:
- 初始状态
- 学习率 :影响收敛速度和收敛精度
- 动量:如何逃离局部最小值,增加一个惯性
激活函数及其梯度
- 阶跃函数
- 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])
- 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])
- 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])
- 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>)
损失函数
- 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.]),)