Octave梯度下降法最优化代价函数的一个例子—ML Note 38
“Logistic Regression——Advanced optimization”。
01
—
笔记
本节讲的高级优化是相对于上一节的梯度下降法来说的,相对于上一节的梯度下降法本节的优化算法速度更快,更适合解决大型的机器学习问题。是什么样的高级算法呢?
除了梯度下降法还有?
回忆一下上一小节梯度下降法的思路。
首先,梯度下降法是通过梯度方向指明参数theta变化的方向;
其次,迭代变换,知道找到那个能使代价函数J(theta)最小那组theta.
如下图:
上图中,使用梯度下降法的时候每一步我们都需要编码做两件事(1)求偏导数;(2)求代价函数的值。
为了实现上面的两个小目标,除了梯度下降法,还有几种更加高级、复杂的算法可选。如下图:
共轭梯度、BFGS、L-BFGS就是其中三个比较常用的。这三种算法的优点:不需要手动设置学习率alpha;收敛速度比较快。这三种算法,比较复杂,需要花好多天的时间才能弄明白,这里吴老师没有详细介绍。可以在数值分析类的课程中学习到。
吴老师自己讲,这三种算法他已经在10多年前就用过了,但真正搞明白也就是这两年的事。就是说,我们可以在一知半解的情况下使用一些机器学习算法很好的去解决一些实际问题。边用边学吧。
一个Octave实现代价函数优化的例子
假设有下图这样一个例子的代价函数,这里有两个参数theta_1, theta_2, 代价函数J(theta)如下:
当然,这里一看就知道theta=[5;5]的时候代价函数取最小值。这里,假设我们不知道,那该怎样用代码来找到最小值呢?
首先,需要定义一个costFunction来计算偏导数。以Octave为例,即:
上图中的costFunction有两个返回,一个jVal即代价函数、一个gradient数组即theta向量每个分量上的偏导数。
其次,我们使用optimset函数创建一个最优化参数选项。代码
optimset('Gradobj', 'on', 'MaxIter', '100');
%‘Gradobj','MaxIter'表示参数名,紧接着后面的'on'、'100'为对应的值。
%‘Gradobj’,是否使用用户自己创建的梯度函数,此处设置为‘on’,即使用自定义的梯度函数
%‘MaxIter’,最大迭代次数,设置为100
然后,设置theta的初始值,此处设置为[0;0],zeros(2,1)。
最后,使用fminunc函数寻找局部最小值。Octave中,这个函数的具体使用方法,可以在Octave中使用命令“help fminunc”。笼统地讲,就是使用指定的梯度函数、梯度函数的初始输入、最优化参数选项这三个东东来迭代寻找局部最优解;找到最优解后呢,把取得最优解的参数、函数最终返回原因的标示这三个东东抛回给用户,这里分别存在optTheta、functionVal、exitFlg这三个变量中。
具体调用方法如下图红色框框中所示:
所以,在Octave中对这个例子进行代价函数最优化求解的过程就是。首先,定义一个costFunction的函数,这个我们在第二周的课程中有讲过;然后,在命令行窗口中通过optimset函数定义一个最优化参数配置项、调用fminunc求解最优质就可以了。
调用过程如下图:
上图中,exitFlag=1说明本例是收敛了的。关于exitFlag其它可能的取值即对应的意义,同样可以在Octave中通过help fminunc命令来查看。
总结
总结一下,我们使用梯度下降一类的方法对有n+1个维度的参数向量的代价函数进行优化的关键是定义一个如下图所示的函数,函数中要给出代价函数的求法、每个维度上的偏导数的求法,即:返回代价函数、各个方向上的梯度。
伪代码如下图:
- Shell脚本的简单排错法及调试程序bashdb
- ASM 翻译系列第二十四弹:ASM Internal ASM files number 10 and 11
- Redhat设置NFS挂载的简单步骤
- WordPress后台首页显示RSS错误的解决办法
- ASM 翻译系列第十九弹:ASM Internal ASM Continuing Operations Directory
- ASM 翻译系列第二十五弹:ASM 高级知识 When will my rebalance complete
- ASM 翻译系列第二十六弹:ASM 高级知识 Where is my data
- LVS+Keepalived负载均衡主备&双主架构全攻略
- ASM 翻译系列第二十八弹:ASM INTERNAL Partnership and Status Table
- ASM 翻译系列第二十九弹:ASM INTERNAL Free Space Table
- MySql常用30种SQL查询语句优化方法
- RxJS速成
- 会HTML/CSS就可以轻松创建网站
- 区块链银行应用探索(Hyperledger fabric)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- centos6.5 安装hadoop1.2.1的教程详解【亲测版】
- Linux中没有rc.local文件的完美解决方法
- 详解linux lcd驱动编写
- Linux下安装telnet的方法
- Linux 安装二进制MySQL 及 破解MySQL密码的方法
- Linux创建进程达到65535的方法
- SSH 上传文件及文件夹到linux服务器的方法
- apache tika检测文件是否损坏的方法
- Linux下二进制编译安装MySql centos7的教程
- Linux 6 修改ssh默认远程端口号的操作步骤
- 基于python的Linux系统指定进程性能监控思路详解
- ubuntu下的虚拟环境中安装Django的操作方法
- 详解linux下umask的使用
- Linux下设置每天自动备份数据库的方法
- Linux常用命令之chmod修改文件权限777和754