Вопрос

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

Прежде чем прийти в TensorFlow, я самостоятельно написал несколько полносвязных MLP и несколько рекуррентных сетей с помощью Питон и 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, для меня это не имеет большого значения) и некоторые пояснения по этой теме.И/или какой-нибудь источник(и) для новичков;)

Это было полезно?

Решение

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

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

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


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

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


Чтобы проиллюстрировать различные различия между функциями стоимости, давайте воспользуемся примером задачи двоичной классификации, где мы хотим, для каждой выборки. $x_n$, класс $f(x_n) \in \{0,1\}$.

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

  • $\frac{1}{N} \sum_n \left\{ \begin{array}{ll} 1 & ext{ if } f(x_n) ot= y_n\\ 0 & ext{ иначе}\\ \end{array} ight.= \sum_n y_n[1-f(x_n)] + [1-y_n]f(x_n)$.

Эта функция стоимости имеет то преимущество, что ее легко интерпретировать.Однако это не гладко;если у вас всего два образца, функция «перепрыгивает» с 0 на 0,5 и на 1.Это приведет к несогласованности, если вы попытаетесь использовать градиентный спуск для этой функции.Один из способов избежать этого — изменить функцию стоимости, чтобы использовать вероятности присвоения; $p(y_n = 1 | x_n)$.Функция становится

  • $\frac{1}{N} \sum_n y_n p(y_n = 0 | x_n) + (1 - y_n) p(y_n = 1 | x_n)$.

Эта функция более плавная и будет лучше работать с подходом градиентного спуска.Вы получите «более точную» модель.Однако у него есть другая проблема;если у вас есть неоднозначный образец, скажем, у вас недостаточно информации, чтобы сказать что-то лучшее, чем $p(y_n = 1 | x_n) = 0,5$.Затем использование градиентного спуска для этой функции стоимости приведет к модели, которая максимально увеличивает эту вероятность и, следовательно, возможно, переобучит.

Другая проблема этой функции заключается в том, что если $p(y_n = 1 | x_n) = 1$ пока $y_n = 0$, вы наверняка правы, но вы ошибаетесь.Чтобы избежать этой проблемы, вы можете взять журнал вероятности, $\log p(y_n | x_n)$.Как $\log(0) = \infty$ и $\log(1) = 0$, следующая функция не имеет проблемы, описанной в предыдущем абзаце:

  • $\frac{1}{N} \sum_n y_n \log p(y_n = 0 | x_n) + (1 - y_n) \log p(y_n = 1 | x_n)$.

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

Для функций стоимости возможно $А$ и $Б$ измерить та же концепция, но $А$ может привести ваш метод к лучшим результатам, чем $Б$.


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

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

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

Чтобы оценить такие алгоритмы, общей функцией стоимости является $Ф$-оценка (Википедия).Распространенным случаем является $F_1$-оценка, которая придает равный вес точности и полноте, но в общем случае $F_\бета$-оцените, и вы можете настроить $\бета$ получить

  • Более высокий отзыв, если вы используете $\бета > 1$
  • Более высокая точность, если вы используете $\бета < 1$.

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

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

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

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


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

Другие советы

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

$ - frac {1} {n} sum (y _train * log (y _output) + (1 - y _train) cdot log (1 - y _output)) $

То, что вы упомянули, является просто бинарной потерей поперечной энтропии, в которой вы предполагаете, что $ y _train $ - скаляр 0/1 и что $ y _output $ снова является скалярным, указывающим на вероятность того, что выход 1.

Другое уравнение, которое вы упомянули, является более общим вариантом этого простирания до нескольких классов

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

$- sum_n train _prob cdot log (out _prob) $

где суммирование превышает многочисленные классы, а вероятности - для каждого класса. Очевидно, что в бинарном случае это то же самое, что и то, что было упомянуто ранее. Термин «$ n $» пропущен, поскольку он никоим образом не способствует минимизации потерь, поскольку он является постоянной.

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

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

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

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

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

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

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

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

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

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

Рекалируя ваш вопрос

Где (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]

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с datascience.stackexchange
scroll top