Имплементација понављајуће неуронске мреже из нуле у Питхону

Блог

Имплементација понављајуће неуронске мреже из нуле у Питхону

Главни циљ овог поста је примена РНН -а од нуле и лако објашњење које ће читаоцима бити корисно. Имплементација било које неуронске мреже од нуле барем једном је вредна вежба. Помаже вам да стекнете разумевање о томе како функционишу неуронске мреже, а овде имплементирамо РНН који има своју сложеност и тако нам пружа добру прилику да усавршимо своје вештине.

Ово је наслов слике
Извор

Постоје различити водичи који пружају врло детаљне информације о унутрашњости РНН -а. Неке од врло корисних референци можете пронаћи на крају овог поста. Могао сам прилично брзо да разумем рад РНН -а, али оно што ме највише мучило је пролазак кроз прорачуне БПТТ -а и његову примену. Морао сам да проведем неко време да разумем и коначно све то саставим. Без губљења времена, прво ћемо прво проћи кроз основе РНН -а.

Шта је РНН?

Понављајућа неуронска мрежа је неуронска мрежа која је специјализована за обраду низа података | _+_ | са индексом временског корака | _+_ | у распону од | _+_ |. За задатке који укључују узастопне уносе, као што су говор и језик, често је боље користити РНН -ове. У проблему НЛП -а, ако желите да предвидите следећу реч у реченици, важно је знати речи испред ње. РНН се зову повратан јер обављају исти задатак за сваки елемент низа, при чему излаз зависи од претходних прорачуна. Други начин размишљања о РНН -има је да они имају меморију која прикупља информације о ономе што је до сада израчунато.

Архитектура : Хајде да укратко прођемо кроз основну РНН мрежу.

Ово је наслов слике
Референце

Лева страна горњег дијаграма приказује ознаку РНН, а са десне стране РНН биће одмотан (или расклопљен) у пуну мрежу. Одмотавањем мислимо да испишемо мрежу за комплетан низ. На пример, ако је редослед до кога нам је стало реченица од 3 речи, мрежа би се одмотала у трослојну неуронску мрежу, по један слој за сваку реч.

Улазни: | _+_ | Се узима као улаз у мрежу у временском кораку | _+_ |. На пример, | _+_ |, може бити један врући вектор који одговара речи реченице.

Скривено стање : | _+_ | Представља скривено стање у тренутку т и делује као меморија мреже. | _+_ | Израчунава се на основу тренутног уноса и скривеног стања претходног временског корака: | _+_ | Функција | _+_ | узима се за нелинеарну трансформацију као нпр рибљи , РеЛУ.

Тегови : РНН има улаз за скривене везе параметризоване тежинском матрицом У, скривене за скривене понављајуће везе параметризоване тежинском матрицом В, и везе скривене за излаз параметризоване тежинском матрицом В и све ове тежине ( У , В. , ИН) се деле кроз време.

Оутпут : | _+_ | Илуструје излаз мреже. На слици сам ставио стрелицу иза | _+_ | која је такође често изложена нелинеарности, посебно када мрежа садржи даље слојеве низводно.

Форвард Пасс

На слици није специфициран избор функције активирања за скривене јединице. Пре него што наставимо, доносимо неколико претпоставки: 1) претпостављамо функцију активирања хиперболичне тангенте за скривени слој. 2) Претпостављамо да је излаз дискретан, као да се РНН користи за предвиђање речи или знакова. Природан начин представљања дискретних променљивих је разматрање излаза | _+_ | као давање не-нормализованих лог вероватноћа сваке могуће вредности дискретне променљиве. Затим можемо применити софтмак операцију као корак накнадне обраде да бисмо добили вектор | _+_ | нормализованих вероватноћа над излазом.

РНН прослеђивање унапред може бити представљено доњим скупом једначина.

Ово је наслов слике

Ово је пример понављајуће мреже која пресликава улазну секвенцу у излазну секвенцу исте дужине. Укупан губитак за дати низ | _+_ | вредности упарене са низом | _+_ | вредности би тада биле само збир губитака током свих временских корака. Претпостављамо да се излази | _+_ | користе као аргумент функцији софтмак за добијање вектора | _+_ | вероватноће над излазом. Такође претпостављамо да је губитак | _+_ | је негативна лог-вероватноћа правог циља | _+_ | с обзиром на досадашњи унос.

Бацквард Пасс

