Классификационная модель CNTK Классифицирует все 1

У меня есть модель cntk, которая учитывает функции, связанные с кликами и другой информацией, и предсказывает, будет ли что-то нажато в будущем. Использование тех же функций в случайном лесу работает нормально, однако cntk классифицирует все 1. Почему это происходит? Нужна ли настройка параметров? Характеристики имеют разный масштаб. Мой поезд выглядит так:

    BrainScriptNetworkBuilder = [
    inputD = $inputD$
    labelD = $labelD$
    #hidden1 = $hidden1$
    model(features) = {
        w0 = ParameterTensor{(1 : 2), initValueScale=10}; b0 = ParameterTensor{1, initValueScale=10};
        h1 = w0*features + b0; #hidden layer
        z = Sigmoid (h1)
    }.z
    features = Input(inputD)
    labels = Input(labelD)

    z = model(features)
    #now that we have output, find error
    err = SquareError (labels, z)
    lr = Logistic (labels, z)
    output = z

    criterionNodes = (err)
    evaluationNodes = (err)
    outputNodes = (z)
]

SGD = [
    epochSize = 4 #learn
    minibatchSize = 1 #learn
    maxEpochs = 1000 #learn
    learningRatesPerSample = 1
    numMBsToShowResult = 10000
    firstMBsToShowResult = 10
]

person Varun Appaswami    schedule 19.04.2017    source источник


Ответы (3)


В дополнение к тому, что сказал КеД, случайный лес не заботится о фактических значениях признаков, а только об их относительном порядке.

В отличие от деревьев, нейронные сети чувствительны к фактическим значениям признаков (а не только к их относительному порядку).

Ваш ввод может содержать некоторые функции с очень большими значениями. Вероятно, вам следует их перекодировать. Для этого существуют разные схемы. Одна из возможностей состоит в том, чтобы вычесть среднее значение из каждой функции и масштабировать его до -1,1 или разделить на его стандартное отклонение. Другая возможность для положительных признаков — преобразование, такое как f => log(1+f). Вы также можете использовать слой пакетной нормализации.

person Nikos Karampatziakis    schedule 20.04.2017

Поскольку ваши функции имеют разные масштабы, я бы посоветовал вам нормализовать функции. Вы упомянули, что cntk классифицирует все входные данные как 1. Я предполагаю, что это происходит, когда вы прогнозируете использование обученной модели. Но что происходит во время тренировки? Можете ли вы построить график обучения + ошибка теста на графике (сейчас cntk поддерживает TensorBoard)? Это даст вам некоторое представление о том, подходит ли ваша модель слишком сильно. Более того, в качестве альтернативы я бы предложил увеличить обучаемость модели (скорее всего, за счет увеличения количества скрытых слоев), чтобы изучить лучшее распределение ваших данных.

person Zp Bappi    schedule 30.05.2017
comment
Будет ли слой пакетной нормализации выполнять z-нормализацию признаков? Какую нормализацию можно сделать? - person Varun Appaswami; 08.06.2017
comment
Я имел в виду стандартизацию, т.е. (x - mean) / std. Однако для этого можно использовать пакетную нормализацию, которая, вероятно, будет работать лучше. Он фактически изучит нормализацию как часть процесса обучения вашей модели. Насколько я знаю, он использует среднее значение и дисперсию для нормализации ввода. Однако у него есть и другие приятные преимущества, такие как уменьшение переобучения и уменьшение необходимости тщательной инициализации, что почти всегда полезно иметь. Подробнее об этом можно прочитать здесь, если вам это интересно. - person Zp Bappi; 12.07.2017

Кажется, скорость обучения слишком высока, попробуйте LearningRatesPerSample = 0,001.

person KeD    schedule 20.04.2017