• Информация
  • Энтропия
  • Кросс-энтропия
  • КЛ Дивергенция
  • Кросс-энтропийные потери

Информация

Бит: единица информации, сокращающая пространство возможностей на 1/2.

Если нам нужно описать событие с вероятностью 1/2, нам нужен только 1 бит информации (1 двоичное выражение) для описания события. Размышляя об этом в пространственном плане, получается, что событие может располагаться либо слева, либо справа от пространства всех возможностей, и 1 бит информации, который нам нужен для описания события, — это половина события.

Если событие имеет вероятность 1/4, нам нужно 2 бита информации для описания события: в какой половине (левой или правой) происходит событие и в какой половине (верхней или нижней) происходит событие.

Мы можем смоделировать эту связь между вероятностью и количеством битов, которые нам нужны, с помощью следующего уравнения:

Каждый дополнительный бит информации, который мы получаем, сокращает пространство возможностей на 1/2, позволяя описывать события с меньшей вероятностью.

Два интересных пограничных случая: нам нужно 0 бит для описания события с вероятностью 1 и бесконечные биты для описания события с вероятностью 0.

  • Если событие имеет вероятность 1, оно охватывает пространство всех возможностей, и нам не нужны никакие утверждения для описания местоположения события (нам не нужно спрашивать, справа оно или слева, или любые другие вопросы).
  • Если событие имеет вероятность 0, сколько бы бинарных утверждений мы ни делали относительно местоположения события, мы никогда не сможем сократить пространство всех возможностей до 0.

Преобразовав это уравнение, решив число битов, мы получим следующее уравнение:

Примечание. Иногда вместо журнала с основанием 2 используется натуральный журнал. При использовании натурального журнала единицей информации является nat, а не бит.

def calc_bits(p, fudge=1e-15):
  """
  Find the number of bits it takes to describe an event with probability p.
  Tiny fudge factor needed to make log(0) numerically safe.
  """
  safe_p = p + fudge
  bits = -1.0 * np.log2(safe_p)
  return bits

Информация на самом деле является описанием неопределенности, где чем больше битов информации вам нужно для описания события, тем больше неопределенности в отношении события.

  • Когда вы абсолютно уверены, что событие произойдет (p = 1), биты = 0, и ваша неопределенность равна 0.
  • Когда событие имеет вероятность 1/2, вам нужен 1 бит информации, чтобы описать событие, потому что вы не уверены, произойдет это событие или нет.

Чем ниже вероятность события, тем больше битов информации вам нужно для его описания и тем больше вы не уверены в том, что событие произойдет.

Энтропия

Энтропия — это среднее количество информации, которое нам нужно для описания событий распределения вероятностей.

Скажем, у нас есть 2 взаимоисключающих события, события A и B, с вероятностями [0,1, 0,9] соответственно.

Нам нужно -log2(0,1) = 3,322 бита для описания события A и -log2(0,9) = 0,152 бита для описания события B.

Поскольку событие B гораздо более вероятно, чем событие A, мы не можем просто усреднить биты, необходимые для описания событий A и B, чтобы найти средние биты, необходимые для описания события в распределении вероятностей.

Вместо этого мы взвешиваем биты информации, необходимые для описания каждого события, по их соответствующим вероятностям и суммируем взвешенные биты вместе.

  • A: 0,1 * -log2(0,1) = 0,332 бита
  • B: 0,9 * -log2(0,9) = 0,137 бит
  • Сумма: 0,332 + 0,137 = 0,469 бит

Здесь мы обнаруживаем, что среднее количество битов информации, которое нам нужно для описания событий в этом распределении вероятностей, составляет 0,469 бит.

Формула для энтропии выглядит следующим образом:

def calc_entropy(ps):
  """Calculate the entropy of a probability distribution."""
  entropy = np.sum(ps * calc_bits(ps))
  return entropy

Помните, что -log2(p) — это всего лишь биты информации, необходимые для описания события с вероятностью p.

Энтропия — это сумма битов информации, необходимой для описания каждого события, взвешенная по вероятности получения этого события.

Энтропия — это всего лишь средняя неопределенность событий в распределении вероятностей.

