Практический пример, реализованный в Mathematica

Введение

Персептрон Розенблатта, разработанный Фрэнком Розенблаттом в 1958 году[1][2], считается источником нейронных сетей, потому что это был первый алгоритм, продемонстрировавший способность машины учиться на данных.

Персептрон представлял собой простую модель, состоящую из одного слоя искусственных нейронов или блоков, которые можно было обучить распознавать закономерности во входных данных. Это положило начало области искусственного интеллекта и проложило путь к развитию более сложных нейронных сетей, которые использовались в различных приложениях.

Первой реализацией был персептрон Mark I, разработанный Линкольнской лабораторией Массачусетского технологического института в конце 1950-х годов. Это была первая машина, способная учиться на примерах, и она использовалась для выполнения задач распознавания образов, таких как чтение рукописных букв и распознавание произносимых слов. Персептрон Mark I был построен с использованием вакуумных ламп и других электронных компонентов и состоял из ряда блоков, соединенных вместе в многоуровневую структуру. Каждое подразделение могло обрабатывать входные данные и корректировать свои внутренние веса и смещения, чтобы распознавать закономерности в данных.

Эта машина использовалась ВМС США в 1960-х годах для чтения рукописных писем. В то время флот получал большой объем корреспонденции и нуждался в способе быстрой и точной обработки писем. Они обратились к персептрону, способному учиться на примерах и распознавать закономерности во входных данных. Обучив персептрон большому набору данных рукописных букв, военно-морской флот смог разработать систему, которая могла бы точно читать и классифицировать буквы с минимальным вмешательством человека. В то время это было значительным достижением, поскольку продемонстрировало потенциал искусственного интеллекта и машинного обучения для автоматизации задач, которые ранее выполнялись людьми. Успех Perceptron в этом приложении помог зарекомендовать себя как мощный инструмент для распознавания образов и открыл двери для его использования в широком диапазоне приложений.

Единая нейронная сеть

Персептрон Розенблатта — это простая модель искусственного нейрона. В этой модели один нейрон имеет несколько входов, которые являются значениями признаков во входных данных, и один выход, который представляет собой двоичное значение, указывающее, принадлежат ли входные данные к одному из двух классов. Персептрон работает, присваивая вес каждому входу, который представляет важность этого входа в определении результата. Затем выходные данные вычисляются с использованием математической функции, которая объединяет взвешенные входные данные со смещением. Член смещения является фиксированным значением, которое можно отрегулировать, чтобы сместить выходной сигнал персептрона. Персептрон можно научить распознавать закономерности во входных данных, корректируя веса и смещения на основе ошибок в его прогнозах. Этот процесс настройки весов и смещения для минимизации ошибок известен как обучение персептрона.

Модель состоит из одного слоя блоков, каждый из которых имеет d признаков в качестве входных данных и двоичного выхода, который может принимать значения -1 и +1. . Персептрон использует эти входные и выходные данные, чтобы научиться классифицировать данные по двум классам.

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

Функция прогнозирования

Функция прогнозирования персептрона Rosenblatt используется для расчета выходных данных персептрона на основе входных данных, внутренних весов и смещения устройства. Выход Perceptron представляет собой двоичное значение, указывающее, принадлежат ли входные данные к одному из двух классов. Функция предсказания определяется следующим образом:

Где W — вектор весов, соответствующий входным функциям, X — вектор входных значений для функций. Модель может быть реализована со смещением и без него, будучи b условием смещения. Функция знака возвращает -1, если значение в скобках отрицательное, и +1, если оно положительное. Персептрон регулирует веса и смещения во время обучения, чтобы свести к минимуму ошибки в своих прогнозах и повысить точность.

предвзятость

Член смещения в Rosenblatt Perceptron представляет собой дополнительный вес, который применяется ко всем входным данным. Он используется для смещения вывода персептрона и может быть скорректирован во время обучения для повышения точности модели. Смещение может быть реализовано одним из двух способов: как константа +1 в одном из признаков или как внешний параметр, который настраивается отдельно от других весов.

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

В качестве альтернативы смещение может быть реализовано как внешний параметр, который настраивается отдельно от других весов. Затем к выходным данным, рассчитанным с помощью вектора весов и векторов признаков, добавляется смещение.

