Neural network 神经网络回归预测的截断

Neural network 神经网络回归预测的截断,neural-network,theano,lasagne,nolearn,Neural Network,Theano,Lasagne,Nolearn,上下文:我有一组文档,每个文档都有两个相关的概率值:属于a类或B类的概率。这些类相互排斥,概率加起来就是一个。因此,例如,文档D具有与基本事实相关联的概率(0.6,0.4) 每个文档都由其包含的术语的tfidf表示,从0到1标准化。我还尝试了doc2vec(规范化的表单-1到1)和其他一些方法 我建立了一个非常简单的神经网络来预测这个概率分布 具有与要素相同数量的节点的输入层 具有一个节点的单个隐藏层 具有softmax和两个节点的输出层 交叉熵损失函数 我还尝试了不同的更新功能和学习速度

上下文:我有一组文档,每个文档都有两个相关的概率值:属于a类或B类的概率。这些类相互排斥,概率加起来就是一个。因此,例如,文档D具有与基本事实相关联的概率(0.6,0.4)

每个文档都由其包含的术语的tfidf表示,从0到1标准化。我还尝试了doc2vec(规范化的表单-1到1)和其他一些方法

我建立了一个非常简单的神经网络来预测这个概率分布

  • 具有与要素相同数量的节点的输入层
  • 具有一个节点的单个隐藏层
  • 具有softmax和两个节点的输出层
  • 交叉熵损失函数
  • 我还尝试了不同的更新功能和学习速度
这是我使用nolearn编写的代码:

net = nolearn.lasagne.NeuralNet(
    layers=[('input', layers.InputLayer),
        ('hidden1', layers.DenseLayer),
        ('output', layers.DenseLayer)],
    input_shape=(None, X_train.shape[1]),
    hidden1_num_units=1,
    output_num_units=2,
    output_nonlinearity=lasagne.nonlinearities.softmax,
    objective_loss_function=lasagne.objectives.binary_crossentropy,
    max_epochs=50,
    on_epoch_finished=[es.EarlyStopping(patience=5, gamma=0.0001)],
    regression=True,
    update=lasagne.updates.adam,
    update_learning_rate=0.001,
    verbose=2)
net.fit(X_train, y_train)
y_true, y_pred = y_test, net.predict(X_test)
我的问题是:我的预测有一个分界点,没有预测会低于这个分界点(查看图片了解我的意思)。 . 一个点离红线越近,预测效果越好。理想情况下,所有的点都在这条线上。我如何解决这个问题?为什么会发生这种情况

编辑:实际上,我只需删除隐藏层即可解决问题:

net = nolearn.lasagne.NeuralNet(
    layers=[('input', layers.InputLayer),
        ('output', layers.DenseLayer)],
    input_shape=(None, X_train.shape[1]),
    output_num_units=2,
    output_nonlinearity=lasagne.nonlinearities.softmax,
    objective_loss_function=lasagne.objectives.binary_crossentropy,
    max_epochs=50,
    on_epoch_finished=[es.EarlyStopping(patience=5, gamma=0.0001)],
    regression=True,
    update=lasagne.updates.adam,
    update_learning_rate=0.001,
    verbose=2)
net.fit(X_train, y_train)
y_true, y_pred = y_test, net.predict(X_test)
但我仍然无法理解为什么会出现这个问题,为什么移除隐藏层可以解决这个问题。有什么想法吗

这里是新的情节:

我认为您的培训集输出值应该是[0,1]或[1,0],

[0.6,0.4]不适用于softmax/交叉熵

我不明白为什么这会是个问题。据我所知,softmax输出加起来等于1,交叉熵度量两个概率分布之间的差异。