Продовжуємо серію публікацій які присвячені явищу ентропії в машинному навчанні і сьогодні розглянемо декілька її різновидів які часто використовуються в якості функції втрат (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.
Розглянемо перехресну ентропію на прикладі. Нехай дано істинний та прогнозовані розподіли ймовірностей події X – p та 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 Loss | Logistic Loss Multinomial Logistic Loss |
Binary Cross-Entropy Loss | Sigmoid Cross-Entropy loss BCE With Logits Loss |
Categorical Cross-Entropy Loss | Softmax Loss Cross Entropy Loss Softmax With Loss Layer. |
Kullback–Leibler Divergence | KL Divergence Relative Entropy |