Вывод MXNET softmax: путаница в форме этикетки

У меня нет четкого представления о том, как должны формироваться метки для классификатора softmax.

Что я мог понять из моих экспериментов, так это то, что скалярное поле, указывающее индекс выходной вероятности класса, является одним из вариантов, тогда как другой является двухмерной меткой, где строки представляют собой вероятности класса, или переменную с горячим кодированием, такую ​​как c(1, 0, 0).

Что меня удивляет, так это то, что:

  • Я могу использовать значения меток sclalar, которые идут за индексацией, как 4 в моем примере ниже - без предупреждения или ошибки. Это почему?
  • Когда моя метка является отрицательным скаляром или массивом с отрицательным значением, модель сходится к равномерному распределению вероятности по классам. Например, ожидается ли это, что actor_train.y = matrix(c(0, -1,v0), ncol = 1) приводит к равным вероятностям на выходе softmax?
  • Я пытаюсь использовать Softmax MXNET классификатор, чтобы произвести обучение принципу градиента политики, и мои отрицательные вознаграждения приводят к проблеме выше: равномерная вероятность. Это ожидается?

    требуют (mxnet)

    actor_initializer<- mx.init.Xavier (rnd_type = "gaussian", factor_type = "avg", величина = 0,0001)

    actor_nn_data <- mx.symbol.Variable ('data') actor_nn_label <- mx.symbol.Variable ('label')

    device.cpu <- mx.cpu ()

    NN архитектура

    actor_fc3<- mx.symbol.FullyConnected (data = actor_nn_data, num_hidden = 3)

    actor_output<- mx.symbol.SoftmaxOutput (data = actor_fc3, label = actor_nn_label, name = 'actor')

    crossentfunc<- function (label, pred) {- sum (label * log (pred))}

    actor_loss<- mx.metric.custom (feval = crossentfunc, name = "log-loss")

    инициализировать NN

    actor_train.x <- матрица (rnorm (11), nrow = 1)

    actor_train.y = 0 # 1 # 2 # 3 # -3 # матрица (c(0, 0, -1), ncol = 1)

    гт (actor_model)

    actor_model<- mx.model.FeedForward.create (symbol = actor_output, X = actor_train.x, y = actor_train.y, ctx = device.cpu, num.round = 100, array.batch.size = 1, optimizer = ' adam ', eval.metric = actor_loss, clip_gradient = 1, wd = 0.01, initializer = actor_initializer, array.layout = "rowmajor")

    предсказать (actor_model, actor_train.x, array.layout = "rowmajor")

1 ответ

Это довольно странно для меня, но я нашел решение.

Я изменил оптимизатор с optimizer = 'adam' в optimizer = 'rmsprop'и NN начали сходиться, как и ожидалось, в случае отрицательных целей. Я сделал моделирования в R с использованием простого NN и optim Функция, чтобы получить тот же результат.

Похоже adam или же SGD может быть глючит или что-то еще в случае многочленной классификации... Я также застрял в том факте, что эти оптимизаторы не сходятся к идеальному решению только на одном примере, в то время как rmsprop делает! Будь в курсе!

Другие вопросы по тегам