Ошибка перекрестной энтропии остается неизменной для различных значений

Я использую Cross Entropy с Softmax в качестве функции потерь для своей нейронной сети. Функция перекрестной энтропии, которую я написал, выглядит следующим образом:

def CrossEntropy(calculated,desired):
    sum=0
    n=len(calculated)
    for i in range(0,n):
        sum+=(desired[i] * math.log(calculated[i])) + ((1-desired[i])* math.log(1-calculated[i]))

    crossentropy=(-1)*sum/n
    return crossentropy

Теперь предположим, что желаемый результат равен [1,0,0,0], и мы проверяем его для двух вычисленных результатов, т. е. a=[0.1,0.9,0.1,0.1] и b=[0.1,0.1,0.1,0.9]. Проблема в том, что для обоих этих вычисленных выходных данных функция будет возвращать одно и то же значение перекрестной энтропии. Так как же нейронная сеть узнает, какой из выходных данных является правильным?


person pr22    schedule 28.05.2019    source источник
comment
Это покрывается обратным распространением.   -  person yaho cho    schedule 28.05.2019
comment
Ваш CE предназначен для бинарной классификации, т.е. у вас есть 2 выходных класса. Для вашего образца, поскольку у вас 4, указанный выше CE неверен. Вы должны сделать: - сумма (желаемый * журнал (рассчитанный))   -  person Display name    schedule 29.05.2019


Ответы (1)


Это ожидаемо, потому что у вас есть симметрия данных в ваших двух случаях calculated.

В вашем примере желаемый результат [1, 0, 0, 0]. Таким образом, истинный класс — это первый класс. Однако и в a, и в b ваш прогноз для первого класса одинаков (0,1). Также для других классов (истинные отрицания - 2-й, 3-й и 4-й класс) у вас есть эта симметрия данных (класс 2 и класс 4 одинаково важны в отношении расчета потерь).

 a -> 0.9,0.1,0.1
       ^
       |       |
               V
 b -> 0.1,0.1,0.9

Таким образом, вы имеете тот же убыток, который ожидается.

Если вы удалите эту симметрию, вы получите другую потерю перекрестной энтропии. См. примеры ниже:


# The first two are from your examples.
print CrossEntropy(calculated=[0.1,0.9,0.1,0.1], desired=[1, 0, 0, 0])
print CrossEntropy(calculated=[0.1,0.1,0.1,0.9], desired=[1, 0, 0, 0])

# below we have prediction for the last class as 0.75 thus break the data symmetry.
print CrossEntropy(calculated=[0.1,0.1,0.1,0.75], desired=[1, 0, 0, 0])

# below we have prediction for the true class as 0.45.
print CrossEntropy(calculated=[0.45,0.1,0.1,0.9], desired=[1, 0, 0, 0])


result:
1.20397280433
1.20397280433
0.974900121357
0.827953455132
person greeness    schedule 30.05.2019