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 weights and biases are initialized in the Layer class?

What is the purpose of the activation function in the forward propagation?

Could you show an example of how to use the Layer class for a simple input?

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