- PVSM.RU - https://www.pvsm.ru -

Сэмплирование с температурой

Недавно натолкнулся на вопрос в чате ODS [1]: почему алгоритм, генерирующий текст буква-за-буквой, сэмплит буквы не из p (вектор вероятностей следующей буквы, предсказанный языковой моделью [2]), а из p'=softmax(log(p)/t) (где t — это ещё какой-то непонятный положительный скаляр)?

Быстрый и непонятный ответ: t — это "температура", и она позволяет управлять разнообразием генерируемых текстов. А ради длинного и детального ответа, собственно, и написан этот пост.
Сэмплирование с температурой - 1

Немножко математики

Во-первых, напомню, что softmax(x)=exp(x)/sum(exp(x)) (exp, log, и деление векторов — покомпонентные). Получается, что если t=1, то логарифм и экспонента взаимоуничтожаются, и получаем p'=p. То есть с единичной температурой это преобразование ничего не меняет.

Что произойдёт, если сделать температуру очень большой? В софтмакс попадут (почти) нули, и на выходе мы получим (почти) одинаковые числа, примерно 1/n, где n — размерность p (число букв в алфавите). То есть на очень высоких температурах мы забиваем на то, что предсказала языковая модель, и сэмплим из всех букв равновероятно.

А если мы установим температуру, близкую к нулю, то каждая компонента p' будет очень-большой-экспонентой, делённой на сумму очень-больших-экспонент. В пределе, та буква, которой соответствовало самое большое значение p, задоминирует все остальные, и p' будет стремиться к единице для неё и к нулю для всех остальных букв. То есть на очень низких температурах мы всегда выбираем самую вероятную букву (даже если её абсолютная вероятность не так уж высока — скажем, только 5%).

Основной вывод

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

На картинке выше приведены примеры сэмплирования с разной температурой из модели GPT-2, через эту чудную страничку [3], поддерживаемую группой Hugging Face. GPT-2 генерирует тексты не по буквам и не по словам, а по BPE-токенам (специально подобранным последовательностям букв), но суть от этого не особо меняется.

Немножко физики

А при чём тут температура, можете спросить вы. Ответ — это отсылка к распределению Больцмана [4], используемому в термодинамике. Это распределение описывает вероятность состояний, в которых находится система (например, несколько молекул газа, запертые в бутылке), в зависимости от температуры системы и уровня потенциальной энергии, соответствующего этим состояниям. При переходе из высокоэнергетического состояния в низкоэнергетическое энергия высвобождается (превращается в тепло), а наоборот — тратится. Поэтому система чаще будет оказываться в состояниях с низкой энергией (в них проще попасть, сложнее покинуть, и невозможно забыть), но чем выше температура, тем чаще система всё-таки будет запрыгивать и в высокоэнергетические состояния тоже. Больцман, собственно, описал эти закономерности формулой, и получил как раз таки p=softmax(-energy/t).

Я уже писал в своём бложике об энтропии (1 [5],2 [6],3 [7]), но толком не объяснял, каким образом энтропия статистическая связана с понятием энтропии в физике. А вот собственно через распределение Больцмана они, кажется, и связаны. Но тут уж я лучше вас отошлю читать труды по физике, а сам пойду дальше NLP заниматься. Низких вам перплексий!

P.S. Этот текст был написан под температурой около 38°, так что не удивляйтесь, если он чуть более рандомен, чем вы бы ожидали ¯_(ツ)_/¯

Автор: Давид Дале

Источник [8]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/matematika/329947

Ссылки в тексте:

[1] ODS: http://habrahabr.ru/company/ods

[2] языковой моделью: https://en.wikipedia.org/wiki/Language_model

[3] эту чудную страничку: https://transformer.huggingface.co/doc/gpt2-large

[4] распределению Больцмана: https://en.wikipedia.org/wiki/Boltzmann_distribution

[5] 1: https://vk.com/wall-130785301_177

[6] 2: https://vk.com/wall-130785301_179

[7] 3: https://vk.com/wall-130785301_180

[8] Источник: https://habr.com/ru/post/467189/?utm_source=habrahabr&utm_medium=rss&utm_campaign=467189