Перейти к основному содержимому

Выходы нейросети и функции потерь

В этом разделе обсудим, что будет представлять собой выходной слой (output layer) нейросети для задач регрессии и классификации.

Истинный отклик будем обозначать yy, который по вектору признаков xx предсказывается нейросетевым преобразованием f(x)f(x), зависящим от вектора весов ww.

Одномерная регрессия

В одномерной регрессии требуется предсказать одно число (скаляр) yy. Соответственно, у нейросети будет один нейрон на выходном слое.

  • Если значение прогноза может быть любым, то на выходном слое используется тождественная активация.

  • Если предсказывается неотрицательное значение, то к выходу применяется активация ReLU.

  • Если предсказывается положительное значение, то используется активация SoftPlus.

При прогнозе, который должен принимать значения внутри отрезка [1,+1][-1,+1], используется активация tangh или hard-tangh.

Что нужно дополнительно сделать если целевая величина y[a,b]y\in[a,b]?

Нужно перемасштабировать выход нейросети из отрезка [1,1][-1,1] в отрезок [a,b][a,b]:

f(x)a+(ba)f(x)+12f(\mathbf{x})\longrightarrow a+(b-a)\frac{f(\mathbf{x})+1}{2}

В качестве функции потерь, по которой мы будем настраивать веса, можно использовать любую дифференцируемую функцию, поскольку нейросети настраиваются градиентными методами оптимизациями, вычисляющими градиент этой функции по весам wL(fw(x),y)\nabla_w \mathcal{L}(f_w(x),y).

Например, можно взять квадрат ошибки:

L(f(x),y)=(f(x)y)2\mathcal{L}(f(\mathbf{x}),y)=(f(\mathbf{x})-y)^2

или модуль ошибки:

L(f(x),y)=f(x)y.\mathcal{L}(f(\mathbf{x}),y)=|f(\mathbf{x})-y|.

Последняя функция не дифференцируема в нуле, однако это не будет являться проблемой в общем случае, когда f(x)yf(\mathbf{x})\ne y.

Для набора объектов минимизируется среднее значение этих функций потерь по объектам. Среднее по квадратам отклонений называется mean squared error или MSE -оценкой. Среднее по модулям отклонений называется mean absolute error или MAE-оценкой.

Векторная регрессия

Если требуется решить задачу векторной регрессии, т.е. предсказывать не одно вещественное число, а сразу вектор yRK\mathbf{y}\in\mathbb{R}^K, то нужно задать архитектуру сети так, чтобы у неё было KK выходов.

Чем это лучше, чем делать K независимых прогнозов различными нейросетями для вектора из K откликов?

Если прогнозируемые величины связаны, например, когда предсказываем цены набора акций на следующий день (которые зависят от общих макроэкономических показателей), то эффективнее прогнозировать их одной нейросетью с K выходами:

  • на этапе обучения это приведёт к переиспользованию промежуточных признаков (активаций внутренних слоёв), настроенных для одного отклика другими откликами, в результате чего промежуточные признаки настроятся лучше, и модель будет работать точнее;

  • кроме того, это вычислительно эффективнее, поскольку не придётся перевычислять всю последовательность промежуточных признаков много раз для каждой отдельной модели.

Аналогично одномерной регрессии, для настройки весов можно использовать любую дифференцируемую функцию, например, квадрат L2L_2 нормы расхождения:

L(f(x),y)=f(x)y22\mathcal{L}(f(\mathbf{x}),\mathbf{y})=||f(\mathbf{x})-\mathbf{y}||^2_2

либо L1L_1 норму расхождения между прогнозом и фактическим значением:

L(f(x),y)=f(x)y1\mathcal{L}(f(\mathbf{x}),\mathbf{y})=||f(\mathbf{x})-\mathbf{y}||_1

Для набора объектов также минимизируется среднее значение этих функций потерь по объектам.

Бинарная классификация

Для бинарной классификации y{+1,1}y\in\{+1,-1\} выходной слой содержит один выход с сигмоидной функцией активации, которая принимает значения на интервале (0,1)(0,1), а её выход интерпретируется как вероятность положительного класса:

f(x)=p(y=+1x).f(\mathbf{x})=p(y=+1|\mathbf{x}).

Вероятность отрицательного класса считается как

p(y=1x)=1p(y=+1x)=1f(x).p(y=-1|\mathbf{x})=1-p(y=+1|\mathbf{x})=1-f(\mathbf{x}).

