Нейронные сети: какую функцию стоимости использовать?


49

Я использую TensorFlow для экспериментов в основном с нейронными сетями. Хотя я провел довольно много экспериментов (XOR-Problem, MNIST, некоторые вещи регрессии, ...), я борюсь с выбором «правильной» функции стоимости для конкретных задач, потому что в целом я мог бы считаться новичком.

До прихода в TensorFlow я самостоятельно кодировал некоторые полностью подключенные MLP и некоторые рекуррентные сети с помощью Python и NumPy, но в основном у меня были проблемы, когда было достаточно простой квадратной ошибки и простого отклонения от градиента.

Однако, поскольку TensorFlow предлагает довольно много функций затрат, а также создание пользовательских функций затрат, я хотел бы знать, есть ли какое-то учебное пособие, возможно, специально для функций затрат в нейронных сетях? (Я уже сделал как половину официальных учебных пособий по TensorFlow, но они на самом деле не объясняют, почему функции или ученики с конкретными затратами используются для решения конкретных задач - по крайней мере, не для начинающих)

Чтобы привести несколько примеров:

cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(y_output, y_train))

Я предполагаю, что она применяет функцию softmax к обоим входам, так что сумма одного вектора равна 1. Но что именно является кросс-энтропией с логитами? Я думал, что это суммирует значения и вычисляет перекрестную энтропию ... так что некоторые метрические измерения ?! Разве это не было бы так же, если бы я нормализовал вывод, суммировал и принял квадратную ошибку? Кроме того, почему это используется, например, для MNIST (или даже более сложные проблемы)? Когда я хочу классифицировать как 10 или, может быть, даже 1000 классов, разве суммирование значений полностью не уничтожает какую-либо информацию о том, какой класс на самом деле был выходным?

cost = tf.nn.l2_loss(vector)

Для чего это? Я думал, что потеря l2 в значительной степени является квадратической ошибкой, но API TensorFlow сообщает, что его вход - это всего лишь один тензор. Понятия не имеет вообще ?!

Кроме того, я часто видел это для перекрестной энтропии :

cross_entropy = -tf.reduce_sum(y_train * tf.log(y_output))

... но почему это используется? Разве математическая потеря энтропии не является такой:

-1/n * sum(y_train * log(y_output) + (1 - y_train) * log(1 - y_output))

Где (1 - y_train) * log(1 - y_output)роль в большинстве примеров TensorFlow? Разве это не пропало?


Ответы: я знаю, что этот вопрос довольно открытый, но я не ожидаю, что получу около 10 страниц с каждой функцией проблемы / стоимости, перечисленной подробно. Мне просто нужно краткое резюме о том, когда использовать какую функцию стоимости (в целом или в TensorFlow, для меня это не имеет большого значения) и некоторое пояснение по этой теме. И / или некоторый источник (и) для начинающих;)


1
Хороший вопрос. Добро пожаловать на сайт :)
Dawny33

2
Обычно MSE принимается за регрессию и перекрестную энтропию за классификацию. Классификационный показатель заслуг (CFM) был представлен Хэмпширом и Вайбелем в «Новой целевой функции для улучшенного распознавания фонем с использованием нейронных сетей с временной задержкой». Если я правильно помню, они также объясняют, почему они разработали ОВЛХ так, как они это сделали.
Мартин Тома

1
Я думаю, что limit_sum (y_train * tf.log (y_output)) часто используется, потому что это довольно распространенный пример "простого случая". Он будет суммировать ошибку каждой партии, что означает, что ваша ошибка удваивает стоимость (и величину градиента), если ваш batch_sizes удваивается. На мой взгляд, простое изменение в limit_mean по крайней мере сделает отладку и игру с настройками более понятными.
нейрон

Ответы:


35

Этот ответ относится к общим аспектам функций стоимости, не связанных с TensorFlow, и в основном будет посвящен части «некоторого объяснения по этой теме» вашего вопроса.

В большинстве примеров / уроков, которые я использовал, использованная функция стоимости была несколько произвольной. Суть заключалась в том, чтобы познакомить читателя с конкретным методом, а не с функцией затрат. Это не должно мешать вам следовать учебному пособию, чтобы ознакомиться с инструментами, но мой ответ должен помочь вам в выборе функции стоимости для ваших собственных задач.

Если вы хотите получить ответы, касающиеся кросс-энтропии, логита, норм L2 или чего-либо конкретного, я советую вам опубликовать несколько более конкретных вопросов. Это увеличит вероятность того, что кто-то с конкретными знаниями увидит ваш вопрос.


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

