2016-08-13 4 views
3

Контекст: У меня есть набор документов, каждый из которых имеет два связанных значения вероятности: вероятность принадлежать классу A или вероятность принадлежать классу B. Эти классы являются взаимоисключающими, а вероятности составляют до одного. Так, например, документ D имеет вероятности (0,6, 0,4), связанные как основная истина.Сокращение прогнозов регрессии нейронных сетей

Каждый документ представлен tfidf содержащихся в нем терминов, нормированный от 0 до 1. Я также пробовал doc2vec (нормализованная форма от -1 до 1) и несколько других методов.

Я построил очень простую нейронную сеть, чтобы предсказать это распределение вероятности.

  • Входной слой с таким количеством узлов, как особенности
  • один скрытый слой один с узлом
  • Выходной слой SoftMax и два узла
  • функция Cross потеря энтропии
  • Я также попытался с различными функциями обновления и курсы обучения

Это код, который я написал, используя 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) 

Моя проблема в том, что мои предсказания имеют точку отсечки, и предсказание не идет ниже этой точки (проверьте изображение, чтобы понять, что я имею в виду). This plot shows the difference between the true probability and my predictions. Чем ближе точка к красной линии, тем лучше прогноз. В идеале все точки лежат на линии. Как я могу это решить и почему это происходит?

Edit: на самом деле я решил эту проблему, просто удалив скрытый слой:

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) 

Но я до сих пор не понимаю, почему у меня была эта проблема и почему удаление скрытого слоя решил. Есть идеи?

Вот новый сюжет: 2

ответ

0

Я думаю, что ваше выходное значение обучающего множества должно быть [0,1] или [1,0],
[0.6,0.4] не подходит для SoftMax/Crossentropy ,

+2

Я не понимаю, почему это было бы проблемой. Насколько я знаю, выходы softmax добавляют до 1, а кросс-энтропия измеряет разницу между двумя распределениями вероятностей. –