Шари Перцептрона
Перцептрон — це найпростіший тип нейронної мережі, який складається лише з одного нейрона. Для розв'язання складніших задач використовується модель, відома як багатошаровий перцептрон (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 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
Шари Перцептрона
Свайпніть щоб показати меню
Перцептрон — це найпростіший тип нейронної мережі, який складається лише з одного нейрона. Для розв'язання складніших задач використовується модель, відома як багатошаровий перцептрон (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 на матрицю ваг?
Дякуємо за ваш відгук!