博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
深度学习 Deep Learning UFLDL 最新Tutorial 学习笔记 5:Softmax Regression
阅读量:4124 次
发布时间:2019-05-25

本文共 4477 字,大约阅读时间需要 14 分钟。

Softmax Regression Tutorial地址:http://ufldl.stanford.edu/tutorial/supervised/SoftmaxRegression/

从本节开始,难度开始加大了,我将更详细地解释一下这个Tutorial。

1 Softmax Regression 介绍

前面我们已经知道了Logistic Regression,简单的说就判断一个样本属于1或者0,在应用中比如手的识别,那么就是判断一个图片是手还是非手。这就是很简单的分类。事实上,我们只要把Logistic Regression练习中的样本换成手的样本,那么就能用训练出来的结果来识别手了,因此Logistic Regression是非常有用且强大的算法。
那么在实际问题中,有很多问题需要分类的类别很多(multi-class classification),比如数字识别,就有0~9 一共10个类,这个时候,我们需要对Logistic Regression进行扩展,这就是Softmax Regression。
因此也称为Multinomial Logistic Regression.
那么基本思想还是概率,我们需要计算p(y=j|x)即样本属于某一个类的概率,从而选择概率最大的那一个作为最终的结果。因此,对于h(x)即Hypothesis,现在就不再只是一个值,而是一个k维向量。
下面就是给出h(x)的表达式,我们在这里不需要深究这是如何得到的,而只需知道怎么用。按照Andrew Ng在某个lecture视频说的,先让东西work,再来理解。
hθ(x)=P(y=1|x;θ)P(y=2|x;θ)P(y=K|x;θ)=1Kj=1exp(θ(j)x)exp(θ(1)x)exp(θ(2)x)exp(θ(K)x)
那么大家从上面的公式可以看到,现在的参数theta也不再只是一个列向量,而是一个nxk的矩阵,每一行对应一个theta,因此可以如下denote:
θ=|θ(1)||θ(2)||||θ(K)|.

2 Cost Function

那么在确定Hypothesis之后,下一步的工作就是确定Cost Function的表达以及每个theta的偏导也就是得到Gradient梯度从而使用梯度下降法。
Tutorial直接给出了Cost Function的表达式:
J(θ)=i=1mk=1K1{
y(i)=k}
logexp(θ(k)x(i))Kj=1exp(θ(j)x(i))

然后如果k=2就是只有0或1,可以推出Logistic Regression的Cost Function是上面公式的特殊形式。

在Softmax Regression 中,有

P(y(i)=k|x(i);θ)=exp(θ(k)x(i))Kj=1exp(θ(j)x(i))

然后给出theta偏导的公式:

θ(k)J(θ)=i=1m[x(i)(1{
y(i)=k}P(y(i)=k|x(i);θ))
]

这里  θ(k)J(θ)  本身是向量, 因此它的第j个元素是  J(θ)θlk  ,  J(θ)  关于  θ(k) 的第j个元素的偏导。

3 Softmax Regression参数化的属性

这里介绍了Softmax Regression的一个特别属性,就是它的参数theta可以多重,即Redundant,就是有一组最优的参数theta,就可以推出无数其他组最优参数,原文下面这句话很关键:
if the cost function  J(θ)  is minimized by some setting of the parameters  (θ(1),θ(2),,θ(k)) , then it is also minimized by  (θ(1)ψ,θ(2)ψ,,θ(k)ψ)  for any value of  ψ . Thus, the minimizer of  J(θ)  is not unique.
那么问题就来了,如果最优参数不唯一,那么怎么来计算呢?怎么最优化?
我们需要引入新的调节参数来保证可计算。这里有两种方法,一种就是指定一个参数为0,这样其他参数就唯一。
另一种是下一节介绍的。

4 Weight Decay 权值衰减

很简单的想法,把theta^2作为参数放进Cost Function中,问题就解决了,这和Regulization(防止overfit的处理)完全一样。

5 Softmax Regression vs. k Binary Classifiers

上面就是Softmax Regression的内容了,那么有另外一个问题:
对于上面识别10个数字的例子,我们只能用Softmax Regression吗?
显然不是,我们还可以用 K Binary Classifiers来解决。
什么意思呢?就是我们弄10个二进制的分类器,或者说十个Logistic Regression,然后一个一个判断某一个样本是属于1,还是2,还是3.。。。。
这样也是可以解决问题的。只不过很显然,这样的效率比较低。需要训练多个分类器
但是并不是所有的问题都是这样的,有时候我们不能使用Softmax Regression而只能使用k Binary Classifier。根本在于分类的类别是否相关。比如判断一个图片是属于动物,属于鸟类,属于老鹰。。。这些类是相关的,就不能用Softmax Regression来解决了。

