Обучим случайный лес с обратным распространением (в pytorch).

Случайный лес - это набор деревьев решений. Каждое дерево решений состоит из иерархических решений, обеспечивающих чистоту разделения классов.

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

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

Давайте сначала построим случайную модель леса для прогнозирования классов

Вход MNIST выглядит следующим образом:

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

Теперь давайте закодируем ту же модель случайного леса как можно точнее, используя обратное распространение.

Отсюда интересное:

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

  1. Дифференцируемая функция, маска внимания, заменяет выбор переменной сигмоидной нелинейностью. Также обратите внимание, что выбор переменной также представляет собой создание дерева.
  2. Дифференцируемая функция, символический путь, состоящий из -1 и +1, к прокси-узлу разделяется на жесткую нелинейность
  3. Дифференцируемая функция, вектор вероятности, для определения чистоты для каждого класса в расщеплении с помощью нелинейности softmax
  4. Дифференцируемая функция потерь, максимальная потеря маржи, для представления уменьшения примесей при каждом разбиении, где маржа будет отражать уменьшение примесей.

С архитектурной точки зрения мы сможем реализовать указанную выше маску внимания (1) в одном вычислительном блоке. Назовем его feature_selection_node.

Узел выбора функций

Деревья решений работают с подмножеством входных переменных. Чтобы повторить выбор переменной, мы создадим маски внимания. Каждая маска внимания будет проксировать дерево, а активные единицы в этой маске внимания будут представлять выбранные переменные для прогнозирования в этом дереве. Логика маски внимания находится в переменной self.attention_mask. Поскольку это требует обучения на основе данных, для требования градиента установлено значение True.

Узел решения

После того, как вышеописанный узел выбора функции вычисляет продукт внимания и ввода, он используется узлом принятия решения для создания символического пути. Символьный путь - это вектор из -1 и +1, где -1 представляет левый разделенный путь, а +1 представляет правый разделенный путь. Индекс этого вектора представляет узел решения. Если мы выберем k, скажем, k = 200 активных входных единиц, то потенциально может быть 200 узлов принятия решений. И 2 ^ 200 листовых узлов. Мы не будем изучать критерии разделения на каждом узле напрямую. Вместо этого мы изучим функцию, в частности матрицу, для прогнозирования вероятного символьного пути в результате умножения матрицы на входные переменные, а затем жесткой нелинейности.

В модели случайного леса эти пороговые значения изучаются иерархически, а не сразу. Однако мы собираемся изучать их параллельно и добиваться уменьшения примесей в одном направлении от начального до конечного индекса символического пути. Это однонаправленное уменьшение примесей будет заменять концепцию иерархического разделения узлов. Чтобы достичь этого, нам нужно сделать так, чтобы каждый разделенный узел в символическом пути голосовал за каждый класс, а затем вычислял нечистоту из этих голосов и постепенно уменьшал ее с запасом. Мы будем моделировать это голосование для класса при разбиении по нелинейности softmax.

Архитектурно полный поток выглядит так:

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

Схематично это выглядит так

Код обучения следующий:

Для вызова всех этих модулей используется следующий код:

Как видите, началась тренировка, которая идет ужасно медленно. Во второй части мы рассмотрим вывод этой модели.

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

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

Резюме

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