Помилка перевірки менше, ніж помилка тренування?


57

Тут і тут я знайшов два питання щодо цього питання, але поки немає очевидних відповідей чи пояснень. Я застосовую ту саму проблему, коли помилка перевірки менша, ніж помилка навчання в моїй нейронній мережі Convolution. Що це означає?


Я не думаю, що на це питання можна відповісти, не знаючи абсолютної кількості тренувань (cv) та тестових випадків, а також відмінність, що спостерігається для MSE як для перехресної перевірки, так і для тесту.
cbeleites підтримує Моніку

перетасувати дані
користувач0

Що ми робимо з цього? Так, його генерують із щільної мережі із шарами випадання та batchnorm. ! [Введіть опис зображення тут ] ( i.stack.imgur.com/KX1Fz.png )
Срінат

Відповіді:


69

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

Взагалі кажучи, помилка навчання майже завжди недооцінює вашу помилку перевірки. Однак можливо, що помилка перевірки буде меншою, ніж тренінг. Можна думати про це двома способами:

  1. У вашому навчальному наборі було багато «важких» випадків для навчання
  2. У вашому наборі перевірки було передбачити переважно «легкі» випадки

Ось чому важливо, щоб ви справді оцінювали свою модельну методику навчання. Якщо ви не розділите свої дані для тренування належним чином, ваші результати призведуть до заплутаних, якщо не просто неправильних висновків.

Я думаю про оцінку моделі в чотирьох різних категоріях:

  1. Недостатня кількість - висока помилка перевірки та тренування

  2. Поміщення - помилка перевірки висока, помилка навчання - низька

  3. Хороша відповідність - похибка перевірки низька, трохи вище помилки тренувань

  4. Невідома відповідність - помилка перевірки низька, помилка тренування "висока"

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

EDIT

Щоб вирішити посилання ОП на попереднє питання про лазань пітона .

Це говорить про те, що у вас є достатня кількість даних, щоб не вимагати перехресної перевірки і просто мати підгрупи даних про навчання, валідацію та тестування. Тепер, якщо ви подивитесь на підручник з лазаньєю, ви побачите, що така ж поведінка спостерігається вгорі сторінки. Мені важко буде повірити, що автори опублікують такі результати, якби це було дивно, але замість того, щоб просто припускати, що вони правильні, давайте подивимось далі. Розділ, який нас найбільше цікавить тут, знаходиться в розділі навчального циклу , трохи вище дна ви побачите, як розраховуються параметри втрат.

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

Сподіваюсь, це пояснює ці помилки.


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

@cdeterman thanks.Я використовую RMSE як показник ефективності. Я розділив свої дані на 20% для тестування та 80% для навчання та валідації (20% даних тренувань перехресне підтверджено для обчислення помилки перевірки) Насправді помилка валідації низька, трохи нижча, ніж помилка тренування. Похибка тесту вища, ніж помилки навчання та перевірки. Ми можемо знайти подібний випадок у MNISTdataset для розпізнавання рукописного тексту stats.stackexchange.com/questions/178371/…
Бідо

@Bido чи моя остання адреса редагування, яку ви запитуєте?
cdeterman

@cdeterman Дякую Я щойно помітив, що ви відредагували свою відповідь. Це зрозуміло і корисно.
Бідо

Чудове пояснення, якби ви могли додати кілька графіків - це було б найкращим можливим
Тарас Мацик,

109

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


12
Яка проста, розумна відповідь!
rajb245

4
Так, це справді має бути позначено як правильну відповідь.
Симанас

2
Я видалив шар відсіву, але все ще бачу втрати валідації нижче, ніж початкові втрати тренувань! (Я не вказую жодної регуляризації для шарів!)
Josiah Yoder

Відповідає моєму випадку. Використання безлічі відсівів.
Андре Крістофер Андерсен

