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

Входните данни X са с размер (n𝕩, m), където n𝕩 е броят на характеристиките, а m е броят на пробите. Резултатът Y е с размер (1, m).

Броят на невроните в слой l се означава с n⁽ˡ⁾.

Ще използваме функцията за активиране „relu“ от слоеве 1 до L-1 и „sigmoid“ за слой L. Инициализираме A⁽⁰⁾ = X и тегловните матрици W и пресечките b за всеки слой l, от 1 до L , както следва :

W⁽ˡ⁾ = np.random.randn(n⁽ˡ⁾, n⁽ˡ⁻¹⁾) * 0.01

Функцията ‘np.random.randn’ генерира произволен нормално разпределен масив с посочения размер и ние го умножаваме по 0,01, за да запазим първоначалните си тегла малки, което в противен случай може да доведе до проблем с изчезващи градиенти.

b⁽ˡ⁾ = np.zeros((n⁽ˡ⁾,1)) 

Предаване

  1. Изчислете Z за всеки слой l от слой 1 до слой L-1:

(Вземете A⁽⁰⁾ = X)

Z⁽ˡ⁾ = W⁽ˡ⁾A⁽ˡ⁻¹⁾ + b⁽ˡ⁾

2 . Съхранявайте A⁽ˡ⁻¹⁾, W⁽ˡ⁾, b⁽ˡ⁾, Z⁽ˡ⁾ в списък и продължавайте да добавяте за всеки слой.

3. Изчислете A⁽ˡ⁾

A⁽ˡ⁾ = relu(Z⁽ˡ⁾)

За слоя L,

A⁽ᴸ⁾ = sigmoid(Z⁽ᴸ⁾)

4. Изчислете разходите, като използвате:

cost, J = -(Y(log(A⁽ᴸ⁾)ᵀ + (1-Y)(log(1-A⁽ᴸ⁾))ᵀ)/m

където Aᵀ означава транспонирането на матрица A.

Обратно разпространение

  1. За слоя L:
dZ⁽ᴸ⁾ = A⁽ᴸ⁾ - Y         

вижте тази статия за подробности относно горното уравнение.

и получаване на стойностите на A⁽ˡ⁻¹⁾, W⁽ˡ⁾, b⁽ˡ⁾ от кеша, създаден по време на предаване напред:

dW⁽ᴸ⁾ = (dZ⁽ᴸ⁾(A⁽ˡ⁻¹⁾)ᵀ)/m
db⁽ᴸ⁾ = dZ⁽ᴸ⁾/m
dA⁽ᴸ⁻¹⁾ = (W⁽ᴸ⁾)ᵀdZ⁽ᴸ⁾

2. За всички останали слоеве до l=1

dZ⁽ˡ⁾ = dA⁽ˡ⁾ * relu'(Z⁽ˡ⁾)

където „*“ означава умножение по елементи между две матрици и „relu“(Z⁽ˡ⁾)“ означава диференциране на функцията за активиране на relu спрямо Z⁽ˡ⁾.

и

dW⁽ˡ⁾ = dZ⁽ˡ⁾(A⁽ˡ⁻¹⁾)ᵀ/m
db⁽ˡ⁾ = dZ⁽ˡ⁾/m
dA⁽ˡ⁻¹⁾ = (W⁽ˡ⁾)ᵀdZ⁽ˡ⁾

и съхранявайте градиентите dW и db в списък

3. Използвайте съхранените по-горе градиенти, за да актуализирате параметрите W и b за всеки слой

W⁽ˡ⁾ = W⁽ˡ⁾ - 𝝰dW⁽ˡ⁾
b⁽ˡ⁾ = b⁽ˡ⁾ - 𝝰db⁽ˡ⁾

където 𝝰 означава скоростта на обучение.

Повторете всички стъпки за n итерации, докато загубата се сближи, за да намерите оптималната стойност за W и b.

В случай на L2 регулация, функцията на разходите става:

където l означава слоевете, k и j означават броя на невроните във всеки слой и 𝝺 е параметърът за регулиране

Също така градиентите dW⁽ˡ⁾ се променят съответно

dW⁽ˡ⁾ = dZ⁽ˡ⁾(A⁽ˡ⁻¹⁾)ᵀ/m + (𝝺/m)W⁽ˡ⁾

За всякакви грешки, които възникват в кода, едно нещо, което помага много при отстраняването на неизправности, е проверката на размерите на матриците на всяка стъпка. За подробности вижте тук:



Цялото съдържание тук е взето от DeepLearning.AI. Формулировките са мои, както и всички грешки.

Благодаря, че прочетохте. Всякакви коментари, запитвания или предложения са добре дошли.