Введение:
Алгоритм обучения персептрона (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, чтобы понять упомянутые явления (прямой проход и обновление веса).