梯度下降法原理和matlab仿真分析

1 引言

梯度下降法(Gradient Descent)也称为最速下降法(Steepest Descent),是法国数学家奥古斯丁·路易·柯西 (Augustin Louis Cauchy) 于1847年提出来,它是最优化方法中最经典和最简单的一阶方法之一。梯度下降法由于其较低的复杂度和简单的操作而在很多领域得到广泛研究和应用,如机器学习。由梯度下降法衍生了许多其他算法,如次梯度下降法,近端梯度下降法,随机梯度下降法,回溯梯度发,动量加速梯度法等等。本文只介绍最基础的梯度下降法原理和理论分析,与此同时,通过仿真来说明梯度下降法的优势和缺陷。其他重要的梯度下降衍生方法会持续更新,敬请关注。

2 梯度下降法原理

2.1 偏导数,方向导数和梯度

在直角坐标系下,标量函数 f : R n ↦ R f:\mathbb{R}^{n}\mapsto \mathbb{R} f:RnR 的梯度 ∇ f \nabla f f 定义为:

∇ f = ∂ f ∂ x i + ∂ f ∂ y j + ∂ f ∂ z k \nabla f = \frac{{\partial f}}{{\partial x}}{\bf{i}} + \frac{{\partial f}}{{\partial y}}{\bf{j}} + \frac{{\partial f}}{{\partial z}}{\bf{k}} f=xfi+yfj+zfk

其中 i \bf{i} i j \bf{j} j k \bf{k} k 表示在三个维度的单位方向矢量。 ∂ f ∂ x \frac{{\partial f}}{{\partial x}} xf ∂ f ∂ y \frac{{\partial f}}{{\partial y}} yf ∂ f ∂ z \frac{{\partial f}}{{\partial z}} zf 为对应的偏导数。

  • 方向导数:函数在某点处有无数条切线,沿着这些方向的斜率组成了方向导数,每一条切线都代表一个变化的方向。
  • 偏导数:函数在一个点处有无数个导数,而延着坐标轴方向对应的导数叫偏导数。
  • 梯度:是一个向量,它是的方向是最大方向导数所对应的方向。

梯度下降法就是以梯度为搜索方向的迭代优化算法

图2. 梯度下降法迭代过程

2.2 梯度下降法描述

对于无约束优化问题:

arg ⁡ min ⁡ x ∈ R n f ( x ) \mathop {\arg \min }\limits_{{\bf{x}} \in {\mathbb{R}^n}} f({\bf{x}}) xRnargminf(x)

函数 f f f 可以是凸的,也可以是非凸的,在高维非凸的情况下,解这样一个优化问题可能很难计算解析解,而我们可以使用数值迭代法来求得一个局部最优解。这样的迭代方法有很多,比如本文讲的梯度下降法,牛顿迭代法,共轭梯度法等,其中梯度下降法利用了梯度信息,属于一阶方法,牛顿法利用了海森矩阵,属于二阶方法,而共轭梯度法是介于这二者之间的方法。

图1. 复杂函数图像

我们先来看看梯度下降法是什么样子的,梯度下降法的迭代公式为:
x k + 1 = x k + α k d k {{\bf{x}}^{k + 1}} = {{\bf{x}}^k} + {\alpha _k}{{\bf{d}}^k} xk+1=xk+αkdk
式 (2) 中 x k {{\bf{x}}^k} xk 表示第 k k k 次迭代时的位置, α k \alpha_k αk 表示第 k k k 次迭代的步长, d k \bf{d}_k dk 表示第 k k k 次迭代的寻优方向。梯度下降法就是在给定初始点 x 0 \bf{x}_0 x0 后,通过不断沿着寻优方向迭代找到局部最优值的过程。

那么梯度下降法中的步长方向怎么确定呢?
一般来说,步长的选择有多种方式,可以是固定的,也可以是随着迭代过程而变化的
寻优方向则是 f ( x ) f(\bf{x}) f(x) 在点 x k \bf{x}_k xk 处的梯度反方向,

2.3 梯度下降法的矩阵形式

