Једноставан водич за логичке јединице неуронске аритметике (НАЛУ): Објашњење, интуиција и код

Инжењери истраживања у ДеепМинд-у, укључујући познатог истраживача АИ и аутора књиге Гроккинг Дееп Леарнинг, Андрев Траск објавили су импресиван рад о моделу неуронске мреже који може научити једноставне до сложене нумеричке функције са великом екстраполацијом (генерализацијом) способношћу.

У овом посту објаснит ћу НАЛУ, његову архитектуру, његове компоненте и значај у односу на традиционалне неуронске мреже. Примарна намера која стоји иза овог поста је да пружи једноставно и интуитивно објашњење НАЛУ-а (и са појмовима и кодом) које могу да разумеју истраживачи, инжињери и студенти који имају ограничено знање о неуронским мрежама и дубоком учењу.

Напомена: топло препоручујем читаоцима да прочитају оригинални чланак за детаљније разумевање теме. Рад можете преузети овде.

Где Неуронске мреже пропадају?

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

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

Међутим, према мишљењу аутора овог рада, њима недостаје врло основна способност која делује безначајно за човека или чак за пчеле! То је способност бројања / манипулације бројевима и такође екстраполације нумеричког односа из опажаног нумеричког обрасца. У раду је показано да се стандардна неуронска мрежа чак бори да научи чак и функцију идентитета (функција чији су улаз и излаз идентични; ф (к) = к) која је најједноставнији бројчани однос. Испод слике приказује средња квадратна грешка (МСЕ) разних НН-ова обучених за учење такве функције идентитета.

Слика приказује МСЕ за стандардну неуронску мрежу која има потпуно исту архитектуру обучену користећи различите функције активације (нелинеарност) у скривеним слојевима

Зашто не успевају?

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

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

Јачина овог неуспеха директно одговара степену нелинеарности у оквиру изабране функције активирања. Из горње слике је јасно видљиво да тешко ограничене нелинеарне функције као што су Танх и Сигмоид имају врло мању способност генерализације добро од меко ограничене нелинеарне функције као што су ПРеЛУ и ЕЛУ.

Решење: Неуронски акумулатор (НАЦ)

Неурални акумулатор (НАЦ) чини основу НАЛУ модела. НАЦ је једноставан, али ефикасан модел (јединице) неуронске мреже који подржава способност учења сабирања и одузимања - што је пожељно својство за ефикасно учење линеарних функција.

НАЦ је посебан слој линеарности чији параметри тежине имају ограничења да имају једине вредности 1, 0 или -1. Ограничењем вредности тежине на такав начин спречава се да слој промени меру улазних података и они остану доследни широм мреже без обзира на то колико слојева су сложени заједно. Дакле, излаз ће бити линеарна комбинација улазног вектора која лако може представљати операције сабирања и одузимања.

Интуиција: Да бисмо разумели ову чињеницу, размотримо следеће примере НН слојева који изводе линеарну аритметичку операцију на улазима.

Илустрација која објашњава да слојеви неуронске мреже који немају пристраност и имају тежину вредности -1, 0 или 1 могу научити линеарну екстраполацију.

Као што је приказано на горе НН слојевима, мрежа може научити екстраполирати једноставне аритметичке функције попут збрајања и одузимања (и = к1 + к2 и и = к1-к2) ограничавањем параметара тежине на -1, 0 и 1.

Напомена: Као што је приказано на мрежним дијаграмима горе, НАЦ не садржи параметар пристраности (б) и нелинеарност примењену на излаз јединица сакривених слојева.

Будући да је ограничење на параметре тежине у НАЦ-у тешко научити стандардном неуронском мрежом, аутори су описали врло корисну формулу за учење тако ограничених вредности параметара користећи стандардне (неограничене) параметре В_хат и М_хат. Ови параметри су као и било који стандардни НН параметри тежине који се могу насумично иницијализирати и могу се научити током процеса тренирања. Формула за добијање В у смислу В_хат и М_хат је дата у наставку:

Формула означава производ који се односи на елементе између две матрице

Користећи горњу једнаџбу за израчунавање параметара тежине у мрежи, гарантује да ће вредност таквих параметара бити у опсегу [-1,1] са нагибом ка -1, 0 и 1. Такође, ова једначина је диференцијабилна једначина (чији се деривати могу израчунати с обзиром на параметре тежине). Стога ће НАЦ-у бити лакше научити В користећи градијентно спуштање и ширење леђа. Испод је архитектонски дијаграм НАЦ јединице.

НАЦ архитектура за учење једноставних (линеарних) нумеричких функција

Имплементација НАЦ-а у питхону користећи Тенсорфлов

Као што се може замислити, НАЦ је једноставан НН модел с неколико малих подешавања. Испод сам приказао једноставну имплементацију једног НАЦ слоја у питхону користећи Тенсорфлов и Нумпи библиотеку.

