Чи має batch_size в Керасі вплив на якість результатів?


38

Я збираюся тренувати велику мережу LSTM з 2-3 мільйонами статей і борюся з помилками пам'яті (я використовую AWS EC2 g2x2large).

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

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

Спасибі.


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

Я бачив випадки, коли занадто великий розмір партії може запобігти зближенню навіть при однаковій кількості навчальних епох.
Кертіс Уайт

Відповіді:


43

Через півтора року я повертаюся до своєї відповіді, оскільки моя попередня відповідь була неправильною.

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

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

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

WRONG, СТАРИЙ ВІДПОВІДЬ: [[[Ні, batch_size в середньому впливає лише на швидкість вашого навчання, а не на якість навчання. Batch_size також не повинні бути повноваженнями 2, хоча я розумію, що деякі пакети дозволяють отримати потужність лише 2. Ви повинні спробувати отримати свій batch_size максимальний, що все ще може відповідати пам’яті вашого GPU, щоб отримати максимальну швидкість .]]]]


Я не можу собі дозволити 32, але можу дозволити собі 16. Однак я помітив, що це занадто повільно. Як ви думаєте, я повинен спробувати деякі значення між 16-32 або дотримуватися 16?
hipoglucido

Я б спробував і час визначити деякі цінності. Кожна епоха повинна бути приблизно в один і той же час, щоб не зайняти занадто багато часу. Спробуйте спершу 17, щоб побачити, чи швидше це чи повільніше, тому що мене це цікавить, враховуючи, що ця потужність у 2 залежить від GPU та / або резервного керасу Keras. Але я думаю, що просто заповнити його до
крайови,

9
Ви впевнені, що розмір партії не впливає на якість навчання? Я пам'ятаю, як читав деякі блоги / статті (?), Де вони казали, що менші партії створюють більш шумні градієнти, ніж великі партії, але шум може бути корисним для виходу з місцевих мінімумів. Не впевнений, чи / як це стосується LSTM.
stmax

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

2
Через півтора року і набагато більше обізнаних зараз, і я згоден. Я збираюся змінити свою відповідь
Ян ван дер Вегт

11

Я вважаю, що прийнята відповідь, можливо, неправильна. Існують варіанти в алгоритмах спуску градієнта .

  1. Спуск градієнта ванілі : Тут градієнт обчислюється по всіх точках даних за один кадр, і приймається середнє значення. Отже, у нас більш плавна версія градієнта потребує більше часу для вивчення.

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

  3. Міні-пакетний градієнт спуск : який приймає переваги обох попередніх, в середньому градієнти невеликої партії. Отже, не надто агресивний, як SGD, і дозволяє навчатись в Інтернеті, яке Ванільний GD ніколи не дозволяв.

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

SGD має фіксований параметр навчання, тому ми запускаємо інші адаптивні оптимізатори, такі як Adam, AdaDelta, RMS Prop тощо, який змінює параметр навчання на основі історії градієнтів.


3) зазвичай називається minibatch
Алекс

@Alex: додав зміни.
Jil Jung Juk

1
Я погоджуюся, що немає жодного правила щодо параметра "batch size". Але це твердження - «Чим менше Mini-Batch, тим краще було б продуктивність вашої моделі» - суперечить загальному правилу. Ви, як правило, хочете збільшити розмір партії
MonsieurBeilto

4

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

Наприклад, вихід цього сценарію на основі інтеграційного тесту керасу є

epochs 15   , batch size 16   , layer type Dense: final loss 0.56, seconds 1.46
epochs 15   , batch size 160  , layer type Dense: final loss 1.27, seconds 0.30
epochs 150  , batch size 160  , layer type Dense: final loss 0.55, seconds 1.74

Пов'язані

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

Edit: в більшості випадків, збільшення batch_sizeбажано прискорити обчислення, але є й інші більш прості способи зробити це, як використання типів даних меншою займаної площі з допомогою dtypeаргументу, то чи в keras або tensorflow , напр float32замістьfloat64


З більшими партіями (а отже, і меншою кількістю епох) у вас буде менше оновлень градієнта за епоху. "епоха" - це просто жаргон ML для "одного проходу ваших даних під час тренінгу". Якщо ви намагаєтесь прискорити навчання, вимірюйте час на стіні та ігноруйте епохи.
Ендрю Вагнер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.