Недавно натолкнулся на вопрос в чате 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°, так что не удивляйтесь, если он чуть более рандомен, чем вы бы ожидали ¯\_(ツ)_/¯ Разработчик / Аналитик / Data Scientist / NLPшник