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



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

从本节開始,难度開始加大了。我将更具体地解释一下这个Tutorial。


1 Softmax Regression 介绍

前面我们已经知道了Logistic Regression。简单的说就推断一个样本属于1或者0。在应用中比方手的识别。那么就是推断一个图片是手还是非手。这就是非常easy的分类。

其实。我们仅仅要把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 权值衰减

非常easy的想法,把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是非常easy想到的,得到kxm,而对于概率项的分母,我们得这样理解:kxm每个列就是某一个样本相应于每个类的数据,我们因此对于分母项的求法非常easy。就是用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】

原文地址:https://www.cnblogs.com/wzzkaifa/p/7367006.html