paddlepaddle学习笔记之梯度下降法
本文基于ai-studio使用nmumpy构建神经网络模型项目
引入
波士顿房价预测:
本文以波士顿房价预测模型来介绍梯度下降法,波士顿房价预测模型是机器学习界的helloworld,现实生活中,房价会受到多方面的影响,这就使得人们有机会从外部信息中提取出对房价信息的预测值,那么诸多的外部信息如:位置、交通、是否学区房等如何影响房价,影响房价的程度如何这些信息我们该如何确定呢?
现规定预测值与实际值的偏差为Loss函数:其中y为真实房价,z为预测房价。
L
=
1
2
N
∑
i
=
1
N
(
y
i
−
z
i
)
2
L= \frac{1}{2N}\sum_{i=1}^N{(y_i - z_i)^2}
L=2N1i=1∑N(yi−zi)2
我们的目标即是选择合适的网络参数w将Loss函数不断减小!
梯度下降法
那么如何使得loss函数不断减小呢?由此引入梯度下降法:
梯度下降法:
在现实中存在大量的函数正向求解容易,但反向求解较难,被称为单向函数,这种函数在密码学中有大量的应用。密码锁的特点是可以迅速判断一个密钥是否是正确的(已知x,求y很容易),但是即使获取到密码锁系统,无法破解出正确的密钥是什么(已知y,求x很难)。
这种情况特别类似于一位想从山峰走到坡谷的盲人,他看不见坡谷在哪(无法逆向求解出Loss导数为0时的参数值),但可以伸脚探索身边的坡度(当前点的导数值,也称为梯度)。那么,求解Loss函数最小值可以这样实现:从当前的参数取值,一步步的按照下坡的方向下降,直到走到最低点。这种方法笔者称它为“盲人下坡法”。哦不,有个更正式的说法“梯度下降法”。
结合上面对梯度下降法的定义,得知:
-
梯度下降法的作用:通过不断迭代神经网络参数实现对神经网络模型的优化。
-
梯度下降法的原理:循环计算L对w(神经网络参数)的梯度。每次迭代将w沿着梯度反方向移动一定值,使得Loss函数能够靠近最小值,得到更准确的模型。
为了直观,选择w5,w9两个参数。做出loss函数随着w5,w9的变化趋势。
如图:红线表示当前梯度方向,蓝线表示梯度下降方向,二者相反。我们所要做的就是将w5,w9的值不断的沿着梯度下降方向修改,使得loss达到最小值。
实现方法
下面我们开始研究更新梯度的方法。首先沿着梯度的反方向移动一小步,找到下一个点P1,观察损失函数的变化。
# 在[w5, w9]平面上,沿着梯度的反方向移动到下一个点P1
# 定义移动步长 eta
eta = 0.1
# 更新参数w5和w9
net.w[5] = net.w[5] - eta * gradient_w5
net.w[9] = net.w[9] - eta * gradient_w9
# 重新计算z和loss
z = net.forward(x)
loss = net.loss(z, y)
gradient_w, gradient_b = net.gradient(x, y)
gradient_w5 = gradient_w[5][0]
gradient_w9 = gradient_w[9][0]
print('point {}, loss {}'.format([net.w[5][0], net.w[9][0]], loss))
print('gradient {}'.format([gradient_w5, gradient_w9]))
运行上面的代码,可以发现沿着梯度反方向走一小步,下一个点的损失函数的确减少了。
在上述代码中,每次更新参数使用的语句: net.w[5] = net.w[5] - eta * gradient_w5
- 相减:参数需要向梯度的反方向移动。
- eta:控制每次参数值沿着梯度反方向变动的大小,即每次移动的步长,又称为学习率。
当以上的代码重复执行足够多次时,网络参数点就将不断移动到接近于最小值的位置,最终得到一个理想的模型。
缺点
梯度下降法每次都要使用全部样本数据进行计算,每次计算梯度时需要消耗大量的算力。
计算次数=样本量*迭代次数。
如当样本量较大时需要计算的数据量大时,梯度下降法计算时间久,算法效率低,所以需要对梯度下降法进行改进,于是后来便出现了随机梯度下降法,下篇博客再介绍随机梯度下降法对梯度下降法的改进与提升。
下降法计算时间久,算法效率低,所以需要对梯度下降法进行改进,于是后来便出现了随机梯度下降法通过跟合理的利用有限样本的信息提高计算效率,下篇博客再介绍随机梯度下降法对梯度下降法的改进与提升。