梯度下降
梯度下降是求解参数的一个优化方法,即求解使目标函数最小的参数组合, ω ∗ = a r g m i n c o s t ( ω ) \omega ^*=argmin \ cost(\omega) ω∗=argmin cost(ω)
基本原理
梯度下降过程中,每一步通过目标函数在某点对权重求导,即 ∂ c o s t ∂ ω \frac{\partial cost}{\partial \omega} ∂ω∂cost,得到这个点的梯度,即目标函数在这个点上升最快的方向,并且要对其取相反数(正方向是上升的,负方向是下降的),从而得到梯度下降每一步的迭代方向
核心公式:
ω
=
ω
−
α
∂
c
o
s
t
∂
ω
\omega = \omega - \alpha \frac{\partial cost}{\partial \omega}
ω=ω−α∂ω∂cost
其中,
α
\alpha
α 为学习率
梯度下降的算法核心是贪心算法
**注:**梯度下降只能保证最终得到的结果为局部最优解,而不能保证全局最优。但在实际的神经网络中,经过大量的实验发现,我们的目标函数很少存在局部最优的情况,大部分是全局最优。
但是在深度学习中使用梯度下降时,常见的问题是解决鞍点,即在目标函数的某点处其梯度为0,导致我们的梯度下降算法无法对参数进行更新
使用梯度下降求解线性模型
首先通过求导公式及链式求导法则,得到梯度:
然后得到线性模型中参数的更新公式:
ω
=
ω
−
α
1
N
∑
n
=
1
N
2
x
n
(
x
n
ω
−
y
n
)
\omega = \omega - \alpha \frac{1}{N}\sum_{n=1}^{N}2x_n(x_n\omega - y_n)
ω=ω−αN1n=1∑N2xn(xnω−yn)
代码实现
import numpy as np
import matplotlib.pyplot as plt
## 数据准备
x_data = [1.0,2.0,3.0]
y_data = [2.0,4.0,6.0]
cost_history = []
## 梯度下降参数初始化
w = np.random.rand() # 设定为一个随机数
alpha = 0.01 # 学习率
## 定义线性模型
def forward(x):
return x*w
## 损失函数
def cost(xs, ys):
cost = 0
for x, y in zip(xs, ys):
y_pred = forward(x)
cost += (y_pred - y) ** 2
return cost / len(xs) # 返回平均误差
## 计算梯度
def gradient(xs, ys):
grad = 0;
for x, y in zip(xs, ys):
grad += 2*x*(x*w - y)
return grad / len(xs) # 返回平均梯度
## 模型训练
for epoch in range(100):
cost_val = cost(x_data, y_data)
grad_val = gradient(x_data, y_data)
w -= alpha*grad_val # 梯度下降更新参数
cost_history.append(cost_val)
print("最优参数", w)
plt.plot(np.arange(100), cost_history)
plt.xlabel("epoch")
plt.ylabel("cost")
plt.show()
随机梯度下降
每次更新参数时,从所有样本中随机选取一个,进行计算梯度,更新参数。在实际惭怍中,要计算每一个样本的梯度,并且对参数进行更新
由于样本存在随机噪声,并且在计算梯度时也存在随机性,因此使用随机梯度下降可以解决陷入鞍点的问题
随机梯度下降公式
∂
l
o
s
s
n
∂
ω
=
2
x
n
(
x
n
ω
−
y
n
)
\frac{\partial loss_n}{\partial \omega} = 2x_n(x_n\omega - y_n)
∂ω∂lossn=2xn(xnω−yn)
随机梯度下降代码
def forward(x):
return x*w;
def loss(x, y):
y_pred = forward(x)
return (y_pred - y) ** 2
def gradient(x, y):
return 2*x*(x*w - y);
for epoch in range(100):
for x, y in zip(x_data, y_data):
grad = gradient(x, y)
w = w - 0.01 * grad;
l = loss(x, y)
随机梯度下降由于可以解决鞍点问题,在寻找最优值时具有不错的效果,但因为在每一次迭代中,所有的样本不能同时计算梯度进行更新,即不能并行,因此其时间效率比较低
随机小批量梯度下降
随机小批量梯度下降是批量梯度下降和随机梯度下降的折中
即每次更新梯度时,选取一个批量
b
a
t
c
h
batch
batch进行梯度求解,更新参数。且在深度学习中默认的SGD
方法就是随机小批量深度下降