以求解线性方程 y = A x {\bf{y}} = {\bf{Ax}} y=Ax 为例,
假设目标函数为
f ( x ) = 1 2 ∥ A x − y ∥ 2 2 f({\bf{x}}) = \frac{1}{2}\left\| {{\bf{Ax}} - {\bf{y}}} \right\|_2^2 f(x)=21Axy22
我们知道目标函数的梯度就是梯度下降法的寻优方向,所以我们可以先求目标函数的导数:
g = A T ( A x − y ) {\bf{g}} = {{\bf{A}}^T}({\bf{Ax}} - {\bf{y}}) g=AT(Axy)
x k {\bf{x}}_{k} xk 处,将 x k + 1 = x k + α k g k {{\bf{x}}_{k + 1}} = {{\bf{x}}_k} + {\alpha _k}{{\bf{g}}_k} xk+1=xk+αkgk 代入上式中,得到:
f ( x k + 1 ) = 1 2 ∥ A ( x k + α k g k ) − y ∥ 2 2 f({{\bf{x}}_{k + 1}}) = \frac{1}{2}\left\| {{\bf{A}}({{\bf{x}}_k} + {\alpha _k}{{\bf{g}}_k}) - {\bf{y}}} \right\|_2^2 f(xk+1)=21A(xk+αkgk)y22
接下来,为了求 x k {\bf{x}}_{k} xk 处的步长,我们介绍一种精确线搜索(Exact Line Search)方法,
精确线搜索方法的原理是沿着 x k + α k g k {{\bf{x}}_k} + {\alpha _k}{{\bf{g}}_k} xk+αkgk 方向最小化目标函数,从而得到此时的 α k {\alpha _k} αk。也就是求解这样一个问题:
α k = arg ⁡ min ⁡ α f ( x k + α k g k ) {\alpha _k} = \mathop {\arg \min }\limits_\alpha f\left( {{{\bf{x}}_k} + {\alpha _k}{{\bf{g}}_k}} \right) αk=αargminf(xk+αkgk)
求解这个优化问题,我们只需对 α k {\alpha _k} αk 求导,并且令结果等于0,也就是:
∂ f ( x k + 1 ) ∂ α k = 0 \frac{{\partial f({{\bf{x}}_{k + 1}})}}{{\partial {\alpha _k}}} = 0 αkf(xk+1)=0
( A g k ) T ( A ( x k + α k g k ) − y ) = 0 {\left( {{\bf{A}}{{\bf{g}}_k}} \right)^T}\left( {{\bf{A}}({{\bf{x}}_k} + {\alpha _k}{{\bf{g}}_k}) - {\bf{y}}} \right) = 0 (Agk)T(A(xk+αkgk)y)=0
α k ( A g k ) T A g k + g k T A T ( A x k − y ) = 0 {\alpha _k}{\left( {{\bf{A}}{{\bf{g}}_k}} \right)^T}{\bf{A}}{{\bf{g}}_k} + {\bf{g}}_k^T{{\bf{A}}^T}\left( {{\bf{A}}{{\bf{x}}_k} - {\bf{y}}} \right) = 0 αk(Agk)TAgk+gkTAT(Axky)=0
α k ( A g k ) T A g k = g k T g k {\alpha _k}{\left( {{\bf{A}}{{\bf{g}}_k}} \right)^T}{\bf{A}}{{\bf{g}}_k} = {\bf{g}}_k^T{{\bf{g}}_k} αk(Agk)TAgk=gkTgk
α k = g k T g k ( A g k ) T A g k {\alpha _k} = \frac{{{\bf{g}}_k^T{{\bf{g}}_k}}}{{{{\left( {{\bf{A}}{{\bf{g}}_k}} \right)}^T}{\bf{A}}{{\bf{g}}_k}}} αk=(Agk)TAgkgkTgk
当然,还有其他的一些步长选择方法,比如回溯线搜索方法等,在这里就不再展开。
寻优方向和步长都得到了,那么矩阵形式的梯度下降法的迭代公式可以总结为:
x k + 1 = x k + α k A T ( A x k − y ) {{\bf{x}}_{k + 1}} = {{\bf{x}}_k} + {\alpha _k}{{\bf{A}}^T}({\bf{A}}{{\bf{x}}_k} - {\bf{y}}) xk+1=xk+αkAT(Axky)