Член смещения в Rosenblatt Perceptron полезен, когда переменные признаков центрированы по среднему значению, но среднее значение предсказания бинарного класса не равно 0, потому что это позволяет модели корректировать границу решения модели, чтобы лучше соответствовать данным. Это может быть особенно важно, когда распределение бинарных классов сильно несбалансировано, поскольку модель может чаще предсказывать класс большинства, чтобы свести к минимуму ошибки. В этом случае смещение можно использовать для корректировки положения границы решения и улучшения способности модели правильно классифицировать класс меньшинства.

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

Модель Rosenblatt Perceptron не включала формального определения функции потерь, даже когда ее целью было минимизировать ошибку между прогнозируемыми и фактическими значениями. Для этого персептрон регулирует веса и смещения модели на основе ошибок в своих прогнозах. Один из способов определить ошибку в модели персептрона — использовать метод наименьших квадратов, который включает в себя минимизацию суммы квадратов разностей между прогнозируемыми и фактическими значениями. Эта функция потерь может быть выражена математически следующим образом:

Хотя градиентный спуск — это обычный способ минимизировать функции потерь в машинном обучении, его нельзя применить к Rosenblatt Perceptron, поскольку функция не является непрерывной. Вместо этого персептрон использовал правило обучения, называемое теоремой сходимости персептрона, которая была основана на идее корректировки весов и смещения модели, чтобы минимизировать ошибки в ее предсказаниях.

Параметр обучения в модели Rosenblatt Perceptron представляет собой гиперпараметр, определяющий размер шага алгоритма обучения. Он используется для управления скоростью обновления весов и смещения модели на основе ошибок в прогнозах. Больший параметр обучения приведет к большим обновлениям весов и смещения, что может привести к более быстрому обучению, но также может увеличить риск переобучения. Меньший параметр обучения приведет к меньшим обновлениям, что может привести к замедлению обучения, но также может снизить риск переобучения.

Модель Perceptron часто описывается как имеющая алгоритм обучения стохастического градиентного спуска (SGD), несмотря на то, что она была разработана до того, как была введена концепция градиентного спуска. Это связано с тем, что правило обучения персептрона, известное как теорема сходимости персептрона, по духу похоже на градиентный спуск, поскольку оно включает итеративную корректировку весов и смещения модели, чтобы минимизировать ошибки в прогнозах. Подобно градиентному спуску, персептрон использует параметр обучения для управления размером шага обновлений, и его можно рассматривать как форму онлайн-обучения, поскольку он обрабатывает обучающие данные по одной выборке за раз.

В целом параметр обучения в модели персептрона играет решающую роль в управлении скоростью и точностью процесса обучения. Регулируя параметр обучения, можно точно настроить производительность модели персептрона и добиться лучших результатов в различных задачах классификации.

Персептрон в действии: предсказатель рака молочной железы

Набор данных о раке молочной железы штата Висконсин [3] является широко используемым набором данных для демонстрации возможностей модели Rosenblatt Perceptron. Этот набор данных состоит из 699 образцов изображений биопсии рака молочной железы, сделанных с 1989 по 1992 год, которые были классифицированы как доброкачественные или злокачественные на основании наличия определенных признаков. Набор данных включает в общей сложности 9 признаков, рассчитанных по изображениям, включая толщину скопления, однородность размера клеток, однородность формы клеток, краевую адгезию, размер отдельных эпителиальных клеток, голые ядра, мягкий хроматин, нормальные ядрышки и митозы. опухолей.

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

Набор данных о раке молочной железы штата Висконсин включает следующие функции:

   #  Attribute                     Domain
   -- -----------------------------------------
   1. Sample code number            id number
   2. Clump Thickness               1 - 10
   3. Uniformity of Cell Size       1 - 10
   4. Uniformity of Cell Shape      1 - 10
   5. Marginal Adhesion             1 - 10
   6. Single Epithelial Cell Size   1 - 10
   7. Bare Nuclei                   1 - 10
   8. Bland Chromatin               1 - 10
   9. Normal Nucleoli               1 - 10
  10. Mitoses                       1 - 10
  11. Class :                       (2 for benign, 4 for malignant)

