Перехресна ентропія


Продовжуємо серію публікацій які присвячені явищу ентропії в машинному навчанні і сьогодні розглянемо декілька її різновидів які часто використовуються в якості функції втрат (loss function) у задачах багатокласової (multi-class classification) та багатозначної класифікацій (multi-label classification).


Попередній допис “Ентропія в інформаційних системах” дозволить вам коротко пригадати явище інформаційної ентропії Шенона.

Перехресна ентропія

Перехресна ентропія (також можна зустріти переклад крос-ентропія від англ. cross-entropy) – це міра різниці (похибки) між двома розподілами ймовірностей випадкової величини на тому самому ймовірнісному просторі. У задачах машинного навчання цими двома розподілами зазвичай є прогнозовані значення ймовірностей та істинні значення ймовірностей для випадкової величини X.

\[CE\left(p,q\right)\ =\ -\sum_{i=1}^Np\left(x_i\right)\cdot\log\left(q\left(x_i\right)\right),\ де:\ \ \ \ \ \ \ \ \ \ \ \ \left(1\right)\]

\[p\left(x_i\right)\ -істинні\ значення\ ймовірностей;\]

\[q\left(x_i\right)\ -\ прогнозовані\ значення\ ймовірностей;\]

\[i\ -кожен\ можливий\ клас\ події\ X;\]

На перший погляд звучить дещо складно проте інтуєтивне визначення можна сформулювати так: перехресна ентропія дозволяє відповісти на запитання: “Наскільки близький прогнозований розподіл до справжнього?”. Слід наголосити, що тут і далі по тексту, мова йде саме про дискретний розподіл деякої величини, а не про неперевний розподіл.

З точки зору теорії інормації можна дати більш технічне визначення яке наведено у відповідній статті у Вікіпедії:

Перехресна ентропія … вимірює середню кількість біт, необхідних для впізнання події з простору подій, якщо схема кодування, що використовується, базується на розподілі ймовірностей q, замість «істинного» розподілу p.

wikipedia.org

Якщо ми використовуємо розподіл p для кодування події X, але насправді подія розподілена за (згідно з) розподілом q, тоді перехресна ентропія показує, скільки додаткової інформації (у вигляді бітів) нам знадобиться в середньому через невідповідність між p та q.

Розглянемо перехресну ентропію на прикладі. Нехай дано істинний та прогнозовані розподіли ймовірностей події Xp та q відповідно.

In [1]: from math import log
In [2]: p = [0.1, 0.6, 0.3]
In [3]: q = [0.8, 0.15, 0.05]

In [4]: def cross_entropy(p, q, base=2, d=1e-10):
    ...:  return -1 * sum([i * log(j + d, base) for i, j in zip(p, q)])
    ...:

In [5]: cross_entropy(p,q)
Out[5]: 2.970950594454669

In [6]: cross_entropy(q,p)
Out[6]: 2.8549355947431314

Чим менше значення крос-ентропії, тим краще модель передбачає реальні результати.

Нотатка. Якщо в обчисленні використовується двійковий логарифм то вихідні значення вимірюються у бітах (bits), якщо інший то у натах (nats).

Перехресна ентропія розподілу по відношенню самого до себе дорівнює початковій ентропії розподілу.

In [7]: cross_entropy(p,p)
Out[7]: 1.295461844238322

Таким чином, що ближча перехресна ентропія між двома розподілами (істинним та прогнозованим) до початкової ентропії істинного розподілу то точніший прогноз.

Бінарна перехресна ентропія

Бінарна перехресна ентропія (binary cross-entropy) — це спеціальний випадок (різновид) перехресної ентропії, який використовується для оцінки моделей класифікації, що мають лише два класи.

\[BCE\left(p,q\right)\ =\ -\sum_{i=1}^{N=2}p\left(x_i\right)\cdot\log\left(q\left(x_i\right)\right)\ =\]

\[\ =-\left(p\left(x\right)\cdot\log\left(q\left(x\right)\right)\ +\left(1-p\left(x\right)\right)\cdot\log\left(1-q\left(x\right)\right)\right)\ \ \ \ \ \left(2\right)\]

