Мой набег на DL

Хранится или выводится лекарство? Написание и обучение простого перцептрона, чтобы узнать

Краткое практическое введение в простой алгоритм обучения перцептрона и его использование для классификации биоконцентрации

Вкратце, что такое перцептрон?

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

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

На изображении, которое я собрал выше, есть несколько компонентов, которые мы должны рассмотреть, чтобы лучше понять модель:

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

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

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

  • θ - функция активации
  • z - это сумма входных данных, умноженная на их веса (и смещение, если оно есть)

Выход: биологический нейрон передает сигнал по аксону, если пороговое значение достигнуто, это его выход. Выходной сигнал перцептрона также срабатывает по принципу «все или ничего» и приводит к двоичной классификации 1 или -1.

Примечание. Более подробную статью об этом материале можно найти здесь.

Пошаговый алгоритм

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

  1. Установите веса на небольшие начальные значения
  2. Умножьте входные и весовые векторы, затем просуммируйте их.
  3. Если суммированное значение больше порогового значения, будет вычислен двоичный выходной сигнал.
  4. Проверьте, был ли предсказанный результат верным, а затем обновите веса соответствующим образом.
  5. Повторите процесс для повышения точности

Примечание: еще одна отличная статья, объясняющая, почему алгоритм работает.

Кодирование перцептрона

Примечание. Я буду анализировать и объяснять примеры кода из книги Машинное обучение Python, одновременно добавляя собственный код. Я рассмотрю каждую строчку кода для нашего перцептрона.

Самая первая строка кода будет импортировать numpy, поскольку нам нужно выполнить умножение векторов и использовать случайные числа. Затем мы создаем класс перцептрона, инициализируем его и устанавливаем значения параметров для «эпох», «скорость обучения» и randomState.

  • эпохи - сколько раз все обучающие данные передаются вперед и назад
  • скорость обучения - обычно обозначается как η (эта) и размер шага. Это значение обновляет веса. При обучении данных веса будут обновляться в зависимости от того, за какую ошибку они несут ответственность, однако скорость обучения обновляет веса с учетом части этой ошибки. Таким образом, веса обновляются как таковые - вес + η (ошибка).
  • randomState - используется класс для отрисовки псевдослучайных сгенерированных чисел для экземпляра. Я бы не советовал использовать random.seed (), поскольку это повлияет на глобальную среду numpy.

Здесь мы определяем функцию fit, которая принимает аргументы x и y.

  • weights - этот параметр используется для установки весов на случайное число вместо нуля. Использование нуля в качестве начального веса создает проблему симметрии. Если вес всех входных значений равен нулю, тогда ошибка также будет равна нулю, и все они будут обновлены с одинаковой величиной. Мы генерируем нормальное распределение со средним значением 0, стандартным отклонением 0,01 и размером выборки, равным 1 выборке.
  • ошибки - это пустой список, который мы будем добавлять с ошибками, которые мы выявляем во время обучения

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

  1. мы устанавливаем цикл для итерации через каждую эпоху
  2. установите для переменной ошибки значение 0 для каждой итерации
  3. здесь xi и target - это два числа в кортеже значений x и y, которые мы вводим в качестве наших данных.
  4. мы устанавливаем переменную обновления как значение, которое нам нужно для обновления наших весов, то есть скорость обучения * ошибка
  5. веса входных данных обновляются по следующей формуле:
    веса = веса + (обновить * xi)
  6. здесь мы обновляем ввод смещения как: вес = вес + обновление
  7. теперь мы устанавливаем значение переменной ошибок как значение обновления
  8. наконец, мы добавляем список ошибок, которые мы создали ранее

Последний блок кода персептрона будет определять функции суммирования и прогнозирования.

  • суммирование - мы определяем наши входные параметры как x и возвращаем скалярное векторное произведение весов и входных данных вместе с единицей смещения.
  • прогнозировать - используя x (ввод функции) в качестве аргумента функции, функция возвращает 1, если сумма (x) больше 0; -1 в противном случае.

Очистка и подготовка данных

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

Данные нужно только немного подправить, и в остальном они готовы к использованию. В следующем блоке кода я сделал, чтобы данные можно было использовать с моделью персептрона. Исходные данные имеют 3 различных классификации: (1) в основном хранится в липидных тканях, (2) имеет дополнительные места хранения (например, белки) или (3) метаболизируется / удаляется [1]. Поскольку наша модель будет работать с двумя классами прогнозирования, мы можем отбросить метку класса (2).

Теперь мы можем создать наш обучающий набор данных для обучения модели обучения перцептрона:

Тренировка перцептрона

Ниже приведен полный блок кода для нашей модели обучения перцептрона.

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

Вывод: Неплохо, но работает!

Мы видим, что, хотя количество обновлений колеблется, наблюдается общая тенденция к снижению по итерациям, то есть наш алгоритм персептрона становится более точным с каждым проходом по обучающим данным. Мы не можем сказать, что он достигнет нуля (как это было бы с менее сложным набором данных, таким как Ирис Фишера), но мы можем сказать, что наш простой алгоритм обучения перцептрона - с 1960-х годов - действительно «учился».

Ссылки

[1] Ф. Гризони, В.Консонни, М.Виги, С.Вилла, Р.Тодескини, Исследование механизмов биоконцентрации с помощью деревьев классификации QSAR (2016 г.), Environment International