【优化算法】从梯度下降到深度学习非凸优化

一、数学优化

1.1 定义

Mathematical Optimization(数学优化)问题,亦称最优化问题,是指在一定约束条件下,求解一个目标函数的最大值(或最小值)问题。

image

根据输入变量 𝑿 的值域是否为实数域,数学优化问题可分为离散优化问题连续优化问题

在连续优化问题中,根据是否有变量的约束条件,可将优化问题分为无约束优化问题约束优化问题

1.2 线性优化和非线性优化

  • 如果目标函数和所有的约束函数都为线性函数,则该问题为线性规划(Linear Programming)问题
  • 相反,如果目标函数或任何一个约束函数为非线性函数,则该问题为非线性规划(Nonlinear Programming)问题
在非线性优化问题中,有一类比较特殊的问题是凸优化(Convex Optimization)问题。

1.3 凸优化

image

1.3.1 凸集和凸函数

在凸优化问题中,变量 𝒙 的可行域为凸集(Convex Set),即对于集合中任意两点,它们的连线全部位于集合内部。

image

凸集的并集也是凸集。

image

目标函数 𝑓 也必须为凸函数, 即满足 image

凸函数: 给定任意两个点,函数的取值在两点之间的取值,总是小于此两点。

image

1.3.2 其他性质

image

image

image
凸优化要求优化目标是凸函数,然而深度学习建模的往往是非凸问题。因此,凸优化只在算法收敛性证明性上有用,在实际训练中的用处却不大。

1.4 深度学习优化

深度学习中的大多数目标函数都很复杂,没有解析解。所以,必须使用数值优化算法。

深度学习优化中最令人烦恼的是局部最小值、鞍点和梯度消失。

1.4.1 局部最小值

对于任何目标函数f(x),如果在处x对应的值f(x)小于在x附近任意其他点的值,那么f(x)可能是局部最小值。

1.4.2 鞍点(saddle point)

指函数的所有梯度都为0,但既不是全局最小值也不是局部最小值的任何位置。
image
假设函数输入是k维向量,其输出是标量,因此其Hessian矩阵将有k个特征值。函数的解可能是局部最小值局部最大值函数梯度为零位置处的鞍点

  • 当函数在零梯度位置处的Hessian矩阵的特征值全部为正值时(正定),有该函数的局部最小值;
  • 当函数在零梯度位置处的Hessian矩阵的特征值全部为负值时,有该函数的局部最大值;
  • 当函数在零梯度位置处的Hessian矩阵的特征值为负值和正值时,有该函数的一个鞍点;

这是多变量微积分的结论。

二、梯度下降

梯度下降(Graident Descent, GD)可以从方向导数和泰勒级数分别推导。

2.1 方向导数推导GD

方向导数即,一个函数f(x)在给定点x处,在给定单位方向的变化率(斜率,>0增加,<0减少)。

方向导数就是把导数推广到了单位方向。简而言之,给定函数点x,选择在任意一个单位方向都求一个斜率来看函数的变化程度Δf(x)/Δx
image

如果你要爬升(上山),那么可定选最陡的方向。给定点x,通过求方向的极值得到最优方向(局部):

  • 梯度是方向导数取最大值的方向(单位方向和梯度同方向时,夹角为0)。
  • 负梯度,是f(x)在给定点x处衰减最厉害的方向

2.2 泰勒级数启发式推导GD

总结:泰勒一阶展开,基于负梯度针对 ϵ构造递减序列

方向导数:梯度是方向导数最大的方向,而负梯度则是函数值下降最快的方向

梯度下降启发式

考虑一类连续可微实值函数 f:RR。利用泰勒展开,可得到:

f(x+ϵ)=f(x)+ϵf(x)+O(ϵ2)

即在一阶近似中,f(x+e) 可通过x处的函数值f(x)和及其一阶导数f(x) 得出。

现在试图构造出一个让f(x)递减的序列:

f(x+ϵ)f(x)<0

f(x+ϵ)f(x)=ϵf(x)+O(ϵ2)

可试图将,ϵ 设置为一个极小值的正值 η 乘以负梯度,即ϵ=ηf(x)

那么有,η 设为固定步长,将其代入泰勒展开式以得到:f(xηf(x))=f(x)η(f(x))2+O(η2f2(x))

如果f(x) 的导数没有消失,就能继续展开(函数n阶可导)。此外,总是可令 η小到足以使高阶项变得不相关。因此:

f(xηf(x))f(x)=η(f(x))2<0

那么有, w为损失函数中关于模型f(w)的参数,η 为学习率,那么梯度下降则有:

wwηf(w)

可假设w在负梯度方向上移动的会减少函数值。

2.3 学习率

在梯度下降中,我们首先选择初参数始值和学习率常数,然后使用它们连续迭代,直到停止条件达成。

学习率(learning rate)决定目标函数能否收敛到局部最小值,以及何时收敛到最小值。

若学习率太小,将导致的更新非常缓慢代
image

若学习率太大,将导致的更新震荡
image

import torch
import numpy as np

def f(x):  
    # 目标函数 
    f(x) = x^2   
    return x ** 2

def f_grad(x): 
    # 目标函数的梯度(导数)
    return 2 * x

def gd(eta, f_grad):
    x = 10.0  # 初始参数值
    results = [x]
    for i in range(10):
        x = x - eta * f_grad(x)
        results.append(float(x))
        print(f'epoch 10, x: {x:f}')
    return results

results = gd(0.2, f_grad)

image

2.4 多元梯度下降

多变量情况下的梯度下降。
考虑多元连续可微实值函数,输入为

x=[x1,x2,,xd]

即目标函数将向量映射成标量 f:RdR。相应地,它的梯度也是一个由个偏导数组成的向量:f(x)=[f(x)x1,f(x)x2,,f(x)xd].

对多变量函数使用相应的一阶泰勒近似来思考。 具体来说

f(x+ϵ)=f(x)+ϵf(x)+O(ϵ2).

在epsilon的二阶项中,函数下降最陡的方向由负梯度得出:f(x) 。即在近似中,f(x+e) 可通过x处的函数值f(x)和一阶导数f(x)得出。

现在试图,构造出一个让f(x)递减的序列:
可以试图将 设置为一个负的极小值 η 乘以梯度:

image

x(t+1)=x(t)H1f(x).

未完待续

参考资料

  1. 动手学DL
  2. 深度学习和神经网络
posted @   LeonYi  阅读(1060)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· 分享4款.NET开源、免费、实用的商城系统
· 解决跨域问题的这6种方案,真香!
· 一套基于 Material Design 规范实现的 Blazor 和 Razor 通用组件库
· 5. Nginx 负载均衡配置案例(附有详细截图说明++)
点击右上角即可分享
微信分享提示