在使用 LSTM 时,我使用的是 softmax 分类器和 one-hot 编码向量方法。softmax 看起来像这样:
注意,LSTM 的结果是
其中 c 也是通过 tanh 的单元状态,并且 是两个向量的分量乘积。
回想一下,tanh 永远不会超过 -1,也永远不会超过 1;这 永远不会低于 0 也永远不会高于 1
这是否意味着如果我们在输出上有 4 个神经元 - 网络可以做出的最佳猜测将是 1、-1、-1、-1?
当softmaxed时,这将产生 这些概率是:
0.7,
0.1,
0.1,
0.1
无论学习率如何,我们永远无法获得〜100%的确定性(编辑:或者在这个例子中甚至超过70%)?有没有办法在不破坏它的衍生物的情况下与交叉熵很好地对抗它?
编辑
作为一个解决方案,我试图确定多接近 和 这 实际上是谎言。基本上是一个“反向 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);
}
然而,这样一来,恐怕我就失去了那份华丽 (softmax 和交叉熵一起工作的礼貌)
..或者如果我基本上破坏了softmax的好处