梯度下降 -《动手学深度学习pytorch》

1梯度下降

一维梯度下降

**证明:沿梯度反方向移动自变量可以减小函数值** (梯度:导数)  x -= lr* gradf(x)

根据公式:学习率(lr)太小达不到最低点,太大动荡变化

局部极小值挑战:学习率过大动荡会到另一个局部最小值

 多维梯度下降

等高线 (x1 - eta * 2 * x1, x2 - eta * 4 * x2)

2自适应方法

2.1牛顿法

需要计算Heissan矩阵,计算量很大(也可以用Heissan阵辅助梯度下降,不详细介绍)

c = 0.5
def f(x):
    return np.cosh(c * x)  # Objective
def gradf(x):
    return c * np.sinh(c * x)  # Derivative
def hessf(x):
    return c**2 * np.cosh(c * x)  # Hessian
# Hide learning rate for now
def newton(eta=1):
    x = 10
    results = [x]
    for i in range(10):
        x -= eta * gradf(x) / hessf(x) #学习率*一阶导数/二阶导数
        results.append(x)
    print('epoch 10, x:', x)
    return results
show_trace(newton()) #仍需要调整学习率

2.2 共轭梯度法(梯度下降与线性搜索结合)

多维:方向正确加快速度

3随机梯度下降

(1)批量梯度下降BGD使用整个数据集(时间复杂度O(n)):全局最优解;易于并行实现

(2)随机梯度下降SGD使用单个样本的梯度(时间复杂度O(1)):每个样本计算完都对t梯度更新

优点:计算速度快,缺点:收敛性能不好  解决(使用动态学习率,学习率变化开始快后面慢)

def exponential(): #动态学习率
    global ctr
    ctr += 1
    return math.exp(-0.1 * ctr)
lr=exponential()

(3)小批量梯度下降法MBGD

 把数据分为若干个批,按批来更新参数,这样,一个批中的一组数据共同决定了本次梯度的方向,下降起来就不容易跑偏,减少了随机性. 优点:减少了计算的开销量,降低了随机性

 

随机梯度下降(SGD)和 批量梯度下降(BGD)的公式对比、实现对比

1、批量梯度下降

由于是要最小化风险函数,所以按每个参数theta的梯度负方向,来更新每个theta,得到的是一个全局最优解,迭代速度慢

 

2、随机梯度下降的求解思路如下:

每个样本的损失函数,对theta求偏导得到对应梯度,来更新theta

 

随机梯度下降是通过每个样本来迭代更新一次,如果样本量很大的情况(例如几十万),那么可能只用其中几万条或者几千条的样本,就已经将theta迭代到最优解了,对比上面的批量梯度下降,迭代一次需要用到十几万训练样本,一次迭代不可能最优,如果迭代10次的话就需要遍历训练样本10次。但是,SGD伴随的一个问题是噪音较BGD要多,使得SGD并不是每次迭代都向着整体最优化方向。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值