Сравнение энтропий

Давайте сравним энтропии вероятностных распределений, созданных при честном и необъективном подбрасывании монеты.

Здесь мы видим, что энтропия для распределения вероятностей честной монеты выше, чем у необъективной монеты.

Это соответствует нашей интерпретации энтропии как средней неопределенности событий в распределении вероятностей, поскольку вы можете быть гораздо более уверены в результате, подбрасывая нечестную монету, а не правильную.

Кросс-энтропия

Кросс-энтропия — это метрика, которая сравнивает 2 распределения вероятностей.

def calc_cross_entropy(p, q):
  """Calculate the cross entropy between target dist p and pred dist q."""
  cross_entropy = np.sum(p * calc_bits(q))
  return cross_entropy

По сути, кросс-энтропия — это мера того, насколько неопределенным является каждое событие в распределении вероятностей q, взвешенное по тому, насколько каждое событие имеет значение в распределении вероятностей p. Взвешивание неопределенности q вероятностью p увеличивает неопределенность для более вероятных событий p.

Здесь у нас есть целевое распределение p из [1, 0] и множество предсказанных распределений qs. По мере того, как прогнозируемая вероятность события 1 увеличивается с 0 до 1, целевая вероятность события 1, кросс-энтропия двух распределений приближается к энтропии целевого распределения, которая в данном случае равна 0.

КЛ Дивергенция

Дивергенция KL очень похожа на кросс-энтропию в том, что она также сравнивает 2 распределения вероятностей. На самом деле, мы можем связать их с помощью следующего уравнения:

Учитывая это уравнение, мы на самом деле видим, что когда энтропия = 0, перекрестная энтропия = дивергенция KL!

Решая эти уравнения для дивергенции КЛ, мы получаем следующее уравнение:

Доказательство предоставляется читателю 😄. Подсказка: не обращайте внимания на сложную сумму и используйте свойство вычитания логарифма!

def calc_kl_divergence(p, q, fudge=1e-15):
  """
  Calculate the kl divergence between target dist p and pred dist q.
  Use a tiny fudge to avoid division by 0.
  """
  kl_divergence = np.sum(p * calc_bits(q / (p + fudge)))
  return kl_divergence

Когда q приближается к p, расхождение KL становится равным 0.

Кросс-энтропийные потери

В машинном обучении кросс-энтропия обычно используется в качестве функции потерь для оценки моделей, особенно в задачах классификации.

В задачах классификации обычно имеется целевой массив с одним горячим кодированием и массив предсказаний с softmax-ed, сгенерированный моделью.

Поскольку целевые массивы с горячим кодированием состоят из 1 в правильном классе и нулей везде ([0, 1, 0]), мы можем упростить вычисление кросс-энтропии.

def calc_smart_cross_entropy(p, q):
  """Calculate cross-entropy for classification tasks."""
 q_correct_class = q[p == 1]
 return calc_bits(q_correct_class)

Доказательство снова предоставляется читателю 😄! На самом деле это просто потому, что везде p(i) = 0.

Кросс-энтропия упрощает до неопределенности модели при правильной классификации!

Это сила использования кросс-энтропии в качестве функции потерь! Перекрестная потеря энтропии позволяет узнать, насколько точно модель соответствует правильной классификации!

Теперь мы можем использовать график зависимости вероятности от неопределенности для представления кросс-энтропийной потери, где вероятность — это предсказание модели вероятности в правильном классе.

Кроме того, кросс-энтропия и расхождение KL в задачах классификации одинаковы, поскольку энтропия целевого массива равна 0!

Кросс-энтропия — это отличная функция потерь, поскольку кросс-энтропия стремится к 0, когда модель уверена в правильном ответе!

Производная кросс-энтропийных потерь

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

Примечание. На самом деле не имеет значения, какую базу журналов вы используете. Здесь я переключился на натуральный лог, потому что производная чище (немного).

Ресурсы

Спасибо

  • Редактор: младшая сестра
  • Читатели

Заключение

  • Надеюсь, вы чему-то научились!
  • Спасибо за прочтение!
  • Оставайтесь с нами, чтобы узнать больше!