1、梯度
梯度是一个反向,函数值变大的方向
在做梯度下降时,自变量和因变量是参数和loss函数,参数的值会沿着梯度的方向即loss值更小的方向更新。
2、learning rate
- learning rate如果太小,那么梯度下降太慢,计算时间太长
- learning rate 太大的话,梯度下降可能会反复在局部最小值两端横跳
- 让lr在梯度较大时,大一些,在梯度较小时,小一些。
- 可以在lr上加上每次梯度下降时刻的梯度的平方和再开根号来限制lr的变化:AdaGrad
3、initialization status
梯度下降的初始化会决定最后可以下降到哪个local minimum
4、momentum
可以有助于跳过局部最小值:加入惯性
- 在当前时刻梯度更新的方向不仅仅取决于当前时刻的梯度,还要通过加权考虑前面几个时刻的梯度。这样当曲面平缓,或落在局部最小值上时,该momentum可以加大惯性,使梯度继续沿着最小值的方向更新下去。
w=w-lr*grad
- grad:决定方向
- lr:决定步长
Adam是同时考虑了方向和步长的梯度更新策略
5、激活函数
常用激活函数
- relu: 将小于0的部分不响应,大于0线性相应:让梯度经过激活函数后梯度不变。
- leaky_relu: 小于0的部分也按一定斜率线性相应
- sigmoid 有缺陷,在两端时梯度接近0,梯度无法更新
- tanh: 2sigmoid(2x)-1 :映射到[-1,1]
torch.sigmoid(a) 将输入的值全部映射到[0,1]区间
torch.tanh(a)
torch,relu(a)
6、loss及其梯度
- MSE
- Cross-entropy
第一种:MSE
- L2_norm相比于mse多了一个开根号的步骤
- 使用norm也可以
使用pytorch自动求导
第一种: torch.autograd.grad
x=torch.ones(1)
w=torch.full([1],2)
#w=torch.tensor([1.],required_grad=True)
w.requires_grad_()#告诉系统这个w需要更新
mse=F.mse_loss(torch.ones(1),x*w)
torch.autograd.grad(mse,[w])
第二种:loss.backward
x=torch.ones(1)
w=torch.full([1],2)
#w=torch.tensor([1.],required_grad=True)
mse=F.mse_loss(torch.ones(1),x*w)
mse.backward()
w.grad()#返回w的梯度信息
7、 softmax:
将输出的结果映射到一个维度,使所有输出的总和为1,符合概率分布的特征。适用于分类的时候。
还会使数值较大的经过softmax后相较于原来的与其他值的比例来说变得更大,可以把数值代表的信息放大。
softmax的求导:(会用在后向算法的计算上)
p=F.softmax(a,dim=0)
- 用 p i 对 a j p_i对a_j