- Рассмотрим Два нейрона в последнем слое, учитывая эти выходные данные на 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 в двоичной классификации
- Допустим, у нас есть 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 не ведет журнал. Мы увидим почему в следующем разделе, но сначала давайте посмотрим, почему логарифмирование может быть полезным.