Обучение глубоких нейронных сетей обычно сводится к определению архитектуры вашей модели и функции потерь, а также к наблюдению за распространением градиентов.
Однако иногда все не так просто: некоторые архитектуры включают случайный компонент. Прямой проход больше не является детерминированной функцией ввода и весов. Случайная составляющая вносит стохастичность посредством выборки из нее.
Когда это произойдет, спросите вы? Всякий раз, когда мы хотим аппроксимировать неразрешимую сумму или интеграл. Затем мы можем сформировать оценку Монте-Карло. Хороший пример вариационный автоэнкодер. По сути, это автоэнкодер на стероидах: работа энкодера состоит в том, чтобы выучить распределение над скрытым пространством. Функция потерь содержит трудноразрешимое ожидание по этому распределению, поэтому мы делаем выборку из него.
Как и в любой архитектуре, градиенты должны распространяться на веса модели. Некоторые из весов отвечают за преобразование входных данных в параметры распределения, из которого мы делаем выборку. Здесь мы сталкиваемся с проблемой: градиенты не могут распространяться через случайные узлы! Следовательно, эти веса не будут обновлены.
Одним из решений проблемы является прием репараметризации: вы заменяете выборочную случайную величину детерминированным параметризованным преобразованием случайной величины без параметров.
Если вы не знаете этого трюка, я настоятельно рекомендую вам читать об этом. Я продемонстрирую это на примере Гаусса:
Пусть $Z \sim \mathcal{N}(\mu(X), \sigma^2(X))$. Параметры гауссиана зависят от входных данных $X$, например, от выходных данных сложенных плотных слоев. При выборке реализаций $Z$ градиенты не смогут распространяться на веса плотных слоев. Мы можем заменить $Z$ другой случайной величиной $Z’ = \mu(X) + \sigma(X) \cdot \mathcal{E}$, где $\mathcal{E} \sim \mathcal{N}(0 , 1)$. Теперь выборка будет из $\mathcal{E}$, поэтому градиенты не будут распространяться по этому пути, что нас не волнует. Однако через $\mu(X)$ и $\sigma(X)$ они будут, так как это детерминированный путь.
Для многих типов непрерывных распределений вы можете проделать трюк с репараметризацией. Но что делать, если вам нужно, чтобы распределение было по дискретному набору значений?
В следующих разделах вы узнаете:
- что такое распределение Гамбеля
- как он используется для выборки из дискретного распределения
- как можно обучить веса, влияющие на параметры распределения
- как использовать все это в игрушечном примере (с кодом)
Распределение Гамбеля имеет два параметра — $\mu$ и $\beta$. Стандартное распределение Гамбеля, где $\mu$ и $\beta$ равны 0 и 1 соответственно, имеет PDF $e^{-(x + e^{-x})}$.
Зачем вам этот дистрибутив? Рассмотрим настройку, в которой у вас есть дискретная случайная величина, логиты которой равны $\{\alpha_i\}_{i=1}^k$. Логиты являются функцией входных данных и весов, которые необходимо обучить.
То, что я собираюсь описать далее, называется трюком Гамбеля-макс. Используя этот прием, вы можете семплировать из дискретного распределения. Процесс выглядит следующим образом:
- Выборка iid выборки $\{z_i\}_{i=1}^k$ из стандартного распределения Гумбеля.
- Добавьте образцы в логиты: $\{\alpha_i + z_i\}_{i=1}^k$.
- Возьмем индекс максимального значения: $\text{argmax}_{i=1}^k\alpha_i + z_i$.
Результатом будет случайная выборка вашего исходного дистрибутива. Вы можете прочитать доказательство здесь.
Большой! Таким образом, мы смогли заменить наше распределение детерминированным преобразованием распределения без параметров! Итак, если мы подключим его к нашей модели, градиенты смогут распространяться на веса логитов, верно?
Ну не так быстро! Градиенты не могут распространяться через argmax…
Использование argmax эквивалентно использованию одного горячего вектора, где запись, соответствующая максимальному значению, равна 1.
Таким образом, вместо того, чтобы использовать жесткий горячий вектор, мы можем аппроксимировать его с помощью мягкого — softmax.
Процесс аналогичен описанному выше, за исключением того, что теперь вы применяете softmax вместо argmax.
И вуаля! Градиенты могут распространяться на веса логитов.
Есть один гиперпараметр, о котором я вам (пока) не рассказал — температура:
$\frac{\text{exp}((\log(\alpha_i)+z_i) \cdot \tau^{-1})}{\sum_{j=1}^k \text{exp}((\log (\alpha_j)+z_j) \cdot \tau^{-1})}$
Разделив на температуру $\tau > 0$, мы можем контролировать, насколько близко будет приближение к argmax. При $\tau \to 0$ запись, соответствующая максимальному значению, будет стремиться к 1, а остальные записи будут стремиться к 0. При $\tau \to \infty$ результат будет стремиться к равномерному. Чем меньше $\tau$, тем лучше получается аппроксимация. Проблема с установкой $\tau$ на маленькие значения заключается в том, что дисперсия градиентов будет слишком высокой. Это усложнит обучение. Хорошей практикой является начинать с большой температуры, а затем отжигать ее до малых значений.
Вы можете прочитать больше о трюке Gumbel-softmax здесь и здесь.
Чтобы показать, что теория работает в реальной жизни, я воспользуюсь игрушечной задачкой. Данные представляют собой поток чисел в диапазоне от 0 до 4. Каждое число имеет разную вероятность появления в потоке. Ваша миссия, если вы решите принять ее, состоит в том, чтобы выяснить, каково распределение по 5 числам.
Простым решением было бы считать, но мы собираемся сделать кое-что гораздо круче (и смехотворно слишком сложное для этой задачи): мы будем обучать ГАН. Генератор будет генерировать числа из распределения, которое должно сходиться к реальному.
Вот интуиция, почему это должно работать: скажем, истинная вероятность, связанная с числом 0, равна 0. Дискриминатор узнает, что 0 никогда не бывает с ярлыком РЕАЛЬНОСТЬ. Следовательно, генератор будет нести большие потери всякий раз, когда он генерирует 0. Это побудит генератор перестать генерировать 0.