@JosiahYoder - Ви маєте щось більше для цього? У мене 1650 вхідних функцій. коли я тримаю в мережі невеликий (1650, 50, 1) відсіч або відсутність відміни, помилка тренувань у початкові епохи вище помилки перевірки. Коли я використовую великі мережі (1650, 1200, 800, 100 ..... близько 10 шарів 100 з активацією selu), дивна модель більшої точності перевірки дещо пом’якшується.
MiloMinderbinder

19

У мене недостатньо балів, щоб коментувати відповідь @ DK, але зараз це відповідь як FAQ на документацію Кераса:

"Чому втрата від навчання набагато вище, ніж тестова втрата?

Модель Кераса має два режими: тренування та тестування. Механізми регуляризації, такі як випадання та регуляризація ваги L1 / L2, вимикаються під час тестування.

Крім того, втрати від тренувань - це середнє значення втрат за кожну групу даних про навчання. Оскільки ваша модель змінюється з часом, втрати за перші партії епохи, як правило, вищі, ніж за останні партії. З іншого боку, тестові втрати для епохи обчислюються за допомогою моделі, що є в кінці епохи, в результаті чого менші втрати ".


1
Це також не зовсім відповідає на питання. Якщо відмова відключена, я все ще бачу втрату валідації приблизно на половину втрати тренувань протягом кількох епох поспіль!
Йосія Йодер

Чи є ваші дані про навчання репрезентативними для даних розробників?
dter

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

Ваша відповідь не говорить про те, що втрата тренувань більша, ніж втрата валідації, що є питанням, яке задавали. Ви більше зосереджені на програші та втратах на тренуванні
enjal

6

мої 2 копійки: у мене також була така ж проблема, навіть не маючи шарів, що випадали. У моєму випадку - винуватці шарів партії норми. Коли я їх видалив - втрата навчання стала схожою на втрату перевірки. Можливо, це сталося тому, що під час тренування пакетної норми використовується середнє значення та дисперсія даної вхідної партії, які можуть відрізнятися від партії до партії. Але під час оцінки пакетна норма використовує бігову середню і дисперсію, обидві вони відображають властивості всього тренувального набору набагато краще, ніж середнє значення та дисперсія однієї партії під час тренування. Принаймні, саме так застосовується пакетна норма в піторху


1
Дякую @ Mans007, це сталося зі мною, і я використовував Keras. Причиною стали шари партії норми.
Roei Bahumi

4

Інша можливість, яка певним чином поєднує в собі відповіді @cdeterman та @DK, це якщо ви використовуєте якийсь механізм збільшення даних. Збільшення даних про забруднення зазвичай проводиться лише на навчальному наборі, а не на наборі перевірки (як для регуляризації випадання), і це може призвести до набору перевірок, що містить "простіші" випадки передбачення, ніж ті, що знаходяться у навчальному наборі.


2

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


0

@cdeterman і @DK мають гарне пояснення. Я хотів би ще одну причину - data leakage. Частина ваших даних поїздів "тісно пов'язана" з тестовими даними.

Потенційний приклад: уявіть, що у вас є 1000 собак і 1000 котів з 500 подібними зображеннями на вихованця (деякі власники люблять фотографувати своїх вихованців у дуже схожих положеннях), скажімо на задньому плані. Тож якщо ви зробите випадковий поділ 70/30, ви отримаєте витік даних поїздів у дані тесту.


0

Простіше кажучи, якщо втрати тренувань та втрати валідації обчислюються правильно, втрати тренувань не можуть бути вищими, ніж втрати під час перевірки. Це пояснюється тим, що зворотне розповсюдження Прямо зменшує помилки, обчислені на тренувальному наборі, і лише ПОСЛІДНО (навіть не гарантовано!) Зменшує помилку, обчислені на наборі перевірки.

