softMax(2)---predict实现

来源:互联网 发布:按option无法切换mac 编辑:程序博客网 时间:2024/05/20 13:37

softMax的cost写好之后,模型也就可以正式开始进行训练了。
首先要把softMaxExercise里边的Debug赋值为false,可以看到,梯度检验这一步在正式训练过程中是完全不需要做的。

softMax模型

softMax的模型是什么样的呢?
假设一共有k个类,那么对于样本x(i),预测它属于第j类的概率如下

p(y=j|x(i))=eθTjx(i)kl=1θTlx(i)

softMax将样本x(i)属于这k个类的概率都计算出来,之后将样本预测为概率最大的那个类。
predict=maxj(p(y=j|x(i)))

Train

%% STEP 4: Learning parameters%%  Once you have verified that your gradients are correct, %  you can start training your softmax regression code using softmaxTrain%  (which uses minFunc).options.maxIter = 100;softmaxModel = softmaxTrain(inputSize, numClasses, lambda, ...                            inputData, labels, options);% Although we only use 100 iterations here to train a classifier for the % MNIST data set, in practice, training for more iterations is usually% beneficial.

训练的过程实质上便是学习模型参数的过程,模型参数包括了各个类的θ

训练过程是怎样的呢?
来看看softmaxTrain里边是怎么做的吧。
首先初始化模型参数,一般原则是初始化为接近0的值,如下所示,randn生成-1~1直接的随机数,所以theta里边的初始值都是在-0.005~0.005之间的随机值。
theta的大小为numClasses*inputSize,对于第j个类,它的参数θj是inputSize大小的,因为要进行θTjx(i)操作嘛!

% initialize parameterstheta = 0.005 * randn(numClasses * inputSize, 1);

接着这一段把lbfgs加了进来,lbfgs是一种对函数求解最小值的方法,这个我没看,不过原理大致也是和梯度下降是差不多的吧。
这里我解释下梯度下降的做法。
首先要有个最优化目标,这里便是代价函数J(θ),我们需要做的便是最小化这个代价函数,那么如何最小化呢?
θiθ的第i个参数,那么我们可以求θθi,这也就是θi的梯度值gradθi了。
求出梯度值之后,接着就是更新参数,
那么就有θi = θi - gradθi*step
根据求取梯度的反方向每次对参数更新step步长。
那什么时候结束更新呢?满足下列条件中的一个即可停止
1.更新前后参数θ的变化小于一个阈值
2.迭代更新次数达到最高迭代次数

softmaxCost的函数便是用来求取J(θ)gradθ
而minFunc则是用来更新J(θ)的。

% Use minFunc to minimize the functionaddpath minFunc/options.Method = 'lbfgs'; % Here, we use L-BFGS to optimize our cost                          % function. Generally, for minFunc to work, you                          % need a function pointer with two outputs: the                          % function value and the gradient. In our problem,                          % softmaxCost.m satisfies this.minFuncOptions.display = 'on';[softmaxOptTheta, cost] = minFunc( @(p) softmaxCost(p, ...                                   numClasses, inputSize, lambda, ...                                   inputData, labels), ...                                                                 theta, options);

得到最优参数之后,模型便把参数进行了保存。

% Fold softmaxOptTheta into a nicer formatsoftmaxModel.optTheta = reshape(softmaxOptTheta, numClasses, inputSize);softmaxModel.inputSize = inputSize;softmaxModel.numClasses = numClasses;

predict

预测部分是我们需要填写的,这段代码超级简单的哦!
首先从模型中取出参数。

theta = softmaxModel.optTheta;  % this provides a numClasses x inputSize matrixpred = zeros(1, size(data, 2));

接下来

%  Instructions: Compute pred using theta assuming that the labels start %                from 1.Mat = theta*data;[maxValue, pred] = max(Mat);

嗯,就是这么简单。

p(y=j|x(i))=eθTjx(i)kl=1θTlx(i)

对于同一个样本x(i),上面式子的分母是一样的,所以不需要求,另外exp操作也都是有的,而且exp函数是单调函数,所以也不需要求,只需要计算出θTjx(i)就ok了。
至于theta*data为什么就能计算θTjx(i)可以去看cost部分的说明。
Mat中的第i列也就是对第i个样本的k个类别所求取得θTx(i),从这一列找出最大值所在的index便是预测结果啦。

实验结果

这里写图片描述

0 0
原创粉丝点击