В этом примере Perceptron будет реализован с использованием языка Wolfram Mathematica (его можно легко адаптировать к любому другому языку).

Шаги для реализации будут такими:

  1. Определите особенности.
  2. Загрузите данные (включая очистку).
  3. Разделите набор данных на обучающий и тестовый.
  4. Назначьте начальный вектор веса.
  5. Обучите модель (оптимизируйте весовой вектор).
  6. Используйте обученную модель для сравнения набора тестовых данных.
  7. Рассчитать точность.
  8. Рассчитать отзыв.
  9. Рассчитайте матрицу путаницы.

Шаг 1. Определите функции

features = {
   "Sample code number", 
   "Clump Thickness", 
   "Uniformity of Cell Size", 
    "Uniformity of Cell Shape",
    "Marginal Adhesion",  
   "Single Epithelial Cell Size" ,
   "Bare Nuclei",
   "Bland Chromatin",
   "Normal Nucleoli",
   "Mitoses",
   "Class"
   };
features = ToUpperCase[features];
features = StringReplace[features, " " -> "_"]

---
{"SAMPLE_CODE_NUMBER", "CLUMP_THICKNESS", "UNIFORMITY_OF_CELL_SIZE", \
"UNIFORMITY_OF_CELL_SHAPE", "MARGINAL_ADHESION", \
"SINGLE_EPITHELIAL_CELL_SIZE", "BARE_NUCLEI", "BLAND_CHROMATIN", \
"NORMAL_NUCLEOLI", "MITOSES", "CLASS"}

Шаг 2. Загрузите данные и очистите их

SetDirectory[
  "/data/uci_breast_cancer/"];
data = Import[
   "/data/uci_breast_cancer/breast-cancer-wisconsin.data"];
data = DeleteCases[data, {___, x_ /; ! NumberQ[x], ___}];

Шаг 3. Разделите набор данных на обучающий и тестовый

(* OBTAIN DATA LENGTH *)
n = Length[data];

(* SET THE RATIO BETWEEN TEST AND TRAINING, TEST IS 20 PERCENT *)
testFraction = 0.2;

(* SET THE ALPHA VALUE *)
alpha = 0.9;

(* SHUFFLE THE DATA *)
randomizedData = RandomSample[data];

(* EXTRACT THE TRAINING AND TEST SETS *)
testData = Take[randomizedData, Round[testFraction*n]];
trainingData = Drop[randomizedData, Round[testFraction*n]];

(* GET THE LENGTHS OF EACH DATASET *)
lengthTestData = Length[testData]
lengthTrainingData = Length[trainingData]

---
137

546

Шаг 4. Назначьте начальный вектор веса

W = ConstantArray[1, Length[features[[2 ;; 10]]]]

---
{1, 1, 1, 1, 1, 1, 1, 1, 1}

Шаг 5. Обучите модель (оптимизируйте весовой вектор)

nonZeroSign[x_] := If[x > 0.0, 1.0, -1.0];
Do[
  X = trainingData[[i, 2 ;; 10]];
  Y = trainingData[[i, 11]] - 3;
  EY = nonZeroSign[Dot[X, W]];
  W = (W  + alpha (Y - EY) X);
  , {i, 1, lengthTrainingData}
  ];
W

---
{-2.6, 42.4, 6.4, 20.8, -78.2, 19., -26., 53.2, 6.4}

Шаг 6. Используйте обученную модель для сравнения набора тестовых данных

results = ConstantArray[0, lengthTestData];
Do[
  X = testData[[i, 2 ;; 10]];
  results[[i]] = nonZeroSign[Dot[X, W]];
  , {i, 1, lengthTestData}
  ];
Y = testData[[All, 11]] - 3.0
EY = results