Я не верю, что смогу провести вас через функции стоимости, уже реализованные в TensorFlow, так как я очень мало знаю об этом инструменте, но я могу дать вам пример того, как писать и оценивать различные функции стоимости.


xnf(xn){0,1}

Nf(yn)yn

  • 1Nn{1 if f(xn)yn0 otherwise=nyn[1f(xn)]+[1yn]f(xn)

p(yn=1|xn)

  • 1Nnynp(yn=0|xn)+(1yn)p(yn=1|xn)

p(yn=1|xn)=0.5

p(yn=1|xn)=1yn=0logp(yn|xn)log(0)=log(1)=0, следующая функция не имеет проблемы, описанной в предыдущем абзаце:

  • 1Nnynlogp(yn=0|xn)+(1yn)logp(yn=1|xn)

Это должно проиллюстрировать, что для оптимизации одного и того же процента ошибки разные определения могут давать разные результаты, если их легче понять в вычислительном отношении.

ABAB


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

  • иметь высокую точность , не возвращать ненужную информацию
  • иметь высокий отзыв , вернуть как можно больше релевантных результатов
  • Точность и отзыв (Википедия)

Обратите внимание, что если ваш алгоритм возвращает все , он будет возвращать все возможные возможные результаты и, следовательно, будет иметь высокий отзыв, но с очень низкой точностью. С другой стороны, если он возвращает только один элемент, тот, который является наиболее определенным, является релевантным, он будет иметь высокую точность, но низкий отзыв.

FF1Fββ

  • β>1
  • β<1

В таком сценарии выбор функции стоимости - это выбор компромисса вашего алгоритма .

Другой пример, который часто упоминается, - это случай медицинского диагноза, вы можете выбрать функцию стоимости, которая наказывает больше ложных отрицательных или ложных положительных результатов в зависимости от того, что является предпочтительным:

  • Более здоровые люди классифицируются как больные (но тогда мы можем лечить здоровых людей, что обходится дорого и может причинить им вред, если они на самом деле не больны)
  • Больше больных людей классифицируют как здоровых (но тогда они могут умереть без лечения)

В заключение, определение функции стоимости - это определение цели вашего алгоритма. Алгоритм определяет, как туда добраться.


Примечание: у некоторых функций стоимости есть хороший алгоритм, чтобы добраться до своих целей. Например, существует хороший способ минимизации потерь шарнира (Википедия) путем решения двойной проблемы в SVM (Википедия)


10

Чтобы ответить на ваш вопрос о кросс-энтропии, вы заметите, что то, что вы упомянули, - это одно и то же.

1n(y_trainlog(y_output)+(1y_train)log(1y_output))

y_trainy_output

Другое упомянутое вами уравнение является более общим вариантом, распространяющимся на несколько классов.

-tf.reduce_sum(y_train * tf.log(y_output)) это то же самое, что писать

ntrain_problog(out_prob)

n


4

BLUF: итеративный метод проб и ошибок с подмножеством данных и matplotlib.

Длинный ответ:

Моя команда боролась с тем же вопросом не так давно. Все ответы здесь замечательные, но я хотел бы поделиться с вами своим «ответом новичка» для контекста и в качестве отправной точки для людей, которые плохо знакомы с машинным обучением.

Вы хотите стремиться к функции стоимости, которая является гладкой и выпуклой для вашего конкретного выбора алгоритма и набора данных. Это потому, что вы хотите, чтобы ваш алгоритм мог уверенно и эффективно корректировать веса, чтобы в конечном итоге достичь глобального минимума этой функции затрат. Если ваша функция стоимости «неровная» с локальными максимумами и минимумами и / или не имеет глобального минимума, то вашему алгоритму может быть трудно сходиться; его вес может просто подпрыгнуть повсюду, в конечном итоге не давая вам точных и / или последовательных предсказаний.

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

Но, скажем, вместо этого вы используете алгоритм логистической регрессии для задачи бинарной классификации, например, для прогнозирования пола человека на основе того, купил ли он подгузники за последние 30 дней и купил ли он пиво за последние 30 дней. В этом случае среднеквадратическая ошибка может не дать гладкой выпуклой поверхности, что может быть плохо для тренировки. И вы бы сказали это экспериментально.

Вы можете начать с пробного использования MSE и небольшого и простого образца ваших данных или с фиктивными данными, которые вы сгенерировали для этого эксперимента. Визуализируйте, что происходит с matplotlib (или любым другим решением для печати, которое вы предпочитаете). Полученная кривая ошибки является гладкой и выпуклой? Попробуйте еще раз с дополнительной входной переменной ... Полученная поверхность все еще гладкая и выпуклая? В ходе этого эксперимента вы можете обнаружить, что, хотя MSE не соответствует вашей проблеме / решению, перекрестная энтропия дает вам плавную выпуклую форму, которая лучше соответствует вашим потребностям. Таким образом, вы можете попробовать это с большим набором данных и посмотреть, остается ли гипотеза верной. И если это произойдет, то вы можете попробовать это несколько раз с полным набором тренировок и посмотреть, как он работает и обеспечивает ли он одинаковые модели. Если это не так, выберите другую функцию стоимости и повторите процесс.

Этот тип итеративного процесса проб и ошибок очень хорошо работал для меня и моей команды начинающих исследователей данных и позволяет нам сосредоточиться на поиске решений наших вопросов без необходимости углубляться в математическую теорию выбора функций затрат и оптимизация модели.

Конечно, многие из этих проб и ошибок уже были сделаны другими людьми, поэтому мы также используем общедоступные знания, чтобы помочь нам отфильтровать наш выбор того, что может быть хорошей функцией затрат в начале процесса. Например, перекрестная энтропия, как правило, является хорошим выбором для задач классификации, будь то бинарная классификация с логистической регрессией, как в примере выше, или более сложная многокомпонентная классификация со слоем softmax в качестве выходных данных. Принимая во внимание, что MSE является хорошим первым выбором для задач линейной регрессии, когда вы ищете скалярное предсказание вместо вероятности членства в известной категории из известного набора возможных категорий, и в этом случае вместо слоя softmax в качестве вашего вывода вы ' Я мог бы просто иметь взвешенную сумму входов плюс смещение без функции активации.

Надеюсь, что этот ответ поможет другим новичкам, не будучи слишком упрощенным и очевидным.


3

Пересмотр вашего вопроса

Где находится часть (1 - y_train) * log (1 - y_output) в большинстве примеров TensorFlow? Разве это не пропало?

Ответ в том, что большинство функций вывода - softmax. Это означает, что вам необязательно уменьшать все вероятности в неправильных случаях, поскольку они будут автоматически уменьшаться при увеличении вероятности правильного

Например:

до оптимизации

y_output = [0.2, 0.2, 0.6] а также y_train = [0, 0, 1]

после оптимизации

y_output = [0.15, 0.15, 0.7] а также y_train = [0, 0, 1]

здесь заметим, что хотя мы только что увеличили третий срок, все остальные условия автоматически сокращаются


0

Функция потерь - это руководство для модели, чтобы определить свой путь с помощью оптимизатора. Таким образом, он попытается привести некоторое число, которое должно корректно отражать разрыв с фактическим значением, а также (хотя и не ограничиваясь) -

Понимать выбросы, понимать цель модели, подход модели, понимать тип прогнозирования, т. Е. Число, двоичную метку и т. Д.

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

Это может помочь вам запустить вашу модель, но должно сопровождаться отдельными исследованиями, основанными на сценарии и данных.

Это также может вызвать несколько почему и как. Задайте новый вопрос или используйте уже отвеченные вопросы по ним (их много)

mean_squared_error По умолчанию для регрессии

mean_absolute_error Регрессия, когда у вас есть выбросы

mean_squared_logarithmic_error Регрессия. В дальнейшем уменьшена ошибка. Используйте, когда вы ожидаете больших значений в своем прогнозе

huber_loss Середина MSE и MAE. Эта функция является квадратичной для малых значений и линейной для больших значений

logcosh Это снова средний способ получить преимущества как MSE, так и MAE log (cosh (x)) приблизительно равен (x ** 2) / 2 для малых x и abs (x) - log (2) для больших Икс. Это означает, что «logcosh» работает в основном как среднеквадратическая ошибка, но не будет сильно подвержен случайным дико неверным прогнозам.

mean_absolute_percentage_error Когда нас интересуют% измерения, а не значения. например, при работе с данными о масштабах населения страны,% будет важнее, чем большое число ~ 10000

шарнир СВМ. Он заботится о поле вокруг вектора поддержки.

categorical_crossentropy MultiClass Классификация - мы имеем одну целевую вероятность каждого класса для каждого экземпляра (например , как один докрасна векторов, например , [0, 0, 0, 1, 0, 0, 0, 0, 0. , 0.] для представления класса 3

sparse_categorical_crossentropy Multiclass Classification - у нас есть разреженные метки (т. е. для каждого экземпляра есть только индекс целевого класса, в данном случае от 0 до 9), и классы являются исключительными

двоичный_кросентропий Используйте его для простой двоичной классификации

Примечания :: Это «потеря» из библиотеки Keras. Концепция будет такой же, но другие библиотеки могут использовать некоторые другие текстовые различия, чтобы назвать их.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.