编辑:
一个更尖锐的问题: 在我的梯度下降中使用softmax的导数是什么?
这或多或少是一门课程的研究项目,我对NN的理解非常/相当有限,所以请耐心等待:)
我目前正在建立一个神经网络,试图检查输入数据集并输出每个分类的概率/可能性(有5种不同的分类)。当然,所有输出节点的总和应该加起来为1。
目前,我有两层,我将隐藏层设置为包含10个节点。
我想出了两种不同类型的实现
我使用梯度下降来查找局部最大值,以便调整隐藏节点的权重和输出节点的权重。我确信我对sigmoid有正确的看法。我不太确定softmax(或者我是否可以使用梯度下降),经过一些研究后,我找不到答案并决定自己计算衍生物并获得softmax'(x) = softmax(x) - softmax(x)^2
(这会返回一列矢量大小n)。我还研究了MATLAB NN工具包,工具包提供的softmax的派生返回了一个大小为nxn的方阵,其中对角线与我手工计算的softmax'(x)一致;我不知道如何解释输出矩阵。
我运行每个实现,学习率为0.001和1000次反向传播。但是,对于输入数据集的任何子集,我的NN为所有五个输出节点返回0.2(均匀分布)。
我的结论:
非常感谢任何帮助!
我正在使用的数据集可以在这里找到(已处理的克利夫兰): http://archive.ics.uci.edu/ml/datasets/Heart+Disease
答案 0 :(得分:5)
您使用的渐变实际上与平方误差相同:输出 - 目标。这一开始可能看起来令人惊讶,但诀窍是最小化了不同的错误函数:
(- \sum^N_{n=1}\sum^K_{k=1} t_{kn} log(y_{kn}))
其中log是自然对数,N表示训练样本的数量,K表示类的数量(以及输出层中的单位)。 t_kn描述了第n训练示例中第k类的二进制编码(0或1)。 y_kn相应的网络输出。
显示渐变是正确的可能是一个很好的练习,但我自己并没有这样做。
解决您的问题:您可以通过数值区分来检查渐变是否正确。假设你有一个函数f和f和f'的实现。那么以下内容应该成立:
(f'(x) = \frac{f(x - \epsilon) - f(x + \epsilon)}{2\epsilon} + O(\epsilon^2))
答案 1 :(得分:0)
请查看sites.google.com/site/gatmkorn了解开源Desire模拟程序。 对于Windows版本,/ mydesire / neural文件夹有几个softmax分类器,其中一些使用softmax特定的梯度下降算法。
在示例中,这适用于简单的字符识别任务。
ASee也
Korn,G.A。:高级动态系统仿真,Wiley 2007
GAK
答案 2 :(得分:0)
查看链接: http://www.youtube.com/watch?v=UOt3M5IuD5s softmax导数为:dyi / dzi = yi *(1.0 - yi);