Почему функция стоимости и функция последней активации связаны в MXNet?

Когда мы определяем модель глубокого обучения, мы делаем следующие шаги:

  1. Укажите, как выходные данные должны быть рассчитаны на основе входных данных и параметров модели.
  2. Укажите функцию затрат (убытков).
  3. Найдите параметры модели путем минимизации функции стоимости.

Мне кажется, что в MXNet первые два шага связаны. Например, следующим образом я определяю линейное преобразование:

# declare a symbolic variable for the model's input
inp = mx.sym.Variable(name = 'inp')
# define how output should be determined by the input
out = mx.sym.FullyConnected(inp, name = 'out', num_hidden = 2)

# specify input and model's parameters
x = mx.nd.array(np.ones(shape = (5,3)))
w = mx.nd.array(np.array([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]]))
b = mx.nd.array(np.array([7.0, 8.0]))

# calculate output based on the input and parameters
p = out.bind(ctx = mx.cpu(), args = {'inp':x, 'out_weight':w, 'out_bias':b})
print(p.forward()[0].asnumpy())

Теперь, если я хочу добавить преобразование SoftMax поверх него, мне нужно сделать следующее:

# define the cost function
target = mx.sym.Variable(name = 'target')
cost = mx.symbol.SoftmaxOutput(out, target, name='softmax')

y = mx.nd.array(np.array([[1.0, 0.0], [0.0, 1.0], [1.0, 0.0], [1.0, 0.0], [0.0, 1.0]]))
c = cost.bind(ctx = mx.cpu(), args = {'inp':x, 'out_weight':w, 'out_bias':b, 'target':y})
print(c.forward()[0].asnumpy())

Чего я не понимаю, так это зачем нам создавать символическую переменную target. Нам это понадобится, только если мы хотим рассчитать затраты, но пока мы просто вычисляем результат на основе ввода (выполняя линейное преобразование и SoftMax).

Кроме того, нам нужно предоставить числовое значение для цели, чтобы рассчитать результат. Итак, похоже, что это требуется, но не используется (предоставленное значение цели не меняет значение вывода).

Наконец, мы можем использовать объект cost для определения модели, которую мы можем подогнать, как только у нас появятся данные. А как насчет функции затрат? Его нужно указать, а его нет. По сути, похоже, что я вынужден использовать определенную функцию затрат только потому, что использую SoftMax. Но почему?

ДОБАВЛЕНО

Для получения дополнительной статистической/математической точки зрения проверьте здесь. Хотя текущий вопрос носит более прагматический/программный характер. В основном это: Как отделить выходную нелинейность и функцию стоимости в MXNEt. Например, я мог бы захотеть выполнить линейное преобразование, а затем найти параметры модели, минимизируя абсолютное отклонение вместо квадрата.


person Roman    schedule 07.12.2017    source источник


Ответы (1)


Вы можете использовать mx.sym.softmax(), если вам нужен только softmax. mx.sym.SoftmaxOutput() содержит эффективный код для расчета градиента перекрестной энтропии (отрицательные потери журнала), который является наиболее распространенным типом потерь, используемых с softmax. Если вы хотите использовать собственные потери, просто используйте softmax и добавляйте потери сверху во время тренировки. Я должен отметить, что вы также можете заменить слой SoftmaxOutput простым softmax во время вывода, если вы действительно этого хотите.

person Sina Afrooze    schedule 09.12.2017