Рачунање градијента укључује извођење напредног пролаза за простирање који се креће лево надесно кроз графикон приказан изнад, након чега следи пролаз за простирање уназад који се креће десно на лево кроз графикон. Време извођења је О (τ) и не може се смањити паралелизацијом јер је граф простирања унапред инхерентно секвенционалан; сваки временски корак се може израчунати тек након претходног. Стања израчуната у прослеђивању унапред морају се чувати док се поново не употребе током повратног пролаза, тако да је и цена меморије О (τ). Алгоритам повратног ширења који се примењује на неограничени граф са трошковима О (τ) назива се повратно ширење кроз време (БПТТ). Пошто се параметри деле са свим временским корацима у мрежи, градијент на сваком излазу не зависи само од прорачуна тренутног временског корака, већ и од претходних временских корака.

Рачунарски градијенти

С обзиром на нашу функцију губитка ТХЕ , морамо израчунати градијенте за наше три тежинске матрице У, В, З и предрасуде пре нове ере и ажурирајте их брзином учења | _+_ |. Слично нормалном простирању уназад, градијент нам даје осећај како се губитак мења у односу на сваки параметар тежине. Ажурирамо утеге В да бисмо смањили губитак следећом једначином:

Ово је наслов слике

Исто треба урадити и за остале утеге У, В, б, ц.

јавасцрипт валидација ИП адресе

Хајде сада да израчунамо градијенте помоћу БПТТ за горе наведене РНН једначине. Чворови нашег рачунског графикона укључују параметре У, В, В, б и ц, као и низ чворова индексираних са т за к (т), х (т), о (т) и Л (т). За сваки чвор | _+_ | морамо израчунати градијент | _+_ | рекурзивно, на основу градијента израчунатог на чворовима који га прате у графикону.

Градијент у односу на излаз о (т) израчунава се под претпоставком да се о (т) користе као аргумент функције софтмак за добијање вектора | _+_ | вероватноће над излазом. Такође претпостављамо да је губитак негативна лог-вероватноћа правог циља и (т).

Ово је наслов слике

Молимо вас да погледате овде за извођење горе наведеног елегантног решења.

Схватимо сада како градијент протиче кроз скривено стање х (т). Ово можемо јасно видети из доњег дијаграма да у тренутку т, скривено стање х (т) има градијент који тече и из тренутног излаза и из следећег скривеног стања.

Ово је наслов слике
Црвена стрелица приказује проток градијента

Радимо назад, почевши од краја низа. У последњем временском кораку τ, х (τ) има само о (τ) као потомак, па је његов градијент једноставан:

Ово је наслов слике

Затим можемо понављати уназад у времену да бисмо уназад пропагирали градијенте кроз време, од т = τ −1 до т = 1, имајући у виду да је х (т) (за т<τ ) has as descendants both o(t) and h(t+1). Its gradient is thus given by:

Ово је наслов слике

Када се добију градијенти на унутрашњим чворовима рачунског графа, можемо добити градијенте на чворовима параметара. Израчуни градијента који користе правило ланца за све параметре су:

Ово је наслов слике

Овде нисмо заинтересовани за извођење ових једначина, већ за њихову примену. Има јако добрих постова овде и овде пружајући детаљно извођење ових једначина.

Имплементација

Применићемо потпуну понављајућу неуронску мрежу од нуле користећи Питхон. Покушаћемо да изградимо модел за генерисање текста користећи РНН. Обучавамо наш модел да предвиди вероватноћу карактера с обзиром на претходне знакове. То је генеративни модел . С обзиром на постојећи низ знакова, узоркујемо следећи знак из предвиђених вероватноћа и понављамо процес док не добијемо целу реченицу. Ова имплементација је од Андреја Карпартхија одличан пост изградња нивоа карактера РНН. Овде ћемо корак по корак разговарати о детаљима имплементације.

Општи кораци које треба следити:

  1. Иницирајте тежинске матрице У, В, Ж из случајне расподеле и пристрасности б, ц са нулама
  2. Прослеђивање унапред за израчунавање предвиђања
  3. Израчунај губитак
  4. Проширење уназад за израчунавање нагиба
  5. Ажурирајте тежине на основу нагиба
  6. Поновите кораке 2–5

Корак 1: Иницијализујте

За почетак имплементације основне РНН ћелије, прво дефинишемо димензије различитих параметара У, В, В, б, ц.

Димензије : Претпоставимо да одаберемо величину речника | _+_ | и скривена величина слоја | _+_ |. Тада имамо:

Ово је наслов слике

Величина речника може бити број јединствених знакова за модел заснован на знаковима или број јединствених речи за модел заснован на речима.

Са наших неколико хипер-параметара и других параметара модела, почнимо са дефинисањем наше РНН ћелије.

Ово је наслов слике

где могу трговати хнт

Чини се да правилна иницијализација утега утиче на резултате обуке. У овој области је било много истраживања. Испоставило се да најбоља иницијализација зависи од активационе функције (у нашем случају танх) и једне препоручено приступ је да се тегови насумично иницијализују у интервалу од | _+_ | где | _+_ | је број долазних веза са претходног слоја.

