В тази статия нека разберем:

  • Как работи обратното разпространение
  • Защо автоматичната диференциация е по-добра от другите методи за диференциация

Бонус: Ще намерите и кода за внедряване на обратно разпространение от нулата :)

Добре! Lessgo!!

Обратното разпространение е един от многото методи за обучение на невронна мрежа. Той работи, като отчита отклонението между действителния изход и желания изход и съответно коригира параметрите на невронната мрежа (тегла и отклонения). Всеки път, когато изходът е обозначен като грешка във фаза на контролирано обучение, информацията се изпраща обратно. Всяко тегло се актуализира въз основа на това колко е отговорно за отклонението. По този начин невронната мрежа се научава да минимизира вероятността от възникване на грешки. Тези случаи на грешки се представят чрез функция на загуба.

Ние използваме стохастично градиентно спускане, за да минимизираме функцията на загубата. Актуализациите на параметрите след всеки път, когато невронната мрежа направи грешка, могат да бъдат обобщени, както следва:

W= W — 𝛂 * dE/dW

b = b — 𝛂 * dE/db

Тук 𝛂 представлява скоростта на обучение, която определя колко бързо NN учи и постига оптималните тегла и отклонения. Колкото по-висока е скоростта на обучение, толкова по-голяма е промяната в стойностите на параметрите. По-ниските нива на обучение причиняват само по-малки актуализации на параметрите и следователно изискват повече епохи на обучение (изисква повече време за обучение). Въпреки това, ако 𝛂 е зададено твърде високо, това може да причини нежелано различно поведение във функцията за загуба.

dE/dW(db) е градиентът на функцията на загуба по отношение на теглото (отклонение).

Помислете за двуслойна невронна мрежа.

Градиентът на функцията на загуба (L) по отношение на W[1] може да се изчисли само чрез прилагане на верижното правило:

Ще забележите, че изчисляването на този градиент изисква 4 якобиани. Но на практика нито една невронна мрежа не е толкова проста. На практика се нуждаем от много по-дълбоки невронни мрежи и много повече якобиани. И много пъти градиентът не следва прост път, както тук. Ще трябва да сумираме градиентите от различни пътища. В такива случаи може да се наложи същите якобиани да бъдат преизчислени. И така, как да решим тези проблеми?

За щастие методът за автоматично диференциране идва на помощ. „Как“, питате вие? Е, autodiff използва изчислителни графики (CG) и преформулира цялата CG в примитивни функции и операции.

Изчислителна графика за горепосочената невронна мрежа би била:

Можете да разберете как се създават тези CG от връзката по-долу:

#Обратна напречна в CG

След това CG се преминава в обратен ред и правилото на веригата присвоява на всеки възел неговия съответен градиент (т.е. градиента на последния възел по отношение на настоящия възел). На последния възел се присвоява градиент от едно. Така на всеки възел се присвоява градиент, така че:

Където vj е градиентът на възела, който идва след iтиявъзел.

Тази форма избягва скъпото умножение на огромен брой якобиани. Освен това, тъй като градиентите се предават, няма повторение в термините.

Тъй като операциите са разбити до примитивни, ние трябва да дефинираме якобиевите продукти само за основни операции като събиране, изваждане и т.н. Напречното на CG ще изчисли градиента, който следва.

Подробното изпълнение на горното обяснение можете да намерите тук:

#Микроград

Сега, защо избираме автоматично диференциране пред други методи като символно диференциране и крайно диференциране? Всичко се свежда до времева и пространствена сложност. В случай на методи с крайни производни, от нас се изисква да оценим частните производни на множество частни производни. Ние основно вземаме началния вектор, изчисляваме стойността на загубата му и след това правим малки измествания на всяка променлива едно по едно, за да оценим градиента по отношение на всеки параметър. Това означава, че трябва да направим прехвърляне напред за всяка производна. По този начин методът на крайните разлики би отнел времева и пространствена сложност от O(n).

Методът на символните разлики, от друга страна, може да доведе до сложни и излишни изрази.

По този начин методът на автоматичните производни е по-добър от тези методи по отношение както на ефективност, така и на числена стабилност.

Надявам се, че сега и двата ви въпроса: защо и как, са получили отговор :)

източници: