
Но не существует внятного объяснения как конкретно нужно выбрать эти самые скрытые "слои".
Кажется придумал как.
Постановка задачи. Пусть мы умеем программировать "простую" (или "не глубокую") ассоциативную память ключ-значение

. Эта "простота" означает, что зависимость

от

должна быть
слабо-нелинейной в том смысле, что должна требовать не очень много обучаемых параметров. Не триллион и не миллиард, а максимум несколько миллионов или даже несколько тысяч параметров. Допустим, мы хотим построить глубокую
ассоциативную память (deep associative memory) из каскада простых ассоциативных воспоминаний. Например, добавив два скрытых слоя:

или четыре:

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

и размерность векторного пространства значений

может быть разной

.
Предлагаю участникам форума рассмотреть следующее решение.
Давайте построим первый слой

из исходных векторов

следующим образом. Если два значения

и

соответствующие ключам

и

близки друг к другу, то мы эти два ключа

и

немного пододвинем поближе друг к другу. А если соответствующие им значения

и

далеки друг от друга, то ключи

и

немного отодвинем подальше друг от друга. Так получим слой

, он по-построению будет слабо-нелинейно отличаться от исходного

.
С построением первого слоя

из исходных векторов

всё обстоит с точностью до наоборот. Если два ключа

и

соответствующие значениям

и

близки друг к другу, то мы эти два значения

и

немного пододвинем поближе друг к другу. А если соответствующие им ключи

и

далеки друг от друга, то значения

и

немного отодвинем подальше друг от друга. Так получим слой

, он по-построению будет слабо-нелинейно отличаться от исходного

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

- гиперпараметр, константа связи):



Окончательно, уравнения движения векторов

и

:


В этих уравнениях в качестве начальных значений надо взять векторы

и

, далее численно решить эти уравнения до некоторого небольшого

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

и

. Интегрируя эти уравнения дальше до некоторго большего значения

получим слои

и

. И так далее, в конце концов, на некотором шаге

, отображение

в

само по себе станет слабо-нелинейным. На этом процедуру генерации слоёв можно будет остановить.