Шари Перцептрона
Перцептрон — це назва найпростішої нейронної мережі, яка складається лише з одного нейрона. Однак для розв'язання складніших задач ми створимо модель під назвою багатошаровий перцептрон (MLP). Багатошаровий перцептрон складається з одного або декількох прихованих шарів. Структура багатошарового перцептрона виглядає так:
- Вхідний шар: отримує вхідні дані;
- Приховані шари: ці шари обробляють дані та виділяють закономірності.
- Вихідний шар: формує фінальний прогноз або класифікацію.
Загалом кожен шар складається з декількох нейронів, а вихід одного шару стає входом для наступного шару.
Ваги та зсуви шару
Перш ніж реалізовувати шар, важливо зрозуміти, як зберігати ваги та зсуви кожного нейрона в ньому. У попередньому розділі ви дізналися, як зберігати ваги одного нейрона у вигляді вектора, а його зсув — як скаляр (одне число).
Оскільки шар складається з декількох нейронів, природно представляти ваги у вигляді матриці, де кожен рядок відповідає вагам конкретного нейрона. Відповідно, зсуви можна представити у вигляді вектора, довжина якого дорівнює кількості нейронів.
Для шару з 3 входами та 2 нейронами його ваги зберігаються у 2×3 матриці W, а зсуви — у 2×1 векторі b, які виглядають так:
W=[W11W21W12W22W13W23]b=[b1b2]Тут елемент Wij позначає вагу j-го входу до i-го нейрона, тобто перший рядок містить ваги першого нейрона, а другий рядок — ваги другого нейрона. Елемент bi позначає зсув i-го нейрона (два нейрони — два зсуви).
Пряме поширення
Виконання прямого поширення для кожного шару означає активацію кожного його нейрона шляхом обчислення зваженої суми вхідних даних, додавання зміщення та застосування функції активації.
Раніше для одного нейрона ви реалізували зважену суму вхідних даних, обчислюючи скалярний добуток між вектором входів і вектором ваг та додаючи зміщення.
Оскільки кожен рядок матриці ваг містить вектор ваг для певного нейрона, тепер потрібно просто виконати скалярний добуток між кожним рядком матриці та вектором входів. На щастя, саме це і виконує множення матриць:
Щоб додати зміщення до виходів відповідних нейронів, також слід додати вектор зміщень:
Нарешті, до результату застосовується функція активації — sigmoid або ReLU у нашому випадку. Остаточна формула прямого поширення в шарі виглядає так:
a=activation(Wx+b)де a — вектор активацій нейронів (виходів).
Клас 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.
Ініціалізація 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 ...
Перетворення inputs
у стовпцевий вектор забезпечує коректне матричне множення з матрицею ваг під час прямого поширення. Це запобігає невідповідності розмірностей і дозволяє безперервні обчислення на всіх шарах.
1. Що робить багатошаровий перцептрон (MLP) потужнішим за простий перцептрон?
2. Чому ми застосовуємо цей код перед множенням inputs
на матрицю ваг?
Дякуємо за ваш відгук!
Запитати АІ
Запитати АІ
Запитайте про що завгодно або спробуйте одне із запропонованих запитань, щоб почати наш чат
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
Шари Перцептрона
Свайпніть щоб показати меню
Перцептрон — це назва найпростішої нейронної мережі, яка складається лише з одного нейрона. Однак для розв'язання складніших задач ми створимо модель під назвою багатошаровий перцептрон (MLP). Багатошаровий перцептрон складається з одного або декількох прихованих шарів. Структура багатошарового перцептрона виглядає так:
- Вхідний шар: отримує вхідні дані;
- Приховані шари: ці шари обробляють дані та виділяють закономірності.
- Вихідний шар: формує фінальний прогноз або класифікацію.
Загалом кожен шар складається з декількох нейронів, а вихід одного шару стає входом для наступного шару.
Ваги та зсуви шару
Перш ніж реалізовувати шар, важливо зрозуміти, як зберігати ваги та зсуви кожного нейрона в ньому. У попередньому розділі ви дізналися, як зберігати ваги одного нейрона у вигляді вектора, а його зсув — як скаляр (одне число).
Оскільки шар складається з декількох нейронів, природно представляти ваги у вигляді матриці, де кожен рядок відповідає вагам конкретного нейрона. Відповідно, зсуви можна представити у вигляді вектора, довжина якого дорівнює кількості нейронів.
Для шару з 3 входами та 2 нейронами його ваги зберігаються у 2×3 матриці W, а зсуви — у 2×1 векторі b, які виглядають так:
W=[W11W21W12W22W13W23]b=[b1b2]Тут елемент Wij позначає вагу j-го входу до i-го нейрона, тобто перший рядок містить ваги першого нейрона, а другий рядок — ваги другого нейрона. Елемент bi позначає зсув i-го нейрона (два нейрони — два зсуви).
Пряме поширення
Виконання прямого поширення для кожного шару означає активацію кожного його нейрона шляхом обчислення зваженої суми вхідних даних, додавання зміщення та застосування функції активації.
Раніше для одного нейрона ви реалізували зважену суму вхідних даних, обчислюючи скалярний добуток між вектором входів і вектором ваг та додаючи зміщення.
Оскільки кожен рядок матриці ваг містить вектор ваг для певного нейрона, тепер потрібно просто виконати скалярний добуток між кожним рядком матриці та вектором входів. На щастя, саме це і виконує множення матриць:
Щоб додати зміщення до виходів відповідних нейронів, також слід додати вектор зміщень:
Нарешті, до результату застосовується функція активації — sigmoid або ReLU у нашому випадку. Остаточна формула прямого поширення в шарі виглядає так:
a=activation(Wx+b)де a — вектор активацій нейронів (виходів).
Клас 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.
Ініціалізація 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 ...
Перетворення inputs
у стовпцевий вектор забезпечує коректне матричне множення з матрицею ваг під час прямого поширення. Це запобігає невідповідності розмірностей і дозволяє безперервні обчислення на всіх шарах.
1. Що робить багатошаровий перцептрон (MLP) потужнішим за простий перцептрон?
2. Чому ми застосовуємо цей код перед множенням inputs
на матрицю ваг?
Дякуємо за ваш відгук!