Введение:

Алгоритм обучения персептрона (PLA) представляет собой подход к обучению с бинарной классификацией под наблюдением. Путем обновления весов метод стремится предсказать результат для заданных входных данных и минимизирует функцию потерь. Цель состоит в том, чтобы правильно классифицировать данные, чтобы функция потерь была равна нулю для всех точек данных. Это может быть достигнуто путем итеративного выполнения прямых и обратных проходов заданных данных до тех пор, пока потери не достигнут нуля. В этом блоге освещается ключевая концепция PLA, которая позволяет понять основные идеи нейронных сетей, такие как прямой проход, минимизация функции потерь и обновление веса. Вот разбивка рабочего механизма PLA:

Проход вперёд:

Предсказать вывод с использованием текущих весов:

x0 - член смещения, т. е. 1.

Функция потерь:

Определите функцию потерь, используя фактический и прогнозируемый класс. Для PLA функция потерь будет:

где альфа — скорость обучения.

Обратный проход:

Если функция потерь не равна 0, т.е.

обновить веса.

Обновление веса:

веса обновляются как:

где wi — текущий вес, а xi — соответствующий вход.

Эпоха:

Прямой и обратный проход для всех точек данных за один цикл.

Пример:

Используя PLA, обновляйте веса до тех пор, пока потери не будут минимизированы до 0, так что LR (aplha) = 1, веса = [0,1, -1], функция активации является ступенчатой ​​функцией и:

Решение:

Решение основано на шагах, описанных ранее, т.е.

для заданного ввода, используя текущие веса и функцию активации, прогнозируется выход y.

Потери определяются на каждом шаге, и веса обновляются, если потери не равны 0.

Функция потерь сходится к 0 для всех входных данных после 3-й эпохи, поэтому достигается окончательное решение.

Для эпохи = 1 и первых двух входных данных давайте разберемся с этими шагами:

Ввод (0,0): y=0,5, L=-0,5, обновить веса

Новые веса будут w0=-0,5, w1=1 и w2=-1, и эти веса будут использоваться для следующего ввода.

Входные данные (0,1): y=0, L=1, обновить веса, так как функция потерь не равна нулю:

Новые веса будут w0=0,5, w1=1 и w2=0, и эти веса будут использоваться для следующего ввода и будут обновлены для других входов в случае, если функция потерь не равна 0.

Питон:

import numpy as np
import matplotlib.pyplot as plt


def step(output):
    if output > 0:
        return 1
    elif output==0:
      return 1/2
    else:
        return 0

inputs = [(0, 0), (0, 1), (1, 0), (1, 1)]
T = [0, 1, 0, 1]
w = [0, 1, -1]
LR = 1
loss_final=[]

for epoch in range(5):
    for i in range(4):
        data = inputs[i]
        c = T[i]
        output = step(w[0] * 1 + w[1] * data[0] + w[2] * data[1])
        loss = LR * (c - output)
        if loss !=0:
          w[0] += loss * 1
          w[1] += loss * data[0]
          w[2] += loss * data[1]
        loss_final.append({'epoch': epoch, 'input':data, 'loss': loss})

epochs = [key['epoch'] for key in loss_final]
losses = [key['loss'] for key in loss_final]

# Plotting the data using plt.scatter
plt.plot(epochs, losses)
plt.xlabel('Epoch')
plt.ylabel('Loss')
plt.title('Loss over Epochs')
plt.show()

На графике видно, что по мере увеличения эпох функция потерь имеет тенденцию к сокращению, а в 3-й эпохе она достигает 0 для всех точек данных, что означает, что алгоритм становится достаточно точным, чтобы правильно классифицировать все заданные точки данных.

Заключение:

Хотя PLA является очень простым алгоритмом, он имеет фундаментальное значение для понимания явлений прямого прохода и обновления веса для сложных нейронных сетей. Этот блог фокусируется не только на теоретическом понимании PLA, но и на математике, стоящей за ним, и его реализации в python, чтобы понять упомянутые явления (прямой проход и обновление веса).