Зауважимо, що оригінальна формула перехресної ентропії для задач бінарної класифікації може бути спрощена до виду (2), оскільки дійсним є те, що сума ймовірностей класів рівна одиниці. Таким чином ймовірність другого класу, може бути виражена через різницю 1 та ймовірність першого класу (3).

\[p\left(x_1\right)\ =y\ \Rightarrow p\left(x_2\right)\ =\ 1-y\ \ \ \ \ \ \ \ \ \ \ \left(3\right)\]

Такий запис наочно демонструє й іншу цікаву властивість. Якщо істинна ймовірність класу рівна 1, то формула “заохочує” високі значення передбачень і “карає” за низькі і, навпаки, якщо істинна ймовірність рівна 0, то формула “заохочує” передбачення з низькими ймовірностями і карає за високі значення.

\[p\left(x\right)=1\ \Rightarrow-\left(1\cdot\log\left(q\left(x\right)\right)+0\cdot\log\left(1-q\left(x\right)\right)\right)\ =\ -\log\left(q\left(x\right)\right)\ \ \ \ \left(4\right)\]

\[p\left(x\right)=0\ \Rightarrow-\left(0\cdot\log\left(q\left(x\right)\right)+1\cdot\log\left(1-q\left(x\right)\right)\right)=-\log\left(1-q\left(x\right)\right)\ \ \left(5\right)\]

Наведемо приклад який показує динаміку зміни значень бінарної перехресної ентропії при зміні передбаченої ймовірності по відношенню до істинної ймовірністі в умовній задачі бінарної класифікації.

In [1]: import numpy as np
In [2]: from tabulate import tabulate
In [3]: from math import log

In [4]: def bce(p, q, base=2, d=1e-10):
    ...:  return -(p * log(q + d, base) + (1 - p) * (log(1 - q + d, base)))
    ...:
   
In [5]: p = 0
In [6]: print(
     ...:     tabulate(
     ...:         [(p, q, bce(p, q)) for q in np.linspace(0, 1, num=10)],
     ...:         headers=("true", "predicted", "bce"),
     ...:     )
     ...: )
     
  true    predicted          bce
------  -----------  -----------
     0     0         -1.4427e-10
     0     0.111111   0.169925
     0     0.222222   0.36257
     0     0.333333   0.584963
     0     0.444444   0.847997
     0     0.555556   1.16993
     0     0.666667   1.58496
     0     0.777778   2.16993
     0     0.888889   3.16993
     0     1         33.2193

Бінарна перехресна ентропія використовується також у задачах багатозначної класифікації, де наявність елемента, що належить до певного класу, не повинна впливати на рішення про принадежність щодо іншого класу.

In [1]: from math import log

In [2]: actual_data = [1,1,1,0,0,0]
In [3]: predicted_data = [0.9,0.5,0.1,0.8,0.5,0.01]

In [5]: for idx, data in enumerate(zip(actual_data, predicted_data)):
    ...:     print(f"Cls. {idx}, BCE({p,q}) = {bce(*data)}")
    ...:

Cls. 0, BCE((1, 0.9)) = 0.15200309344504997
Cls. 1, BCE((1, 0.5)) = 1.0
Cls. 2, BCE((1, 0.1)) = 3.321928094887362
Cls. 3, BCE((0, 0.8)) = 2.3219280948873626
Cls. 4, BCE((0, 0.5)) = 1.0
Cls. 5, BCE((0, 0.01)) = 0.01449956969511509

Кожен з шести бінарних класифікаторів в межах однієї багатозначної класифікації може бути представлений та обчислений за допомогою класичної формули перхресної ентропії. Так, наприклад, перший класифікатор:

In [6]: bce(1, 0.9)
Out[7]: 0.15200309344504997

In [8]: cross_entropy([1,0], [0.9, 0.1])
Out[9]: 0.15200309344504997

Категорійна перехресна ентропія

Категорійна перехресна ентропія — це спеціальний випадок (різновид) перехресної ентропії, який використовується використовується у задачах багатокласової класифікації, де кожен елемент належить лише до одного з кількох можливих класів. Оригінальна формула перехресної ентропії для задач багатокласової класифікації може бути спрощена до виду (6), оскільки дійсним є те, що в задачах багатокласової класифікації існує лише один елемент який може бути рівний одиниці, а всі інші елементи – рівні нулю. Таким чином, рівняння перехресної ентропії може бути записане як:

