UFLDL教程之五:Softmax 回归

来源:互联网 发布:炒股软件jryznxt 编辑:程序博客网 时间:2024/05/22 02:20

softmax回归是logistic回归的一般化形式,可将样本分为k类,其假设函数如下:


 \begin{align} h_\theta(x^{(i)}) = \begin{bmatrix} p(y^{(i)} = 1 | x^{(i)}; \theta) \ p(y^{(i)} = 2 | x^{(i)}; \theta) \ \vdots \ p(y^{(i)} = k | x^{(i)}; \theta) \end{bmatrix} = \frac{1}{ \sum_{j=1}^{k}{e^{ \theta_j^T x^{(i)} }} } \begin{bmatrix} e^{ \theta_1^T x^{(i)} } \ e^{ \theta_2^T x^{(i)} } \ \vdots \ e^{ \theta_k^T x^{(i)} } \ \end{bmatrix} \end{align}

代价函数为

 \begin{align} J(\theta) = - \frac{1}{m} \left[ \sum_{i=1}^{m} \sum_{j=1}^{k} 1\left\{y^{(i)} = j\right\} \log \frac{e^{\theta_j^T x^{(i)}}}{\sum_{l=1}^k e^{ \theta_l^T x^{(i)} }}\right] \end{align}

梯度公式

 \begin{align} \nabla_{\theta_j} J(\theta) = - \frac{1}{m} \sum_{i=1}^{m}{ \left[ x^{(i)} \left( 1\{ y^{(i)} = j\} - p(y^{(i)} = j | x^{(i)}; \theta) \right) \right] } \end{align}

将其带入梯度下降等算法中,来最小化 \textstyle J(\theta),如 \textstyle \theta_j <wbr>:= \theta_j - \alpha \nabla_{\theta_j} J(\theta)(\textstyle j=1,\ldots,k
softmax回归有一个特点,就是它的参数是冗余的。
有时会添加一个权重衰减项来修改代价函数,变成这样

 \begin{align} J(\theta) = - \frac{1}{m} \left[ \sum_{i=1}^{m} \sum_{j=1}^{k} 1\left\{y^{(i)} = j\right\} \log \frac{e^{\theta_j^T x^{(i)}}}{\sum_{l=1}^k e^{ \theta_l^T x^{(i)} }} \right] + \frac{\lambda}{2} \sum_{i=1}^k \sum_{j=0}^n \theta_{ij}^2 \end{align}

相应导数是这样

 \begin{align} \nabla_{\theta_j} J(\theta) = - \frac{1}{m} \sum_{i=1}^{m}{ \left[ x^{(i)} ( 1\{ y^{(i)} = j\} - p(y^{(i)} = j | x^{(i)}; \theta) ) \right] } + \lambda \theta_j \end{align}

实际应用中要考虑清楚是使用softmax回归还是使用K个二元分类器,根据类别之间是否互斥来确定。

实验:
MATLAB FUNCTIONS:

  sparse:

  生成一个稀疏矩阵,比如说sparse(A, B, k),,其中A和B是个向量,k是个常量。这里生成的稀疏矩阵的值都为参数k,稀疏矩阵位置值坐标点有A和B相应的位置点值构成。

  full:

  生成一个正常矩阵,一般都是利用稀疏矩阵来还原的。


SoftmaxCost.m
%YOUR CODE HERE
M = bsxfun(@minus, theta*data,max(theta*data, [], 1));
M = exp(M);
p = bsxfun(@rdivide, M, sum(M));

cost = -1/numCases * groundTruth(:)' * log(p(:)) + lambda/2 * sum(theta(:).^2);
thetagrad = -1/numCases * (groundTruth - p) * data' + lambda*theta;


SoftmaxPredict.m
% YOUR CODE HERE
[nop, pred] = max(theta * data);

0 初始化常量与参数

             输入图片大小是28*28,共有10类。

1 载入数据

             60000张训练图像及其标签,权重参数是7840维的,表明网络只有输入层与输出层,没有隐层。

2 实现softmaxCost

             将\textstyle J(\theta) \textstyle \nabla_{\theta_j} J(\theta)用向量化的方式表示出来。

3梯度检查

            这个在调试的时候用较小的量来做即可,正式运行的时候可以不要。

4学习参数

            用minFunc学习,迭代100次,返回学到的最优参数。

5测试

           10000张测试图像,测试的正确率92.64%。

0 0
原创粉丝点击