可以证明,采用精确线性搜索的最速下降法的收敛速度是线性的。对于极小化正定二次函数,梯度下降法产生的序列满足
f ( x k + 1 ) − f ( x ∗ ) f ( x k ) − f ( x ∗ ) ≤ ( λ 1 − λ n λ 1 + λ n ) 2 = ( κ − 1 κ + 1 ) 2 \frac{{f({x_{k + 1}}) - f({x^*})}}{{f({x_k}) - f({x^*})}} \le {\left( {\frac{{{\lambda _1} - {\lambda _n}}}{{{\lambda _1} + {\lambda _n}}}} \right)^2} = {\left( {\frac{{\kappa - 1}}{{\kappa + 1}}} \right)^2} f(xk)f(x)f(xk+1)f(x)(λ1+λnλ1λn)2=(κ+1κ1)2
这里 λ 1 {{\lambda _1}} λ1 λ 1 {{\lambda _1}} λ1 分别表示矩阵 A T A {{\bf{A}}^T}{\bf{A}} ATA 的最大和最小特征值, κ = λ 1 λ n \kappa = \frac{{{\lambda _1}}}{{{\lambda _n}}} κ=λnλ1 表示矩阵 A T A {{\bf{A}}^T}{\bf{A}} ATA 的条件数。可以看出梯度下降法的收敛速度是与对称矩阵 A T A {{\bf{A}}^T}{\bf{A}} ATA 的条件数有关的,条件数越小收敛速度越快。如果矩阵的条件数远大于1,则说明矩阵是ill-conditioned,反之,如果矩阵的条件数等于1,则说明矩阵是well-conditioned。

3 收敛性分析

如果函数 f f f 在定义域内是利普希兹连续(Lipschitz continuous)的,则有:
∥ f ( x ) − f ( y ) ∥ ≤ L ∥ x − y ∥ \left\| {f(x) - f(y)} \right\| \le L\left\| {x - y} \right\| f(x)f(y)Lxy
如果函数 f f f 的导数符合Lipschitz continuous,那么有:
∥ ∇ f ( x ) − ∇ f ( y ) ∥ ≤ L ∥ x − y ∥ \left\| {\nabla f(x) - \nabla f(y)} \right\| \le L\left\| {x - y} \right\| f(x)f(y)Lxy
其中 L > 0 L>0 L>0 称为利普希兹常数。

在梯度满足利普希兹连续条件下,梯度下降法的收敛性如下:

步长为 α ≤ 1 L \alpha \le \frac{1}{L} αL1 的梯度下降法满足:
f ( x k ) − f ( x ∗ ) ≤ ∥ x 0 − x ∗ ∥ 2 2 α k f({x_k}) - f({x^*}) \le \frac{{{{\left\| {{x_0} - {x^*}} \right\|}^2}}}{{2\alpha k}} f(xk)f(x)2αkx0x2
也就是说梯度下降法的收敛速度为 O ( 1 k ) O\left( {\frac{1}{k}} \right) O(k1),只需要 O ( 1 ε ) O\left( {\frac{1}{\varepsilon }} \right) O(ε1) 次迭代即可达到 $f({x_k}) - f({x^*}) \le \varepsilon $。

