В тази статия ще разгледам стъпките, включени в решаването на проблем с двоична класификация, използвайки дълбока невронна мрежа, имаща 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))
Предаване
- Изчислете 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.
Обратно разпространение
- За слоя 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. Формулировките са мои, както и всички грешки.
Благодаря, че прочетохте. Всякакви коментари, запитвания или предложения са добре дошли.