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

时间:2017-08-11 18:43:11

标签: machine-learning neural-network tflearn

我有一个香草前馈神经网络(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的东西?)

提前致谢! 伊万

1 个答案:

答案 0 :(得分:1)

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

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

您的网络在输出层中使用sigmoid激活效果不佳的原因是vanishing gradient problem。 当你的输出接近1时,sigmoid变得非常非常平坦,渐变消失到接近零,使得反向传播学习速度非常慢。

TL; DR:这是正常的。这是由于消失的梯度问题。使用线性或ReLU代替回归。