上述结论的证明见参考文献[1],这里给一个简单的描述。
如果 ∇ f ( x ) \nabla f(x) f(x) 满足利普希兹连续条件,那么下式成立
f ( y ) ≤ f ( x ) + ∇ f ( x ) T ( y − x ) + L 2 ∥ y − x ∥ 2 f(y) \le f(x) + \nabla f{(x)^T}(y - x) + \frac{L}{2}{\left\| {y - x} \right\|^2} f(y)f(x)+f(x)T(yx)+2Lyx2
y = x − α ∇ f ( x ) y = x - \alpha \nabla f(x) y=xαf(x) 代入可得
f ( y ) ≤ f ( x ) − ( 1 − L α 2 ) α ∥ ∇ f ( x ) ∥ 2 f(y) \le f(x) - (1 - \frac{{L\alpha }}{2})\alpha {\left\| {\nabla f(x)} \right\|^2} f(y)f(x)(12Lα)αf(x)2
x ~ = x − α ∇ f ( x ) \tilde x = x - \alpha \nabla f(x) x~=xαf(x),且 0 < α ≤ 1 L 0 < \alpha \le \frac{1}{L} 0<αL1,有
f ( x ~ ) ≤ f ( x ∗ ) + ∇ f ( x ) T ( y − x ∗ ) − α 2 ∥ ∇ f ( x ) ∥ 2 = f ( x ∗ ) + 1 2 α ( ∥ x − x ∗ ∥ 2 − ∥ x ~ − x ∗ ∥ 2 ) \begin{array}{l} f(\tilde x) \le f({x^*}) + \nabla f{(x)^T}(y - {x^*}) - \frac{\alpha }{2}{\left\| {\nabla f(x)} \right\|^2} \\ = f({x^*}) + \frac{1}{{2\alpha }}({\left\| {x - {x^*}} \right\|^2} - {\left\| {\tilde x - {x^*}} \right\|^2}) \\ \end{array} f(x~)f(x)+f(x)T(yx)2αf(x)2=f(x)+2α1(xx2x~x2)
将所有迭代求和
∑ i = 1 k ( f ( x i ) − f ( x ∗ ) ) ≤ 1 2 α ( ∥ x 0 − x ∗ ∥ 2 − ∥ x k − x ∗ ∥ 2 ) ≤ 1 2 α ∥ x 0 − x ∗ ∥ 2 \begin{array}{l} \sum\limits_{i = 1}^k {\left( {f({x_i}) - f({x^*})} \right)} \le \frac{1}{{2\alpha }}\left( {{{\left\| {{x_0} - {x^*}} \right\|}^2} - {{\left\| {{x_k} - {x^*}} \right\|}^2}} \right) \\ \le \frac{1}{{2\alpha }}{\left\| {{x_0} - {x^*}} \right\|^2} \\ \end{array} i=1k(f(xi)f(x))2α1(x0x2xkx2)2α1x0x2
因为 f ( x k ) f({x_k}) f(xk) 是非增的,所以有
f ( x i ) − f ( x ∗ ) ≤ 1 k ∑ i = 1 k ( f ( x i ) − f ( x ∗ ) ) ≤ ∥ x 0 − x ∗ ∥ 2 2 α k f({x_i}) - f({x^*}) \le \frac{1}{k}\sum\limits_{i = 1}^k {\left( {f({x_i}) - f({x^*})} \right)} \le \frac{{{{\left\| {{x_0} - {x^*}} \right\|}^2}}}{{2\alpha k}} f(xi)f(x)k1i=1k(f(xi)f(x))2αkx0x2

4 梯度下降法仿真

通过梯度下降法求解二次方程来说明梯度下降法的性能。设求解的问题为 y = A x {\bf{y}} = {\bf{Ax}} y=Ax,那么用梯度下降法求解 x ∗ {\bf{x}}^{*} x 可以写成优化问题: x ∗ = arg ⁡ min ⁡ x ∈ R n 1 2 ∥ A x − y ∥ 2 2 {\bf{x}}^{*}=\mathop {\arg \min }\limits_{{\bf{x}} \in {\mathbb{R}^n}} \frac{1}{2}\left\| {{\bf{Ax}} - {\bf{y}}} \right\|_2^2 x=xRnargmin21Axy22

4.1 Matlab code

  • 梯度下降法函数