---
{-1., -1., 1., -1., -1., -1., 1., 1., -1., -1., -1., -1., -1., -1., \
-1., -1., -1., -1., -1., -1., 1., 1., -1., -1., -1., -1., 1., -1., \
1., -1., -1., -1., -1., -1., -1., -1., 1., -1., -1., -1., -1., -1., \
-1., -1., -1., -1., 1., -1., -1., 1., 1., -1., 1., 1., 1., -1., 1., \
-1., 1., -1., -1., -1., -1., 1., -1., 1., -1., -1., -1., 1., -1., \
-1., -1., 1., 1., 1., 1., 1., -1., 1., -1., 1., -1., -1., 1., 1., \
-1., -1., 1., 1., -1., -1., 1., 1., 1., -1., -1., -1., 1., -1., 1., \
-1., -1., 1., 1., 1., -1., -1., -1., -1., -1., -1., -1., -1., -1., \
-1., -1., 1., -1., 1., 1., -1., 1., -1., 1., -1., -1., 1., -1., -1., \
-1., -1., -1., -1., -1., -1., -1.}

{-1., -1., -1., -1., -1., -1., 1., 1., -1., -1., -1., -1., -1., -1., \
-1., -1., -1., -1., -1., 1., 1., 1., -1., -1., -1., -1., 1., -1., 1., \
-1., -1., -1., -1., -1., 1., 1., 1., -1., -1., -1., -1., 1., -1., 1., \
-1., 1., -1., 1., -1., -1., 1., -1., 1., 1., 1., -1., 1., -1., 1., \
1., -1., -1., -1., 1., 1., 1., 1., -1., -1., -1., -1., -1., -1., 1., \
1., 1., 1., -1., -1., 1., -1., 1., 1., -1., 1., 1., -1., 1., 1., 1., \
-1., -1., 1., 1., 1., -1., -1., 1., 1., -1., 1., -1., -1., 1., 1., \
-1., -1., -1., 1., -1., -1., 1., 1., 1., -1., -1., -1., 1., -1., 1., \
1., -1., 1., -1., 1., -1., -1., 1., -1., -1., -1., -1., -1., -1., 1., \
1., -1.}

Шаг 7. Расчет точности

testDataHit = MapThread[Equal, {EY, Y}]
testDataHitCount = Count[testDataHit, True]
EYAccuracy = testDataHitCount/Length[Y]*1.0

---
{True, True, False, True, True, True, True, True, True, True, True, \
True, True, True, True, True, True, True, True, False, True, True, \
True, True, True, True, True, True, True, True, True, True, True, \
True, False, False, True, True, True, True, True, False, True, False, \
True, False, False, False, True, False, True, True, True, True, True, \
True, True, True, True, False, True, True, True, True, False, True, \
False, True, True, False, True, True, True, True, True, True, True, \
False, True, True, True, True, False, True, True, True, True, False, \
True, True, True, True, True, True, True, True, True, False, True, \
True, True, True, True, True, True, False, True, True, False, True, \
True, False, False, False, True, True, True, True, True, True, True, \
True, True, True, True, True, True, True, True, True, True, True, \
True, True, False, False, True}

112

0.817518

Шаг 8. Рассчитать отзыв

recall =
 Count[
    Thread[Thread[Y == 1.0] && Thread[EY == 1.0]]
    , True]/(
    Count[
      Thread[Thread[Y == 1.0] && Thread[EY == 1.0]]
      , True]
     +
     Count[
      Thread[Thread[Y == 1.0] && Thread[EY == -1.0]]
      , True]
    )*1.0

---
0.863636

Шаг 9. Матрица путаницы

beningPredictedBening = 
 Count[Thread[Thread[Y == -1.0] && Thread[EY == -1.0]], True]
beningPredictedMalignant = 
 Count[Thread[Thread[Y == -1.0] && Thread[EY == 1.0]], True]
malignantPredictedBening = 
 Count[Thread[Thread[Y == 1.0] && Thread[EY == -1.0]], True]
malignantPredictedMalignant = 
 Count[Thread[Thread[Y == 1.0] && Thread[EY == 1.0]], True]
MatrixPlot[
 {
  {beningPredictedBening, beningPredictedMalignant},
  {malignantPredictedBening, malignantPredictedMalignant}
  },
 ImageSize -> 300,
 ColorFunction -> "TemperatureMap",
 FrameTicks -> {
   {{1, "TUMOUR\nBENING"}, {2, "TUMOUR\nMALIGNANT"}},
   {{1, "PREDICTED\nBENING"}, {2, "PREDICTED\nMALIGNANT"}},
   {{1, ""}, {2, ""}},
   {{1, ""}, {2, ""}}
   },
 PlotLabel -> "CONFUSSION MATRIX PERCEPTRON",
 Epilog -> {
   Text[beningPredictedBening, {1/2, 3/2}],
   Text[beningPredictedMalignant, {3/2, 3/2}],
   Text[malignantPredictedBening, {1/2, 1/2}],
   Text[malignantPredictedMalignant, {3/2, 1/2}]}
 ]

