Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Вивчайте Шари Перцептрона | Нейронна Мережа з Нуля
Вступ до нейронних мереж

bookШари Перцептрона

Перцептрон — це найпростіший тип нейронної мережі, який складається лише з одного нейрона. Для розв'язання складніших задач використовується модель, відома як багатошаровий перцептрон (MLP). Багатошаровий перцептрон містить один або декілька прихованих шарів, що дозволяє мережі навчатися складним закономірностям у даних.

Структура багатошарового перцептрона включає:

  1. Вхідний шар: отримує вхідні дані;
  2. Приховані шари: обробляють дані та виділяють значущі закономірності;
  3. Вихідний шар: формує фінальний прогноз або класифікацію.

Кожен шар складається з декількох нейронів, а вихід одного шару слугує входом для наступного шару.

Ваги та зсуви шару

Перед реалізацією шару важливо зрозуміти, як зберігати ваги та зсуви кожного нейрона в ньому. У попередньому розділі ви дізналися, як зберігати ваги одного нейрона у вигляді вектора, а його зсув — як скаляр (одне число).

Оскільки шар складається з декількох нейронів, природно представляти ваги у вигляді матриці, де кожен рядок відповідає вагам конкретного нейрона. Відповідно, зсуви можна представити у вигляді вектора, довжина якого дорівнює кількості нейронів.

Для шару з 33 входами та 22 нейронами його ваги зберігаються у 2×32 \times 3 матриці WW, а зсуви — у 2×12 \times 1 векторі bb, які виглядають так:

W=[W11W12W13W21W22W23]b=[b1b2]W = \begin{bmatrix} W_{11} & W_{12} & W_{13}\\ W_{21} & W_{22} & W_{23} \end{bmatrix} \qquad b = \begin{bmatrix} b_1\\ b_2 \end{bmatrix}

Тут елемент WijW_{ij} позначає вагу jj-го входу до ii-го нейрона, тобто перший рядок містить ваги першого нейрона, а другий рядок — ваги другого нейрона. Елемент bib_i позначає зсув ii-го нейрона (два нейрони — два зсуви).

Пряме поширення

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

Раніше для одного нейрона ви реалізували зважену суму вхідних даних, обчислюючи скалярний добуток між вектором входів і вектором ваг та додаючи зміщення.

Оскільки кожен рядок матриці ваг містить вектор ваг для певного нейрона, тепер потрібно просто виконати скалярний добуток між кожним рядком матриці та вектором входів. На щастя, саме це і виконує множення матриць:

Щоб додати зміщення до виходів відповідних нейронів, також слід додати вектор зміщень:

Нарешті, до результату застосовується функція активації — у нашому випадку sigmoid або ReLU. Остаточна формула для прямого поширення в шарі виглядає так:

a=activation(Wx+b)a = activation(Wx + b)

де aa — це вектор активацій (виходів) нейронів.

Клас Layer

Фундаментальними будівельними блоками перцептрона є його шари, тому доцільно створити окремий клас Layer. Його атрибути включають:

  • inputs: вектор вхідних даних (n_inputs — кількість входів);
  • outputs: вектор сирих вихідних значень (до застосування функції активації) нейронів (n_neurons — кількість нейронів);
  • weights: матриця ваг;
  • biases: вектор зсувів;
  • activation_function: функція активації, що використовується в шарі.

Як і в реалізації одного нейрона, weights та biases ініціалізуються випадковими значеннями в діапазоні від -1 до 1, взятими з рівномірного розподілу.

class Layer:
    def __init__(self, n_inputs, n_neurons, activation_function):
        self.inputs = np.zeros((n_inputs, 1))
        self.outputs = np.zeros((n_neurons, 1))
        self.weights = ...
        self.biases = ...
        self.activation = activation_function

Атрибути inputs та outputs будуть використовуватись пізніше під час зворотного поширення помилки, тому доцільно ініціалізувати їх як масиви нулів NumPy.

Note
Примітка

Ініціалізація inputs та outputs як масивів NumPy, заповнених нулями, запобігає помилкам під час обчислень у прямому та зворотному поширенні. Це також забезпечує послідовність між шарами, дозволяючи виконувати матричні операції без додаткових перевірок.

Пряме поширення можна реалізувати у методі forward(), де outputs обчислюються на основі вектору inputs з використанням NumPy за наведеною вище формулою:

def forward(self, inputs):
    self.inputs = np.array(inputs).reshape(-1, 1)
    # Raw outputs
    self.outputs = ...
    # Applying the activation function
    return ...
Note
Примітка

Перетворення inputs у стовпчиковий вектор забезпечує коректне матричне множення з матрицею ваг під час прямого поширення. Це запобігає невідповідності розмірностей і дозволяє безперешкодні обчислення на всіх шарах.

1. Що робить багатошаровий перцептрон (MLP) потужнішим за простий перцептрон?

2. Чому необхідно застосовувати цей код перед множенням inputs на матрицю ваг?

question mark

Що робить багатошаровий перцептрон (MLP) потужнішим за простий перцептрон?

Select the correct answer

question mark

Чому необхідно застосовувати цей код перед множенням inputs на матрицю ваг?

Select the correct answer

Все було зрозуміло?

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

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

Секція 2. Розділ 3

Запитати АІ

expand

Запитати АІ

ChatGPT

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

Suggested prompts:

