Перцептрони є основою нейронних мереж і є відмінною точкою для початківців, які тільки починають вивчати машинне навчання та штучний інтелект. У цьому посібнику ми створимо просту модель перцептрона на Python, щоб зрозуміти, як вона працює "під капотом". Ми навчимо її вирішувати базову задачу бінарної класифікації.
Що таке перцептрон?
Перцептрон — це одношарова нейронна мережа, яка відображає вхідні характеристики у вихід, використовуючи ваги, зсув та функцію активації. Це одна з найпростіших форм штучних нейронних мереж, винайдена Френком Розенблаттом у 1958 році.
Основні етапи роботи перцептрона:
- Ініціалізація: Присвоєння випадкових ваг.
- Прямий прохід: Обчислення виходу за допомогою функції активації.
- Обчислення помилки: Вимірювання різниці між фактичними та передбаченими виходами.
- Оновлення ваг: Коригування ваг за допомогою помилки.
Покрокова реалізація
Ось як можна реалізувати перцептрон на Python:
1. Імпорт бібліотек
Ми використаємо numpy
для числових обчислень.
import numpy as np
2. Опис функції активації
Ми використаємо сигмоїдальну функцію, яка виводить значення в межах від 0 до 1, що робить її придатною для задач бінарної класифікації.
def sigmoid(x):
return 1 / (1 + np.exp(-x))
def sigmoid_derivative(x):
return x * (1 - x)
Похідна сигмоїдальної функції допомагає в оновленні ваг під час навчання.
3. Підготовка навчальних даних
Ми використаємо невеликий набір даних з бінарними входами та виходами.
training_inputs = np.array([[0, 0, 1],
[1, 1, 1],
[1, 0, 1],
[0, 1, 1]])
training_outputs = np.array([[0, 1, 1, 0]]).T
Кожен рядок training_inputs
представляє один навчальний приклад, а відповідне значення в training_outputs
— це цільовий вихід.
4. Ініціалізація ваг
Ми присвоюємо випадкові значення вагам, переконавшись, що вони спочатку будуть малими.
np.random.seed(1)
synaptic_weights = 2 * np.random.random((3, 1)) - 1
print("Random starting synaptic weights...")
print(synaptic_weights)
5. Навчання перцептрона
Ми будемо ітерувати по навчальних даних та коригувати ваги, щоб мінімізувати помилки.
for iterations in range(100000):
# Forward pass
input_layer = training_inputs
outputs = sigmoid(np.dot(input_layer, synaptic_weights))
# Calculate error
error = training_outputs - outputs
# Adjust weights
adjustments = error * sigmoid_derivative(outputs)
synaptic_weights += np.dot(input_layer.T, adjustments)
6. Виведення результатів
Після навчання ми виведемо оновлені ваги та остаточні виходи.
print("Synaptic weights after training")
print(synaptic_weights)
print("Outputs after training: ")
print(outputs)
Повний код
Ось повна реалізація:
import numpy as np
def sigmoid(x):
return 1 / (1 + np.exp(-x))
def sigmoid_derivative(x):
return x * (1 - x)
training_inputs = np.array([[0, 0, 1],
[1, 1, 1],
[1, 0, 1],
[0, 1, 1]])
training_outputs = np.array([[0, 1, 1, 0]]).T
np.random.seed(1)
synaptic_weights = 2 * np.random.random((3, 1)) - 1
print("Random starting synaptic weights...")
print(synaptic_weights)
for iterations in range(100000):
input_layer = training_inputs
outputs = sigmoid(np.dot(input_layer, synaptic_weights))
error = training_outputs - outputs
adjustments = error * sigmoid_derivative(outputs)
synaptic_weights += np.dot(input_layer.T, adjustments)
print("Synaptic weights after training")
print(synaptic_weights)
print("Outputs after training: ")
print(outputs)
Пояснення коду
- Ініціалізація випадкових ваг:
- Ми ініціалізуємо ваги випадковими значеннями в межах [-1, 1].
2. Прямий прохід:
- Обчислюємо скалярний добуток вхідних даних і ваг.
- Застосовуємо сигмоїдальну функцію для нормалізації результату.
3.
Обчислення помилки
- Віднімаємо передбачений вихід від фактичного виходу.
4. Зворотне поширення (Backpropagation)
- Використовуємо похідну сигмоїдальної функції для обчислення коригувань.
- Оновлюємо ваги для зменшення помилки.
Виходи
- Початкові ваги: Випадково згенеровані ваги до навчання.
- Остаточні ваги: Оновлені ваги після 100 000 ітерацій навчання.
- Передбачені виходи: Прогнози перцептрона для навчальних входів.
Розширення моделі
Цей перцептрон працює для бінарної класифікації з одним шаром. Для обробки складніших наборів даних ви можете:
- Додати більше шарів (глибоке навчання).
- Використовувати інші функції активації (ReLU, tanh).
- Включити більш складні методи оптимізації, такі як градієнтний спуск.
Висновок
Вітаємо! Ви тільки що побудували та натренували просту нейронну мережу з нуля. Це базове розуміння допоможе вам краще освоїти більш складні нейронні мережі та концепції глибокого навчання. Експериментуйте з різними наборами даних та параметрами, щоб побачити, як перцептрон працює. Успіхів у програмуванні!
Перекладено з: Building a Simple Neural Network in Python: A Step-by-Step Guide