увести нумпи као нп
увоз тенсорфлов као тф
# Дефинишите неуронски акумулатор (НАЦ) за сабирање / одузимање -> Корисно за учење операције сабирања / одузимања

деф нац_симпле_сингле_лаиер (к_ин, оут_унитс):
    '' '
    Атрибути:
        к_ин -> Улазни тензор
        оут_унитс -> број излазних јединица

    Повратак:
       и_оут -> Излазни тензор споменутог облика
       В -> Матрица тежине слоја
    '' '
# Дохвати број функција уноса (бројеви)
    ин_феатурес = к_ин.схапе [1]

    # дефинишите В_хат и М_хат

    В_хат = тф.гет_вариабле (облик = [ин_феатурес, оут_унитс],
    иницијализатор = тф.инитиализерс.рандом_униформ (минвал = -2, маквал = 2),
    траинабле = Истина, име = "В_хат")

    М_хат = тф.гет_вариабле (облик = [ин_схапе, оут_унитс],
    иницијализатор = тф.инитиализерс.рандом_униформ (минвал = -2, маквал = 2),
    траинабле = Истина, име = "М_хат")

    # Набавите В користећи формулу
    В = тф.нн.танх (В_хат) * тф.нн.сигмоид (М_хат)

    и_оут = тф.матмул (к_ин, В)

    повратак и_оут, В

У горњем коду користио сам случајну једнолику иницијализацију за параметре који се могу издржати В_хат и М_хат, али за ове параметре се може користити било која препоручена техника иницијализације тежине. За потпуни радни код, молимо вас да прегледате мој ГитХуб репо, споменут на крају овог поста.

Прекорачење и одузимање: НАЦ за сложене нумеричке функције

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

Испод је модификована архитектура НАЦ-а која је у стању да научи сложеније нумеричке функције користећи дневник записа (логаритамске вредности и експоненте) за своје параметре тежине. Примјетите како се овај НАЦ разликује од оног наведеног прво у посту.

НАЦ архитектура за учење сложенијих нумеричких функција

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

Излазна једнаџба сложеног НАЦ приказана горе. Епсилон је овде врло мала вредност да би се избегло стање дневника (0) током тренинга

Дакле, све је исто с обзиром на основни механизам једноставног НАЦ-а и сложеног НАЦ-а, укључујући формулу за ограничене тежине В у смислу В_хат и М_хат. Једина разлика је у томе што сложени НАЦ примењује простор за пријаву на улаз и излаз слоја.

Питхон примена сложених НАЦ-ова:

Као и код архитектуре оба НАЦ-а, имплементација сложених НАЦ-а је скоро иста, осим што је поменута промена формуле излазног тензора. Испод је код за такав НАЦ.

# дефинишите сложени НАЦ у дневнику -> за сложеније аритметичке функције као што су множење, дељење и снага

деф нац_цомплек_сингле_лаиер (к_ин, оут_унитс, епсилон = 0,000001):

    '' '
    : парам к_ин: вектор карактеристика уноса
    : парам оут_унитс: број излазних јединица ћелије
    : парам епсилон: мала вредност да се избегне лог (0) у излазном резултату
    : повратни м: излазни тензор
    : повраћај В: придружена матрица тежине
    
    '' '

    ин_феатурес = к_ин.схапе [1]

    В_хат = тф.гет_вариабле (облик = [ин_схапе, оут_унитс],
    иницијализатор = тф.инитиализерс.рандом_униформ (минвал = -2, маквал = 2),
    траинабле = Истина, име = "В_хат")

    М_хат = тф.гет_вариабле (облик = [ин_феатурес, оут_унитс],
    иницијализатор = тф.инитиализерс.рандом_униформ (минвал = -2, маквал = 2),
    траинабле = Истина, име = "М_хат")
    # Добијте неограничену матрицу параметара В
    В = тф.нн.танх (В_хат) * тф.нн.сигмоид (М_хат)

    # Функција експресног уноса у дневнику за учење сложених функција
    к_модифиед = тф.лог (тф.абс (к_ин) + епсилон)

    м = тф.екп (тф.матмул (к_модифицирано, В))

    повратак м, В

Још једном, ради пуног радног кода, молимо погледајте мој ГитХуб репо поменути на крају овог поста.

Комбиновање: Неуралне аритметичке логичке јединице (НАЛУ)

До сада се може замислити да изнад два НАЦ модела комбинирана заједно могу научити готово све аритметичке операције. То је кључна идеја НАЛУ која садржи пондерирану комбинацију једноставног НАЦ-а и сложеног горе споменутог НАЦ-а, који се контролише наученим сигналом врата. Стога, НАЦ чини основни блок НАЛУ-а. Дакле, ако сте правилно разумели НАЦ, НАЛУ је врло лако разумети. Ако нисте, одвојите време и још једном прођите кроз оба објашњења НАЦ-а. Испод слике описује се архитектура НАЛУ-а.

Дијаграм са напоменом НАЛУ

