PyTorch入门实战教程笔记(十):梯度相关操作1

梯度概念

梯度也就是所有自变量偏微分的向量(而不是标量),与导数不同,梯度有方向还有大小,反应朝某一方向梯度变化的大小,可用下式表示,例如,z = y2 - x2 ,其梯度为▽z = (-2x, 2y), 在(0,0)处的梯度为(0, 0), 在(1, 1)处的梯度为(-2,2)。

pytorch设置不使用梯度 pytorch 梯度_pytorch设置不使用梯度

用梯度找极小值解

在PyTorch入门实战教程笔记(二):简单回归问题中,我们讲过通过每次更新下式函数的参数,函数参数的当前值减去一个梯度的方向(前面乘以一个学习率),通过反复迭代更新,可以帮助函数找到一个比较合适的极小值的解,我们再来回顾一下,如下式:

pytorch设置不使用梯度 pytorch 梯度_深度学习_02


我们看一个一维的可视化过程,函数f(x)= x2sin(x), 其梯度仅与x有关,在2.5处,梯度为-10,如果2.5直接减去-10,那么就会到达12.5的位置,超过了局部最小值(x=5左右),这就有问题了,所以我们要乘以一个learning rate(学习率),假设为0.005,那么下一个x 为2.5 - (-100.005) = 2.6, 这样让它一点一点的更新,逐渐到5的位置(梯度为0,也就稳定了),具体如下图:

pytorch设置不使用梯度 pytorch 梯度_激活函数_03

常见函数梯度

  1. y = xW + b ,其中x为感知机的输入,W, b 为参数,那么y对W的偏导数为x,y对b的偏导数为1,则梯度▽(W,b) = (x, 1)
  2. y = x W2 +b2 那么y对W的偏导数为2xW,y对b的偏导数为2b,则梯度▽(W,b) = (2xW, 2b)
  3. y = xeW + eb 那么y对W的偏导数为xeW,y对b的偏导数为eb ,则梯度▽(W,b) = (xeW, eb )
  4. f = [y - (xW + b)]2 ,线性感知机的输出和真实label之间的均方差,即单层感知机在使用均方差的度量的loss的梯度。计算如下:(即对初始值的(W0,b0),能够推出(▽W0,▽b0),然后乘以学习率,即可进行更新)。

pytorch设置不使用梯度 pytorch 梯度_激活函数_04

  1. f = ylog(xW+b), 求解梯度结果如下:

pytorch设置不使用梯度 pytorch 梯度_pytorch设置不使用梯度_05

激活函数及其梯度

  1. 激活函数Sigmoid 最初的神经元,科学家根据青蛙的神经元做了深入研究,发现青蛙的神经元有多个输入(比如x0-x2),中间的结果为这几个输入的加权和,但是响应值并不是一个线性的输出,而是大于某一阈值才会输出一个固定的响应值,即阶梯函数,结构如下所示:

pytorch设置不使用梯度 pytorch 梯度_pytorch_06

可以发现,这个激活函数,不可导,为了解决不可导,科学家提出一个连续可导的函数:Sigmoid/Logistic, f(x) = 1/(1+e-x), 可以将(-∞, +∞)压缩到(-1, 1), 图像如下所示:

pytorch设置不使用梯度 pytorch 梯度_pytorch_07



该函数求导过程如下:

pytorch设置不使用梯度 pytorch 梯度_pytorch_08



可以看到,δ已知,δ对w的导数已知,计算过程是非常方便的,并且该激活函数可以把结果压缩到[0, 1], 而概率也是[0, 1], 刚好对应,但是有致命的也有,比如当中间过程比较大时,那么其梯度为零,造成长时间不能更新,即梯度弥散。torch的sigmod函数,运算如下,可以将[-100, 100]压缩几乎[0, 1]。

pytorch设置不使用梯度 pytorch 梯度_激活函数_09

  1. 激活函数Tanh Tanh激活函数可以有sigmoid变化得到,是[-1, 1]的区间,具体形式如下:

pytorch设置不使用梯度 pytorch 梯度_激活函数_10

导数推导及代码效果torch.tanh展示:


pytorch设置不使用梯度 pytorch 梯度_激活函数_11

pytorch设置不使用梯度 pytorch 梯度_pytorch_12

  1. 激活函数 ReLU(Rectified Linear Unit)

pytorch设置不使用梯度 pytorch 梯度_pytorch设置不使用梯度_13



ReLU形式简单,性能优良,实验证明非常适合做现在的深度学习激活函数,在x<0时,梯度为0,在x>0时,梯度为1,能够克服梯度弥散的情况,在pytorch中操作如下所示:

pytorch设置不使用梯度 pytorch 梯度_pytorch设置不使用梯度_14