Оптимизация точности вместо потерь в модели Keras - PullRequest
1 голос
/ 07 июня 2019

Если я правильно понял значение функции потерь для модели, она направляет модель для обучения на основе минимизации значения потерь. Так, например, если я хочу, чтобы моя модель была обучена, чтобы иметь наименьшую среднюю абсолютную ошибку, я должен использовать MAE в качестве функции потерь. Почему, например, иногда вы видите кого-то, кто хочет достичь максимально возможной точности, но строит модель, чтобы минимизировать другую, совершенно другую функцию? Например:

model.compile(loss='mean_squared_error', optimizer='sgd', metrics='acc')

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

Я сомневаюсь: разве не следует сосредоточить внимание модели во время обучения на максимизации соотношения (или уменьшении 1 / разрядов) вместо минимизации MSE? Если сделать это таким образом, разве модель не даст нам еще более высокую точность, поскольку она знает, что должна максимизировать ее во время обучения?

Ответы [ 2 ]

0 голосов
/ 08 июня 2019

Начнем с того, что фрагмент кода, который вы использовали в качестве примера:

model.compile(loss='mean_squared_error', optimizer='sgd', metrics='acc')

на самом деле недействителен (хотя Keras не выдаст никакой ошибки или предупреждения) для очень простого иэлементарная причина: MSE является действительной потерей для регрессии задач, для которых точность проблем не имеет смысла (она имеет смысл только для классификации задач, где MSE не является действительной функцией потерь).Подробнее (включая пример кода) см. Собственный ответ в Какая функция определяет точность в Керасе, когда потеря представляет собой среднеквадратическую ошибку (MSE)? ;для подобной ситуации в scikit-learn см. собственный ответ в этой теме .

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

model.compile(loss='mean_squared_error', optimizer='sgd')

без указания metrics.Конечно, мы могли бы использовать metrics='mse', но это излишне и не очень нужно.Иногда люди используют что-то вроде

model.compile(loss='mean_squared_error', optimizer='sgd', metrics=['mse','mae'])

, то есть оптимизируют модель в соответствии с потерей MSE, но в дополнение к MSE показывают ее производительность в средней абсолютной ошибке (MAE).

Теперь,Ваш вопрос:

не следует ли фокусировать модель во время обучения, чтобы максимизировать акк (или минимизировать 1 / акк) вместо минимизации MSE?

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

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

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

0 голосов
/ 07 июня 2019

Если я правильно понял, вы задаетесь вопросом: зачем оптимизировать «потери», когда мы можем оптимизировать «точность».

короткий ответ:

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

возможно, эта путаница возникает из-за использования таких слов, как: "mse" и еще более запутанно: "acc".

отметьте этот файл, чтобы получить более четкое представление о том, что происходит, когда вы пишете "mse"

"acc" немного немного немного более запутанно. Видите ли, когда вы пишете «acc», это имеет несколько значений для Keras. Следовательно, в зависимости от того, какую функцию потерь вы используете, Keras затем решит, какая функция «акк» вам подойдет. Проверьте этот файл, чтобы увидеть, что происходит, когда вы пишете "acc"

Наконец, отвечая на ваш вопрос: shouldn't the focus of the model during it's training to maximize acc (or minimize 1/acc) instead of minimizing MSE?

Ну, керасам, MSE и acc - не что иное, как функции. Keras оптимизирует вашу модель на основе обратной связи от функции, определенной в:

model.compile(loss=<function_to_take_feedback_from>, optimizer=<also_another_function>, metrics=<function_to_just_evaluate_and_print_result_hoping_this_printed_value_means_something_to_you_the_user>)

подведение:

для attribute: loss передать функцию. Если вы не хотите этого делать, просто напишите "mse", и keras передаст вам необходимую функцию.

для attribute: metrics передать список функций. Если вы такой же ленивый, как я, просто попросите keras сделать это, написав "acc"

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

какую функцию / уравнение следует использовать в качестве целевой функции?

это на другой день:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...