Настройка архитектуры производится методом максимального правдоподобия (максимизация вероятности пронаблюдать фактические отклики в обучающей выборке):

P(y1,...yNx1,...xN)=n=1Np(ynxn)maxw,(1)P(y_1,...y_N|\mathbf{x}_1,...\mathbf{x}_N)=\prod_{n=1}^N p(y_n|\mathbf{x}_n)\to\max_\mathbf{w}, \tag{1}

где NN - число объектов выборки, а вероятность всех откликов факторизуется (представляется в виде произведения вероятностей) при предположении, что наблюдения отдельных объектов независимы.

Максимизация (1) численно неудобна (приходится перемножать много малых чисел, за счёт чего быстро сходимся к машинному нулю), поэтому на практике максимизируют логарифм правдоподобия:

lnP(y1,...yNx1,...xN)=n=1Nlnp(ynxn)maxw,(2)\ln P(y_1,...y_N|\mathbf{x}_1,...\mathbf{x}_N)=\sum_{n=1}^N \ln p(y_n|\mathbf{x}_n)\to\max_\mathbf{w}, \tag{2}

Поскольку в машинном и глубоком обучении принято минимизировать функцию потерь, то в терминах функции потерь (2) записывается как

lnP(y1,...yNx1,...xN)=n=1Nlnp(ynxn)minw,(3)-\ln P(y_1,...y_N|\mathbf{x}_1,...\mathbf{x}_N)=-\sum_{n=1}^N \ln p(y_n|\mathbf{x}_n)\to\min_\mathbf{w}, \tag{3}

при этом чаще минимизируют не сумму, а среднее минус логарифмов вероятностей.

Почему неважно, минимизировать сумму или среднее?

Если интересует оптимальное значение весов w^\hat{w}, то минимизируемый критерий L(w)L(\mathbf{w}) можно домножать на любую положительную константу α>0\alpha>0 (в частности, α=1/N\alpha=1/N) - всё равно минимум будет достигаться в той же точке w^\hat{\mathbf{w}}.

Более того, к минимизируемому критерию можно применять любую монотонно возрастающую функцию G:L(w)G(L(w))G:\, L(\mathbf{w})\to G(L(\mathbf{w})), чем мы и пользовались, когда заменили максимизацию вероятностей в (1) максимизацией логарифма вероятностей в (2). Это не окажет влияние на оптимальные веса w^\hat{\mathbf{w}}, хотя, конечно, повлияет на само значение критерия. Но в настройке нейросетей нас интересует не сам критерий, а только веса, которые его минимизируют.

Кросс-энтропийные потери (бинарный случай)

Функция потерь (3) для одного объекта в случае бинарной классификации (на 2 класса) называется кросс-энтропийной функцией потерь (cross-entropy loss) и запишется как

L(f(x),y)=lnp(yx)=I{y=+1}lnf(x)I{y=1}ln(1f(x)),\begin{aligned} \mathcal{L}(f(\mathbf{x}),y)&=-\ln p(y|\mathbf{x})\\ &=-\mathbb{I}\{y=+1\}\ln f(\mathbf{x})-\mathbb{I}\{y=-1\}\ln (1-f(\mathbf{x})), \end{aligned}

где I{}\mathbb{I}\{\cdot\} - индикатор условия:

