Недавно натолкнулся на вопрос в чате ODS: почему алгоритм, генерирующий текст буква-за-буквой, сэмплит буквы не из p
(вектор вероятностей следующей буквы, предсказанный языковой моделью), а из p'=softmax(log(p)/t)
(где t
— это ещё какой-то непонятный положительный скаляр)?
Быстрый и непонятный ответ: t
— это "температура", и она позволяет управлять разнообразием генерируемых текстов. А ради длинного и детального ответа, собственно, и написан этот пост.
Немножко математики
Во-первых, напомню, что softmax(x)=exp(x)/sum(exp(x))
(exp, log, и деление векторов — покомпонентные). Получается, что если t=1
, то логарифм и экспонента взаимоуничтожаются, и получаем p'=p
. То есть с единичной температурой это преобразование ничего не меняет.
Что произойдёт, если сделать температуру очень большой? В софтмакс попадут (почти) нули, и на выходе мы получим (почти) одинаковые числа, примерно 1/n
, где n
— размерность p
(число букв в алфавите). То есть на очень высоких температурах мы забиваем на то, что предсказала языковая модель, и сэмплим из всех букв равновероятно.
А если мы установим температуру, близкую к нулю, то каждая компонента p'
будет очень-большой-экспонентой, делённой на сумму очень-больших-экспонент. В пределе, та буква, которой соответствовало самое большое значение p
, задоминирует все остальные, и p'
будет стремиться к единице для неё и к нулю для всех остальных букв. То есть на очень низких температурах мы всегда выбираем самую вероятную букву (даже если её абсолютная вероятность не так уж высока — скажем, только 5%).
Основной вывод
То есть семплирование с температурой — это общий вид разных видов семплирования, в разной степени учитывающих предсказания модели. Это нужно, чтобы лавировать между уверенностью модели и разнообразием. Можно поднимать температуру, чтобы генерировать более разнообразные тексты, или опускать её, чтобы генерировать тексты, в которых модель в среднем более уверена. И, естественно, это всё относится не только к генерации текстов, а вообще к любым вероятностным моделям.
На картинке выше приведены примеры сэмплирования с разной температурой из модели GPT-2, через эту чудную страничку, поддерживаемую группой Hugging Face. GPT-2 генерирует тексты не по буквам и не по словам, а по BPE-токенам (специально подобранным последовательностям букв), но суть от этого не особо меняется.
Немножко физики
А при чём тут температура, можете спросить вы. Ответ — это отсылка к распределению Больцмана, используемому в термодинамике. Это распределение описывает вероятность состояний, в которых находится система (например, несколько молекул газа, запертые в бутылке), в зависимости от температуры системы и уровня потенциальной энергии, соответствующего этим состояниям. При переходе из высокоэнергетического состояния в низкоэнергетическое энергия высвобождается (превращается в тепло), а наоборот — тратится. Поэтому система чаще будет оказываться в состояниях с низкой энергией (в них проще попасть, сложнее покинуть, и невозможно забыть), но чем выше температура, тем чаще система всё-таки будет запрыгивать и в высокоэнергетические состояния тоже. Больцман, собственно, описал эти закономерности формулой, и получил как раз таки p=softmax(-energy/t)
.
Я уже писал в своём бложике об энтропии (1,2,3), но толком не объяснял, каким образом энтропия статистическая связана с понятием энтропии в физике. А вот собственно через распределение Больцмана они, кажется, и связаны. Но тут уж я лучше вас отошлю читать труды по физике, а сам пойду дальше NLP заниматься. Низких вам перплексий!
P.S. Этот текст был написан под температурой около 38°, так что не удивляйтесь, если он чуть более рандомен, чем вы бы ожидали ¯_(ツ)_/¯
Автор: Давид Дале