L-BFGS-B(Limited-memory Broyden–Fletcher–Goldfarb–Shanno )算法理解 —— 内存受限的拟牛顿法 —— 数值优化算法
本文主要讲下个人对数值优化算法中几种常见算法的理解。
什么是优化算法?
给出函数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 )算法理解 —— 内存受限的拟牛顿法 —— 数值优化算法的更多相关文章
- 优化算法-BFGS
优化算法-BFGS BGFS是一种准牛顿算法, 所谓的"准"是指牛顿算法会使用Hessian矩阵来进行优化, 但是直接计算Hessian矩阵比较麻烦, 所以很多算法会使用近似的He ...
- 《Small Memory Software:Patterns For System With Limited Memory》读书笔记
原文地址:http://blog.csdn.net/jinzhuojun/article/details/13297447 虽然摩尔定律让我们的计算机硬件得以以指数速度升级,但反摩尔定律又不断消减这些 ...
- 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 ...
- SQL Server ->> Memory Allocation Mechanism and Performance Analysis(内存分配机制与性能分析)之 -- Minimum server memory与Maximum server memory
Minimum server memory与Maximum server memory是SQL Server下配置实例级别最大和最小可用内存(注意不等于物理内存)的服务器配置选项.它们是管理SQL S ...
- 利用 Memory Dump Diagnostic for Java (MDD4J) 分析内存管理问题
利用 Memory Dump Diagnostic for Java (MDD4J) 分析内存管理问题(2) 启动和理解 MDD4J[size=1.0625]为了充分理解如何使用 MDD4J,您需要了 ...
- SHELL:Find Memory Usage In Linux (统计每个程序内存使用情况)
转载一个shell统计linux系统中每个程序的内存使用情况,因为内存结构非常复杂,不一定100%精确,此shell可以在Ghub上下载. [root@db231 ~]# ./memstat.sh P ...
- Identify Memory Leaks in Visual CPP Applications —— VLD内存泄漏检测工具
原文地址:http://www.codeproject.com/Articles/1045847/Identify-Memory-Leaks-in-Visual-CPP-Applications 基于 ...
- insufficient memory to configure kdump(没有足够的内存)解决方法(待验证、待解决)
vritualbox上安装redhat 6.4 32位系统 在安装完成重启后开始进行一些初始化的配置,在最后一项是配置Kdump 看到这个"没有足够的内存配置kdump"(在英文界 ...
- [SPDK/NVMe存储技术分析]015 - 理解内存注册(Memory Registration)
使用RDMA, 必然关系到内存区域(Memory Region)的注册问题.在本文中,我们将以mlx5 HCA卡为例回答如下几个问题: 为什么需要注册内存区域? 注册内存区域有嘛好处? 注册内存区域的 ...
- 创建结点 与 分配内存 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 ...
随机推荐
- LeetCode 719. 找出第 k 小的距离对 (Java)
题目: 给定一个整数数组,返回所有数对之间的第 k 个最小距离.一对 (A, B) 的距离被定义为 A 和 B 之间的绝对差值. 示例 1: 输入:nums = [1,3,1]k = 1输出:0 解释 ...
- ASP.NET MVC 出现: Uncaught ReferenceError: $ is not defined
ASP.NET MVC 出现: Uncaught ReferenceError: $ is not defined 错误 将 _Layout.cshtml 中的三行代码,移动到 <head> ...
- Vue学习:21.mixins混入
在Vue中,mixins(混入)是一种用于分发Vue组件中可复用功能的灵活机制.它们允许你抽取组件中的共享功能,如数据.计算属性.方法.生命周期钩子等,并将其作为单独的模块复用到多个组件中.这种方式有 ...
- js中字符串的方法,17种方法
字符串的17种方法...... 1.length:返回字符串的长度. const str = "Hello, World!"; console.log(str.length); / ...
- python logging去掉selenium大量的日志
问题 二次封装logging模块,设置级别为DEBUG,默认所有级别的日志都可以收集到:在发起ui自动化,打开浏览器输入网址,进行页面操作时,打印了大量的connectionpool.remote_c ...
- python 使用pandas修改数据到excel,报“SettingwithCopyWarning A value is trying to be set on a copy of a slice from a DataFrame”的解决方法
场景: 通过pandas模块,将测试数据回写到excel,测试数据有写到excel文件,但控制台输出警告信息如下 警告: SettingwithCopyWarning A value is tryin ...
- VSCode中设置用IPython运行Python代码
VSCode中设置用IPython运行Python代码 在IPython中运行所选的代码: 在设置中, 找到python.terminal.launchArgs这一项, 设置为如下内容. " ...
- 【Python】用Python把从mysql统计的结果数据转成表格形式的图片并推送到钉钉群
** python把数据转为图片 / python推送图片到钉钉群 ** 需求:通过python访问mysql数据库,统计业务相关数据.把统计的结果数据生成表格形式的图片并发送到钉钉群里. 一:Cen ...
- Java Objects工具类重点方法使用
Objects工具类 jdk 1.7引进的工具类,都是静态调用的方法,jdk 1.8新增了部分方法 重点方法 equals 用于字符串和包装对象的比较,先比较内存地址,再比较值 deepEquals ...
- Swift开发基础07-内存布局
了解Swift的内存布局和底层原理对于编写高性能和内存高效的应用非常重要.接下来,我将更详细地介绍Swift的内存管理机制和一些底层实现细节,包括内存布局.ARC(自动引用计数).引用类型和值类型的区 ...