I{условие}={1, если условие выполнено,0, если условие не выполнено.\mathbb{I}\{\text{условие}\}=\begin{cases} 1, \text{ если условие выполнено,} \\ 0, \text{ если условие не выполнено.} \end{cases}

Потери для ненормированных рейтингов

Можно настраивать веса нейросети, используя предсказанный ненормированный рейтинг класса, а не его вероятность. В этом случае на выходном слое действует тождественная активация, а сама нейросеть настраивается, используя одну из функций потерь, штрафующих неправильный рейтинг, например, hinge:

L(f(x),y)=max{0,αyf(x)},\mathcal{L}(f(\mathbf{x}),y) = \max\{0, \alpha-yf(\mathbf{x})\},

где α>0\alpha>0 - гиперпараметр, обычно равный 1.

Многоклассовая классификация

В многоклассовой классификации отклик принимает одно из CC дискретных значений: y{1,2,...C}y\in\{1,2,...C\}. В этом случае на выходном слое нейросети создают CC выходов f1(x),....fC(x)f_1(\mathbf{x}),....f_C(\mathbf{x}), вычисляющими рейтинги классов. К этим выходам применяют SoftMax преобразование, с которым мы уже встречались в логистической регрессии, для того, чтобы получить вероятности классов.

SoftMax преобразование

SoftMax преобразование преобразует CC ненормированных рейтингов классов в CC вероятностей соответствующих классов по формулам:

p(y=1x)=ef1(x)/τc=1Cefc(x)/τ,p(y=2x)=ef2(x)/τc=1Cefc(x)/τ,    p(y=Cx)=efC(x)/τc=1Cefc(x)/τ,\begin{aligned} & p(y=1|\mathbf{x}) = \frac{e^{f_1(\mathbf{x})/\tau}}{\sum_{c=1}^C e^{f_c(\mathbf{x})/\tau}}, \\ & p(y=2|\mathbf{x}) = \frac{e^{f_2(\mathbf{x})/\tau}}{\sum_{c=1}^C e^{f_c(\mathbf{x})/\tau}}, \\ & \cdots \; \cdots \; \cdots\\ & p(y=C|\mathbf{x}) = \frac{e^{f_C(\mathbf{x})/\tau}}{\sum_{c=1}^C e^{f_c(\mathbf{x})/\tau}}, \\ \end{aligned}

где гиперпараметр температуры τ>0\tau>0 управляет контрастностью вероятностей (чем он выше, тем вероятности будут ближе к равномерному распределению). Его обычно полагают равным единице.

Почему можно брать τ=1\tau=1?

Параметр τ\tau отвечает за общий масштаб аргументов экспонент, которые и так автоматически настраиваются, причём независимо для каждого рейтинга за счёт настройки весов последнего слоя нейросети.

От какого вида преобразований f1(x),...,fC(x)f_1(\mathbf{x}), ... , f_C(\mathbf{x}) SoftMax-вероятности не меняются?

Формулы расчёта вероятностей через SoftMax инварианты к сдвигу на общую функцию g(x)g(x):

f1(x),...,fC(x)f1(x)+g(x),....,fC(x)+g(x)f_1(\mathbf{x}), ... , f_C(\mathbf{x}) \longrightarrow f_1(\mathbf{x})+g(\mathbf{x}), .... , f_C(\mathbf{x})+g(\mathbf{x})

Избавиться от этой неоднозначности можно введя регуляризатор, штрафующий абсолютные величины f1(x),...,fC(x)f_1(\mathbf{x}), ... , f_C(\mathbf{x}), либо всегда полагая рейтинг одного из классов тождественно равным нулю. Это не скажется на выразительной способности модели.

Кросс-энтропийные потери (многоклассовые)

Как только получены вероятности классов, производить настройку нейросети можно тем же методом максимального правдоподобия, как и в случае бинарной классификации. Функция потерь для отдельного объекта также называется кросс-энтропийной функцией потерь и будет вычисляться по формуле:

L(f(x),y)=lnp(yx)=c=1CI{y=c}lnfc(x)\begin{aligned} \mathcal{L}(f(\mathbf{x}),y)&=-\ln p(y|\mathbf{x})\\ &=-\sum_{c=1}^C\mathbb{I}\{y=c\}\ln f_c(\mathbf{x}) \end{aligned}

Потери для ненормированных рейтингов

Как и в бинарном случае, допускается настраивать веса нейросети, используя предсказанные рейтинги классов, а не их вероятности (после SoftMax). В этом случае на выходном слое действуют тождественные активации, но необходимо придумать обобщение функции потерь от рейтингов на многоклассовый случай.

Примеры обобщения для функции потерь hinge:
hinge1(x,y)=[maxcyfc(x)+αfy(x)]+hinge2(x,y)=cy[fc(x)+αfy(x)]+\begin{aligned} \text{hinge}_{1}(\mathbf{x},y)&=\left[\max_{c\ne y}f_{c}\left(\mathbf{x}\right)+\alpha-f_{y}\left(\mathbf{x}\right)\right]_{+} \\ \text{hinge}_{2}(\mathbf{x},y)&=\sum_{c\ne y}\left[f_{c}\left(\mathbf{x}\right)+\alpha-f_{y}\left(\mathbf{x}\right)\right]_{+} \end{aligned}

где α>0\alpha>0 - гиперпараметр, а [u]+=max{u;0}[u]_+=\max\{u;0\} - оператор положительной срезки.