Реалізація Одного Нейрона
Нейрон — це базова обчислювальна одиниця нейронної мережі. Він обробляє декілька вхідних даних та генерує один вихід, що дозволяє мережі навчатися та здійснювати передбачення.
Наразі ми хочемо побудувати нейронну мережу з одним нейроном. Наприклад, використаємо її для бінарної класифікації, такої як виявлення спаму, де 0 означає ham (неспамовий) лист, а 1 — спамовий лист.
Нейрон прийматиме числові ознаки, пов'язані з електронними листами, як вхідні дані та формуватиме вихід у діапазоні від 0 до 1, що відображає ймовірність, що лист є спамом.
Ось як це відбувається крок за кроком:
- Кожен вхід множиться на відповідну вагу. Ваги — це параметри, що навчаються, які визначають важливість кожного входу;
- Усі зважені входи підсумовуються;
- Додається додатковий параметр — зсув (bias) — до суми входів. Зсув дозволяє нейрону зміщувати свій вихід вгору або вниз, забезпечуючи гнучкість моделі;
- Сума входів передається через функцію активації. Оскільки у нас лише один нейрон, який безпосередньо формує фінальний вихід (ймовірність), використаємо сигмоїдну функцію, яка стискає значення у діапазон (0,1).
Зсув нейрона також є параметром, що підлягає навчанню.
Клас Neuron
Нейрон повинен зберігати свої ваги та зсув, тому клас є природним способом об'єднання цих пов'язаних властивостей.
Хоча цей клас не буде частиною фінальної реалізації нейронної мережі, він ефективно ілюструє ключові принципи.
class Neuron:
def __init__(self, n_inputs):
self.weights = ...
self.bias = ...
weights
: список випадково ініціалізованих значень, які визначають важливість кожного входу (n_inputs
— кількість входів) для нейрона;bias
: випадково ініціалізоване значення, що допомагає нейрону приймати гнучкі рішення.
Ваги та зсув повинні бути випадково ініціалізовані малими значеннями в діапазоні від -1 до 1, взятими з рівномірного розподілу, щоб порушити симетрію та забезпечити навчання різних ознак різними нейронами.
Для підсумку, NumPy надає функцію random.uniform()
, яка генерує випадкове число або масив (за допомогою аргументу size
) випадкових чисел з рівномірного розподілу в межах діапазону [low, high)
.
import numpy as np
np.random.uniform(low, high, size=...)
Пряме поширення
Крім того, клас Neuron
повинен містити метод activate()
, який обчислює зважену суму входів і застосовує функцію активації (у нашому випадку — сигмоїду).
Насправді, якщо у нас є два вектори однакової довжини (weights
і inputs
), зважену суму можна обчислити за допомогою скалярного добутку цих векторів:
Це дозволяє обчислити зважену суму в одному рядку коду за допомогою функції numpy.dot()
, що усуває необхідність у циклі. Зсув потім можна безпосередньо додати до результату, щоб отримати input_sum_with_bias
. Вихід обчислюється шляхом застосування сигмоїдної функції активації:
def activate(self, inputs):
input_sum_with_bias = ...
output = ...
return output
Функції активації
Формула для сигмоїдної функції виглядає наступним чином, де z — це зважена сума вхідних значень із доданим зсувом (сире вихідне значення) для цього нейрона:
σ(z)=1+e−z1Використовуючи цю формулу, сигмоїду можна реалізувати як просту функцію на Python:
def sigmoid(z):
return 1 / (1 + np.exp(-z))
Формула для функції ReLU виглядає наступним чином: вона встановлює вихідне значення рівним z, якщо воно додатне, і 0 в іншому випадку:
ReLU(z)=max(0,z)def relu(z):
return np.maximum(0, z)
1. Яка роль зсуву (bias) в одному нейроні?
2. Чому ваги ініціалізують малими випадковими значеннями, а не нулями?
Дякуємо за ваш відгук!
Запитати АІ
Запитати АІ
Запитайте про що завгодно або спробуйте одне із запропонованих запитань, щоб почати наш чат
Can you show me how to complete the Neuron class with random initialization?
How does the activate method work in practice?
Can you explain why we use the sigmoid function for binary classification?
Awesome!
Completion rate improved to 4
Реалізація Одного Нейрона
Свайпніть щоб показати меню
Нейрон — це базова обчислювальна одиниця нейронної мережі. Він обробляє декілька вхідних даних та генерує один вихід, що дозволяє мережі навчатися та здійснювати передбачення.
Наразі ми хочемо побудувати нейронну мережу з одним нейроном. Наприклад, використаємо її для бінарної класифікації, такої як виявлення спаму, де 0 означає ham (неспамовий) лист, а 1 — спамовий лист.
Нейрон прийматиме числові ознаки, пов'язані з електронними листами, як вхідні дані та формуватиме вихід у діапазоні від 0 до 1, що відображає ймовірність, що лист є спамом.
Ось як це відбувається крок за кроком:
- Кожен вхід множиться на відповідну вагу. Ваги — це параметри, що навчаються, які визначають важливість кожного входу;
- Усі зважені входи підсумовуються;
- Додається додатковий параметр — зсув (bias) — до суми входів. Зсув дозволяє нейрону зміщувати свій вихід вгору або вниз, забезпечуючи гнучкість моделі;
- Сума входів передається через функцію активації. Оскільки у нас лише один нейрон, який безпосередньо формує фінальний вихід (ймовірність), використаємо сигмоїдну функцію, яка стискає значення у діапазон (0,1).
Зсув нейрона також є параметром, що підлягає навчанню.
Клас Neuron
Нейрон повинен зберігати свої ваги та зсув, тому клас є природним способом об'єднання цих пов'язаних властивостей.
Хоча цей клас не буде частиною фінальної реалізації нейронної мережі, він ефективно ілюструє ключові принципи.
class Neuron:
def __init__(self, n_inputs):
self.weights = ...
self.bias = ...
weights
: список випадково ініціалізованих значень, які визначають важливість кожного входу (n_inputs
— кількість входів) для нейрона;bias
: випадково ініціалізоване значення, що допомагає нейрону приймати гнучкі рішення.
Ваги та зсув повинні бути випадково ініціалізовані малими значеннями в діапазоні від -1 до 1, взятими з рівномірного розподілу, щоб порушити симетрію та забезпечити навчання різних ознак різними нейронами.
Для підсумку, NumPy надає функцію random.uniform()
, яка генерує випадкове число або масив (за допомогою аргументу size
) випадкових чисел з рівномірного розподілу в межах діапазону [low, high)
.
import numpy as np
np.random.uniform(low, high, size=...)
Пряме поширення
Крім того, клас Neuron
повинен містити метод activate()
, який обчислює зважену суму входів і застосовує функцію активації (у нашому випадку — сигмоїду).
Насправді, якщо у нас є два вектори однакової довжини (weights
і inputs
), зважену суму можна обчислити за допомогою скалярного добутку цих векторів:
Це дозволяє обчислити зважену суму в одному рядку коду за допомогою функції numpy.dot()
, що усуває необхідність у циклі. Зсув потім можна безпосередньо додати до результату, щоб отримати input_sum_with_bias
. Вихід обчислюється шляхом застосування сигмоїдної функції активації:
def activate(self, inputs):
input_sum_with_bias = ...
output = ...
return output
Функції активації
Формула для сигмоїдної функції виглядає наступним чином, де z — це зважена сума вхідних значень із доданим зсувом (сире вихідне значення) для цього нейрона:
σ(z)=1+e−z1Використовуючи цю формулу, сигмоїду можна реалізувати як просту функцію на Python:
def sigmoid(z):
return 1 / (1 + np.exp(-z))
Формула для функції ReLU виглядає наступним чином: вона встановлює вихідне значення рівним z, якщо воно додатне, і 0 в іншому випадку:
ReLU(z)=max(0,z)def relu(z):
return np.maximum(0, z)
1. Яка роль зсуву (bias) в одному нейроні?
2. Чому ваги ініціалізують малими випадковими значеннями, а не нулями?
Дякуємо за ваш відгук!