Истинное понимание потери кросс-энтропии - PullRequest
0 голосов
/ 19 июня 2020

У меня есть курс машинного обучения, где мне нужно реализовать прямой и обратный метод CELoss:

class CELoss(object):
    @staticmethod
    def forward(x, y):
        assert len(x.shape) == 2 # x is batch of predictions   (batch_size, 10)
        assert len(y.shape) == 1 # y is batch of target labels (batch_size,)
        # TODO implement cross entropy loss averaged over batch
        return


    @staticmethod
    def backward(x, y, dout):
        # TODO implement dx
        dy = 0.0 # no useful gradient for y, just set it to zero
        return dx, dy

Более того, мне дается CELoss как

CELoss (x , y) = - log \ frac {exp (x_y)} {\ sum_ {k} exp (x_k)}

(в нем говорится, что я не могу использовать создатель формулы, потому что мне нужно иметь как минимум 10 репутаций)

Это, однако, не тот CELoss, который вы можете найти, например, в Википедии (https://en.wikipedia.org/wiki/Cross_entropy). Насколько я понимаю, CELoss принимает цели и прогнозы. Представляет ли x здесь цели, а y - прогнозы? Если да, то что имеет в виду x_y? Спасибо за помощь!

1 Ответ

0 голосов
/ 19 июня 2020

Они одинаковы.

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

Что касается того, почему это происходит, давайте начнем с потери кросс-энтропии для одного примера обучения x:

Loss = - sum_j P(x_j) log(Q(x_j)) #j is the index of possible labels 

, где P - это «истинное» распределение, а «Q» - это распределение, которое изучила ваша сеть. «Истинное» распределение P задается вашими жесткими метками, то есть, предполагая, что истинная метка - t, у вас будет:

P(x_t) = 1
P(x_j) = 0   if j!=t   

, что означает, что потеря, указанная выше, станет

Loss= - log(Q_t)

В вашем случае кажется, что распределение Q_s вычисляется из логитов, т.е. последнего уровня перед softmax или функцией стоимости, которая выводит набор оценок для каждого label:

scores= [s_1 , ..., s_N]

если вы запустите это через softmax, вы получите:

distribution = [exp(s_1)/(sum_k exp(s_k)), ..., exp(s_N)/(sum_k exp(s_k))]

Распределение истинной метки t, которое мы до сих пор обозначали * Таким образом, 1030 * дается как

Q(s_t)=exp(s_t)/(sum_k exp(s_k))

, и это возвращает нас к потерям, которые можно выразить как

Loss= - log(Q_t) = - log (exp(s_t)/(sum_k exp(s_k))

, которое вы указали в своей задаче. Поэтому в вашем вопросе x_y - это оценки, которые сеть выводит для правильной метки, связанной с x.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...