Чому назад поширюється протягом часу в RNN?


14

У періодичній нейронній мережі, як правило, вперед розповсюджуються через кілька часових кроків, "розкручують" мережу, а потім поширюються назад по послідовності входів.

Чому б ви не просто оновлювали ваги після кожного окремого кроку в послідовності? (еквівалент використання довжини усікання 1, тому немає чого розкручувати) Це повністю виключає проблему градієнта, що зникає, значно спрощує алгоритм, можливо, зменшить шанси застрягти в локальних мінімумах, а головне, здається, працює добре . Я тренував модель таким чином, щоб генерувати текст, і результати здавалися порівнянними з результатами, які я бачив із тренованих моделей BPTT. Мене це бентежить лише тому, що в кожному підручнику з RNN, які я бачив, йдеться про використання BPTT, майже як ніби це потрібно для належного навчання, що не так.

Оновлення: я додав відповідь


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

Ваше "Оновлення: я додав відповідь" замінило попереднє редагування описом вашої архітектури та ілюстрацією. Це цілеспрямовано?
Амеба каже: Відновити Моніку

Так, я вийняв це, тому що він не видався актуальним для фактичного питання, і це займає багато місця, але я можу додати його назад, якщо це допоможе
Frobot

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

Відповіді:


4

Редагувати: Я зробив велику помилку, порівнюючи два способи, і мені довелося змінити свою відповідь. Виявляється, так, як я це робив, просто поширюючись на поточному кроці часу, насправді починається навчання швидше. Швидкі оновлення дуже швидко засвоюють основні зразки. Але на більшому наборі даних та за тривалішого часу навчання BPTT насправді виходить на перше місце. Я випробовував невеликий зразок всього за кілька епох і припускав, що той, хто розпочне перемогу в гонці, буде переможцем. Але це привело мене до цікавої знахідки. Якщо ви почнете тренуватися назад, розповсюджуючи лише один крок часу, потім перейдіть на BPTT і повільно збільшуйте, наскільки далеко ви поширюєтесь, ви отримуєте швидше конвергенцію.


Дякуємо за ваше оновлення. У джерелі цього останнього зображення він говорить про це на одному налаштування: "Ванільний режим обробки без RNN, від вводу фіксованого розміру до виводу фіксованого розміру (наприклад, класифікація зображення)." Отже, це ми говорили. Якщо це так, як ви описали, він не має стану і це не RNN. "передача вперед через один вхід перед тим, як поширюватись назад" - я б назвав це ANN. Але це не дуже добре з текстом, тому щось не вдається, і я поняття не маю, тому що в мене немає коду
ragulpr

Я не прочитав цю частину, і ти прав. Модель, якою я користуюся, є насправді "багато-багато" в крайній правій частині. Я припускав, що в розділі «один до одного» було дійсно багато з усіх цих підключених, і малюнок просто залишив його. але це насправді є одним із варіантів в крайньому правому куті, який я не помітив (дивним є той, що є в блозі про RNN, тому я припускав, що вони всі повторюються). Я відредагую цю частину відповіді, щоб мати більше сенсу
Frobot

Я уявляв, що це так, тому я наполягав на тому, щоб побачити вашу функцію втрат. Якщо це багато-багато, ваша втрата схожа на , і це однаково РННИ і ви поширюється / inputing всієї послідовностіале потім просто усічення BPTT тобто ви » буду обчислювати червону частину в моєму дописі, але не повторювати далі. еrrоr=т(ут-у^т)2
ragulpr

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

Просто опублікуйте свій код, я більше не вгадаю, це нерозумно.
ragulpr

2

RNN - це глибока нейронна мережа (DNN), де кожен шар може приймати новий вхід, але має однакові параметри. BPT - модне слово для зворотного розповсюдження в такій мережі, яке саме по собі є вигадливим словом для Gradient Descent.

Скажімо , що РНН виходів у т в кожному кроці , і е гу^т

errort=(yty^t)2

Для того, щоб дізнатися ваги, нам потрібні градієнти для функції, щоб відповісти на питання "наскільки зміна параметра впливає на функцію втрати?" і переміщуємо параметри в напрямку, заданому:

errort=2(yty^t)y^t

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

Візьміть просту мережу з одношаровим нейроном, щоб побачити це напіввиразно:

y^t+1=f(a+bxt+cy^t)ay^t+1=f(a+bxt+cy^t)cay^tby^t+1=f(a+bxt+cy^t)(xt+cby^t)cy^t+1=f(a+bxt+cy^t)(y^t+ccy^t)y^t+1=f(a+bxt+cy^t)([0xty^t]+cy^t)

