Softmax не приводит к распределению вероятностей в реализации Python - PullRequest
0 голосов
/ 14 февраля 2019

У меня есть простая реализация softmax:

softmax = np.exp(x) / np.sum(np.exp(x), axis=0)

Для x, установленного здесь как массив: https://justpaste.it/6wis7

Вы можете загрузить его как:

 import numpy as np

 x = np.as (just copy and paste the content (starting from array))

Я получаю:

softmax.mean(axis=0).shape 
(100,) # now all elements must be 1.0 here, since its a probability

softmax.mean(axis=0) # all elements are not 1

array([0.05263158, 0.05263158, 0.05263158, 0.05263158, 0.05263158,
       0.05263158, 0.05263158, 0.05263158, 0.05263158, 0.05263158,
       0.05263158, 0.05263158, 0.05263158, 0.05263158, 0.05263158,
       0.05263158, 0.05263158, 0.05263158, 0.05263158, 0.05263158,
       0.05263158, 0.05263158, 0.05263158, 0.05263158, 0.05263158,
       0.05263158, 0.05263158, 0.05263158, 0.05263158, 0.05263158,
       0.05263158, 0.05263158, 0.05263158, 0.05263158, 0.05263158,
       0.05263158, 0.05263158, 0.05263158, 0.05263158, 0.05263158,
       0.05263158, 0.05263158, 0.05263158, 0.05263158, 0.05263158,
       0.05263158, 0.05263158, 0.05263158, 0.05263158, 0.05263158,
       0.05263158, 0.05263158, 0.05263158, 0.05263158, 0.05263158,
       0.05263158, 0.05263158, 0.05263158, 0.05263158, 0.05263158,
       0.05263158, 0.05263158, 0.05263158, 0.05263158, 0.05263158,
       0.05263158, 0.05263158, 0.05263158, 0.05263158, 0.05263158,
       0.05263158, 0.05263158, 0.05263158, 0.05263158, 0.05263158,
       0.05263158, 0.05263158, 0.05263158, 0.05263158, 0.05263158,
       0.05263158, 0.05263158, 0.05263158, 0.05263158, 0.05263158,
       0.05263158, 0.05263158, 0.05263158, 0.05263158, 0.05263158,
       0.05263158, 0.05263158, 0.05263158, 0.05263158, 0.05263158,
       0.05263158, 0.05263158, 0.05263158, 0.05263158, 0.05263158])

Почему эта реализация неверна?Как это исправить?

Ответы [ 2 ]

0 голосов
/ 14 февраля 2019

Сумма вероятностей должна быть 1, нет, это значит.Давайте сделаем это более понятным на этом простом примере.Представьте себе 3 softmax выходные значения s = [0.5, 0.25, 0.25].Очевидно, они должны подвести итог 1 (вероятность).Но их среднее значение равно 0.333.

>>> softmax.sum(axis=0)
array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,
       1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,
       1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,
       1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,
       1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,
       1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.])

Я надеюсь, что этот пример прояснит это!

0 голосов
/ 14 февраля 2019

выглядит хорошо для меня:

import numpy as np

def softmax(x):
    return np.exp(x) / np.sum(np.exp(x), axis=0)

logits = softmax(np.random.rand(4))

print(logits)

Сумма всех элементов действий softmax предполагается равной 1.

Для задач классификации обычно берется индекс ссамое высокое значение (np.argmax()) или самые высокие n-индексы и выбирает их в качестве наиболее вероятного класса (классов):

class_index = np.argmax(logits)  # Assuming logits is the output of a trained model

print('Most likely class: %d' % class_index)

Как указано в комментариях JosepJoestar, определениеФункцию softmax можно найти здесь .

...