Tflearn使用没有softmax输出层的神经网络对文档进行排名



我有一个进行文本分类的香草前馈神经网络(2 个隐藏层和一个 softmax 输出层(。它是用tflearn实现的。

softmax的作用是将输出转换为密度概率分布,以确定输入实例中最可能的类别。

我想对文档进行排名,而不是分类(每个类都有一个"分数"而不是概率(。所以我的方法不是规范化输出层,而是只使用常规层(带有 sigmoid 激活函数(。这将给我每个文档的分数(0 到 1 之间(。

我定义的模型是这样的:

tf.reset_default_graph()
# Build neural network
net = tflearn.input_data(shape=[None, x_size])
net = tflearn.fully_connected(net, self.HIDDEN_LAYER_SIZE)
net = tflearn.fully_connected(net, self.HIDDEN_LAYER_SIZE)
net = tflearn.fully_connected(net, y_size, activation='sigmoid')
net = tflearn.regression(net)
# Define model and setup tensorboard
model = tflearn.DNN(net)
return model

如果我使用 softmax 输出训练模型,该模型非常准确。但是,如果我更改 sigmoid 的输出激活函数,我的分数并不像我预期的那么准确(正确类的分数最高(。在某些情况下,分数是完全错误的。

我的问题是:这种方法对神经网络进行文本排名是否正确?为什么分数不如预期(也许我在训练过程中遗漏了一些东西,或者一些超参数需要一些调整,或者我需要更多的训练数据使用这种方法?还是TFLEARN的东西?(

提前感谢! 伊凡

您尝试解决的问题是一个回归问题。您希望网络的结果是一个连续值(在本例中,范围从 0 到 1(,而不是将其映射到不同的类别(这称为分类(。

作为一般规则,对于回归器,您需要使用线性激活(tflearn中的线性(或ReLU(tflearn中的relu,范围从0到∞(进行输出层激活。

您的网络在输出层中通过 sigmoid 激活表现不佳的原因是梯度消失问题。 当你的输出接近 1 时,sigmoid 变得非常非常平坦,梯度消失到接近零,使反向传播学习速率非常慢。

TL;大卫:这很正常。这是由于梯度消失问题。请改用线性或 ReLU 进行回归。

最新更新