深度学习 Deep Learning UFLDL 最新Tutorial 学习笔记 5:Softmax Regression

来源:互联网 发布:淘宝banner图怎么做 编辑:程序博客网 时间:2024/05/02 04:59


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

[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. function [f,g] = softmax_regression_vec(theta, X,y)  
  2.   %  
  3.   % Arguments:  
  4.   %   theta - A vector containing the parameter values to optimize.  
  5.   %       In minFunc, theta is reshaped to a long vector.  So we need to  
  6.   %       resize it to an n-by-(num_classes-1) matrix.  
  7.   %       Recall that we assume theta(:,num_classes) = 0.  
  8.   %  
  9.   %   X - The examples stored in a matrix.    
  10.   %       X(i,j) is the i'th coordinate of the j'th example.  
  11.   %   y - The label for each example.  y(j) is the j'th example's label.  
  12.   %  
  13.   m=size(X,2);  
  14.   n=size(X,1);  
  15.   
  16.   % theta is a vector;  need to reshape to n x num_classes.  
  17.   theta=reshape(theta, n, []);  
  18.   num_classes=size(theta,2)+1;  
  19.   theta = [theta,zeros(n,1)];  
  20.     
  21.   % initialize objective value and gradient.  
  22.   f = 0;  
  23.   g = zeros(size(theta));  
  24.   
  25.   %  
  26.   % TODO:  Compute the softmax objective function and gradient using vectorized code.  
  27.   %        Store the objective function value in 'f', and the gradient in 'g'.  
  28.   %        Before returning g, make sure you form it back into a vector with g=g(:);  
  29.   %  
  30. %%% YOUR CODE HERE %%%  
  31.   
  32. yCompare = full(sparse(y, 1:m, 1));  %??y == k ???  
  33. %yCompare = yCompare(1:num_classes-1,:); % ??y = 10???  
  34. M = exp(theta'*X);  
  35. p = bsxfun(@rdivide, M, sum(M));  
  36. f = - yCompare(:)' * log(p(:));  
  37.   
  38.   
  39. g = - X*(yCompare - p)';  
  40. g = g(:,1:num_classes - 1);  
  41.   
  42.   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,举例如下:

[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. <span style="font-size:24px;">>> y = [1 2 3]  
  2.   
  3. y =  
  4.   
  5.      1     2     3  
  6.   
  7. >> sparse(y,1:3,1)  
  8.   
  9. ans =  
  10.   
  11.    (1,1)        1  
  12.    (2,2)        1  
  13.    (3,3)        1  
  14.   
  15. >> full(sparse(y,1:3,1))  
  16.   
  17. ans =  
  18.   
  19.      1     0     0  
  20.      0     1     0  
  21.      0     0     1</span>  

而bsxfun可以用来做矩阵的各种运算,很快!

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


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

0 0
原创粉丝点击