Реалізація Одного Нейрона
Нейрон — це базова обчислювальна одиниця нейронної мережі. Він обробляє декілька вхідних даних та генерує один вихід, що дозволяє мережі навчатися та здійснювати передбачення.
На цьому етапі ми створюємо нейронну мережу з одним нейроном. Наприклад, її можна використати для бінарної класифікації, такої як виявлення спаму, де 0 означає ham (не-спам) лист, а 1 — спам-лист.
Нейрон приймає числові ознаки, пов'язані з електронними листами, як вхідні дані та формує вихід у діапазоні від 0 до 1, що відображає ймовірність того, що лист є спамом.
Покроковий процес виглядає так:
- Кожен вхід множиться на відповідну вагу. Ваги — це параметри, що навчаються, які визначають важливість кожного входу;
- Усі зважені входи підсумовуються;
- Додається додатковий параметр — зміщення (bias) — до суми входів. Зміщення дозволяє нейрону зміщувати свій вихід вгору або вниз, забезпечуючи гнучкість моделі;
- Сума входів передається через функцію активації. Оскільки у нас лише один нейрон, який безпосередньо формує фінальний вихід (ймовірність), використовується сигмоїдна функція, що стискає значення у діапазон (0,1).
Зсув нейрона також є параметром, що підлягає навчанню.
Клас нейрона
Нейрон повинен зберігати свої ваги та зсув, тому клас є природним способом об'єднання цих пов'язаних властивостей.
Хоча цей клас не буде частиною фінальної реалізації нейронної мережі, він ефективно ілюструє ключові принципи.
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).
Зсув нейрона також є параметром, що підлягає навчанню.
Клас нейрона
Нейрон повинен зберігати свої ваги та зсув, тому клас є природним способом об'єднання цих пов'язаних властивостей.
Хоча цей клас не буде частиною фінальної реалізації нейронної мережі, він ефективно ілюструє ключові принципи.
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. Чому ваги ініціалізують малими випадковими значеннями, а не нулями?
Дякуємо за ваш відгук!