动手学深度学习(七) 梯度下降(上)

简介: 动手学深度学习(七) 梯度下降(上)

梯度下降


Boyd & Vandenberghe, 2004

%matplotlib inline
import numpy as np
import torch
import time
from torch import nn, optim
import math
import sys
sys.path.append('/home/kesci/input')
import d2lzh1981 as d2l


一维梯度下降


证明:沿梯度反方向移动自变量可以减小函数值

泰勒展开:

代入沿梯度方向的移动量

e.g.

def f(x):
    return x**2  # Objective function
def gradf(x):
    return 2 * x  # Its derivative
def gd(eta):
    x = 10
    results = [x]
    for i in range(10):
        x -= eta * gradf(x)
        results.append(x)
    print('epoch 10, x:', x)
    return results
res = gd(0.2)

epoch 10, x: 0.06046617599999997

def show_trace(res):
    n = max(abs(min(res)), abs(max(res)))
    f_line = np.arange(-n, n, 0.01)
    d2l.set_figsize((3.5, 2.5))
    d2l.plt.plot(f_line, [f(x) for x in f_line],'-')
    d2l.plt.plot(res, [f(x) for x in res],'-o')
    d2l.plt.xlabel('x')
    d2l.plt.ylabel('f(x)')
show_trace(res)


80.png


学习率

show_trace(gd(0.05))

epoch 10, x: 3.4867844009999995


81.png

show_trace(gd(1.1))

epoch 10, x: 61.917364224000096


82.png


局部极小值


e.g.

c = 0.15 * np.pi
def f(x):
    return x * np.cos(c * x)
def gradf(x):
    return np.cos(c * x) - c * x * np.sin(c * x)
show_trace(gd(2))

epoch 10, x: -1.528165927635083


83.png


多维梯度下降


def train_2d(trainer, steps=20):
    x1, x2 = -5, -2
    results = [(x1, x2)]
    for i in range(steps):
        x1, x2 = trainer(x1, x2)
        results.append((x1, x2))
    print('epoch %d, x1 %f, x2 %f' % (i + 1, x1, x2))
    return results
def show_trace_2d(f, results): 
    d2l.plt.plot(*zip(*results), '-o', color='#ff7f0e')
    x1, x2 = np.meshgrid(np.arange(-5.5, 1.0, 0.1), np.arange(-3.0, 1.0, 0.1))
    d2l.plt.contour(x1, x2, f(x1, x2), colors='#1f77b4')
    d2l.plt.xlabel('x1')
    d2l.plt.ylabel('x2')


eta = 0.1
def f_2d(x1, x2):  # 目标函数
    return x1 ** 2 + 2 * x2 ** 2
def gd_2d(x1, x2):
    return (x1 - eta * 2 * x1, x2 - eta * 4 * x2)
show_trace_2d(f_2d, train_2d(gd_2d))

epoch 20, x1 -0.057646, x2 -0.000073


84.png


自适应方法

牛顿法


处泰勒展开:

最小值点处满足: , 即我们希望 , 对上式关于 求导,忽略高阶无穷小,有:

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())

epoch 10, x: 0.0


85.png

c = 0.15 * np.pi
def f(x):
    return x * np.cos(c * x)
def gradf(x):
    return np.cos(c * x) - c * x * np.sin(c * x)
def hessf(x):
    return - 2 * c * np.sin(c * x) - x * c**2 * np.cos(c * x)
show_trace(newton())

epoch 10, x: 26.83413291324767


86.png

show_trace(newton(0.5))

epoch 10, x: 7.269860168684531


87.png


收敛性分析


只考虑在函数为凸函数, 且最小值点上 时的收敛速度:

为第 次迭代后 的值, 表示 到最小值点 的距离,由 :

两边除以 , 有:

代入更新方程 , 得到:

时,有:


预处理 (Heissan阵辅助梯度下降)



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

相关文章
|
7月前
|
机器学习/深度学习 数据可视化 算法
深度学习之梯度下降参数可视化
深度学习之梯度下降参数可视化
127 2
|
7月前
|
机器学习/深度学习 人工智能 自然语言处理
梯度下降求极值,机器学习&深度学习
梯度下降求极值,机器学习&深度学习
60 0
|
机器学习/深度学习 算法 TensorFlow
深度学习常用知识梯度下降学习率和反向传播
深度学习常用知识梯度下降学习率和反向传播
103 0
|
6月前
|
机器学习/深度学习 PyTorch 算法框架/工具
【从零开始学习深度学习】39. 梯度下降优化之动量法介绍及其Pytorch实现
【从零开始学习深度学习】39. 梯度下降优化之动量法介绍及其Pytorch实现
|
6月前
|
机器学习/深度学习 算法 PyTorch
【从零开始学习深度学习】38. Pytorch实战案例:梯度下降、随机梯度下降、小批量随机梯度下降3种优化算法对比【含数据集与源码】
【从零开始学习深度学习】38. Pytorch实战案例:梯度下降、随机梯度下降、小批量随机梯度下降3种优化算法对比【含数据集与源码】
|
3月前
|
机器学习/深度学习 算法
深度学习中的优化算法:从梯度下降到Adam
本文深入探讨了深度学习中的核心——优化算法,重点分析了梯度下降及其多种变体。通过比较梯度下降、动量方法、AdaGrad、RMSProp以及Adam等算法,揭示了它们如何更高效地找到损失函数的最小值。此外,文章还讨论了不同优化算法在实际模型训练中的表现和选择依据,为深度学习实践提供了宝贵的指导。
108 7
|
6月前
|
机器学习/深度学习 人工智能 算法
【机器学习】深度探索:从基础概念到深度学习关键技术的全面解析——梯度下降、激活函数、正则化与批量归一化
【机器学习】深度探索:从基础概念到深度学习关键技术的全面解析——梯度下降、激活函数、正则化与批量归一化
79 3
|
6月前
|
机器学习/深度学习 算法 C语言
【深度学习】优化算法:从梯度下降到Adam
【深度学习】优化算法:从梯度下降到Adam
177 1
|
6月前
|
机器学习/深度学习 算法 PyTorch
《PyTorch深度学习实践》--3梯度下降算法
《PyTorch深度学习实践》--3梯度下降算法
|
7月前
|
机器学习/深度学习 自然语言处理 算法
深度解析深度学习中的优化算法:从梯度下降到自适应方法
【4月更文挑战第28天】 在深度学习模型训练的复杂数学迷宫中,优化算法是寻找最优权重配置的关键导航者。本文将深入探讨几种主流的优化策略,揭示它们如何引导模型收敛至损失函数的最小值。我们将比较经典的批量梯度下降(BGD)、随机梯度下降(SGD)以及动量概念的引入,进一步探索AdaGrad、RMSProp和Adam等自适应学习率方法的原理与实际应用。通过剖析这些算法的理论基础和性能表现,我们旨在为读者提供一个关于选择合适优化器的参考视角。