Softmax 分类器在 LSTM 中永远不允许 100% 的概率?

数据挖掘 可能性 lstm 成本函数
2021-10-08 04:05:51

在使用 LSTM 时,我使用的是 softmax 分类器和 one-hot 编码向量方法。softmax 看起来像这样:

S(hi)=ehiehtotal

注意,LSTM 的结果是 h=tanh(c)σ(p)

其中 c 也是通过 tanh 的单元状态,并且 是两个向量的分量乘积。

回想一下,tanh 永远不会超过 -1,也永远不会超过 1;σ 永远不会低于 0 也永远不会高于 1

这是否意味着如果我们在输出上有 4 个神经元 - 网络可以做出的最佳猜测将是 1、-1、-1、-1?

当softmaxed时,这将产生 2.723.83,0.373.83,0.373.83,0.373.83 这些概率是:

0.7,

0.1,

0.1,

0.1

无论学习率如何,我们永远无法获得〜100%的确定性(编辑:或者在这个例子中甚至超过70%)?有没有办法在不破坏它的衍生物的情况下与交叉熵很好地对抗它?


编辑

作为一个解决方案,我试图确定多接近 e1e1ex实际上是谎言。基本上是一个“反向 lerp”,它确实将值设置为 0 和 1 范围。但是,我不确定它是否会影响衍生品以及在使用交叉熵时它是否不再开箱即用。

这是计算 softmaxed-vector 的常用方法:

float totalSum = 0;
Vec softmaxedVec;
for(int i=0; i< tanhVec.Length; ++i){
   softmaxedVec[i] =  exp( tanhVec[i]);
   totalSum += softmaxedVec[i];
}

for(int i=0; i<softmaxedVec.Length; ++i){
   softmaxedVec[i] = softmaxedVec[i] / totalSum;
}

这就是我现在正在尝试做的事情:

float totalSum = 0;
Vec softmaxedVec;
for(int i=0; i< tanhVec.Length; ++i){
   softmaxedVec[i] =  inverse_lerp(0.3678,  2.71828,  exp( tanhVec[i]));
   totalSum += softmaxedVec[i];
}

for(int i=0; i<softmaxedVec.Length; ++i){
   softmaxedVec[i] = softmaxedVec[i] / totalSum;
}

//returns percentage: 0 the value sits on min, 1.0 the value sits on max
float inverse_lerp(float min, float max, float currValue){
    return (currValue - min) / (max - min);
}

然而,这样一来,恐怕我就失去了那份华丽EW=expectedtarget (softmax 和交叉熵一起工作的礼貌)

..或者如果我基本上破坏了softmax的好处

2个回答

如果你将 LSTM 的输出直接输入到 softmax 中,你可能不会得到好的结果。

如果在 tanh 层之后使用 softmax 层,就会发生不好的事情。正如你所说,信心永远不会接近 100%。例如,如果有两个类,你永远不会超过 88% 的置信度。如果有k 类,你永远无法获得信心 e/(e+(k1)/e))=e2/(e2+k1).

因此,与其直接将 LSTM 的输出直接馈送到 softmax 中,不如使用 LSTM 的输出作为一个或多个(全连接)神经网络层的输入。

如果您希望 100% 确定是:

1、

0,

0,

0,

如您的示例所示,您无法使用 soft-max 获得这种类型的输出。为此,对于那些不正确的 i,您需要 softmax 等于 0,而这根本不可能发生,因为:

ehi0
hiR

请参阅此链接以获得更好的解释。注意ex可以接近 0,但永远不会为 0。您想要的输出类型是 max 函数将输出的输出,遗憾的是 max 函数不可微,因此需要一个软版本,因此需要 softmax。

我认为问题在于您在 tanh 之后使用 softmax,因此您必须消除其中一个“挤压”功能,请参阅此讨论

使用 softmax 的原因是如果类是互斥的,使用 softmax 的优点之一是它通过给其他值至少一些概率来降低对异常值的敏感性。有关更详细的说明12 ,请参阅此链接。