Can you explain how the matrix multiplication works in forward propagation?

What is the purpose of the activation function in a neural network layer?

Could you show an example of how to initialize the weights and biases in the Layer class?

Awesome!

Completion rate improved to 4

bookШари Перцептрона

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

Перцептрон — це найпростіший тип нейронної мережі, який складається лише з одного нейрона. Для розв'язання складніших задач використовується модель, відома як багатошаровий перцептрон (MLP). Багатошаровий перцептрон містить один або декілька прихованих шарів, що дозволяє мережі навчатися складним закономірностям у даних.

Структура багатошарового перцептрона включає:

  1. Вхідний шар: отримує вхідні дані;
  2. Приховані шари: обробляють дані та виділяють значущі закономірності;
  3. Вихідний шар: формує фінальний прогноз або класифікацію.

Кожен шар складається з декількох нейронів, а вихід одного шару слугує входом для наступного шару.

Ваги та зсуви шару

Перед реалізацією шару важливо зрозуміти, як зберігати ваги та зсуви кожного нейрона в ньому. У попередньому розділі ви дізналися, як зберігати ваги одного нейрона у вигляді вектора, а його зсув — як скаляр (одне число).

Оскільки шар складається з декількох нейронів, природно представляти ваги у вигляді матриці, де кожен рядок відповідає вагам конкретного нейрона. Відповідно, зсуви можна представити у вигляді вектора, довжина якого дорівнює кількості нейронів.

Для шару з 33 входами та 22 нейронами його ваги зберігаються у 2×32 \times 3 матриці WW, а зсуви — у 2×12 \times 1 векторі bb, які виглядають так:

W=[W11W12W13W21W22W23]b=[b1b2]W = \begin{bmatrix} W_{11} & W_{12} & W_{13}\\ W_{21} & W_{22} & W_{23} \end{bmatrix} \qquad b = \begin{bmatrix} b_1\\ b_2 \end{bmatrix}

Тут елемент WijW_{ij} позначає вагу jj-го входу до ii-го нейрона, тобто перший рядок містить ваги першого нейрона, а другий рядок — ваги другого нейрона. Елемент bib_i позначає зсув ii-го нейрона (два нейрони — два зсуви).

Пряме поширення

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

Раніше для одного нейрона ви реалізували зважену суму вхідних даних, обчислюючи скалярний добуток між вектором входів і вектором ваг та додаючи зміщення.

Оскільки кожен рядок матриці ваг містить вектор ваг для певного нейрона, тепер потрібно просто виконати скалярний добуток між кожним рядком матриці та вектором входів. На щастя, саме це і виконує множення матриць:

Щоб додати зміщення до виходів відповідних нейронів, також слід додати вектор зміщень:

Нарешті, до результату застосовується функція активації — у нашому випадку sigmoid або ReLU. Остаточна формула для прямого поширення в шарі виглядає так:

a=activation(Wx+b)a = activation(Wx + b)

де aa — це вектор активацій (виходів) нейронів.

Клас Layer

Фундаментальними будівельними блоками перцептрона є його шари, тому доцільно створити окремий клас Layer. Його атрибути включають:

  • inputs: вектор вхідних даних (n_inputs — кількість входів);
  • outputs: вектор сирих вихідних значень (до застосування функції активації) нейронів (n_neurons — кількість нейронів);
  • weights: матриця ваг;
  • biases: вектор зсувів;
  • activation_function: функція активації, що використовується в шарі.

Як і в реалізації одного нейрона, weights та biases ініціалізуються випадковими значеннями в діапазоні від -1 до 1, взятими з рівномірного розподілу.

class Layer:
    def __init__(self, n_inputs, n_neurons, activation_function):
        self.inputs = np.zeros((n_inputs, 1))
        self.outputs = np.zeros((n_neurons, 1))
        self.weights = ...
        self.biases = ...
        self.activation = activation_function

Атрибути inputs та outputs будуть використовуватись пізніше під час зворотного поширення помилки, тому доцільно ініціалізувати їх як масиви нулів NumPy.

Note
Примітка

Ініціалізація inputs та outputs як масивів NumPy, заповнених нулями, запобігає помилкам під час обчислень у прямому та зворотному поширенні. Це також забезпечує послідовність між шарами, дозволяючи виконувати матричні операції без додаткових перевірок.

Пряме поширення можна реалізувати у методі forward(), де outputs обчислюються на основі вектору inputs з використанням NumPy за наведеною вище формулою:

def forward(self, inputs):
    self.inputs = np.array(inputs).reshape(-1, 1)
    # Raw outputs
    self.outputs = ...
    # Applying the activation function
    return ...
Note
Примітка

Перетворення inputs у стовпчиковий вектор забезпечує коректне матричне множення з матрицею ваг під час прямого поширення. Це запобігає невідповідності розмірностей і дозволяє безперешкодні обчислення на всіх шарах.

1. Що робить багатошаровий перцептрон (MLP) потужнішим за простий перцептрон?

2. Чому необхідно застосовувати цей код перед множенням inputs на матрицю ваг?

question mark

Що робить багатошаровий перцептрон (MLP) потужнішим за простий перцептрон?

Select the correct answer

question mark

Чому необхідно застосовувати цей код перед множенням inputs на матрицю ваг?

Select the correct answer

Все було зрозуміло?

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

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

Секція 2. Розділ 3
some-alt