\[CCE\left(p,\ q\right)\ =\ -\sum_{i=1}^Np\left(x_i\right)\cdot\log\left(q\left(x_i\right)\right)\ =-\log\left(q\left(x_j\right)\right)\ ,\ де\ \ \ \ \ \ \ \ \ \ \ \ \left(6\right)\]

\[j\ \ -\ індекс\ правильного\ класу\ \left(єдиний\ індекс,\ де\ p\left(x_i\right)=1\right)\]

\[q\left(x_j\right)\ -прогнозована\ ймовірність\ для\ екземпляру\ класу\ де\ p\left(x_i\right)=1\]


In [1]: import numpy as np
In [2]: from math import log

In [3]: p = [0, 1, 0]
In [4]: q = [0.2, 0.7, 0.1]

In [5]: def cce(p,q, base=2, d=1e-10):
    ...:     assert sum(p) == 1
    ...:     j = p.index(1)
    ...:     return -log(q[j] + d, base)
  
In [6]: cce(p,q)
Out[6]: 0.514573172623659

Як і в попередньому випадку для обчислення можемо також використати формулу перехресної ентропії.

In [7]: cross_entropy(p,q)
Out[7]: 0.514573172623659

Розходження Кульбака — Лейблера

Нагадаємо коротко, що перехресна ентропія вимірює середню кількість біт, необхідних для впізнання події з простору подій, при різних схемах кодування p та q. Навідміну від перехресної ентропії розходження Кульбака — Лейблера (також зустрічається як відносна ентропія (тут і далі по тексту)) вимірює додаткову кількість бітів, необхідних для впізнання події з простору подій при різних схемах кодування. Іноді відносна ентропія також може розглядатися як “відстань” між p та q (хоча не є справжньою математичною відстанню).

\[D_{KL}\left(p||q\right)\ =-\sum_{i=1}^Np\left(x_i\right)\cdot\log\left(\frac{p\left(x_i\right)}{q\left(x_i\right)}\right)\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \left(7\right)\]

Звя’зок між перехресною ентропією та відносною ентропією може бути виражений як:

\[D_{KL}\left(p||q\right)\ =\ CE\left(p,q\right)-H\left(p\right),\ де\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \left(8\right)\]

\[CE\left(p,q\right)\ -перехресна\ ентропія;\]

\[H\left(p\right)\ -початкова\ ентропія\ істинного\ розподілу;\]

Як видно із формули, відносна енропія визначає кількісну різницю в прирості інформації між двома розподілами і є різницею між перехресною ентропією CE(p,q) і початковою ентропією H(p).

Нотатка. Більш детальне пояснення про приріст інформації можна знайти у статті “Приріст інформації“.

Для демонстрації обчислення відносної ентропії використаємо дані та функцію із прикладу роботи перехресної ентропії наведеного на початку сторінки:

In [8]: def kl_divergence(p,q, base=2, d=1e-10):
    ...:     return sum([i * log((i/j) + d, base) for i, j in zip(p, q)])
    
In [9]: cross_entropy(p,q)
Out[9]: 2.9709505929939404

In [10]: cross_entropy(p,p)
Out[10]: 1.2954618438055134

In [11]: cross_entropy(p,q) - cross_entropy(p,p)
Out[11]: 1.675488749188427

In [12]: kl_divergence(p,q)
Out[12]: 1.6754887503606164

Деякі інші назви функцій

Іноді різні види перехресної ентропії можуть мати інші назви залежно від бібліотеки або реалізації, де вони використовуються як функція втрат. Наведемо коротку таблицю інших поширених імен функцій англійською мовою.

Назва функціїІнші назви функції
Cross-Entropy LossLogistic Loss
Multinomial Logistic Loss
Binary Cross-Entropy LossSigmoid Cross-Entropy loss
BCE With Logits Loss
Categorical Cross-Entropy LossSoftmax Loss
Cross Entropy Loss
Softmax With Loss Layer.
Kullback–Leibler DivergenceKL Divergence
Relative Entropy
Таб.1. Деякі інші поширені назви функцій втрат