关于梯度的问题
在深度学习之中,我们往往把梯度和偏导数结合在一起,那么什么是梯度呢?梯度和偏导数之间究竟有什么关系呢?梯度有什么作用呢?得到梯度之后我们应该如何优化我们的模型呢?这些问题在这个文章中都会给出答案
拿线性回归举例
- 用一个烂大街的线性回归的例子来做演示,首先要弄明白什么是回归任务要做的。简单一句话,==回归就是拟合,就是要通过一堆特征点总结出一条具有直观意义、并能帮助你以后预测其他点的线的过程。==如果觉得这还不是人话,那么让我们来可视化一下:
- 这些蓝点是一个个的已知的特征点,通过这些特征点,我要总结出一条线,有了这条线之后,以后再给我任意一个
x
,我都能根据这条线预测出y
,得到这个红线的过程就叫线性回归过程。
过程介绍
- 首先我们知道,最后之所以得到这条红线,是因为这个红线所代表的总体损失小于我们规定的一个阈值。例如我们规定,当我们的程序运行到损失小于 0.1 的时候程序停止,得到的线就是这条红线。
- 因此我们一开始需要初始化我们的程序,也就是先指定一条线,比如说我们指定下图的绿色直线为程序开始时候的线,很显然,绿线到所有点的误差的总和是明显大于红线的,而我们程序需要做的就是不断通过梯度下降来减小绿线的误差,直到绿线移动到红线的位置,这个时候误差小于阈值 0.1 程序就会停止。
误差计算
- 好的,确定好目标之后,我们开始计算误差,并且学习如何减小误差。
- 误差的计算使用
MSE
均方误差:
Σ i = 1 m ( y ^ ( i ) − y ( i ) ) 2 \Sigma^{m}_{i=1}(\hat{y}^{(i)}-y^{(i)})^2 Σi=1m(y^(i)−y(i))2- i i i 是第 i i i 个样本点, y ( i ) y^{(i)} y(i) 是当前 x x x 下 y y y 的真实值; y ^ ( i ) \hat{y}^{(i)} y^(i) 是根据当前的 x x x 预测的值
- 最终我们计算所有 m m m 个样本的预测和真实值的误差,我们可以得到总的误差表示
目标
-
我们的目标最终是得到一个 y = θ 1 + θ 2 x y=\theta_1+\theta_2x y=θ1+θ2x 的直线,除此之外,再没有其他的参数了,也就是说,我们的目标最终是通过学习求解截距 θ 1 \theta_1 θ1 和 斜率 θ 2 \theta_2 θ2,所以我们把目标函数设置成:
J ( θ 1 , θ 2 ) = 1 2 m Σ i = 1 m ( y ^ ( i ) − y ( i ) ) 2 J(\theta_1,\theta_2) =\frac{1}{2m}\Sigma^{m}_{i=1}(\hat{y}^{(i)}-y^{(i)})^2 J(θ1,θ2)=2m1Σi=1m(y^(i)−y(i))2- 之所以有 1 2 m \frac{1}{2m} 2m1 是因为求导之后会多出一个 2 m 2m 2m 项与 Σ i = 1 m ( y ^ ( i ) − y ( i ) ) 2 \Sigma^{m}_{i=1}(\hat{y}^{(i)}-y^{(i)})^2 Σi=1m(y^(i)−y(i))2 相乘;因此我们人为抵消掉这部分,就是上面的这个式子。
- 我们通过求解 J ( θ 1 , θ 2 ) = 1 2 m Σ i = 1 m ( y ^ ( i ) − y ( i ) ) 2 J(\theta_1,\theta_2) =\frac{1}{2m}\Sigma^{m}_{i=1}(\hat{y}^{(i)}-y^{(i)})^2 J(θ1,θ2)=2m1Σi=1m(y^(i)−y(i))2 的最小值,就可以得到红色的线了。
-
对于其他的深度学习任务,我们可能有更复杂的非线性的拟合任务,其中可能涉及到非常多的参数情况,那个时候,我们的优化目标就不仅是 J ( θ 1 , θ 2 ) J(\theta_1,\theta_2) J(θ1,θ2) 了,而是 J ( θ 1 , θ 2 , . . . , θ n ) J(\theta_1,\theta_2,...,\theta_n) J(θ1,θ2,...,θn)
梯度
-
假设我们再简化一下上面的目标,假设我们整个的参数求解,只涉及一个参数, θ 1 \theta_1 θ1,即: J ( θ 1 ) = 1 2 m Σ i = 1 m ( y ^ ( i ) − y ( i ) ) 2 J(\theta_1) =\frac{1}{2m}\Sigma^{m}_{i=1}(\hat{y}^{(i)}-y^{(i)})^2 J(θ1)=2m1Σi=1m(y^(i)−y(i))2
-
那这个时候我们求解最小值你肯定会,这就变成了一个二次方程求极值 的问题,也就是通过求解 J ′ ( θ 1 ) = 0 J^{'}(\theta_1)=0 J′(θ1)=0 的点来得到最小值。这个时候,某个点的导数就是梯度,也就是寻找最小值的方向,这个方向很明确,就是朝着导数的方向
-
这个时候,让我们回归两个参数的情况
J ( θ 1 , θ 2 ) = 1 2 m Σ i = 1 m ( y ^ ( i ) − y ( i ) ) 2 J(\theta_1,\theta_2) =\frac{1}{2m}\Sigma^{m}_{i=1}(\hat{y}^{(i)}-y^{(i)})^2 J(θ1,θ2)=2m1Σi=1m(y^(i)−y(i))2 -
和一个参数不同的是,这个时候,要确定优化的方向(寻找最小值点的方向)就不能只是把 J ′ ( θ 1 ) J^{'}(\theta_1) J′(θ1) 作为决定优化方向的全部筹码了,因为这个时候,要找到最小值, θ 2 \theta_2 θ2 也起着决定性的作用,因此我们要通过 J J J 对 θ 1 , θ 2 \theta_1,\theta_2 θ1,θ2 分别求导的综合表现,来决定优化的方向。而 J J J 对 θ 1 , θ 2 \theta_1,\theta_2 θ1,θ2 的偏导结果,就是这个时候梯度的值!
- 因此在这幅图中,我们把
x
x
x 轴看做是
θ
1
\theta_1
θ1 而把
y
y
y 轴看做是
θ
2
\theta_2
θ2,把
z
z
z 轴看做是当前
J
J
J 的值(误差的总和);
δ
J
δ
θ
1
\frac{\delta J}{\delta \theta_1}
δθ1δJ 就相当于是沿着
x
x
x 轴方向的分量,
δ
J
δ
θ
2
\frac{\delta J}{\delta \theta_2}
δθ2δJ 就相当于是沿着
y
y
y 轴方向的分量,
- 因此在这幅图中,我们把
x
x
x 轴看做是
θ
1
\theta_1
θ1 而把
y
y
y 轴看做是
θ
2
\theta_2
θ2,把
z
z
z 轴看做是当前
J
J
J 的值(误差的总和);
δ
J
δ
θ
1
\frac{\delta J}{\delta \theta_1}
δθ1δJ 就相当于是沿着
x
x
x 轴方向的分量,
δ
J
δ
θ
2
\frac{\delta J}{\delta \theta_2}
δθ2δJ 就相当于是沿着
y
y
y 轴方向的分量,
梯度下降
-
梯度下降就是通过更新梯度的方式求解出 J J J 的最小值,这个过程就是:
θ 1 , θ 2 = θ 1 , θ 2 − g r a d × l r \theta_1,\theta_2=\theta_1,\theta_2-grad×lr θ1,θ2=θ1,θ2−grad×lr- l r lr lr 是学习率,也就是每次沿梯度方向走的距离,下图中两个红点之间的距离
-
g
r
a
d
grad
grad 就是梯度,代表下降的方向
-
更新完之后就得到了新的 θ 1 , θ 2 \theta_1,\theta_2 θ1,θ2,而这个时候, J J J 的值就会小于原来的那个 J J J 了