Повинні бути деякі додаткові фактори, які відрізняються під час навчання та під час перевірки. Випадання - це добре, але можуть бути й інші. Не забудьте перевірити документацію бібліотеки, яку ви використовуєте. Моделі та шари зазвичай можуть мати налаштування за замовчуванням, на які ми зазвичай не звертаємо уваги.


0

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


0

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

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

2.) Помилка тренувань обчислюється до того, як буде виконано оновлення пакету. У методі на основі стохастичного градієнта є деякий шум градієнта. Поки хтось піднімається на гору, є велика ймовірність того, що зменшуються глобальні втрати, обчислені за всі навчальні зразки. Однак, коли один отримує дуже близько до режиму, напрямок поновлення буде негативним по відношенню до зразків в вашої партії. Але так як ми підстрибуючи режим, це означає , що в середньому ми повинні вибрати напрямок , яке є позитивним по відношенню до зразків , виконанимпартії. Тепер, якщо ми збираємось оновити відносно зразків у певній партії, це означає, що вони були висунуті навколо потенційно багато пакетних оновлень, до яких вони не були включені, обчислюючи їх втрати до оновлення, це коли стохастичне методи підштовхнули параметри найбільш на користь інших зразків у вашому наборі даних, тим самим надаючи нам невеликий зміщення вгору щодо очікуваної втрати.

Зауважте, що, незважаючи на асимптотику, ефект (1) згасає, (2) - ні! Нижче я показую, що Керас, як видається, робить і (1), і (2).

(1) Показано, що показники усереднюються по кожній партії в епоху, а не всі відразу в кінці. Помітьте ВЕЛИЧЕЗНУ різницю в точності вибірки проти валь-акумуляції, що сприяє валь-акумуляції в перші епохи. Це пояснюється тим, що деякі помилки у вибірці обчислюються за допомогою дуже мало пакетних оновлень.

>>> model.fit(Xtrn, Xtrn, epochs = 3, batch_size = 100, 
...                 validation_data = (Xtst, Xtst))
Train on 46580 samples, validate on 1000 samples
Epoch 1/3
46580/46580 [==============================] - 8s 176us/sample 
- loss: 0.2320 - accuracy: 0.9216 
- val_loss: 0.1581 - val_accuracy: 0.9636
Epoch 2/3
46580/46580 [==============================] - 8s 165us/sample 
- loss: 0.1487 - accuracy: 0.9662 
- val_loss: 0.1545 - val_accuracy: 0.9677
Epoch 3/3
46580/46580 [==============================] - 8s 165us/sample 
- loss: 0.1471 - accuracy: 0.9687 
- val_loss: 0.1424 - val_accuracy: 0.9699
<tensorflow.python.keras.callbacks.History object at 0x17070d080>

(2) Показ помилки обчислюється перед оновленням для кожної партії. Зауважимо, що для епохи 1, коли ми використовуємо batch_size = nRows(тобто всі дані в одній партії), помилка у вибірці становить приблизно 0,5 (випадкове відгадування) для епохи 1, проте помилка перевірки становить 0,82. Тому помилка у вибірці була обчислена перед оновленням пакету, тоді як помилка перевірки була обчислена після пакетного оновлення.

>>> model.fit(Xtrn, Xtrn, epochs = 3, batch_size = nRows, 
...                 validation_data = (Xtst, Xtst))
Train on 46580 samples, validate on 1000 samples
Epoch 1/3
46580/46580 [==============================] - 9s 201us/sample 
- loss: 0.7126 - accuracy: 0.5088 
- val_loss: 0.5779 - val_accuracy: 0.8191
Epoch 2/3
46580/46580 [==============================] - 6s 136us/sample 
- loss: 0.5770 - accuracy: 0.8211 
- val_loss: 0.4940 - val_accuracy: 0.8249
Epoch 3/3
46580/46580 [==============================] - 6s 120us/sample 
- loss: 0.4921 - accuracy: 0.8268 
- val_loss: 0.4502 - val_accuracy: 0.8249
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.