梯度下降(BGD、SGD、MSGD)差异

首先引荐一片写的很详细的博文https://www.cnblogs.com/pinard/p/5970503.html

具体介绍不在累述,本文主要可视化三种梯度下降的差异

先附上手动推导过程:


再附上Python代码:

# encoding=utf-8
import numpy as np
import matplotlib.pyplot as plt
#创建训练数据集
#假设训练学习一个线性函数y = 2.33x
EXAMPLE_NUM = 100#训练总数
BATCH_SIZE = 10#mini_batch训练集大小
TRAIN_STEP = 100#训练次数
LEARNING_RATE = 0.0001#学习率
X_INPUT = np.arange(EXAMPLE_NUM) * 0.1#生成输入数据X
Y_OUTPUT_CORRECT = 2.33 * X_INPUT#生成训练正确输出数据

def train_func(X, K):
    result = K * X
    return result
#BGD
#参数初始化值
k_BGD = 0.0
#记录迭代数据用于作图
k_BGD_RECORD = []
for step in range(TRAIN_STEP):
    SUM_BGD = 0
    for index in range(len(X_INPUT)):
        SUM_BGD += (train_func(X_INPUT[index], k_BGD) - Y_OUTPUT_CORRECT[index]) * X_INPUT[index]
    k_BGD -= LEARNING_RATE * SUM_BGD
    k_BGD_RECORD.append(k_BGD)
#SGD
k_SGD = 0.0
k_SGD_RECORD = []
for step in range(TRAIN_STEP):
    index = np.random.randint(len(X_INPUT))
    SUM_SGD = (train_func(X_INPUT[index], k_SGD) - Y_OUTPUT_CORRECT[index]) * X_INPUT[index]
    k_SGD -= LEARNING_RATE * SUM_SGD
    k_SGD_RECORD.append(k_SGD)
#MBGD
k_MBGD = 0.0
k_MBGD_RECORD = []
for step in range(TRAIN_STEP):
    SUM_MBGD = 0
    index_start = np.random.randint(len(X_INPUT) - BATCH_SIZE)
    for index in np.arange(index_start, index_start+BATCH_SIZE):
        SUM_MBGD += (train_func(X_INPUT[index], k_MBGD) - Y_OUTPUT_CORRECT[index]) * X_INPUT[index]
    k_MBGD -= LEARNING_RATE * SUM_MBGD
    k_MBGD_RECORD.append(k_MBGD)
#作图
plt.plot(np.arange(TRAIN_STEP), np.array(k_BGD_RECORD), label='BGD')
plt.plot(np.arange(TRAIN_STEP), k_SGD_RECORD, label='SGD')
plt.plot(np.arange(TRAIN_STEP), k_MBGD_RECORD, label='MBGD')
plt.legend()
plt.ylabel('weight')
plt.xlabel('step')
plt.show()
再附上执行结果图:


BGD:可以在迭代步骤上可以快速接近最优解,但是其时间消耗相对其他两种是最大的,因为每一次更新都需要遍历完所有数据。

SGD:参数更新是最快的,因为每遍历一个数据都会做参数更新,但是由于没有遍历完所有数据,所以其路线不一定是最佳路线,甚至可能会反方向巡迹,不过其整体趋势是往最优解方向行进的,随机速度下降还有一个好处是有一定概率跳出局部最优解,而BGD会直接陷入局部最优解。

MSGD:以上两种都是MBGD的极端,MBGD是中庸的选择,保证参数更新速度的前提下,用过小批量又增加了其准备度,所以大多数的梯度下降算法中都会使用到小批量梯度下降。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值