З швидкість навчання крок один навчальний тоді: [ ~ ~ б ~ з ][ б з ] + δ ( у т - у т ) у тδ

[a~b~c~][abc]+δ(yty^t)y^t

y^t+1y^tt

error=t(yty^t)2

Може, тоді кожен крок сприятиме грубому напрямку, якого достатньо в сукупності? Це може пояснити ваші результати, але мені дуже цікаво почути більше про ваш метод / функцію втрати! Також буде зацікавлене порівняння з двома кроками вікна ANN.

edit4: Після прочитання коментарів здається, що ваша архітектура не є RNN.

ht Statefull

Ваша модель: Без стану - прихований стан перебудовується на кожному кроці stateless edit2: додано більше посилань на DNNs edit3: фіксований gradtep та деякі нотації edit5: виправлена ​​інтерпретація вашої моделі після вашої відповіді / уточнення.


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

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

Якщо ви передаєте лише один крок вперед, чи не є це двошаровий ANN з введенням функції останнього кроку на перший шар, вхідним елементом до поточного кроку на другому шарі, але має однакові ваги / параметри для обох шарів? Я б очікував подібних результатів або краще з ANN, який бере вкладу^т+1=f(хт,хт-1)тобто використовується фіксований часовий вікно розміром 2. Якщо він здійснює лише один крок вперед, чи може він вивчити довгострокові залежності?
ragulpr

1
Я використовую розсувне вікно розміром 1, але результати значно відрізняються від створення розсувного вікна ANN розміру 2 із входами (xt, xt − 1). Я можу навмисно дозволити йому переобладнати під час вивчення величезної частини тексту, і він може відтворити весь текст із 0 помилками, що вимагає знання довгострокових залежностей, що було б неможливо, якби ви мали лише (xt, xt − 1) вхід. Єдине питання, що мені залишилося - це, якщо використання BPTT дозволить залежностям збільшитись довше, але це, чесно кажучи, не виглядає так, як було б.
Frobot

Подивіться на мій оновлений пост. Ваша архітектура не є RNN, це без громадянства, тому довгострокові залежності, які явно не вкладаються в функції, не можуть бути вивчені. Попередні прогнози не впливають на майбутні прогнози. Ви можете бачити це так, нібиу^т-2у^т=0для вашої архітектури. BPTT теоретично ідентичний BP, але виконується на RNN-архітектурі, тому ви не можете, але я бачу, що ви маєте на увазі, і відповідь - ні. Було б дійсно цікаво побачити експерименти над видатними RNN, але лише
однокроковим BPTT,

1

"Розгортання через час" - це просто застосування ланцюгового правила,

гЖ(г(х),год(х),м(х))гх=Жггггх+Жгодггодгх+Жмгмгх

Вихід RNN на етапі часу т, Нт is a function of the parameters θ, the input xt and the previous state, Ht1 (note that instead Ht may be transformed again at time step t to obtain the output, that is not important here). Remember the goal of gradient descent: given some error function L, let's look at our error for the current example (or examples), and then let's adjust θ in such a way, that given the same example again, our error would be reduced.

How exactly did θ contribute to our current error? We took a weighted sum with our current input, xt, so we'll need to backpropagate through the input to find θa(xt,θ), to work out how to adjust θ. But our error was also the result of some contribution from Ht1, which was also a function of θ, right? So we need to find out θHt1, which was a function of xt1, θ and Ht2. But Ht2 was also a function a function of θ. And so on.


I understand why you back propagate through time in a traditional RNN. I'm trying to find out why a traditional RNN uses multiple inputs at once for training, when using just one at a time is much simpler and also works
Frobot

The only sense in which you can feed in multiple inputs at once into an RNN is feeding in multiple training examples, as part of a batch. The batch size is arbitrary, and convergence is guaranteed for any size, but higher batch sizes may lead to more accurate gradient estimations and faster convergence.
Matthew Hampsey

That's not what I meant by "multiple inputs at once". I didn't word it very well. I meant you usually forward propagate through several inputs in the training sequence, then back propagate back through them all, then update the weights. So the question is, why propagate through a whole sequence when doing just one input at a time is much easier and still works
Frobot

I think some clarification here is required. When you say "inputs", are you referring to multiple training examples, or are you referring to multiple time steps within a single training example?
Matthew Hampsey

1
I will post an answer to this question by the end of today. I finished making a BPTT version, just have to train and compare. After that if you still want to see some code let me know what you want to see and I guess I could still post it
Frobot
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.