UFLDL学习笔记3(Softmax Regression)
2014-01-13 16:43
260 查看
最近在学习UFLDL
Tutorial,这是一套关于无监督学习的教程。在此感觉Andrew Ng做的真的是非常认真。下面把我的代码贴出来,方便大家学习调试。所有代码已经过matlab调试通过。
第三章 Softmax Regression
这一章讲的是用softmax(实际就是logistic回归的多类版)来进行mnist手写数字的分类。我们知道,logistic和softmax只能做线性的分类。这章的数学求导真是让我呕血啊!花了整整一天无果,最后在Yuli的启发下发现了bug,这个待会讲。softmax是一个概率模型,如下图。其中输出的和为1。
![](http://img.blog.csdn.net/20140113164007921)
softmax分类模型
代码编写
首先要从UFLDL上把mnist下好,这个不多说了。代码中softmaxCost.m和softmaxPred.m是要自己填写的。
softmaxCost.m 计算损失函数和梯度。很简短,但我debug了很久很久。。。代码:
准确率92.270%。可以看到如此简单的模型已经有了一个不错的结果。
数学细节
由于这一章真的是呕心沥血才调通,虽然主要代码才三行,但所以我必须要马克一下细节。主要是求导的地方让我头大了很久很久。。。
首先输出概率可以写成
![](http://img.blog.csdn.net/20140113160250593)
(1)
y为输出向量,比如说y={0,0,1,0,0}
写成exponential family的形式为
![](http://img.blog.csdn.net/20140113160640843)
![](http://img.blog.csdn.net/20140113160640843)
(2)
UFLDL上没有给出推导,我简要总结如下,可跳过不影响阅读。
![](http://img.blog.csdn.net/20140113161626359)
我们定义损失函数为负最大似然函数/N
![](http://img.blog.csdn.net/20140113161925671)
(3)
其中p如(2)中定义。那么只需要E对w求导即可得到梯度了。好了就是这个地方卡了我超久!演算了很多草稿纸放在matlab上还是不对。最后受网友Yuli的启发终于发现了bug。UFLDL上没有给出过程推导,现在我来推导它。作为UFLDL的补充。
(3)式可以写成
![](http://img.blog.csdn.net/20140113162241406)
(4)
对wj求导有
![](http://img.blog.csdn.net/20140113162416515)
(5)
其中
![](http://img.blog.csdn.net/20140113162459171)
上两式推导不难,省略。将该两式代入(5)得
![](http://img.blog.csdn.net/20140113162719140)
至此就和UFLDL上的结果一样了!大功告成!
我之前犯的错误是(5)式没有对右边的项求导,只考虑了左边的项,因此错了。
小结
这一章代码量很少,但是想把每个公式都推一边还是不容易的。
Tutorial,这是一套关于无监督学习的教程。在此感觉Andrew Ng做的真的是非常认真。下面把我的代码贴出来,方便大家学习调试。所有代码已经过matlab调试通过。
第三章 Softmax Regression
这一章讲的是用softmax(实际就是logistic回归的多类版)来进行mnist手写数字的分类。我们知道,logistic和softmax只能做线性的分类。这章的数学求导真是让我呕血啊!花了整整一天无果,最后在Yuli的启发下发现了bug,这个待会讲。softmax是一个概率模型,如下图。其中输出的和为1。
softmax分类模型
代码编写
首先要从UFLDL上把mnist下好,这个不多说了。代码中softmaxCost.m和softmaxPred.m是要自己填写的。
softmaxCost.m 计算损失函数和梯度。很简短,但我debug了很久很久。。。代码:
X = data; Y = groundTruth; W = theta; sampleN = numCases; % 主要部分 P = exp(W*X) ./ repmat(sum(exp(W*X)),numClasses,1); %预测概率 cost = -1/sampleN * sum(sum(Y.*log(P))); %损失函数 thetagrad = -1/sampleN * (Y-P)*X'; %权值梯度softmaxPred.m 预测函数。代码:
result = theta*data; %测试结果 [tmp,pred] = max(result); %pred保存识别图片结果序号运行结果
准确率92.270%。可以看到如此简单的模型已经有了一个不错的结果。
数学细节
由于这一章真的是呕心沥血才调通,虽然主要代码才三行,但所以我必须要马克一下细节。主要是求导的地方让我头大了很久很久。。。
首先输出概率可以写成
(1)
y为输出向量,比如说y={0,0,1,0,0}
写成exponential family的形式为
(2)
UFLDL上没有给出推导,我简要总结如下,可跳过不影响阅读。
我们定义损失函数为负最大似然函数/N
(3)
其中p如(2)中定义。那么只需要E对w求导即可得到梯度了。好了就是这个地方卡了我超久!演算了很多草稿纸放在matlab上还是不对。最后受网友Yuli的启发终于发现了bug。UFLDL上没有给出过程推导,现在我来推导它。作为UFLDL的补充。
(3)式可以写成
(4)
对wj求导有
(5)
其中
上两式推导不难,省略。将该两式代入(5)得
至此就和UFLDL上的结果一样了!大功告成!
我之前犯的错误是(5)式没有对右边的项求导,只考虑了左边的项,因此错了。
小结
这一章代码量很少,但是想把每个公式都推一边还是不容易的。
相关文章推荐
- Zip unzip with Shell32
- django 模板过滤
- 练习1-12
- java中String 相关及“==”与equals方法区别
- 打飞机
- 使用Excel组件时的权限设置
- python subprocess Popen
- 对12306未来发展的建议
- sicily 4379 bicoloring
- man用来显示中文cman
- UML用例图总结
- Xcode 警告信息处理:Format string is not a string literal (potentially insecure)
- android修改默认桌面
- Android实现推送方式解决方案
- Qt技术优势
- Android input处理机制(四)线程安全
- UML类图几种关系的总结
- linux网络协议栈(四)链路层 (6)L2隧道(eoip)
- CreateThread 与 AfxBeginThread的区别
- listview嵌套listview