Као што је приказано на горњој слици, у НАЛУ оба НАЦ-а (љубичаста ћелија) интерполирају (комбинују) наученом регулацијом сигмоидних врата (наранџаста ћелија) тако да се излаз било којег НАЦ-а може активирати или деактивирати капијом на основу нумеричке функције. покушавају да оспособе мрежу за.

Као што је горе поменуто, једноставан НАЦ израчунава функцију накупљања, тако да је одговоран за складиштење линеарних операција (сабирања и одузимања) НАЛУ-а. Док је сложени НАЦ одговоран за извршавање својих сложенијих нумеричких функција као што су функције множења, дељења и снаге. Излаз основних ћелија у НАЛУ може се математички представити на следећи начин:

Једноставан НАЦ: а = В Кс
Комплексни НАЦ: м = екп (В лог (| Кс | + е))
Где је В = танх (В_хат) * сигмоид (М_хат)
Гате ћелија: г = сигмоид (ГКС) # Где је Г стандардна матрица параметара за третирање
# И на крају излаз НАЛУ-а
НАЛУ: и = г * а + (1-г) * м # Где је * производ који има елемената

У горњој формули НАЛУ-а можемо рећи да ако излаз излазног г = 0 онда ће мрежа научити само сложене функције, али не и једноставне. Супротно томе, ако је г = 1, мрежа ће научити само адитивне функције, а не сложене. Дакле, свеукупно НАЛУ може научити било које нумеричке функције које се састоје од функција множења, сабирања, одузимања, дељења и снаге на такав начин да добро екстраполира бројеве изван опсега бројева који су виђени током тренинга.

Питхон имплементација НАЛУ-а:

У имплементацији НАЛУ користићемо једноставне и сложене НАЦ дефинисане у претходним исјечцима кода.

деф налу (к_ин, оут_унитс, епсилон = 0,000001, гет_веигхтс = Нетачно):
    '' '
    : парам к_ин: вектор карактеристика уноса
    : парам оут_унитс: број излазних јединица ћелије
    : парам епсилон: мала вредност да се избегне лог (0) у излазном резултату
    : парам гет_веигхтс: Тачно ако желите добити тежину модела
                        заузврат
    : ретурн: излазни тензор
    : ретурн: Матрица тежине капија
    : повратак: НАЦ1 (једноставна НАЦ) матрица тежине
    : повратак: НАЦ2 (сложени НАЦ) матрица тежине
    '' '

    ин_феатурес = к_ин.схапе [1]

    # Набавите излазни тензор из једноставног НАЦ-а
    а, В_симпле = нац_симпле_сингле_лаиер (к_ин, оут_унитс)

    # Набавите излазни тензор из сложеног НАЦ-а
    м, В_цомплек = нац_цомплек_сингле_лаиер (к_ин, оут_унитс, епсилон = епсилон)

    # Слој сигнала врата
    Г = тф.гет_вариабле (облик = [ин_феатурес, оут_унитс],
    иницијализер = тф.рандом_нормал_инитиализер (стддев = 1.0),
    траинабле = Истина, име = "Гате_веигхтс")

    г = тф.нн.сигмоид (тф.матмул (к_ин, Г))

    и_оут = г * а + (1 - г) * м

    иф (гет_веигхтс):
        врати и_оут, Г, В_симпле, В_цомплек
    друго:
        врати и_оут

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

Ибелиеве НАЛУ је модеран пробој у АИ и посебно у неуронским мрежама који изгледа врло обећавајуће. Они могу отворити врата многим апликацијама које стандардним мрежама мреже изгледају тешко.

Аутори су у раду показали различите експерименте и резултате примене НАЛУ у различитим областима неуронских мрежа од једноставних задатака учења аритметичке функције до бројања броја руком писаних цифара у датој серији МНИСТ слика како би мрежа научила да процењује рачунарске програме!

Резултати су невероватни и доказују да НАЛУ изврсно генералише готово све задатке који укључују нумеричку репрезентацију од стандардних НН модела. Препоручујем читаоцима да погледају ове експерименте и њихове резултате да би стекли дубље разумевање како НАЛУ може бити користан у неким занимљивим нумеричким задацима.

Међутим, мало је вероватно да ће НАЦ или НАЛУ бити савршено решење за сваки задатак. Уместо тога, они демонстрирају општу стратегију дизајнирања за стварање модела који су намењени циљној класи нумеричких функција.

Испод је веза до мог ГитХуб складишта која показује потпуну имплементацију исјечака кода приказаних у овом посту.

хттпс://гитхуб.цом/фаизан2786/налу_имплементатион

Можете да испробате различите функције како бих тестирао мој модел користећи различите хиперпраметере за подешавање мреже.

Јавите ми ако имате било каквих питања или размишљања о овом посту у коментарима испод и потрудит ћу се да их одговорим.

ПС: Ово је мој први блог на било којој теми. Дакле, свака препорука, сугестије и будући савети, технички и нетехнички у вези мог писања, су добродошли.