本文主要讲下个人对数值优化算法中几种常见算法的理解。

什么是优化算法?

给出函数f(X),现在要求 min f(X) 时的X值,这就是最优化问题。

1. 共轭梯度法

方程:A*x=b,A矩阵为对称正定矩阵,b为向量,目标为求解出向量 x 。

个人认为共轭梯度法并不能被当做是一个真正的优化算法,因为共轭梯度法很难单独使用,而是作为其他优化算法的一个辅助使用,因为共轭梯度法只是求解方程组解的一种算法。

2. 最速下降法

最为常用的优化算法之一,如果接触过神经网络模型的话应该对这个算法最为了解,直白的说就是在每次优化时都沿着函数梯度的负方向。该方法是优化算法中当步运算量最小的算法,但是对于一些复杂的优化问题,如病态优化问题,很难获得较好的优化结果,因为最速下降法(梯度下降法)只是一阶优化算法,而不是二阶优化算法。

3. 牛顿法

牛顿法是二阶优化算法,也是最为常见的优化算法。牛顿法是二阶优化算法,每步优化都需要计算出原函数的二阶梯度矩阵,即Hession矩阵,并获得类似H*x=b的形式的方程,并进行求解,因此使用牛顿法时可以搭配共轭梯度法进行使用。

4. 拟牛顿法(DFP/BFGS)

牛顿法需要计算原函数的二阶导Hession矩阵,并解H*x=b方程,相当于求解 Hession 的逆矩阵,为此拟牛顿法对Hession矩阵的逆矩阵进行拟合近似,于是有 \(B\approx H^{-1}\),各种拟牛顿法就是在求解这个B矩阵,为此常见的拟牛顿法有DFP法和BFGS法。

5. 内存受限的拟牛顿法(L-BFGS)

拟牛顿法虽然避免了牛顿法求解Hession逆矩阵的复杂运算,但是即使通过计算近似矩阵B可以替代Hession逆矩阵,但是矩阵B也会占用大量的内存空间,如果优化变量的size为n,那么矩阵B的size就是nn,如果变量为1000000个,那么B矩阵中数字个数为10000001000000,因此为了避免因为内存无法存储B矩阵而导致无法计算的情况,于是有了内存受限的拟牛顿法(L-BFGS)。L-BFGS算法通过保留计算历史中的m个历史的变量值和一阶导数,来近似计算出\(B^{-1}b\),因此内存中只需要存储mn大小的空间,而不是nn大小的空间,这里m为远小于n的值,如n=1000000,m=30。

总结:

牛顿法,最后需要求解的是 \(H*x=b\),也就是\(x=H^{-1}*b\),难点在于求 \(H^{-1}\)以及存储矩阵\(H^{-1}\) 。

拟牛顿法,通过\(B\approx H^{-1}\),来解决对\(H^{-1}\)的复杂求解,但是没有解决对\(H^{-1}\)的存储问题,最终的求解形式为 \(x=B*b\)。

内存受限的拟牛顿法,通过对最近历史中的m个变量值及其一阶导数的保存,并用此近似计算出\(B*b\),直接求出近似的 \(x\) 解,由此解决 \(H^{-1}\) 矩阵和 \(B\) 矩阵难以存储的问题。