6 exercise解答

方法和前面的练习都是一样的,最困难的问题在于如何用Vectorization来将Cost Function和Gradient表达出来。

下面是我的解答,只列出softmax_regression_vec.m

function [f,g] = softmax_regression_vec(theta, X,y)  %  % Arguments:  %   theta - A vector containing the parameter values to optimize.  %       In minFunc, theta is reshaped to a long vector.  So we need to  %       resize it to an n-by-(num_classes-1) matrix.  %       Recall that we assume theta(:,num_classes) = 0.  %  %   X - The examples stored in a matrix.    %       X(i,j) is the i'th coordinate of the j'th example.  %   y - The label for each example.  y(j) is the j'th example's label.  %  m=size(X,2);  n=size(X,1);  % theta is a vector;  need to reshape to n x num_classes.  theta=reshape(theta, n, []);  num_classes=size(theta,2)+1;  theta = [theta,zeros(n,1)];    % initialize objective value and gradient.  f = 0;  g = zeros(size(theta));  %  % TODO:  Compute the softmax objective function and gradient using vectorized code.  %        Store the objective function value in 'f', and the gradient in 'g'.  %        Before returning g, make sure you form it back into a vector with g=g(:);  %%%% YOUR CODE HERE %%%yCompare = full(sparse(y, 1:m, 1));  %??y == k ???%yCompare = yCompare(1:num_classes-1,:); % ??y = 10???M = exp(theta'*X);p = bsxfun(@rdivide, M, sum(M));f = - yCompare(:)' * log(p(:));g = - X*(yCompare - p)';g = g(:,1:num_classes - 1);  g=g(:); % make gradient a vector for minFunc

如何解释是个比较麻烦的问题,我推出的方法还是通过矩阵的size。

首先cost function有两个连加号,这意味着如果每一个计算得出一个值,cost function可以得到一个kxm的矩阵,而yCompare就是kxm,因此后面的概率项也应该如此。theta‘*X是很容易想到的,得到kxm,而对于概率项的分母,我们得这样理解:kxm每一个列就是某一个样本对应于每一个类的数据,我们因此对于分母项的求法很简单,就是用sum把每一列的数据加起来。

其他的推导是一样的道理。

运行结果为:

Average error :0.000005  (Gradient Checking 结果显示梯度计算没有问题)

Training accuracy: 94.4%
Test accuracy: 92.2%

这里有一些有用的MATLAB函数需要关注一下:

full 和 sparse,举例如下:

>> y = [1 2 3]y =     1     2     3>> sparse(y,1:3,1)ans =   (1,1)        1   (2,2)        1   (3,3)        1>> full(sparse(y,1:3,1))ans =     1     0     0     0     1     0     0     0     1
而bsxfun可以用来做矩阵的各种运算,很快!

很多函数如果不清楚一种就是直接在MATLAB help,一种那就是直接百度了。

【本文为原创文章,转载请注明出处:blog.csdn.net/songrotek 欢迎交流QQ:363523441】

你可能感兴趣的文章
zju 1006 zoj 1006
查看>>
【虚拟机】虚拟化架构与系统部署(Windows系统安装)
查看>>
字节跳动安卓开发实习生面试分享
查看>>
好书分享之——《能力陷进》
查看>>
阅读笔记《c++ primer》
查看>>
阅读笔记《C++标准程序库》
查看>>
基于mirror driver的windows屏幕录像
查看>>
C语言8
查看>>
Qt实现简单延时
查看>>
qml有关矩形说明
查看>>
在qt中使用QSplitter设置初始比例setStretchFactor失效的解决方法
查看>>
repeater的使用
查看>>
qt msvc编译中文乱码解决
查看>>
qt中TextField输入框无法输入中文解决办法
查看>>
qt实现点击出现窗口,点击其他任何地方窗口消失
查看>>
QML DropArea拖拉文件事件
查看>>
CORBA links
查看>>
读后感:>
查看>>
ideas about sharing software
查看>>
different aspects for software
查看>>