1. Рассмотрим Два нейрона в последнем слое, учитывая эти выходные данные на 6 входных данных.
tensor([[ 0.6734,  0.2576],
            [ 0.4689,  0.4607],
            [-2.2457, -0.3727],
            [ 4.4164, -1.2760],
            [ 0.9233,  0.5347],
[ 1.0698,  1.6187]])

2. Давайте сделаем это в диапазоне от 0 до 1 — Используя Sigmoid — Вероятность быть 1-м классом в первом столбце и вторым классом во втором столбце

tensor([[0.6623, 0.5641],
            [0.6151, 0.6132],
            [0.0957, 0.4079],
            [0.9881, 0.2182],
            [0.7157, 0.6306],[0.7446, 0.8346]])

3. Выберите функцию принятия решения по критерию — могут быть разные возможности, я могу сказать 0,66> 0,56, так что это 3, иначе 7. Еще один критерий — проверить разницу активаций и взять сигмоиду — так что это значит, как полностью уверен, что мы скорее 3, чем 7. Sigmoid(0,6734–0,2576) = 0,6025означает, что я (0,6025–0) более уверен в 3 чем 7, это означает из-за диапазона значений от 0 до 1. обратите внимание.Что, если диапазон значений находится в диапазоне от -3 до 6, тогда он будет (0,6025–(-3) ).

Давайте поговорим о логарифмическом правдоподобии

Как и в предыдущих главах, мы видели код для получения приведенной ниже функции потерь для набора данных MNIST.

def mnist_loss(inputs, targets):
 inputs = inputs.sigmoid()
 return torch.where(targets==1, 1-inputs, inputs).mean()

Мотивация для перехода от сигмоида к softmax — это расширение функции потерь для работы более чем с двумя категориями, как описано в шагах после применения softmax к последнему слою нейронной сети, она передается на уровень активации, что делает находится в диапазоне от 0 до 1, а сумма равна 1.

Давайте применим Softmax в двоичной классификации

  1. Допустим, у нас есть 6 примеров с меткой 0 или 1, приведенной ниже:
targ = tensor([0,1,0,1,1,0])

2. softmax, примененный к последнему слою и переданный слою активации, дает

Tensor([[0.6025, 0.3975],
            [0.5021, 0.4979],
            [0.1332, 0.8668],
            [0.9966, 0.0034],
            [0.5959, 0.4041],[0.3661, 0.6339]])

3. Расчетный убыток определяется по формуле

idx = range(6)
sm_acts[idx, targ]
Output:
tensor([0.6025, 0.4979, 0.1332, 0.0034, 0.4041, 0.3661])

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

4. То же самое можно расширить для работы с более чем двумя столбцами, нам просто нужно добавить целевую метку на случай, если 9-значная метка начинается с 0 до 9, а потеря будет выбрана из столбца с правильной меткой.

Задача состоит в том, чтобы активация нужного ярлыка была как можно выше, а остальных – ниже.

5. Функция Pytorch. PyTorch предоставляет функцию, которая делает то же самое, что и sm_acts[range(n), targ]

sm_acts[idx, targ]
    tensor([-0.6025, -0.4979, -0.1332, -0.0034, -0.4041, -0.3661])
F.nll_loss(sm_acts, targ, reduction='none')
    tensor([-0.6025, -0.4979, -0.1332, -0.0034, -0.4041, -0.3661])

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