я должен применить softmax перед перекрестной энтропией? - PullRequest
0 голосов
/ 06 марта 2019

Учебное пособие pytorch (https://pytorch.org/tutorials/beginner/blitz/cifar10_tutorial.html#sphx-glr-beginner-blitz-cifar10-tutorial-py) обучает сверточную нейронную сеть (CNN) на наборе данных CIFAR.

    class Net(nn.Module):
        def __init__(self):
            super(Net, self).__init__()
            self.conv1 = nn.Conv2d(3, 6, 5)
            self.pool = nn.MaxPool2d(2, 2)
            self.conv2 = nn.Conv2d(6, 16, 5)
            self.fc1 = nn.Linear(16 * 5 * 5, 120)
            self.fc2 = nn.Linear(120, 84)
            self.fc3 = nn.Linear(84, 10)

        def forward(self, x):
            x = self.pool(F.relu(self.conv1(x)))
            x = self.pool(F.relu(self.conv2(x)))
            x = x.view(-1, 16 * 5 * 5)
            x = F.relu(self.fc1(x))
            x = F.relu(self.fc2(x))
            x = self.fc3(x)
            return x 

Сеть выглядит хорошо, за исключением того, что самый последний слой fc3, который предсказывает вероятность принадлежности к 10 классам без softmax. Разве мы не должны применять softmax в первую очередь, чтобы убедиться, что выходной сигнал слоя fc находится между 0 и 1 и суммой, прежде чем вычислять кросс-энтропийные потери?

Я проверил это, применяя softmax и перезапуск, но точность упала примерно до 35%. Это кажется нелогичным. Какое объяснение?

1 Ответ

0 голосов
/ 06 марта 2019

CrossEntropyLoss в PyTorch уже реализован с Softmax:

https://pytorch.org/docs/stable/nn.html#torch.nn.CrossEntropyLoss

Этот критерий объединяет nn.LogSoftmax () и nn.NLLLoss () в одном классе.

EDIT : Ответ на вашу вторую часть ответа немного сложнее. Там может быть несколько причин для снижения точности. Теоретически, поскольку добавленный вами слой softmax может предсказать правильный ответ с разумной точностью, следующий слой должен быть в состоянии сделать то же самое, сохранив максимальное значение с идентичностью между двумя последними слоями. Хотя softmax снова нормализует эти ограниченные выходы (между 0 и 1), он может изменить способ их распределения, но все же может сохранить максимум и, следовательно, прогнозируемый класс.

Однако на практике все немного по-другому. Когда у вас есть двойной softmax в выходном слое, вы в основном меняете выходную функцию таким образом, что она изменяет градиенты, которые распространяются в вашей сети. Softmax с перекрестной энтропией является предпочтительной функцией потерь из-за градиентов, которые он производит. Вы можете доказать это себе, вычислив градиенты функции стоимости, и учесть тот факт, что каждая «активация» (softmax) ограничена между 0 и 1. Дополнительный softmax «позади» оригинала просто умножает градиенты на значения между 0 и 1 и, таким образом, уменьшая значение. Это влияет на обновления весов. Может быть, это можно исправить, изменив скорость обучения, но это настоятельно не рекомендуется. Просто сделайте один софтмакс, и все готово.
См. книгу Майкла Нильсена, глава 3 для более подробного объяснения этого.

...