Корак 2: Проследите напред

Једноставно према нашим једначинама за сваку временску ознаку т, израчунавамо скривено стање хс [т] и излаз ос [т] примењујући софтмак да бисмо добили вероватноћу за следећи знак.

Ово је наслов слике

Рачунање софтмака и нумеричке стабилности:

Софтмак функција узима Н-димензионални вектор реалних бројева и трансформише га у вектор реалног броја у опсегу (0,1) који сабира до 1. Мапирање се врши помоћу формуле испод.

Ово је наслов слике

Имплементација софтмака је:

Ово је наслов слике
Ово је наслов слике

Иако изгледа добро када овај софтмак позовемо са већим бројем као испод, он даје „нан“ вредности

Ово је наслов слике

Нумерички опсег бројева са покретним зарезом који користи Нумпи је ограничен. За флоат64, максимални репрезентативни број је реда величине 10³⁰⁸. Експоненција у софтмак функцији омогућава лако пребацивање овог броја, чак и за уносе прилично скромне величине. Добар начин да се избегне овај проблем је нормализација улаза да не буду превелики или премали. Примењен је мали математички трик овде за детаље. Дакле, наш софтмак изгледа овако:

Ово је наслов слике

Корак 3: Рачунајте губитак

Пошто имплементирамо модел генерисања текста, следећи знак може бити било који јединствени лик у нашем речнику. Дакле, наш губитак ће бити губитак унакрсне ентропије. У класификацији више класа узимамо суму вредности дневничких губитака за свако предвиђање класе у опсервацији.

Ово је наслов слике

  • М - број могућих ознака класе (јединствени знакови у нашем вокабу)
  • и - бинарни показатељ (0 или 1) да ли је ознака класе | _+_ | исправна класификација за посматрање | _+_ |
  • п - предвиђена вероватноћа модела за посматрање

Ово је наслов слике

тренутна верзија нумпи

Корак 4: Пролаз уназад

Ако се позивамо на БПТТ једначине, имплементација је према једначинама. Додато је довољно коментара за разумевање кода.

Ово је наслов слике

Проблеми

Иако је у принципу РНН једноставан и моћан модел, у пракси је тешко правилно тренирати. Међу главним разлозима зашто је овај модел тако гломазан јесу нестајући градијент и експлодирајући градијент проблеми. Док тренирате користећи БПТТ, градијенти морају путовати од последње ћелије све до прве ћелије. Производ ових градијената може ићи на нулу или се експоненцијално повећавати. Проблем експлодирајућих нагиба односи се на велико повећање норме нагиба током тренинга. Проблем нестајућих градијената односи се на супротно понашање, када дугорочне компоненте експоненцијално брзо иду на норму 0, онемогућавајући моделу да научи корелацију између временски удаљених догађаја.

Док се експлодирајући градијент може поправити техником исецања градијента као што се користи у примеру кода овде, проблем нестајања градијента и даље представља велику бригу за РНН.

Ово нестајуће ограничење градијента превазиђено је разним мрежама, попут дуготрајне краткотрајне меморије (ЛСТМ), затворених понављајућих јединица (ГРУ) и заосталих мрежа (РесНетс), где су прве две најчешће коришћене варијанте РНН у НЛП апликацијама.

Корак 5: Ажурирајте тежине

Користећи БПТТ израчунали смо градијент за сваки параметар модела. време је за ажурирање тежина.

Ово је наслов слике

У оригиналу имплементација Андреја Карпартхија, Адаград се користи за ажурирање градијента. Адаград ради много боље од СГД -а. Молимо вас да проверите и упоредите обоје.

Корак 6: Поновите кораке 2–5

Да би наш модел учио из података и генерисао текст, морамо га обучити неко време и проверити губитак након сваке итерације. Ако се губитак смањује у одређеном временском периоду, то значи да наш модел учи шта се од њега очекује.

Генериши текст

Тренирамо неко време и ако све прође у реду, требало би да имамо наш модел спреман да предвиди неки текст. Хајде да видимо како то ради за нас.

Имплементираћемо метод предвиђања за предвиђање неколико речи као што је доле:

Ово је наслов слике

Хајде да видимо како наш РНН учи након неколико епоха обуке.

Ово је наслов слике
Ово је наслов слике

Излаз више личи на прави текст са границама речи и нешто граматике. Тако да наша беба РНН зуре у језик и може да предвиди следећих неколико речи.

Овде представљена имплементација је само значила да ће бити лако разумети и схватити концепте. У случају да желите да се играте око хипер параметара модела, нотебоок је овде .

Надам се да вам је било корисно. Хвала на прочитаном.

#питхон #дубоко учење