function [hat_x, error] = opt_gd(y,A,iter_max)
% gradient descent algorithm for solving y=Ax
% Louis Zhang 2020.12.10
% email:zhangyanfeng527@gmail.com
n = size(A,2) ;
x0 = zeros(n,1) ;
g0 = A'*(y-A*x0) ;
% 初始化梯度
% 初始化x_0
for k = 1:iter_max
    g1 = A'*(y-A*x0) ;
    % 计算梯度
    %  alpha = (g0'*g0)/(norm(A*g0)^2) ;
    alpha = 0.1 ;
    % 计算步长
    hat_x = x0 + alpha*g1 ;
    % 更新x_k+1
    error(k) = (norm(y-A*hat_x)/norm(y))^2 ;
    % error(k) = (norm(hat_x-x0)/norm(hat_x))^2 ;
    if error(k)<1e-8
        break;
    else
        x0 = hat_x ;
        g0 = g1 ;
    end
end
end
  • 测试程序
clear
clc
N = 1000 ;
iter_max = 1000 ;
sig_max = 1 ;
% 最大奇异值
sig_min = 1 ;
% 最小奇异值
sig_num = linspace(sig_min,sig_max,N) ;
% 生成奇异值,最大奇异值为100,最小奇异值为1
V = diag(sig_num) ;
% 生成奇异值组成的对角矩阵
A_rand = randn(N,N) ;
% 生成随机矩阵
A_orth = orth(A_rand) ;
% 随机矩阵正交化
A = A_orth*V*A_orth^(-1) ;
% 得到设定条件数的矩阵A
cond(A)
% 试一下矩阵A的条件数是否正确
x = randn(N,1) ;
y = A*x ;

[hat_x,error] = opt_gd(y,A,iter_max) ;
% 使用梯度下降法求解y=Ax

figure(1)
plot(error,'m-o')
xlabel('迭代次数')
ylabel('NMSE')
title(['condition number=',num2str(sig_max/sig_min)])

4.2 仿真结果

图3. 固定步长为0.5条件数为2时的结果
图4. 最优步长,条件数为2时的结果
图5. 最优步长,条件数为10时的结果

从结果可以看出来在相同条件数情况下,最优步长比固定步长收敛速度要快;在最优步长情况下,条件数越大收敛速度越慢。

5 讨论

5.1 梯度下降法优点

  • 梯度下降法的复杂度较低,比如在求解二次问题时,最小二乘的复杂度为 O ( n 3 ) O\left( {{n^3}} \right) O(n3),而梯度下降法的复杂度为 O ( n 2 ) O\left( {{n^2}} \right) O(n2)。在求解大规模问题时优势明显。

5.2 梯度下降法缺点

  • 梯度下降法的收敛速度较慢,原因是每次迭代时作为梯度方向作为寻优方向,梯度方向仅仅反映了点 x k {\bf{x}}_k xk 的局部性质,也就是说,对于局部来说,梯度方向是最快的方向,而对于全局来说,梯度方向不一定是最快的方向。
  • 梯度下降法的收敛受初始点的影响较大,在非凸问题中,初始点如果选在最优点附近,则能以较快的速度收敛到全局最优点,如果初始点与最优点较远,则可能收敛到局部最优点。
  • 梯度下降法存在锯齿收敛情况,尤其是在最优点附近时,由于梯度变化缓慢,收敛速度非常慢。

6 参考文献

[1]]袁亚湘, 孙文瑜. 最优化理论与方法[M]. 科学出版社, 1997.
[2]https://www.cs.ubc.ca/~schmidtm/Courses/540-W18/L4.pdf
[3]https://www.cs.cmu.edu/~ggordon/10725-F12/slides/05-gd-revisited.pdf
[4]]http://users.ece.utexas.edu/~cmcaram/EE381V_2012F/Lecture_4_Scribe_Notes.final.pdf

更多精彩内容请关注订阅号优化与算法和加入QQ讨论群1032493483获取更多资料

往期精选:

  • 18
    点赞
  • 105
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
语音降噪是一种重要的音频处理技术,可以有效减少噪声对语音信号的影响。其中,LMS算和RLS算是两种常见的自适应滤波算,用于语音降噪中。 LMS算是一种基于梯度下降的自适应滤波算,其思想是通过不断调整滤波器的系数,使得滤波器的输出与期望信号的误差最小。LMS算的优点是收敛速度快,但是对于非平稳信号和噪声非常敏感。 相比之下,RLS算是一种基于最小均方误差的自适应滤波算,其优点是可以处理非平稳信号和噪声,并且具有较高的抑制噪声能力。但是,RLS算的计算复杂度较高,收敛速度较慢。 在Matlab中,可以通过仿真对比LMS算和RLS算的降噪效果。具体步骤如下: 1. 构建语音信号和噪声信号 2. 将语音信号和噪声信号混合并添加到信道中 3. 对混合后的信号进行LMS算和RLS算降噪处理 4. 分别计算降噪后的信号与原始语音信号之间的均方根误差(RMSE)和信噪比(SNR) 5. 对比分析LMS算和RLS算的降噪效果 通过比较RMSE和SNR的大小,可以得出LMS算和RLS算的降噪效果。同时,还可以观察LMS算和RLS算的计算时间,以及所需的计算资源,进一步分析两种算的优劣。 综上所述,LMS算和RLS算都是常见的自适应滤波算,在语音降噪中都有着重要的应用。通过Matlab仿真对比分析,可以更好地了解两种算的优缺点,选择合适的算进行语音降噪处理。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值