您的位置:首页 > 其它

使用fminunc找逻辑回归(logistic)代价函数的最小值

2016-09-13 01:23 465 查看
在看完UFLDL自编码器autoencoder的代码后,发现其中的训练过程并不是使用训练的手段找到最优的参数theta,而是使用了minFunc寻找代价函数的最小值,并返回优化后的参数theta。其中的minFunc函数的说明里头提到了这个函数提供的各种选项和matlab提供的fminunc函数非常像,所以就去看了下matlab的help。

这里贴出fminunc函数help中最基本的翻译:

fminunc试图找到一个多变量函数的最小值,从一个估计的初试值开始,这通常被认为是无约束非线性优化问题。

x =fminunc(fun,x0)      试图从x0附近开始找到函数的局部最小值,x0可以是标量,向量或矩阵

x =fminunc(fun,x0,options)      根据结构体options中的设置来找到最小值,可用optimset来设置options

x =fminunc(problem)         为problem找到最小值,而problem是在Input Arguments中定义的结构体

 

Create thestructure problem by exporting a problem from Optimization Tool, as describedin Exporting Your Work.

 

[x,fval]= fminunc(...)    返回目标函数fun在解x处的函数值

[x,fval,exitflag]= fminunc(...)     返回一个描述退出条件的值exitflag

[x,fval,exitflag,output]= fminunc(...)       返回一个叫output的结构体,它包含着优化的信息

[x,fval,exitflag,output,grad]= fminunc(...)     返回函数在解x处的梯度的值,存储在grad中

[x,fval,exitflag,output,grad,hessian]= fminunc(...)            返回函数在解x处的Hessian矩阵的值,存储在hessian中

 

对这些说明理解的不是很透彻,然后做了几个简单的实验,如下:

 

定义函数fun1

function y = fun1(x)

y = (x - 2)^2;

end

显然fun1在x=2处取得最小值0

 

clear all;

x0 = 1.5

 [x,fval,exitflag,output,grad,hessian] =fminunc(@fun1,x0)

 

运行结果是:

x =2.0000     fval =1.2490e-16

exitflag =  1

output =

       iterations: 1

        funcCount: 6

         stepsize: 0.5000

    firstorderopt: 7.4506e-09

        algorithm: 'medium-scale: Quasi-Newtonline search'

          message: [1x436 char]

grad  = 7.4506e-09                hessian =  2

 

再做一个多变量实验,定义函数fun2

function y = fun2(x)

y = (x(1)^2)+(x(2)^2);

end

 

显然,fun2在x1=0,x2=0处取得最小值0

 

clear all;

x0 = [2;2];

[x,fval,exitflag,output,grad,hessian]= fminunc(@fun2,x0)

 

运行结果是:

x =

     0

     0

fval =0

exitflag =1

output =

       iterations: 2

        funcCount: 9

         stepsize: 1

    firstorderopt: 1.4901e-08

        algorithm: 'medium-scale: Quasi-Newtonline search'

          message: [1x436 char]

grad =

   1.0e-07 *

    0.1490

    0.1490

hessian =

   NaN  NaN

   NaN  NaN

但是假如函数形如f(x,y),而且f(x,y)中还有可变的参数a,b的话如何求取其最小值呢?定义了第三个函数fun3

function y = fun3(x,a,b)

y = (x(1)-a)^2+(x(2)-b)^2;

end

这个函数含两个自变量x(1),x(2),还有参数a,b,显然函数在x(1)=a,x(2)=b时取得最小值0

clear all;

x0 = [2;2]

a = 1

b = 0

x = fminunc(@(p)fun3(p,a,b),x0)%注意此处的写法

结果是

x =

    1.0000

0.0000

fminunc找到了当我定义a=1,b=0时的函数的最小值是在x=[1;0]处,以后要找到一个需要赋值,还要指定参数值的函数的最小值的时候就可以这样做了。但是不要把x(1),x(2)分开定义成x,y,这样只会给自己找麻烦。fminunc的help里头提到一个problem的结构体好像可以解决这个问题,没有深究,读者自己去看。

 

%==================================================================

现在我们用fminunc来找二元逻辑回归的代价函数的最小值

数据在这http://openclassroom.stanford.edu/MainFolder/DocumentPage.php?course=DeepLearning&doc=exercises/ex4/ex4.html

 

logistic_test.m

clear all; close all;

 

x = load('G:\training_data\ex4x.dat');

y = load('G:\training_data\ex4y.dat');

 

theta = [-15.0; 0.14; 0.15];

J = logisticCost(theta,x,y);

 

theta0 = zeros(3,1);%随机设置一个初始值,其实就在上面那个theta附近

data = x;

label = y;

options=optimset('MaxIter',100);

[opttheta,fval] = fminunc(@(p)logisticCost(p,data,label),theta0)

定义代价函数logisticCost.m

function cost = logisticCost(theta, data, label)

 

[trainNum trainLength] =size(data);

z = [ones(trainNum,1)data]*theta;

 

h = inline('1.0 ./ (1.0 + exp(-z))');

htheta = h(z);

cost =(-1/trainNum)*(label'*log(htheta) + (1-label)'*log(1-htheta));

运行[opttheta,fval]= fminunc(@(p) logisticCost(p,data,label),theta0)

的结果是

opttheta =

  -16.3787

    0.1483

    0.1589

fval =

0.4054

这个结果跟上面下载数据的网页处提供的结果一样

 

其实注意到fminunc是因为稀疏自编码器autoencoder中train.m代码中步骤3:

numgrad =computeNumericalGradient( @(x) sparseAutoencoderCost(x, visibleSize,...

                                                 hiddenSize, lambda,...

                                                 sparsityParam, beta,...

                                                 patches), theta);

 

此处的写法和x = fminunc(@(p) fun3(p,a,b),x0)类似,我其实是模仿train.m的代码做了个更简单的实验,将参数a,b加入到了fun3中去。在UFLDL的softmax回归的代码softmaxTrain.m中也有类似的求最优的theta的做法,所以从这些实现寻找最优theta的方法中我们发现,神经网络的训练过程可能不是通过一遍一遍的for来实现,而是通过非线性优化之类的寻找最优解的方法来实现的。更多的内容可以自行百度BFGS,L-BFGS之类minFunc中提到的东西来了解。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: