1 相关概念
梯度——表示某一函数在该点处的方向导数沿着该方向取得最大值,即函数在该点处沿着该方向(此梯度的方向)变化最快。对于一元函数
步长——在梯度下降迭代的过程中,每一步沿梯度负方向前进的长度
损失函数——在单个训练样本上的,也就是就算一个样本的误差
代价函数——在整个训练集上面的,也就是所有样本的误差的总和的平均,也就是损失函数的总和的平均
2 梯度下降法
梯度下降法,也就是使函数按照其梯度方向的反方向(也就是下降最快的方向)改变自变量,从而是函数以最快的方向走向最低点,类似于下山,我们在不知道山的全貌的情况下,沿着坡度最陡的方向往下走比较可能最快的走到山底(但也可能是局部最低处,这跟初始点,每步走的长度等有关)。
这里写图片描述
梯度下降法有批梯度下降,随机梯度下降,以及小批量梯度下降
2.1 批梯度下降BGD
批梯度下降在求梯度时使用了所有的样本,是一种比较常用的梯度下降法。
批梯度下降过程如下
- 根据数据的特征X和标签Y之间的分布情况,假设一个拟合函数
- 求得代价函数为若代价函数小到满足精度要求,则结束梯度下降算法,否则继续第3步
- 求梯度
- 用梯度来求新的\alpha$为步长,调到第2步
代码如下:
# -*- coding: utf-8 -*-
import numpy as np
def d_J(X, Y, theta):
# X表示样本
# Y表示样本对应的标签
# theta表示参数
return np.matmul(X.T, (np.matmul(X, theta) - Y)) / np.shape(X)[0]
def cost_J(X, Y, theta):
# X表示样本
# Y表示样本对应的标签
# theta表示参数
X_theta_red_Y = np.matmul(X, theta) - Y
return np.matmul(X_theta_red_Y.T, X_theta_red_Y) / (2 * np.shape(X)[0])
step_size = 0.001 # 步长
max_iters = 10000 # 最大迭代次数
eps = 0.0001 # 精度
def train_gadient_descent(X, Y, theta):
cost = 100
cur_iters = 0
while cost > eps and cur_iters < max_iters:
theta = theta - step_size * d_J(X, Y, theta)
cur_iters += 1
cost = cost_J(X, Y, theta)
return theta
if __name__ == '__main__':
# 输入的特征和标签
X = np.array([[1 ,1, 4], [1 ,2, 5], [1 ,5, 1], [1 ,4, 2]]) # feature
Y = np.array([[19], [26], [19], [20]]) # lebal
# 假设的函数为 y=theta0+theta1*x1+theta2*x2
theta = np.array([[0.1],[0.1], [0.1]]) # 初始的theta参数
print(train_gadient_descent(X, Y, theta))
2.2 随机梯度下降法SGD
随机梯度下降法,其实和批量梯度下降法原理类似,区别在与求梯度时没有用所有的m个样本的数据,而是仅仅选取一个样本来求梯度。对应的更新公式是:
批梯度下降法与随机梯度下降法之间的比较如下:
- 训练速度——随机梯度下降法每次迭代仅用一个样本,训练速度快
- 准确度——随机梯度下降法每次迭代仅用一个样本,并没有参考所有的样本,因而准确度较低
- 收敛速度——随机梯度下降法的收敛速度慢
- 全局最优/局部最优——随机梯度下降法由于走的有点随意,比较可能走出局部最优点
2.3 小批量梯度下降法
该方法结合了上面两种的特点,每次采用小批量的样本进行迭代计算,是一种比较中庸的方法。
3 梯度下降法的调优方法
- 步长的选择——步长太长,可能导致Z字形的震荡;太小,可能导致训练速度太慢。
- 初始值的选择——初始值选的不好,可能会导致训练速度慢,走进局部最优。
- 归一化——当样本特征取值范围差别较大时,可能导致训练速度慢。因此,需要进行归一化。如,将期望为$\overline x,标准差\sigma的样本x。对其进行归一化处理$则得到的新的样本均值为0,方差为1。
网友评论