L-BFGS-B(Limited-memory Broyden–Fletcher–Goldfarb–Shanno )算法理解 —— 内存受限的拟牛顿法 —— 数值优化算法的更多相关文章

  1. 优化算法-BFGS

    优化算法-BFGS BGFS是一种准牛顿算法, 所谓的"准"是指牛顿算法会使用Hessian矩阵来进行优化, 但是直接计算Hessian矩阵比较麻烦, 所以很多算法会使用近似的He ...

  2. 《Small Memory Software:Patterns For System With Limited Memory》读书笔记

    原文地址:http://blog.csdn.net/jinzhuojun/article/details/13297447 虽然摩尔定律让我们的计算机硬件得以以指数速度升级,但反摩尔定律又不断消减这些 ...

  3. Multi-tasking RTOS for microprocessors with limited memory by saving only a single return address per task during context switching

    A real-time operating system (RTOS) for use with minimal-memory controllers has a kernel for managin ...

  4. SQL Server ->> Memory Allocation Mechanism and Performance Analysis(内存分配机制与性能分析)之 -- Minimum server memory与Maximum server memory

    Minimum server memory与Maximum server memory是SQL Server下配置实例级别最大和最小可用内存(注意不等于物理内存)的服务器配置选项.它们是管理SQL S ...

  5. 利用 Memory Dump Diagnostic for Java (MDD4J) 分析内存管理问题

    利用 Memory Dump Diagnostic for Java (MDD4J) 分析内存管理问题(2) 启动和理解 MDD4J[size=1.0625]为了充分理解如何使用 MDD4J,您需要了 ...

  6. SHELL:Find Memory Usage In Linux (统计每个程序内存使用情况)

    转载一个shell统计linux系统中每个程序的内存使用情况,因为内存结构非常复杂,不一定100%精确,此shell可以在Ghub上下载. [root@db231 ~]# ./memstat.sh P ...

  7. Identify Memory Leaks in Visual CPP Applications —— VLD内存泄漏检测工具

    原文地址:http://www.codeproject.com/Articles/1045847/Identify-Memory-Leaks-in-Visual-CPP-Applications 基于 ...

  8. insufficient memory to configure kdump(没有足够的内存)解决方法(待验证、待解决)

    vritualbox上安装redhat 6.4 32位系统 在安装完成重启后开始进行一些初始化的配置,在最后一项是配置Kdump 看到这个"没有足够的内存配置kdump"(在英文界 ...

  9. [SPDK/NVMe存储技术分析]015 - 理解内存注册(Memory Registration)

    使用RDMA, 必然关系到内存区域(Memory Region)的注册问题.在本文中,我们将以mlx5 HCA卡为例回答如下几个问题: 为什么需要注册内存区域? 注册内存区域有嘛好处? 注册内存区域的 ...

  10. 创建结点 与 分配内存 Function to create a Node. Allocates memory for a new node. 主动申请内存 链表 指针的写法

    Self Referential Data Structure in C - create a singly linked list http://www.how2lab.com/programmin ...

随机推荐

  1. kettle从入门到精通 第六十一课 ETL之kettle 任务调度器,轻松使用xxl-job调用kettle中的job和trans

    1.大家都知道kettle设计的job流程文件有个缺点:只能设置简单的定时任务,无法设置复杂的如支持cron表达式的job. 今天给大家分享一个使用xxl-job调度carte的流程文件的示例.整个调 ...

  2. linux系统,kafka常用命令

    kafka版本过高所致,2.2+=的版本,已经不需要依赖zookeeper来查看/创建topic,新版本使用 --bootstrap-server替换老版本的 --zookeeper-server. ...

  3. #9134.反转eehniy

    blog 题面 yinhee 去面试 Google 总裁. 面试官给他了一个长度为 \(n\) 的 \(01\) 串. 面试官给他以下两种操作是的这个序列前 \(n-m\) 个数字与后 \(n-m\) ...

  4. C#.NET 国密 SM2 公钥证书从文本转换

    先前的 Util 是直接从文件中转换的 https://www.cnblogs.com/runliuv/p/15079404.html public static AsymmetricKeyParam ...

  5. 通过JS来触发<a>链接来实现图片下载

    function downloadImg(){ var url = '实际情况的图片URL'; // 获取图片地址 var a = document.createElement('a'); // 创建 ...

  6. 在js、vue中使用方法调用a标签

    <el-button type="primary" style="width:130px" @click="shout"> &l ...

  7. 什么是JDBC的最佳实践?

    a.数据库资源是非常昂贵的,用完了应该尽快关闭它.Connection,   Statement,    ResultSet等JDBC对象都有close方法,调用它就好了. b.养成在代码中显式关闭掉 ...

  8. FEDORA34 安装CUDA11.3

    FEDORA34 安装CUDA11.3 首先确保能装上最新的显卡驱动.  FEDORA显卡驱动安装 然后去官网下fedora对应的.run安装文件.运行安装, 但不要选装驱动. 完成后加环境变量: # ...

  9. ubuntu 18.04 设置开机自启

    ubuntu 18.04 设置开机自启 背景 为了添加一些自定义的服务,例如autossh. 原文(有删改):https://zhuanlan.zhihu.com/p/98804785 介绍 ubun ...

  10. 在Linux驱动中使用timer定时器

    在Linux驱动中使用timer定时器 原文(有删改): https://www.cnblogs.com/chen-farsight/p/6226562.html 介绍 内核定时器是内核用来控制在未来 ...