В беседах с Евгением я определил конкретные примеры, которые могут помочь моей последней странице Преодоление проблемы исчезающего градиента.

Рассмотрим рекуррентную нейронную сеть, которая играет в игру «Лабиринт». Предлагается последовательный выбор: выбрать «правосторонний путь» или «левосторонний путь», а награды выдаются только в том случае, если лабиринт пройден менее чем за определенное количество вариантов. Предположим, что среди всех успешных воспроизведений сеть выбрала «правосторонний путь», а большая часть неудачных воспроизведений начиналась с «левостороннего пути». . «Налево» было плохим решением. И это было первое решение. Здесь типичный градиентный спуск не работает; функция потерь «подтягивает» только самый верхний слой сети, так что у нее нет «силы» исправить эти ранние ошибки.

По мере того, как повторение становится глубже (больший лабиринт с более длительным временем прохождения), градиентному спуску становится все труднее выявить эту раннюю ошибку. Однако эта ошибка присутствует ТОЛЬКО в неудачных случаях. Ошибки такого рода немедленно обнаруживаются методом, основанным на ковариации.

Теперь рассмотрим другой случай, когда ковариация предупреждает нас о проблемах, в отличие от функции потерь, которая распространяется от выходного слоя: классификатор изображений, который обычно (>0,95) правильно идентифицирует «кошку»… тем не менее, случаи, когда он терпит неудачу, группируются вокруг отсутствие некоторых функций. Нейроны, которые обычно активируются, вместо этого молчат. (например, «два уха»?) Мы хотели бы применить наше «притяжение» к ошибочным нейронам, стимулируя их срабатывание (даже если оба уха полностью не видны), как их правильные аналоги.

Немного математики:

В ответ на отзывы я приведу игрушечный пример отрицательной ковариации. Ваш классификатор «кошка» имеет семь изображений реальных кошек в тренировочном наборе (назовем их A, B, C, D, E, F, G), помимо любых других изображений в тренировочном наборе. Вы отправляете каждое изображение «кошки» через свою сеть и старательно сохраняете активации каждого нейрона для своих вычислений. Отсортируйте их в соответствии с точной или ошибочной классификацией — допустим, в нашем примере все A, B, C, D были правильно классифицированы как «кошка», а E, F, G были помечены чем-то другим. Глядя только на наш первый нейрон, x1, мы можем спросить: «Какова была средняя активация среди {A, B, C, D}? то же самое для {E, F, G}?» Вот некоторые примерные значения активации этого первого нейрона:

x1[A]: 0,7 __________ Среднее значение активации для точных

x1[B]: 0.8

x1[C]: 1.1

x1[D]: 1.0__________

x1[E]: 0,2__________Средние значения активации для ошибочных

x1[F]: 0.3

x1[G]: 0.0_________

Точная партия имеет среднее значение S = 0,9, а ошибочная — среднее значение активации R = 0,16666… Они ведут себя по-разному, и это может быть причиной неправильной классификации.

Теперь находим среднее этих двух средних: (0,9+0,16666)/2 = T = 0,53333. Обратите внимание, что средние значения обрабатываются одинаково, независимо от количества изображений в каждой партии (если бы было еще 5 ошибочных изображений, но их среднее значение по-прежнему равно 0,16666, у нас все равно было бы среднее значение 0,53333 между ними).

Следующий шаг — случайным образом (с заменой) выбрать пары, по одной из каждой партии. Пример такой пары: x1[C] и x1[F]. Значение комбинированного среднего значения T вычитается из каждого из них. Затем они умножаются вместе. То есть (x1[C] - T)*(x1[F] - T) = U(C,F). Продолжайте рисовать пары и вычислять их U(v,w), суммируя каждый результат по ходу дела. После достаточной выборки разделите сумму на количество пар, которые вы попробовали. Если эта сумма была отрицательной, оставьте ее — это отрицательная ковариация вокруг T.

Значения ковариации можно добавлять к вашему градиенту по мере приближения к каждому нейрону. (Вы можете попробовать использовать очень маленький коэффициент для взвешивания ковариации, умножив его на 0,01 перед добавлением к градиенту, и сравнить это поведение с сетью с более сильной силой ковариации, скажем, 0,1…)

Надеюсь, это обрисовывает в общих чертах грубую реализацию с некоторой ясностью!

Как упомянул Евгений, возможны проблемы:

Если только несколько примеров ошибочной классификации с многими нейронами, то у каждого нейрона есть небольшая вероятность «случайной ковариации» просто из-за небольшого размера партии. Это может слишком далеко сдвинуть параметры сети в неправильном направлении и удерживать сеть в плохом состоянии колебаний. Полезная статистическая перспектива, которая подтверждается только исследованиями!

Однако похоже, что ковариация, наблюдаемая в небольшом наборе ошибок (статистически вероятная, с большим количеством нейронов), по-прежнему будет там, где «сила притяжения» должна, учитывая, что это общая ошибка, а не успех. Ковариация не возникнет среди многих нейронов, как если бы они были случайной выборкой; это структурированная среда. Я все еще пытаюсь представить себе случай: когда наблюдается отрицательная ковариация, и мы не хотели бы ее устранять? Интуитивно мы всегда должны предпочитать, чтобы наши ошибочные сети сигнализировали больше как правильные, не так ли?