Octave梯度下降法最优化代价函数的一个例子—ML Note 38

时间:2022-07-23
本文章向大家介绍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个维度的参数向量的代价函数进行优化的关键是定义一个如下图所示的函数,函数中要给出代价函数的求法、每个维度上的偏导数的求法,即:返回代价函数、各个方向上的梯度。

伪代码如下图: