使用softmax激活函数的神经网络

编辑:

更具体的问题:在梯度下降中使用softmax的导数是什么?


这基本上是一个课程的研究项目,我的神经网络知识非常/相当有限,所以请耐心一些 🙂


我目前正在构建一个神经网络,试图检查输入数据集并输出每个分类的概率/可能性(共有5个不同的分类)。自然,所有输出节点的总和应该等于1。

目前,我有两层,并设置隐藏层包含10个节点。

我想出了两种不同的实现方式

  1. 隐藏层使用逻辑 sigmoid 激活,输出层使用 softmax 激活
  2. 隐藏层和输出层都使用 softmax 激活

我使用梯度下降来寻找局部最大值,以便调整隐藏节点和输出节点的权重。我对 sigmoid 的实现非常确定。对于 softmax,我不太确定(或者我是否可以使用梯度下降),经过一些研究后,我找不到答案,决定自己计算导数,得到了 softmax'(x) = softmax(x) - softmax(x)^2(这返回一个大小为 n 的列向量)。我还查看了 MATLAB 的神经网络工具包,该工具包提供的 softmax 导数返回一个大小为 nxn 的方阵,其中对角线与我手动计算的 softmax'(x) 一致;我不知道如何解释这个输出矩阵。

我以0.001的学习率和1000次反向传播迭代运行了每种实现。然而,我的神经网络对输入数据集的任何子集的所有五个输出节点都返回0.2(均匀分布)。

我的结论:

  • 我相当确定我的梯度下降做错了,但我不知道如何修复这个问题。
  • 也许我使用的隐藏节点不够
  • 也许我应该增加层数

任何帮助将不胜感激!

我正在使用的数据集在这里可以找到(处理过的克利夫兰数据集):http://archive.ics.uci.edu/ml/datasets/Heart+Disease


回答:

你使用的梯度实际上与平方误差相同:输出 – 目标。这乍一看可能令人惊讶,但诀窍在于最小化的是不同的误差函数:

softmax error

(- \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’ 的实现。那么以下应该成立:

numerical gradient of the softmax

(f'(x) = \frac{f(x - \epsilon) - f(x + \epsilon)}{2\epsilon} + O(\epsilon^2))

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注