Это первая часть серии статей Самоорганизующиеся карты с fast.ai.

Весь код опубликован в этом репозитории и этой библиотеке PyPi.

Обзор

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

Что такое самоорганизующиеся карты?

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

Если SOM обучен на наборе данных с функциями n, каждый элемент его кодовой книги будет иметь n функций как Что ж.

Чем полезны SOM?

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

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

На следующем изображении значение элемента кодовой книги в позиции [14, 14] (нижний правый угол) является RGB-представлением зеленого цвета и топологически близко к другим оттенкам зеленого:

Реализация SOM

Тензорное расширение

Как упоминалось выше, мы стремимся достичь двух основных функций: групповое обучение и настраиваемые функции расстояния / соседства.

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

По этой причине мы реализуем небольшую аккуратную функцию, которая будет выполнять расширение формы за нас, используя функцию широковещания PyTorch:

Определение нашего класса

Единственный параметр, который нам нужен для создания SOM, - это размер карты. Мы будем использовать его для инициализации весов кодовой книги (для начала случайным образом).

Мы также инициализируем тензор, содержащий двумерные индексы каждого элемента кодовой книги карты, для дальнейшего использования.

Алгоритм обучения

Процесс обучения SOM можно разделить на два основных раздела:

  1. Поиск элемента кодовой книги, который наиболее похож на точку входных данных (также известный как блок наилучшего соответствия, BMU)
  2. Обновление BMU и всех его соседних устройств, делая их «ближе» к точке данных.

Поскольку модели PyTorch обычно имеют метод forward(), мы продолжим и будем использовать его для нашего шага 1 и функцию backward() для шага 2.

Шаг вперед

Для поиска BMU требуется два шага: вычисление расстояния от пакета до кодовой книги и поиск элемента кодовой книги с минимальным расстоянием для каждого элемента пакета.

Мы выбираем p-расстояние в качестве нашей функции расстояния от пакета до кодовой книги. По умолчанию мы используем p=2, что дает нам евклидово расстояние:

Что касается поиска BMU, мы будем использовать argmin PyTorch:

Вызов torch.stack в последней строке переводит argmin выходные индексы из плоского 1D в 2D.

Давайте теперь объединим все вместе в наш forward() метод:

Шаг назад

Обратный шаг немного сложнее и отличается от обычного обратного распространения нейронной сети. По этой причине мы не используем функцию автоградации PyTorch.

Кроме того, мы пока игнорируем масштабирование гиперпараметров, так как мы реализуем его с помощью обратных вызовов Fastai в другой статье этой серии.

Правило обновления веса SOM следующее:

где

  • α (s) - скорость обучения в эпоху s
  • Wv (s) - значение элемента кодовой книги v в эпоху s
  • D (t) - запись
  • θ (u, v, s) - множитель соседства для элемента кодовой книги v и BMU u. в эпоху с. Это зависит от гиперпараметра сигма, который мы определили в нашем конструкторе.

Смотрится сложно, но давайте разделим это на части:

  • α (s) можно рассматривать как постоянное значение (мы определили его в конструкторе!)
  • (D (t) - Wv (s)) - разница между одним элементом в нашем пакете и весом кодовой книги v
  • θ (u, v, s) - наша функция соседства. Обычно он реализуется как гауссовское значение разности индексов между индексами кодовой книги и индексами BMU, как показано ниже:

Реализовав нашу функцию соседства, мы наконец можем написать обратную функцию:

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

Цикл обучения

Теперь, когда мы завершили SOM, давайте напишем простой обучающий цикл для его тестирования:

В следующей статье серии мы проведем рефакторинг этой функции, и пусть класс Fastai Learner сделает за нас тяжелую работу.

Шаги

  • Шаг 1: Реализация SOM с PyTorch
  • Шаг 2: Обучение модуля SOM с помощью Fast.ai Learner (с функциями потерь) (22.07.20)
  • Шаг 3. Обновление гиперпараметров SOM с помощью обратных вызовов Fast.ai (29.07.20)
  • Шаг 4. Обработка неконтролируемых данных с помощью Fast.ai DataBunch (08.05.20)
  • Шаг 5: Интерпретация на обученной самоорганизующейся карте (08.12.20)