Будуємо просту нейронну мережу в Python: покрокова інструкція

Перцептрони є основою нейронних мереж і є відмінною точкою для початківців, які тільки починають вивчати машинне навчання та штучний інтелект. У цьому посібнику ми створимо просту модель перцептрона на Python, щоб зрозуміти, як вона працює "під капотом". Ми навчимо її вирішувати базову задачу бінарної класифікації.

pic

Що таке перцептрон?

Перцептрон — це одношарова нейронна мережа, яка відображає вхідні характеристики у вихід, використовуючи ваги, зсув та функцію активації. Це одна з найпростіших форм штучних нейронних мереж, винайдена Френком Розенблаттом у 1958 році.

Основні етапи роботи перцептрона:

  1. Ініціалізація: Присвоєння випадкових ваг.
  2. Прямий прохід: Обчислення виходу за допомогою функції активації.
  3. Обчислення помилки: Вимірювання різниці між фактичними та передбаченими виходами.
  4. Оновлення ваг: Коригування ваг за допомогою помилки.

Покрокова реалізація

Ось як можна реалізувати перцептрон на 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, 1].

2. Прямий прохід:

  • Обчислюємо скалярний добуток вхідних даних і ваг.
  • Застосовуємо сигмоїдальну функцію для нормалізації результату.

3.

Обчислення помилки

  • Віднімаємо передбачений вихід від фактичного виходу.

4. Зворотне поширення (Backpropagation)

  • Використовуємо похідну сигмоїдальної функції для обчислення коригувань.
  • Оновлюємо ваги для зменшення помилки.

Виходи

  1. Початкові ваги: Випадково згенеровані ваги до навчання.
  2. Остаточні ваги: Оновлені ваги після 100 000 ітерацій навчання.
  3. Передбачені виходи: Прогнози перцептрона для навчальних входів.

Розширення моделі

Цей перцептрон працює для бінарної класифікації з одним шаром. Для обробки складніших наборів даних ви можете:

  • Додати більше шарів (глибоке навчання).
  • Використовувати інші функції активації (ReLU, tanh).
  • Включити більш складні методи оптимізації, такі як градієнтний спуск.

Висновок

Вітаємо! Ви тільки що побудували та натренували просту нейронну мережу з нуля. Це базове розуміння допоможе вам краще освоїти більш складні нейронні мережі та концепції глибокого навчання. Експериментуйте з різними наборами даних та параметрами, щоб побачити, як перцептрон працює. Успіхів у програмуванні!

Перекладено з: Building a Simple Neural Network in Python: A Step-by-Step Guide

Leave a Reply

Your email address will not be published. Required fields are marked *