---
74

19

6

38

Измерение производительности нашего классификатора

Один из способов измерить, насколько хорош персептрон (или любой другой классификатор), — оценить его производительность на тестовом наборе данных. Существует несколько показателей, которые можно использовать для оценки производительности классификатора, таких как точность, воспроизводимость и показатель F1.

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

Отзыв — это процент положительных случаев, которые были правильно идентифицированы классификатором. Он рассчитывается как количество истинных положительных прогнозов, деленное на общее количество положительных случаев. Отзыв особенно важен в приложениях, где важно свести к минимуму количество ложноотрицательных результатов (например, детектор рака). В нашем примере мы получаем 86%, что означает, что наш предиктор пропускает 14% злокачественных опухолей.

Матрица путаницы — это таблица, которая показывает количество истинно положительных, истинно отрицательных, ложноположительных и ложноотрицательных прогнозов, сделанных классификатором. Это полезный инструмент для понимания сильных и слабых сторон классификатора, а также для сравнения производительности различных классификаторов.

В детекторе рака матрица путаницы особенно важна, потому что она может помочь выявить случаи, когда классификатор делает неверные прогнозы. Например, если классификатор дает большое количество ложноотрицательных результатов (т. е. пропускает много случаев рака), может потребоваться настроить классификатор или собрать больше обучающих данных для повышения его производительности. С другой стороны, если классификатор выдает большое количество ложных срабатываний (т. е. он идентифицирует много доброкачественных случаев как злокачественные), может потребоваться настроить классификатор, чтобы он был более консервативным в своих прогнозах.

Краткое содержание

В этой статье представлено базовое математическое описание персептрона, типа однослойной нейронной сети, разработанной в 1950-х годах. В нем объяснялась математика, стоящая за персептронами, в том числе то, как их можно использовать для классификации данных по различным категориям.

Персептрон был применен к хорошо известному набору данных в науке о данных, набору данных о раке груди в Висконсине за 1995 год, и продемонстрировал, как можно использовать различные показатели для оценки производительности классификатора. Реализация Perceptron в Mathematica показала, насколько легко эти концепции могут быть представлены в современных языках программирования, а различные шаги, описанные в реализации, демонстрируют, как классификатор может быть разработан с нуля и оценена его производительность.

Хотя персептроны больше не используются в современной практике машинного обучения из-за разработки более продвинутых архитектур нейронных сетей, в статье показано, что они по-прежнему являются ценным инструментом для понимания фундаментальных принципов нейронных сетей.

Рекомендации

[1] https://news.cornell.edu/stories/2019/09/professors-perceptron-paved-way-ai-60-years-too-soon

[2] https://psycnet.apa.org/record/1959-09865-001

[3] https://archive.ics.uci.edu/ml/datasets/breast+cancer+wisconsin+(diagnostic) | https://archive-beta.ics.uci.edu/dataset/15/breast+cancer+wisconsin+original (лицензия CC BY 4.0, см. подтверждение).

Признает

Используемый набор данных был предоставлен репозиторием машинного обучения UCI. Набор данных создан:
1. Доктор Уильям Х. Вольберг, кафедра общей хирургии
Университет Висконсина, Центр клинических наук
Мэдисон, Висконсин, 53792
2. У. Ник Стрит , кафедра компьютерных наук
Университет Висконсина, 1210 West Dayton St., Madison, WI 53706
3. Олви Л. Мангасарян, кафедра компьютерных наук
Университет Висконсина, 1210 West Dayton St. ., Madison, WI 53706
Донор: Ник Стрит.
Репозиторий машинного обучения UCI [http://archive.ics.uci.edu/ml]. Ирвин, Калифорния: Калифорнийский университет, Школа информационных и компьютерных наук. (https://archive.ics.uci.edu/ml/about.html / https://archive.ics.uci.edu/ml/citation_policy.html).