Нейронні мережі: яку функцію витрат використовувати?


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. Але що саме є перехресною ентропією з logits? Я думав, що це підсумовує значення та обчислює поперечну ентропію ... тож деякий метричний вимір ?! Хіба це не буде так само, якби я нормалізував вихід, підсумував його і взяв помилку в квадраті? Крім того, чому це використовується, наприклад, для 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 приймають для регресії, а Cross-Entropy для класифікації. Класифікаційна фігура заслуг (CFM) була введена в "Новій цільовій функції для поліпшення розпізнавання фонеми за допомогою нейронних мереж затримки в часі" Гемпшир та Вайбель. Якщо я це добре пам’ятаю, вони також пояснюють, чому вони створили CFM так, як робили.
Мартін Тома

1
Я думаю, що Redu_sum (y_train * tf.log (y_output)) використовується багато, тому що це досить поширений приклад "простого випадку". Він запустить суму помилки кожної партії, що означає, що ваша помилка подвоює вартість (та величину градієнта), якщо ваш batch_sizes подвійний. Зміна простої зміни на Redu_mean, як мінімум, зробить налагодження і гру з налаштуваннями більш зрозумілою на мій погляд.
нейрон

Відповіді:


34

Ця відповідь стосується загальної сторони функцій витрат, не пов’язаних із TensorFlow, і в основному стосуватиметься частин вашого питання "деякі пояснення щодо цієї теми".

У більшості прикладів / навчальних посібників, за якими я слідував, використовувана функція витрат була дещо довільною. Сенс полягав у тому, щоб ознайомити читача з конкретним методом, а не з функцією витрат конкретно. Це не повинно зупиняти вас слідувати навчальному посібнику, щоб ознайомитись з інструментами, але моя відповідь повинна допомогти вам вибрати, як вибрати функцію витрат для власних проблем.

Якщо ви хочете отримати відповіді щодо перехресної ентропії, Logit, норм L2 чи будь-чого конкретного, я раджу розмістити декілька більш конкретних питань. Це збільшить ймовірність того, що хтось із конкретними знаннями побачить ваше запитання.


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

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


Для ілюстрації різних відмінностей між вартісними функціями скористаємося прикладом задачі бінарної класифікації, де ми хочемо для кожного зразка класу .xnf(xn){0,1}

Починаючи з обчислювальних властивостей ; як дві функції, що вимірюють "те саме", можуть призвести до різних результатів. Візьміть наступну, просту функцію витрат; відсоток помилки. Якщо у вас зразків, - це передбачуваний клас, а справжній клас, ви хочете мінімізуватиNf(yn)yn

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

Ця функція витрат має перевагу, що її легко інтерпретувати. Однак вона не гладка; якщо у вас є лише два зразки, функція "стрибає" з 0, до 0,5, до 1. Це призведе до невідповідностей, якщо ви спробуєте скористатися градієнтним спуском по цій функції. Одним із способів уникнути цього є зміна функції витрат на використання ймовірностей переуступки; . Функція стає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 (якщо ми ігноруємо ранжирування), ми хочемо, щоб результати, що повертаються,

Зауважте, що якщо ваш алгоритм поверне все , він поверне кожен можливий результат і, таким чином, матиме високу згадуваність, але матиме дуже низьку точність. З іншого боку, якщо він повертає лише один елемент, той, який є найбільш певним, є релевантним, він матиме високу точність, але низький рівень виклику.

Для того, щоб судити про такі алгоритми, загальною функцією витрат є -score (Вікіпедія) . Поширений випадок - -score, який дає однакову вагу для точності та згадування, але загальний випадок - -score, і ви можете налаштувати щоб отриматиFF1Fββ

  • Більше нагадуйте, якщо ви використовуєтеβ>1
  • Більш висока точність, якщо ви використовуєте .β<1

У такому сценарії вибір функції вартості - це вибір компромісу за вашим алгоритмом .

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

  • Більше здорових людей класифікують як хворих (Але тоді ми можемо лікувати здорових людей, що коштує дорого і може нашкодити їм, якщо вони насправді не хворі)
  • Більше хворих класифікують як здорових (Але тоді вони можуть померти без лікування)

На закінчення, визначення функції витрат - це визначення мети вашого алгоритму. Алгоритм визначає, як дістатися.


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


10

Щоб відповісти на ваше запитання щодо перехресної ентропії, ви помітите, що обидва згаданих вами речі - це одне і те ж.

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

що ви згадали - це просто двійкова поперечна втрата ентропії, де ви припускаєте, що - скаляр 0/1 і що є знову скалярним, що вказує на ймовірність виходу 1.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 як вихідного ви ' d може просто мати зважену суму входів плюс зміщення без функції активації.

Сподіваюся, що ця відповідь допомагає іншим новачкам там, не надто спрощених і очевидних.


3

Переоцінка вашого питання

Де в більшості прикладів TensorFlow частина (1 - y_train) * журналу (1 - y_output) частина? Хіба цього не вистачає?

Відповідь полягає в тому, що більшість вихідних функцій є 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]

тут зауважте, що хоча ми тільки збільшили третій термін, всі інші терміни автоматично скорочуються

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.