"Обработка естественного языка"

НЛП с использованием учебников по глубокому обучению: понимание функции потерь

Эта статья является частью серии, которую я пишу, и в которой я попытаюсь затронуть тему использования глубокого обучения в НЛП. Прежде всего, я писал статью для примера классификации текста с помощью персептрона, но подумал, что будет лучше сначала рассмотреть некоторые основы, такие как функции активации и потери.

Функция потерь, также называемая целевой функцией, является одним из основных элементов алгоритма контролируемого машинного обучения, основанного на размеченных данных. Функция потерь направляет алгоритм обучения для правильного обновления параметров. В очень простом определении функция потерь принимает истину (y) и прогноз (ŷ) в качестве входных данных и дает оценку реального числа. Это значение указывает, насколько прогноз близок к истине. Чем выше это значение, тем хуже предсказание модели, и наоборот.

В этой статье я представляю три из используемых Мозесом функций потерь.

1. Функция среднеквадратичной ошибки потерь

Функция потерь среднеквадратичной ошибки, известная как MSE, чаще всего используется в задачах регрессии, имеющих непрерывные значения цели (y) и прогноза (ŷ). MSE — это среднее квадратов разницы между целевым и прогнозируемым значениями. Существуют и другие альтернативы для MSE, такие как средняя абсолютная ошибка (MAE) или среднеквадратическая ошибка (RMSE), но все эти функции основаны на вычислении реального расстояния между целями и прогнозами (выход).

Математическая формула MSE:

И пример реализации с использованием Pytorch:

import torch
import torch.nn as nn

# Mean Squared Error Loss
mse_loss = nn.MSELoss()
outputs = torch.randn(3, 5, requires_grad=True)
targets = torch.randn(3, 5)
loss = mse_loss(outputs, targets)
print(f'Mean Squared Erro loss : {loss}')
# Output 
# Mean Squared Erro loss : 3.128143787384033

2. Категориальная функция кросс-энтропийных потерь

Категориальная функция перекрестной энтропийной потери обычно используется в мультиклассовой классификации, в которой выходные данные (ŷ) представляют собой вероятности целевых классов. Целевая истина (y) — это вектор из n элементов, представляющих истинное полиномиальное распределение. Для этого требуются два свойства значений (y): сумма всех элементов равна единице и все элементы положительны. Если один класс правильный, вектор (y) является однократным вектором. Прогнозируемый результат (ŷ) имеет те же свойства, что и (y).

Математическая формула кросс-энтропийной потери:

Чтобы лучше использовать Cross-Entropy Loss, вам необходимо понимать три математических аспекта:

  • Существует предел тому, насколько маленьким или большим может быть число. Чтобы избежать этого случая, вы можете добавить «Функция масштабирования» к своим выходам и/или входам. (Пример: sklearn.preprocessing.StandardScaler)
  • Если вход экспоненциальной функции, используемой в формуле softmax, является отрицательным числом, результирующая является экспоненциально малым числом, а если это положительное число, результирующая является экспоненциально большим числом.
  • А логарифмическая функция является обратной экспоненциальной функции, что означает, что log(exp(x)) равен x.

Таким образом, чтобы получить оптимизированное распределение вероятностей с использованием Cross-Entropy Loss, на этапе обучения вашей сети вам необходимо избегать использования функции softmax. Затем, когда модель обучена, вы можете использовать функцию softmax, чтобы получить вероятности предсказания.

Наконец, вот пример реализации CrossEntropy Loss с использованием Pytorch:

import torch
import torch.nn as nn

# Cross-entropy Loss
ce_loss = nn.CrossEntropyLoss()
outputs = torch.randn(3, 5, requires_grad=True)
targets = torch.tensor([1, 0, 3], dtype=torch.int64)
loss = ce_loss(outputs, targets)
print(f'Cross Entropy Loss : {loss}')
# OutPut :
# Cross Entropy Loss : 1.7309303283691406

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

3. Бинарная функция кросс-энтропийных потерь

Функция Binary Cross-Entropy Loss используется в задачах классификации, которые включают различение двух классов, известных как бинарная классификация.

Математическая формула:

А вот пример реализации с использованием Pytorch:

import torch
import torch.nn as nn

# Binary Cross-Entropy Loss
bce_loss = nn.BCELoss()
sigmoid = nn.Sigmoid()
probabilities = sigmoid(torch.randn(4, 1, requires_grad=True))
targets = torch.tensor([1, 0, 1, 0], dtype=torch.float32).view(4, 1)
loss = bce_loss(probabilities, targets)
print(f'This is probabilities : {probabilities}')
print(f'bce loss : {loss}')
# Output 
# This is probabilities : tensor([[0.8276],
#        [0.4056],
#        [0.4190],
#        [0.5984]], grad_fn=<SigmoidBackward>)
# bce loss : 0.6229268312454224

В приведенном ниже примере мы создали двоичный выходной вектор вероятности «вероятности», используя сигмовидную функцию активации. Затем мы создаем целевой вектор из 0 и 1, который представляет собой индекс двух целевых классов. Наконец, мы используем эти две переменные, вероятности и цель, для расчета значения убытка с помощью бинарной кросс-энтропийной функции.

Вывод

В этой статье я представил три функции Loss. Также обратите внимание, что Pytorch реализует больше функций потерь в своем пакете nn, который вы можете изучить по этой ссылке. https://pytorch.org/docs/stable/nn.html#loss-functions
Каждая функция потерь рекомендуется для некоторых случаев. Однако вы не должны стесняться экспериментировать с другими функциями потерь в разных случаях, когда это возможно.

Ссылки:

  1. Книга Обработка естественного языка с помощью Pytorch (https://www.amazon.fr/Natural-Language-Processing-Pytorch-Applications/dp/1491978236)