.. _sec_softmax: Софтмакс-регрессия ================== В :numref:`sec_linear_regression` мы ввели линейную регрессию, проработав реализации с нуля в :numref:`sec_linear_scratch` и снова с помощью высокоуровневых API фреймворка глубокого обучения в :numref:`sec_linear_concise`, чтобы взять на себя основную работу. Регрессия — это инструмент, к которому мы обращаемся, когда хотим ответить на вопросы «сколько?» или «сколько раз?». Если вы хотите предсказать цену (в долларах), по которой будет продан дом, количество побед, которых может добиться бейсбольная команда, или количество дней, которые пациент проведет в больнице до выписки, то вам, вероятно, понадобится модель регрессии. Однако даже в рамках моделей регрессии существуют важные различия. Например, цена дома никогда не бывает отрицательной, а изменения часто носят *относительный* характер по отношению к его *базовому* решению (baseline price). В связи с этим может оказаться более эффективным проводить регрессию относительно логарифма цены. Аналогично, количество дней, которое пациент проводит в больнице, является *дискретной неотрицательной* случайной величиной. Поэтому метод наименьших квадратов также может оказаться неидеальным подходом. Подобное моделирование времени до наступления события сопряжено с множеством других сложностей, которые рассматриваются в специализированной области, называемой *выживаемым моделированием*. Суть не в том, чтобы перегрузить вас, а лишь в том, чтобы показать: оценка параметров — это не просто минимизация квадратичных ошибок. И в более широком смысле, *обучение с учителем* — это не только *регрессия*. В этом разделе мы сосредоточимся на задачах *классификации*, где мы оставляем вопросы «сколько?» за скобками и вместо этого фокусируемся на вопросах «какой это класс?». - Относится ли это письмо к папке «Спам» или к папке «Входящие»? - Скорее всего, этот клиент подпишется на сервис по подписке или нет? - Изображает ли это изображение осла, собаку, кошку или петуха? - Какой фильм Астон с наибольшей вероятностью посмотрит следующим? - Какой раздел книги вы собираетесь прочитать следующим? В обиходе специалисты по машинному обучению используют термин *классификация* для описания двух тонко различающихся задач: (i) тех, где нас интересуют только жёсткие отнесения примеров к категориям (классам); и (ii) тех, где мы хотим выполнять мягкие отнесения, то есть оценивать вероятность принадлежности каждого примера к той или иной категории. Эта граница часто размывается, отчасти потому, что даже когда нас интересуют только жёсткие отнесения, мы всё равно используем модели, которые дают мягкие отнесения. Более того, бывают случаи, когда истинными могут быть сразу несколько меток. Например, новостная статья может одновременно охватывать темы развлечений, бизнеса и космических полетов, но не касаться тем медицины или спорта. Таким образом, отнесение статьи к одной из вышеперечисленных категорий по отдельности было бы не очень полезным. Эта задача широко известна как `многометочная классификация `__. Обзор этой проблемы можно найти в :cite:t:`Tsoumakas.Katakis.2007`, а эффективный алгоритм для маркировки изображений — в :cite:t:`Huang.Xu.Yu.2015`. .. _subsec_classification-problem: Классификация ------------- Чтобы немного попрактиковаться, начнем с простой задачи классификации изображений. Здесь каждый входной образец представляет собой :math:`2\times2` полутоновое изображение. Мы можем представить значение каждого пикселя с помощью одного скаляра, что дает нам четыре признака :math:`x_1, x_2, x_3, x_4`. Кроме того, предположим, что каждое изображение относится к одной из категорий: «кошка», «курица» и «собака». Далее нам нужно выбрать способ представления меток. У нас есть два очевидных варианта. Наиболее естественным решением было бы выбрать :math:`y \in \{1, 2, 3\}`, где целые числа представляют категории :math:`\{\textrm{dog}, \textrm{cat}, \textrm{chicken}\}` соответственно. Это отличный способ *хранения* таких данных на компьютере. Если бы категории обладали естественным порядком, например, если бы мы пытались предсказать :math:`\{\textrm{baby}, \textrm{toddler}, \textrm{adolescent}, \textrm{young adult}, \textrm{adult}, \textrm{geriatric}\}`, то имело бы смысл свести эту задачу к `порядковой регрессии `__ и сохранить метки в таком формате. Обзор различных функций потерь для ранжирования см. в :cite:t:`Moon.Smola.Chang.ea.2010`, а байесовский подход, решающий проблему ответов с несколькими модами, — в :cite:t:`Beutel.Murray.Faloutsos.ea.2014`. В общем случае задачи классификации не предполагают естественного упорядочивания классов. К счастью, статистики давно придумали простой способ представления категориальных данных: *one-hot кодирование*. One-hot кодирование — это вектор, количество компонент которого равно числу категорий. Компонента, соответствующая категории конкретного объекта, устанавливается в 1, а все остальные компоненты равны 0. В нашем случае метка :math:`y` представляла бы собой трёхмерный вектор, где :math:`(1, 0, 0)` соответствует «кошке», :math:`(0, 1, 0)` — «курице», а :math:`(0, 0, 1)` — «собаке»: .. math:: y \in \{(1, 0, 0), (0, 1, 0), (0, 0, 1)\}. Линейная модель ~~~~~~~~~~~~~~~ Чтобы оценить условные вероятности, соответствующие всем возможным классам, нам нужна модель с несколькими выходами — по одному на каждый класс. Для решения задачи классификации с помощью линейных моделей нам потребуется столько аффинных функций, сколько у нас выходов. Строго говоря, нам достаточно на одну функцию меньше, поскольку итоговый класс определяется как разница между :math:`1` и суммой остальных классов, однако из соображений симметрии мы используем слегка избыточную параметризацию. Каждый выход соответствует своей собственной аффинной функции. В нашем случае, поскольку у нас 4 признака и 3 возможных выходных класса, нам нужно 12 скаляров для представления весов (:math:`w` с индексами) и 3 скаляра для представления смещений (:math:`b` с индексами). Это даёт: .. math:: \begin{aligned} o_1 &= x_1 w_{11} + x_2 w_{12} + x_3 w_{13} + x_4 w_{14} + b_1,\\ o_2 &= x_1 w_{21} + x_2 w_{22} + x_3 w_{23} + x_4 w_{24} + b_2,\\ o_3 &= x_1 w_{31} + x_2 w_{32} + x_3 w_{33} + x_4 w_{34} + b_3. \end{aligned} Соответствующая диаграмма нейронной сети приведена на рисунке :numref:`fig_softmaxreg`. Как и в линейной регрессии, мы используем однослойную нейронную сеть. Поскольку вычисление каждого выхода :math:`o_1, o_2`, :math:`o_3` зависит от всех входов :math:`x_1`, :math:`x_2`, :math:`x_3` и :math:`x_4`, выходной слой также можно описать как *полносвязный слой*. .. _fig_softmaxreg: .. figure:: ../img/softmaxreg.svg Софтмакс-регрессия — это однослойная нейронная сеть. Для более компактной записи мы используем векторы и матрицы: :math:`\mathbf{o} = \mathbf{W} \mathbf{x} + \mathbf{b}` гораздо лучше подходит для математики и кода. Обратите внимание, что мы собрали все веса в матрицу :math:`3 \times 4`, а все смещения :math:`\mathbf{b} \in \mathbb{R}^3` — в вектор. .. _subsec_softmax_operation: Софтмакс ~~~~~~~~ Предполагая наличие подходящей функции потерь, мы могли бы напрямую попытаться минимизировать разницу между :math:`\mathbf{o}` и метками :math:`\mathbf{y}`. Хотя на практике рассмотрение задачи классификации как проблемы регрессии с векторными значениями оказывается удивительно эффективным, такой подход всё же имеет следующие недостатки: - Нет гарантии, что выходы :math:`o_i` в сумме дают :math:`1`, как мы ожидаем от вероятностей. - Нет гарантии, что выходы :math:`o_i` являются неотрицательными, даже если их сумма равна :math:`1`, или что они не превышают :math:`1`. Оба этих аспекта делают задачу оценки сложной для решения, а решение — крайне неустойчивым к выбросам. Например, если мы предполагаем, что существует положительная линейная зависимость между количеством спален и правдоподобием того, что кто-то купит дом, то вероятность может превысить :math:`1`, когда речь заходит о покупке особняка! Таким образом, нам нужен механизм для «сжатия» выходов. Существует множество способов достичь этой цели. Например, мы можем предположить, что выходы :math:`\mathbf{o}` являются искажёнными версиями :math:`\mathbf{y}`, где искажение возникает за счёт добавления шума :math:`\boldsymbol{\epsilon}`, взятого из нормального распределения. Иными словами, :math:`\mathbf{y} = \mathbf{o} + \boldsymbol{\epsilon}`, где :math:`\epsilon_i \sim \mathcal{N}(0, \sigma^2)`. Это так называемая `пробит-модель `__, впервые предложенная :cite:t:`Fechner.1860`. Несмотря на свою привлекательность, она работает не так хорошо и не приводит к такой удобной задаче оптимизации, как софтмакс. Другой способ достичь этой цели (и обеспечить неотрицательность) — использовать экспоненциальную функцию :math:`P(y = i) \propto \exp o_i`. Она действительно удовлетворяет требованию о том, что условная вероятность класса возрастает с увеличением :math:`o_i`, является монотонной, и все вероятности неотрицательны. Затем мы можем преобразовать эти значения так, чтобы их сумма стала равна :math:`1`, разделив каждое из них на общую сумму. Этот процесс называется *нормализацией*. Объединив эти два шага, мы получаем функцию *софтмакс*: .. math:: \hat{\mathbf{y}} = \mathrm{softmax}(\mathbf{o}) \quad \textrm{where}\quad \hat{y}_i = \frac{\exp(o_i)}{\sum_j \exp(o_j)}. :label: eq_softmax_y_and_o Обратите внимание, что наибольшая координата :math:`\mathbf{o}` соответствует наиболее вероятному классу согласно :math:`\hat{\mathbf{y}}`. Кроме того, поскольку операция софтмакса сохраняет порядок между своими аргументами, нам не нужно вычислять софтмакс, чтобы определить, какому классу присвоена наибольшая вероятность. Таким образом, .. math:: \operatorname*{argmax}_j \hat y_j = \operatorname*{argmax}_j o_j. Идея софтмакса восходит к работам :cite:t:`Gibbs.1902`, которые адаптировали идеи из физики. Ещё более ранние корни этого подхода уходят к Больцману, отцу современной статистической физики, который использовал этот приём для моделирования распределения по энергетическим состояниям молекул газа. В частности, он обнаружил, что распространённость состояния с определённой энергией в термодинамическом ансамбле, таком как молекулы газа, пропорциональна :math:`\exp(-E/kT)`. Здесь :math:`E` — это энергия состояния, :math:`T` — температура, а :math:`k` — постоянная Больцмана. Когда статистики говорят об увеличении или уменьшении «температуры» статистической системы, они имеют в виду изменение :math:`T` для того, чтобы сделать более или менее вероятными состояния с низкой или высокой энергией. Следуя идее Гиббса, энергия приравнивается к ошибке. Энергетические модели :cite:`Ranzato.Boureau.Chopra.ea.2007` используют этот подход при описании задач глубокого обучения. .. _subsec_softmax_vectorization: Векторизация ~~~~~~~~~~~~ Для повышения вычислительной эффективности мы векторизуем вычисления в мини-батчах данных. Предположим, что нам дан мини-батч :math:`\mathbf{X} \in \mathbb{R}^{n \times d}` из :math:`n` примеров с размерностью (числом входов) :math:`d`. Кроме того, предположим, что у нас есть :math:`q` категорий на выходе. Тогда веса удовлетворяют условию :math:`\mathbf{W} \in \mathbb{R}^{d \times q}`, а смещение удовлетворяет условию :math:`\mathbf{b} \in \mathbb{R}^{1\times q}`. .. math:: \begin{aligned} \mathbf{O} &= \mathbf{X} \mathbf{W} + \mathbf{b}, \\ \hat{\mathbf{Y}} & = \mathrm{softmax}(\mathbf{O}). \end{aligned} :label: eq_minibatch_softmax_reg Это ускоряет основную операцию, сводя её к произведению матрица-на-матрицу :math:`\mathbf{X} \mathbf{W}`. Более того, поскольку каждая строка в :math:`\mathbf{X}` представляет собой пример данных, операцию софтмакс можно вычислять *по строкам*: для каждой строки в :math:`\mathbf{O}` нужно возвести все элементы в степень и затем нормализовать их, разделив на сумму. Однако следует соблюдать осторожность, чтобы избежать возведения в степень и взятия логарифма от больших чисел, так как это может привести к переполнению или недополнению. Фреймворки глубокого обучения решают эту проблему автоматически. .. _subsec_softmax-regression-loss-func: Функция потерь -------------- Теперь, когда у нас есть отображение признаков :math:`\mathbf{x}` в вероятности :math:`\mathbf{\hat{y}}`, нам нужен способ оптимизировать точность этого отображения. Мы будем опираться на метод максимального правдоподобия — тот самый метод, с которым мы сталкивались, давая вероятностное обоснование функции потерь среднеквадратичной ошибки в :numref:`subsec_normal_distribution_and_squared_loss`. Логарифм правдоподобия ~~~~~~~~~~~~~~~~~~~~~~ Функция софтмакс выдает нам вектор :math:`\hat{\mathbf{y}}`, который можно интерпретировать как (оценочные) условные вероятности каждого класса при любом входном значении :math:`\mathbf{x}`, например, :math:`\hat{y}_1` = :math:`P(y=\textrm{cat} \mid \mathbf{x})`. В дальнейшем мы будем считать, что для набора данных с признаками :math:`\mathbf{X}` метки :math:`\mathbf{Y}` представлены в виде вектора меток с использованием one-hot кодирования. Мы можем сравнить оценки с реальностью, проверив, насколько вероятны истинные классы согласно нашей модели при заданных признаках: .. math:: P(\mathbf{Y} \mid \mathbf{X}) = \prod_{i=1}^n P(\mathbf{y}^{(i)} \mid \mathbf{x}^{(i)}). Мы можем использовать факторизацию, поскольку предполагаем, что каждая метка выбирается независимо из своего распределения :math:`P(\mathbf{y}\mid\mathbf{x}^{(i)})`. Поскольку максимизация произведения членов неудобна, мы берём отрицательный логарифм, чтобы свести задачу к эквивалентной задаче минимизации отрицательного логарифма правдоподобия: .. math:: -\log P(\mathbf{Y} \mid \mathbf{X}) = \sum_{i=1}^n -\log P(\mathbf{y}^{(i)} \mid \mathbf{x}^{(i)}) = \sum_{i=1}^n l(\mathbf{y}^{(i)}, \hat{\mathbf{y}}^{(i)}), где для любой пары метки :math:`\mathbf{y}` и предсказания модели :math:`\hat{\mathbf{y}}` над :math:`q` классами функция потерь :math:`l` равна .. math:: l(\mathbf{y}, \hat{\mathbf{y}}) = - \sum_{j=1}^q y_j \log \hat{y}_j. :label: eq_l_cross_entropy По причинам, которые будут объяснены далее, функция потерь в :eq:`eq_l_cross_entropy` обычно называется *перекрёстной энтропией*. Поскольку :math:`\mathbf{y}` — это one-hot вектор длины :math:`q`, сумма по всем его координатам :math:`j` обращается в ноль для всех слагаемых, кроме одного. Обратите внимание, что функция потерь :math:`l(\mathbf{y}, \hat{\mathbf{y}})` ограничена снизу значением :math:`0`, если :math:`\hat{\mathbf{y}}` является вектором вероятностей: ни один из её элементов не превышает :math:`1`, следовательно, их отрицательный логарифм не может быть меньше :math:`0`; равенство :math:`l(\mathbf{y}, \hat{\mathbf{y}}) = 0` достигается только в том случае, если мы предсказываем истинную метку с *полной уверенностью*. Этого никогда не произойдёт при любом конечном наборе весов, поскольку получение значения софтмакса, стремящегося к :math:`1`, требует, чтобы соответствующий вход :math:`o_i` стремился к бесконечности (или чтобы все остальные выходы :math:`o_j` стремились к отрицательной бесконечности для :math:`j \neq i`). Даже если бы наша модель могла присвоить выходной вероятности значение :math:`0`, любая ошибка при присвоении такой высокой уверенности приводила бы к бесконечной функции потерь (:math:`-\log 0 = \infty`). .. _subsec_softmax_and_derivatives: Софтмакс и перекрёстная энтропия ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Поскольку функция софтмакс и соответствующая перекрёстная энтропия встречаются очень часто, стоит немного лучше разобраться в том, как они вычисляются. Подставляя :eq:`eq_softmax_y_and_o` в определение функции потерь из :eq:`eq_l_cross_entropy` и используя определение софтмакса, получаем .. math:: \begin{aligned} l(\mathbf{y}, \hat{\mathbf{y}}) &= - \sum_{j=1}^q y_j \log \frac{\exp(o_j)}{\sum_{k=1}^q \exp(o_k)} \\ &= \sum_{j=1}^q y_j \log \sum_{k=1}^q \exp(o_k) - \sum_{j=1}^q y_j o_j \\ &= \log \sum_{k=1}^q \exp(o_k) - \sum_{j=1}^q y_j o_j. \end{aligned} Чтобы лучше понять, что происходит, рассмотрим производную по любому логиту :math:`o_j`. Получаем .. math:: \partial_{o_j} l(\mathbf{y}, \hat{\mathbf{y}}) = \frac{\exp(o_j)}{\sum_{k=1}^q \exp(o_k)} - y_j = \mathrm{softmax}(\mathbf{o})_j - y_j. Другими словами, производная — это разница между вероятностью, присвоенной нашей моделью (как она выражается операцией софтмакс), и тем, что произошло на самом деле (как это выражается элементами вектора метки в формате one-hot). В этом смысле она очень похожа на то, что мы видели в регрессии, где градиент был разностью между наблюдением :math:`y` и оценкой :math:`\hat{y}`. Это не совпадение. В любой модели экспоненциального семейства градиенты логарифма правдоподобия задаются именно этим членом. Этот факт упрощает вычисление градиентов на практике. Теперь рассмотрим случай, когда мы наблюдаем не одно единственное значение, а целое распределение вероятностей по исходам. Мы можем использовать то же представление для метки, что и раньше :math:`\mathbf{y}`. Единственное отличие заключается в том, что вместо вектора, содержащего только бинарные значения, скажем :math:`(0, 0, 1)`, у нас теперь есть произвольный вектор вероятностей, скажем :math:`(0.1, 0.2, 0.7)`. Математика, которую мы ранее использовали для определения функции потерь :math:`l` в :eq:`eq_l_cross_entropy`, по-прежнему хорошо работает, просто интерпретация становится немного более общей. Это математическое ожидание функции потерь для распределения по меткам. Эта функция потерь называется *перекрёстной энтропией* и является одной из наиболее часто используемых функций потерь для задач классификации. Мы можем раскрыть смысл этого названия, введя лишь основы теории информации. Если говорить кратко, она измеряет количество битов, необходимых для кодирования того, что мы наблюдаем, :math:`\mathbf{y}`, относительно того, что мы предсказываем как ожидаемое, :math:`\hat{\mathbf{y}}`. Мы приводим очень краткое объяснение ниже. Более подробную информацию по теории информации можно найти в :cite:t:`Cover.Thomas.1999` или :cite:t:`mackay2003information`. .. _subsec_info_theory_basics: Основы теории информации ------------------------ Многие статьи по глубокому обучению опираются на интуицию и терминологию теории информации. Чтобы разобраться в них, нам нужен общий язык. Это руководство по выживанию. *Теория информации* изучает проблемы кодирования, декодирования, передачи и обработки информации (также называемой данными). Энтропия ~~~~~~~~ Центральная идея теории информации заключается в количественной оценке объёма информации, содержащегося в данных. Это накладывает ограничения на нашу способность сжимать данные. Для распределения :math:`P` его *энтропия* :math:`H[P]` определяется как: .. math:: H[P] = \sum_j - P(j) \log P(j). :label: eq_softmax_reg_entropy Одна из фундаментальных теорем теории информации утверждает, что для кодирования данных, случайно выбранных из распределения :math:`P`, необходимо не менее :math:`H[P]` «нат» :cite:`Shannon.1948`. Если вы не знаете, что такое «нат», то это аналог бита, но для кода с основанием :math:`e` вместо основания 2. Таким образом, один нат равен :math:`\frac{1}{\log(2)} \approx 1.44` бита. Сюрприз ~~~~~~~ Возможно, вам интересно, какое отношение сжатие имеет к предсказанию. Представьте, что у нас есть поток данных, который мы хотим сжать. Если предсказать следующий токен всегда легко, то и сжать эти данные тоже легко. Рассмотрим крайний пример, когда каждый токен в потоке всегда принимает одно и то же значение. Это очень скучный поток данных! И не только скучный, но и легко предсказуемый. Поскольку токены всегда одинаковы, нам не нужно передавать никакой информации, чтобы сообщить содержимое потока. Легко предсказуемо — легко сжать. Однако, если мы не можем идеально предсказывать каждое событие, то иногда мы можем испытывать удивление. Степень удивления возрастает, когда событию присваивается меньшая вероятность. Клод Шеннон ввел :math:`\log \frac{1}{P(j)} = -\log P(j)` для количественной оценки *удивления* при наблюдении события :math:`j`, которому была присвоена (субъективная) вероятность :math:`P(j)`. Энтропия, определённая в :eq:`eq_softmax_reg_entropy`, представляет собой *ожидаемое удивление* при условии, что присваиваются верные вероятности, точно соответствующие процессу генерации данных. Перекрёстная энтропия: повторное рассмотрение ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Если энтропия — это уровень удивления, испытываемого тем, кто знает истинные вероятности, то, возможно, вы задаетесь вопросом: что такое перекрёстная энтропия? Перекрёстная энтропия *от* :math:`P` *к* :math:`Q`, обозначаемая :math:`H(P, Q)`, — это ожидаемое удивление наблюдателя с субъективными вероятностями :math:`Q` при наблюдении данных, которые на самом деле были сгенерированы согласно вероятностям :math:`P`. Это выражается формулой :math:`H(P, Q) \stackrel{\textrm{def}}{=} \sum_j - P(j) \log Q(j)`. Минимально возможное значение перекрёстной энтропии достигается, когда :math:`P=Q`. В этом случае перекрёстная энтропия от :math:`P` к :math:`Q` равна :math:`H(P, P)= H(P)`. Короче говоря, цель классификации с перекрёстной энтропией можно рассматривать двумя способами: (i) как максимизацию правдоподобия наблюдаемых данных; и (ii) как минимизацию нашей степени удивления (и, следовательно, количества битов), необходимых для передачи меток. Итоги и обсуждение ------------------ В этом разделе мы познакомились с первой нетривиальной функцией потерь, позволяющей оптимизировать *дискретные* пространства выходных данных. Важнейшим аспектом её разработки стал вероятностный подход, при котором дискретные категории рассматриваются как реализации выборок из распределения вероятностей. В качестве побочного эффекта мы столкнулись с софтмаксом — удобной функцией активации, преобразующей выходы обычного слоя нейронной сети в корректные дискретные распределения вероятностей. Мы увидели, что производная функции потерь перекрёстной энтропии в сочетании с софтмаксом ведёт себя очень похоже на производную функции среднеквадратичной ошибки, а именно: она представляет собой разницу между ожидаемым поведением и предсказанием. И, хотя мы лишь поверхностно коснулись этой темы, мы обнаружили увлекательные связи со статистической физикой и теорией информации. Хотя этого достаточно, чтобы вы могли начать, и, надеемся, пробудить интерес, мы здесь лишь поверхностно затронули тему. В частности, мы опустили вопросы вычислительной сложности. А именно, для любого полносвязного слоя с :math:`d` входами и :math:`q` выходами параметризация и вычислительная стоимость составляют :math:`\mathcal{O}(dq)`, что на практике может быть чрезмерно высоким. К счастью, стоимость преобразования :math:`d` входов в :math:`q` выходов можно снизить с помощью аппроксимации и сжатия. Например, в Deep Fried Convnets :cite:`Yang.Moczulski.Denil.ea.2015` используется комбинация перестановок, преобразований Фурье и масштабирования для снижения стоимости с квадратичной до логарифмически линейной. Аналогичные методы работают и для более сложных структурных аппроксимаций матриц :cite:`sindhwani2015structured`. Наконец, мы можем использовать разложения, подобные кватернионным, чтобы снизить стоимость до :math:`\mathcal{O}(\frac{dq}{n})`, опять же, если мы готовы пожертвовать небольшой точностью ради вычислительных затрат и затрат на хранение :cite:`Zhang.Tay.Zhang.ea.2021`, зависящих от коэффициента сжатия :math:`n`. Это активная область исследований. Сложность заключается в том, что мы не обязательно стремимся к наиболее компактному представлению или наименьшему количеству операций с плавающей запятой, а скорее к решению, которое может быть выполнено наиболее эффективно на современных графических процессорах. Упражнения ---------- 1. Мы можем глубже исследовать связь между экспоненциальными семействами и софтмаксом. 1. Вычислите вторую производную перекрёстной энтропии :math:`l(\mathbf{y},\hat{\mathbf{y}})` для софтмакса. 2. Вычислите дисперсию распределения, заданного :math:`\mathrm{softmax}(\mathbf{o})`, и покажите, что она совпадает со второй производной, вычисленной выше. 2. Предположим, что у нас есть три класса, которые встречаются с одинаковой вероятностью, то есть вектор вероятностей равен :math:`(\frac{1}{3}, \frac{1}{3}, \frac{1}{3})`. 1. Какая проблема возникает, если мы пытаемся разработать для этого двоичный код? 2. Можете ли вы разработать более эффективный код? Подсказка: что произойдет, если мы попробуем закодировать два независимых наблюдения? А если закодировать :math:`n` наблюдений совместно? 3. При кодировании сигналов, передаваемых по физическому проводу, инженеры не всегда используют двоичные коды. Например, `PAM-3 `__ использует три уровня сигнала :math:`\{-1, 0, 1\}` вместо двух уровней :math:`\{0, 1\}`. Сколько триадных разрядов нужно, чтобы передать целое число из диапазона :math:`\{0, \ldots, 7\}`? Почему это может быть более предпочтительным с точки зрения электроники? 4. Модель `Брэдли–Терри `__ использует логистическую модель для описания предпочтений. Чтобы пользователь мог выбрать между яблоками и апельсинами, предполагаются оценки :math:`o_{\textrm{apple}}` и :math:`o_{\textrm{orange}}`. Мы требуем, чтобы большие оценки приводили к более высокому правдоподобию выбора соответствующего элемента, а элемент с наибольшей оценкой был наиболее вероятным для выбора :cite:`Bradley.Terry.1952`. 1. Докажите, что софтмакс удовлетворяет этому требованию. 2. Что произойдет, если мы захотим предусмотреть вариант по умолчанию, при котором пользователь не выбирает ни яблоки, ни апельсины? Подсказка: теперь у пользователя есть три варианта. 5. Софтмакс получил своё название благодаря следующему отображению: :math:`\textrm{RealSoftMax}(a, b) = \log (\exp(a) + \exp(b))`. 1. Докажите, что :math:`\textrm{RealSoftMax}(a, b) > \mathrm{max}(a, b)`. 2. Насколько малым можно сделать разность между обеими функциями? Подсказка: без ограничения общности можно положить :math:`b = 0` и :math:`a \geq b`. 3. Докажите, что это верно для :math:`\lambda^{-1} \textrm{RealSoftMax}(\lambda a, \lambda b)`, при условии :math:`\lambda > 0`. 4. Покажите, что для :math:`\lambda \to \infty` выполняется :math:`\lambda^{-1} \textrm{RealSoftMax}(\lambda a, \lambda b) \to \mathrm{max}(a, b)`. 5. Постройте аналогичную функцию софтмин. 6. Обобщите это на случай более чем двух чисел. 6. Функцию :math:`g(\mathbf{x}) \stackrel{\textrm{def}}{=} \log \sum_i \exp x_i` иногда также называют [функцией логарифма нормирующей константы](https://en.wikipedia.org/wiki/Partition_function\_(mathematics). 1. Докажите, что функция выпукла. Подсказка: используйте тот факт, что первая производная равна вероятностям, получаемым с помощью функции софтмакс, и покажите, что вторая производная равна дисперсии. 2. Покажите, что :math:`g` инвариантно относительно сдвига, т. е. :math:`g(\mathbf{x} + b) = g(\mathbf{x})`. 3. Что произойдет, если некоторые из координат :math:`x_i` будут очень большими? Что произойдет, если они все будут очень маленькими? 4. Покажите, что при выборе :math:`b = \mathrm{max}_i x_i` мы получаем численно устойчивую реализацию. 7. Предположим, что у нас есть некоторое распределение вероятностей :math:`P`. Допустим, мы выбираем другое распределение :math:`Q` с :math:`Q(i) \propto P(i)^\alpha` для :math:`\alpha > 0`. 1. Какой выбор :math:`\alpha` соответствует удвоению температуры? Какой выбор соответствует его уменьшению вдвое? 2. Что произойдет, если мы позволим температуре стремиться к :math:`0`? 3. Что произойдёт, если мы позволим температуре стремиться к :math:`\infty`? `Обсуждения `__