Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Вивчайте Завдання: Навчання Перцептрона | Розділ
Основи нейронних мереж
Секція 1. Розділ 17
single

single

bookЗавдання: Навчання Перцептрона

Свайпніть щоб показати меню

Перш ніж перейти до навчання перцептрона, зверніть увагу, що він використовує функцію втрат бінарної крос-ентропії, яку було розглянуто раніше. Останнє ключове поняття перед реалізацією зворотного поширення — це формула похідної цієї функції втрат відносно вихідних активацій, $a^n$. Нижче наведено формули для функції втрат та її похідної:

L=(ylog(y^)+(1y)log(1y^))dan=y^yy^(1y^)\begin{aligned} L &= -(y \log(\hat{y}) + (1-y) \log(1 - \hat{y}))\\ da^n &= \frac {\hat{y} - y} {\hat{y}(1 - \hat{y})} \end{aligned}

де an=y^a^n = \hat{y}

Щоб перевірити, чи перцептрон навчається правильно, метод fit() також виводить середнє значення втрат на кожній епосі. Воно обчислюється шляхом усереднення втрат по всіх навчальних прикладах у цій епосі:

for epoch in range(epochs):
    loss = 0

    for i in range(training_data.shape[0]):
        loss += -(target * np.log(output) + (1 - target) * np.log(1 - output))

average_loss = loss[0, 0] / training_data.shape[0]
print(f'Loss at epoch {epoch + 1}: {average_loss:.3f}')
L=1Ni=1N(yilog(y^i)+(1yi)log(1y^i))L = -\frac1N \sum_{i=1}^N (y_i \log(\hat{y}_i) + (1 - y_i) \log(1 - \hat{y}_i))

Нарешті, формули для обчислення градієнтів на кожному шарі мають такий вигляд:

dzl=dalfl(zl)dWl=dzl(al1)Tdbl=dzldal1=(Wl)Tdzl\begin{aligned} dz^l &= da^l \odot f'^l(z^l)\\ dW^l &= dz^l \cdot (a^{l-1})^T\\ db^l &= dz^l\\ da^{l-1} &= (W^l)^T \cdot dz^l \end{aligned}

Деталі реалізації, які слід пам'ятати

Перекладаючи ці формули у Python-код для методу backward(), пам'ятайте про операції NumPy, розглянуті у попередніх розділах:

  • Оператор \odot позначає покомпонентне множення, яке виконується стандартним оператором * у Python.
  • Оператор \cdot позначає скалярний добуток (dot product), який реалізується за допомогою функції np.dot().
  • Верхній індекс TT означає транспонування матриці, що виконується через атрибут .T.
  • Щоб обчислити fl(zl)f'^l(z^l), можна динамічно викликати похідну функції активації шару за допомогою self.activation.derivative(self.outputs).

Загальна структура методу backward() виглядає так:

def backward(self, da, learning_rate):
    dz = ... # using da and self.activation.derivative()
    d_weights = ... # using np.dot() and .T
    d_biases = ...
    da_prev = ...

    self.weights -= learning_rate * d_weights
    self.biases -= learning_rate * d_biases

    return da_prev

Аналогічно, при об'єднанні всіх частин у методі fit(), необхідно пам'ятати, що для поширення помилки потрібно ітеруватися по мережі у зворотному порядку. Загальна структура виглядає так:

def fit(self, training_data, labels, epochs, learning_rate):
    # ... (Epoch loop and data shuffling) ...
            # Forward propagation
            output = ...

            # Computing the gradient of the loss function w.r.t. output (da^n)
            da = ...

            # Backward propagation through all layers
            for layer in self.layers[::-1]:
                da = ... # Call the backward() method of the layer

Зразки навчальних даних (X_train) разом із відповідними мітками (y_train) зберігаються як масиви NumPy у файлі utils.py. Крім того, там також визначені екземпляри функцій активації:

relu = ReLU()
sigmoid = Sigmoid()
Завдання

Проведіть, щоб почати кодувати

Ваша мета — завершити процес навчання багатошарового перцептрона, реалізувавши зворотне поширення помилки (backpropagation) та оновлення параметрів моделі.

Дотримуйтесь наступних кроків:

  1. Реалізуйте метод backward() у класі Layer:
  • Обчисліть наступні градієнти:
  • dz: похідна функції втрат за препроактиваційними значеннями, використовуючи похідну функції активації;
  • d_weights: градієнт функції втрат за вагами, обчислюється як добуток dz та транспонованого вхідного вектора;
  • d_biases: градієнт функції втрат за зсувами, дорівнює dz;
  • da_prev: градієнт функції втрат за активаціями попереднього шару, отримується множенням транспонованої матриці ваг на dz.
  • Оновіть ваги та зсуви, використовуючи швидкість навчання.
  1. Завершіть метод fit() у класі Perceptron:
  • Обчисліть вихід моделі, викликавши метод forward();
    • Обчисліть втрати за формулою крос-ентропії;
  • Обчисліть danda^n — похідну функції втрат за вихідними активаціями;
  • Пройдіть у зворотному порядку по шарах, виконуючи зворотне поширення помилки через виклик методу backward() кожного шару.
  1. Перевірте поведінку навчання:
  • Якщо все реалізовано правильно, значення втрат має стабільно зменшуватися з кожною епохою при швидкості навчання 0.01.

Рішення

Switch to desktopПерейдіть на комп'ютер для реальної практикиПродовжуйте з того місця, де ви зупинились, використовуючи один з наведених нижче варіантів
Все було зрозуміло?

Як ми можемо покращити це?

Дякуємо за ваш відгук!

Секція 1. Розділ 17
single

single

Запитати АІ

expand

Запитати АІ

ChatGPT

Запитайте про що завгодно або спробуйте одне із запропонованих запитань, щоб почати наш чат

some-alt