Learning to Remember Rare Events

Статья
https://arxiv.org/pdf/1703.03129.pdf
Что?
Модуль памяти для нейронной сети с возможностью произвольного размещения
Как?
kNN модуль, встраиваемый прямо в сеть. По сути есть набор пар ключ-значение. По мере обучения сеть запоминает примеры, после чего она может сравнивать вновь полученные примеры без метки и присваивать её на основе памяти

Модель

Формализация
Извлечение делаем с помощью kNN по ключу. 
Если модель после извлечения ключа опять извлекает на его основе вектор ( с помощью lookup table), то этот вектор умножается на softmax, с помощью вносится информация о том, насколько модель уверена в правильности извлечения
Составляющие
M  (Memory) - матрица K ключей-активаций, вектор V возможных значений, A - вектор, обозначающий возраст значения в ячейке
q - запрос к памяти, ||q|| = 1
NN(q, M) = argmax_i [q * K[i]] - индекс наиболее подходящей ячейки
(n1, n2, .. n_k) = NN_k(q, M)
d_i = q * K[n_i]
softmax(t*d_1, t*d_2, ..) - "уверенность" памяти в значении
n_p - positive neighbour
n_b - negative neighbour
Функция потери для памяти
loss(q, v, M) = [q * K[n_b] - q * K[n_p] + alpha]+

Обучение

Процесс
Допустим, что кроме запроса q, нам известен ключ v. Вычисляем NN_k по текущей памяти и берем самый ближайший p такой, что V[n_p] = v и ближайший b V[n_b] != v. Они используются для обновления векторов в памяти
Обновления памяти, если ключ подошел
Получили n_1 - ближайшего соседа к q. Если V[n_1] = v, мы просто обновляем ключ с помощью усреднения K[n_1] = mean(q, K[n_1]) и сбрасываем возраст A[n_1]  <- 0
Обновления памяти, если ключ не подошел
Если V[n_1] != v, то надо добавить новый ключ в память. Это можно сделать, заместив самую старую ячейку. 

Плюшки

Оптимизация
kNN -  самая дорогая операция. Её можно оптимизировать с помощью хэшей
   Login to remove ads X
Feedback | How-To