Митасов Андрей Павлович : другие произведения.

Металоция неведомого. Модуль С. Структуры

Самиздат: [Регистрация] [Найти] [Рейтинги] [Обсуждения] [Новинки] [Обзоры] [Помощь|Техвопросы]
Ссылки:
Школа кожевенного мастерства: сумки, ремни своими руками
 Ваша оценка:
  • Аннотация:
    Выжимка информации из Инета по структурам нейросетей.
    Предварительный анализ.
    Крайнее изменение 30.10.2024

  
  "Следует стремиться увидеть в каждой вещи то,
  чего еще никто не видел и над чем еще никто не думал."
  
  "Кто не понимает ничего, кроме химии, тот и её понимает недостаточно."
  
  "Изучай все не из тщеславия, а ради практической пользы."
  
  Георга Кристоф Лихтенберг.
  
  
  Оглавление:
   Вместо предисловия.
   Зоопарк нейронных сетей.
   Структуры нейросетей для задач компьютерного зрения.
   Структуры нейросетей для задач визуального детектирования.
   Структуры нейронок YOLO.
   Пошаговый разбор работы трансформера.
   Структура сети ViT.
   Структура сети Swin.
   Сверточная сеть "для чайников".
   И еще немного сверточных сетей.
   И снова трансформеры.
   Что общего между структурным мышлением и структурой нейросетей?
   Inductive bias в нейронных сетях.
   Двоичные нейронные сети "для чайников".
   Насколько реально обучение BNN методом сплошного перебора?
   KAN - это новая эра глубокого обучения?
   Еще "немного" о попытках трансформировать трансформеры.
   "Возвращение рекуррентного короля"?
   Метод автономного адаптивного управления.
   А как сейчас проектируются бинарные нейросети?
   "Лакмусовая бумажка" уровня понимания существующих нейросетей.
   Аналоговые решения для дискретных нейросетей.
   Возвращение троичной логики?
   Абсолютная экзотика - оптические нейронные сети (ОНС).
   Очередная "новая модель нейрона".
   Можно ли обойтись без перемножения матриц?
   Введение в графовые нейросети.
   "Звонок другу" по теме графовых нейросетей.
   Нейросеть на 8-битном микроконтроллере.
  
  Иллюстрации:
   Тральщик "Наставник" от "Модели Kandinsky 2.1".
   Тральщики "Наставник" от "Модели Kandinsky 3.0".
   Тральщик "Наставник" от "Модели Kandinsky 3.01".
   Тральщик "Наставник" от "Модели Kandinsky 3.1".
   "Графовые сети" от Copilot.
  
  
  ==========
  
  17.02.2024 19:03
  
  Вместо предисловия.
  В оглавление.
  
  Этот модуль задуман как учебный и исследовательский материал
  по анализу предлагавшихся ранее и используемых в настоящее время
  структур нейросетей и Используемых в них архитектурных и композиционных решений.
  Безусловно, при чтении его предполагается какое-то минимальное представление/знание
  начальных азов "нейросетевых наук".
  Если с этим есть какие-то затруднения, то можно начать с материалов,
  расположенных в "Модуле Л. Ликбез.", например, см.:
  "Нейронная сеть простыми словами."
  "Структуры нейросетей простыми словами."
  "Трансформеры простыми словами."
  
  Цели этого модуля не совсем традиционные, предполагается,
  что основное внимание будет уделяться
  не столько особенностям конструирования/архитектуры нейросетей.
  Хотя сейчас это становится все более актуальным, так как в дополнение
  к "стандартным" нейронкам начинают разрабатываться и другие структуры,
  использующие эти стандартные модели уже как "строительные блоки"
  для создания специализированных систем, например, см.:
  "Режем, клеим, дообучаем - нейросеть собираем."
  
  Этому направлению, конечно, тоже будет уделено внимание,
  но все-таки основная цель модуля в другом.
  Хочется, анализируя различные архитектуры,
  попытаться понять внутреннюю механику работы нейросетей,
  возможности улучшения процессов/методов их обучения
  и, самое главное, с другой стороны попытаться подступиться
  к пониманию "внутреннего пространства эмбеддингов" нейросетей, подробнее см.:
  "Каково же оно "пространство эмбеддингов" нейронки?"
  
  Представляется, что понимание "пространства эмбеддингов" нейросетей
  будет более надежным ориентиром/инструментом в конструировании
  различных новых архитектур нейросетей,
  чем простое "полушаманское"/"полуэвристическое" манипулирование блоками и элементами,
  как это, большей частью, происходит сейчас.
  
  
  =========
  
  15.01.2024 8:58
  
  Зоопарк нейронных сетей.
  В оглавление.
  
  Погружение в структуры современных нейросетей, наверно,
  стоит начать с экскурса по своеобразной "кунсткамере",
  сравнительного обзора целых направлений нейросетей,
  которые предлагались в "дотрансформерную эпоху".
  Часть из этих конструкций достаточно активно используется и развивается,
  а часть уже "канула в Лету".
  Но какие-то идеи, лежащие в основание этих структур,
  наверно, все-таки еще проявятся в той или иной форме:
  
  "Зоопарк архитектур нейронных сетей. Часть 1"
  Автор: xopxe
  https://habr.com/ru/companies/wunderfund/articles/313696/.
  26 окт 2016 в 19:44
  
  Автор оригинала: FJODOR VAN VEEN
  http://www.asimovinstitute.org/neural-network-zoo/
  
  //// Начало цитирования.
  
  ......
  
  За всеми архитектурами нейронных сетей,
  которые то и дело возникают последнее время,
  уследить непросто.
  Даже понимание всех аббревиатур, которыми бросаются профессионалы,
  поначалу может показаться невыполнимой задачей.
  
  Поэтому я решил составить шпаргалку по таким архитектурам.
  Большинство из них - нейронные сети,
  но некоторые - звери иной породы.
  Хотя все эти архитектуры подаются как новейшие и уникальные,
  когда я изобразил их структуру,
  внутренние связи стали намного понятнее.
  
  У изображения нейросетей в виде графов есть один недостаток:
  граф не покажет, как сеть работает.
  Например, вариационный автоэнкодер (variational autoencoders, VAE)
  выглядит в точности как простой автоэнкодер (AE),
  в то время как процесс обучения у этих нейросетей совершенно разный.
  Сценарии использования различаются еще сильнее:
  в VAE на вход подается шум,
  из которого они получают новый вектор,
  в то время как AE просто находят для входных данных
  ближайший соответствующий вектор из тех,
  что они "помнят".
  Добавлю еще, что этот обзор не имеет цели объяснить
  работу каждой из топологий изнутри
  (но это будет темой одной из следующих статей).
  
  Следует отметить, что не все (хотя и большинство)
  из используемых здесь сокращений общеприняты.
  Под RNN иногда понимают рекурсивные нейронные сети
  (recursive neural networks),
  но обычно эта аббревиатура означает рекуррентную нейронную сеть
  (recurrent neural network).
  Но и это еще не все:
  во многих источниках вы встретите RNN как обозначение
  для любой рекуррентной архитектуры,
  включая LSTM, GRU и даже двунапраленные варианты.
  Иногда похожая путаница происходит с AE:
  VAE, DAE и им подобные могут называть просто AE.
  Многие сокращения содержат разное количество N в конце:
  можно сказать "сверточная нейронная сеть"
  - CNN (Convolutional Neural Network),
  а можно и просто "сверточная сеть" - CN.
  
  Составить полный список топологий практически невозможно,
  так как новые появляются постоянно.
  Даже если специально искать публикации,
  найти их может быть сложно,
  а некоторые можно просто упустить из виду.
  Поэтому, хотя этот список поможет вам создать представление
  о мире искусственного интеллекта,
  пожалуйста, не считайте его исчерпывающим,
  особенно, если читаете статью спустя долгое время после ее появления.
  
  Для каждой из архитектур, изображенной на схеме,
  я привел очень короткое описание.
  Некоторые из них будут полезны,
  если вы хорошо знакомы с несколькими архитектурами,
  но не знакомы конкретно с этой.
  
  Сети прямого распространения (Feed forward neural networks, FF or FFNN)
  и перцептроны (perceptrons, P) очень просты
  - они передают информацию от входа к выходу.
  Считается, что у нейронных сетей есть слои,
  каждый из которых состоит из входных, скрытых или выходных нейронов.
  Нейроны одного слоя между собой не связаны,
  при этом каждый нейрон этого слоя связан с каждым нейроном соседнего слоя.
  Простейшая мало-мальски рабочая сеть состоит из двух входных
  и одного выходного нейрона
  и может моделировать логический вентиль
  - базовый элемент цифровой схемы, выполняющий элементарную логическую операцию.
  FFNN обычно обучают методом обратного распространения ошибки,
  подавая модели на вход пары входных и ожидаемых выходных данных.
  Под ошибкой обычно понимаются различные степени отклонения выходных данных
  от исходных (например, среднеквадратичное отклонение
  или сумма модулей разностей).
  При условии, что сеть обладает достаточным количеством скрытых нейронов,
  теоретически она всегда сможет установить связь
  между входными и выходными данными.
  На практике использование сетей прямого распространения ограничено,
  и чаще они используются совместно с другими сетями.
  
  Rosenblatt, Frank. "The perceptron: a probabilistic model
  for information storage and organization in the brain."
  Psychological review 65.6 (1958): 386.
  
  > Original Paper PDF
  http://www.ling.upenn.edu/courses/cogs501/Rosenblatt1958.pdf
  
  Сети радиально-базисных функций (radial basis function, RBF)
  - это FFNN с радиально-базисной функцией в качестве функции активации.
  Больше здесь нечего добавить.
  Мы не хотим сказать, что она не используется,
  но большинство FFNN с другими функциями активации
  обычно не выделяют в отдельные группы.
  
  Broomhead, David S., and David Lowe. Radial basis functions,
  multi-variable functional interpolation and adaptive networks.
  No. RSRE-MEMO-4148. ROYAL SIGNALS AND RADAR ESTABLISHMENT MALVERN
  (UNITED KINGDOM), 1988.
  
  > Original Paper PDF
  http://www.dtic.mil/cgi-bin/GetTRDoc?AD=ADA196234
  
  Нейронная сеть Хопфилда - полносвязная сеть
  (каждый нейрон соединен с каждым),
  где каждый нейрон выступает во всех трех ипостасях.
  Каждый нейрон служит входным до обучения,
  скрытым во время него и выходным после.
  Матрица весов подбирается таким образом,
  чтобы все <запомненные> вектора являлись бы для нее собственными.
  Однажды обученная одному или нескольким образам
  система будет сходиться к одному из известных ей образов,
  потому что только одно из этих состояний является стационарным.
  Отметим, что это не обязательно соответствует желаемому состоянию
  (к сожалению, у нас не волшебный черный ящик).
  Система стабилизируется только частично из-за того,
  что общая "энергия" или "температура" сети во время обучения
  постепенно понижается.
  Каждый нейрон обладает порогом активации,
  соизмеримым с этой температурой,
  и если сумма входных данных превысит этот порог,
  нейрон может переходить в одно из двух состояний
  (обычно -1 или 1, иногда 0 или 1).
  Узлы сети могут обновляться параллельно,
  но чаще всего это происходит последовательно.
  В последнем случае генерируется случайная последовательность,
  которая определяет порядок,
  в котором нейроны будут обновлять свое состояние.
  Когда каждый из нейронов обновился и их состояние больше не изменяется,
  сеть приходит в стационарное состояние.
  Такие сети часто называют ассоциативной памятью,
  так как они сходятся с состоянию, наиболее близкому к заданному:
  как человек, видя половину картинки,
  может дорисовать недостающую половину,
  так и нейронная сеть, получая на входе наполовину зашумленную картинку,
  достраивает ее до целой.
  
  Hopfield, John J. "Neural networks and physical systems
  with emergent collective computational abilities."
  Proceedings of the national academy of sciences 79.8 (1982): 2554-2558.
  
  > Original Paper PDF
  https://bi.snu.ac.kr/Courses/g-ai09-2/hopfield82.pdf
  
  Цепи Маркова (Markov Chains, MC или discrete time Markov Chain, DTMC)
  - своего рода предшественники машин Больцмана (BM) и сетей Хопфилда (HN).
  В цепях Маркова мы задаем вероятности перехода из текущего состояния в соседние.
  Кроме того, это цепи не имеют памяти:
  последующее состояние зависит только от текущего
  и не зависит от всех прошлых состояний.
  Хотя цепь Маркова нельзя назвать нейронной сетью,
  она близка к ним и формирует теоретическую основу для BM и HN.
  Цепи Маркова также не всегда являются полносвязными.
  
  Hayes, Brian. "First links in the Markov chain."
  American Scientist 101.2 (2013): 252.
  
  > Original Paper PDF
  http://www.americanscientist.org/libraries/documents/201321152149545-2013-03Hayes.pdf
  
  Машины Больцмана (Boltzmann machines, BM) во многом похожи на сети Хопфилда,
  но в них некоторые нейроны помечены как входные, а некоторые остаются скрытыми.
  Входные нейроны становятся выходными,
  когда все нейроны в сети обновляют свои состояния.
  Сначала весовые коэффициенты присваиваются случайным образом,
  затем происходит обучение методом обратного распространения,
  или в последнее время все чаще с помощью алгоритма
  contrastive divergence
  (когда градиент вычисляется при помощи марковской цепи).
  BM - стохастическая нейронная сеть,
  так как в обучении задействована цепь Маркова.
  Процесс обучения и работы здесь почти такой же, как в сети Хопфилда:
  нейронам присваивают определенные начальные состояния,
  а затем цепь начинает свободно функционировать.
  В процессе работы нейроны могут принимать любое состояние,
  и мы постоянно перемещаемся между входными и скрытыми нейронами.
  Активация регулируется значением общей температуры,
  при понижении которой сокращается и энергия нейронов.
  Сокращение энергии вызывает стабилизацию нейронов.
  Таким образом, если температура задана верно,
  система достигает равновесия.
  
  Hinton, Geoffrey E., and Terrence J. Sejnowski.
  "Learning and releaming in Boltzmann machines."
  Parallel distributed processing:
  Explorations in the microstructure of cognition 1 (1986): 282-317.
  
  > Original Paper PDF
  https://www.researchgate.net/profile/Terrence_Sejnowski/publication/242509302_Learning_and_relearning_in_Boltzmann_machines/links/54a4b00f0cf256bf8bb327cc.pdf
  
  Ограниченная машина Больцмана (Restricted Boltzmann machine, RBM),
  как ни удивительно, очень похожа на обычную машину Больцмана.
  Основное отличие RBM от BM в том, что они ограничены,
  и следовательно, более удобны в использовании.
  В них каждый нейрон не связан с каждым,
  а только каждая группа нейронов соединена с другими группами.
  Входные нейроны не связаны между собой,
  нет соединений и между скрытыми нейронами.
  RBM можно обучать так же, как и FFPN,
  за небольшим отличием:
  вместо передачи данных вперед и последующего обратного распространения ошибки,
  данные передаются вперед и назад (к первому слою),
  а затем применяется прямое и обратное распространение
  (forward-and-back propagation).
  //// Нужно подумать. Может быть и прямое распространение использовать
  //// для обучения.
  
  Smolensky, Paul. Information processing in dynamical systems:
  Foundations of harmony theory.
  No. CU-CS-321-86. COLORADO UNIV AT BOULDER DEPT OF COMPUTER SCIENCE, 1986.
  
  > Original Paper PDF
  http://www.dtic.mil/cgi-bin/GetTRDoc?Location=U2&doc=GetTRDoc.pdf&AD=ADA620727
  
  Автоэнкодеры (Autoencoders, AE) - нечто подобное FFNN,
  это скорее другой способ использования FFNN,
  чем принципиально новая архитектура.
  Основная идея автоэнкодеров - автоматическое кодирование
  (как при сжатии, а не при шифровании) информации,
  отсюда и название.
  Сеть напоминает по форме песочные часы,
  так как скрытый слой меньше, чем входной и выходной;
  к тому же она симметрична относительно средних слоев
  (одного или двух, в зависимости от четности/нечетности общего количества слоев).
  Самый маленьких слой почти всегда средний,
  в нем информация максимально сжата.
  Все, что расположено до середины - кодирующая часть,
  выше середины - декодирующая,
  а в середине (вы не поверите) - код.
  AE обучают методом обратного распространения ошибки,
  подавая входные данные и задавая ошибку равной разницу между входом и выходом.
  AE можно построить симметричными и с точки зрения весов,
  выставляя кодирующие веса равными декодирующим.
  
  Bourlard, Herve, and Yves Kamp.
  "Auto-association by multilayer perceptrons and singular value decomposition."
  Biological cybernetics 59.4-5 (1988): 291-294.
  
  > Original Paper PDF
  https://pdfs.semanticscholar.org/f582/1548720901c89b3b7481f7500d7cd64e99bd.pdf
  
  Разреженный автоэнкодер (Sparse autoencoder, AE)
  - в некоторой степени антипод AE.
  Вместо того чтобы обучать сеть представлять блоки информации
  на меньшем "пространстве", мы кодируем информацию так,
  чтобы она занимала больше места.
  И вместо того чтобы заставлять систему сходиться в центре,
  а затем обратно расширяться до исходного размера,
  мы, наоборот, увеличиваем средние слои.
  Сети этого типа могут применяться для извлечения
  множества маленьких деталей из набора данных.
  Если бы мы стали обучать SAE тем же методом, что и AE,
  мы получили бы в большинстве случаев абсолютно бесполезную сеть,
  где на выходе получается ровно то же, что и на входе.
  Чтобы этого избежать,
  мы вместо входных данных выдаем на выходе входные данные
  плюс штраф за количество активированных нейронов в скрытом слое.
  //// Интересно. Стоит обдумать. Фактически прототип "наставника",
  //// только очень ограниченного. Скорее "надзирателя".
  Это в какой-то мере напоминает биологическую нейронную сеть
  (spiking neural network),
  в которой не все нейроны постоянно находятся в возбужденном состоянии.
  
  Marc'Aurelio Ranzato, Christopher Poultney, Sumit Chopra, and Yann LeCun.
  "Efficient learning of sparse representations with an energy-based model."
  Proceedings of NIPS. 2007.
  
  > Original Paper PDF
  https://papers.nips.cc/paper/3112-efficient-learning-of-sparse-representations-with-an-energy-based-model.pdf
  
  Архитектура вариационных автоэнкодеров (VAE) такая же, как и у обычных,
  но обучают их другому
  - приблизительному вероятностному распределению входных образцов.
  Это в какой-то степени возвращение к истокам,
  так как VAE немножко ближе к машинам Больцмана.
  Тем не менее, они опираются на Байесовскую математику
  касательно вероятностных суждений и независимости,
  которые интуитивно понятны,
  но требуют сложных вычислений.
  Базовый принцип можно сформулировать так:
  принимать в расчет степень влияния одного события на другое.
  Если в одном месте происходит определенное событие,
  а другое событие случается где-то еще,
  то эти события вовсе не обязательно связаны.
  Если они не связаны, то распространение ошибки должно это учитывать.
  Это полезный подход, так как нейронные сети
  - своего рода огромные графы,
  и иногда бывает полезно исключить влияние одних нейронов на другие,
  проваливаясь в нижние слои.
  //// Тоже можно и нужно использовать для "изоляции",
  //// точнее раздельного/ансамблевого обучения.
  
  Kingma, Diederik P., and Max Welling. "Auto-encoding variational bayes."
  arXiv preprint arXiv:1312.6114 (2013).
  
  > Original Paper PDF
  https://arxiv.org/pdf/1312.6114v10.pdf
  
  Шумоподавляющие (помехоустойчивые) автоэнкодеры (Denoising autoencoders, DAE)
  - это такое AE, которым на подаем на вход не просто данные,
  а данные с шумом (например, делая картинку более зернистой).
  Тем не менее, ошибку мы вычисляем прежним методом,
  сравнивая выходной образец с оригиналом без шума.
  Таким образом, сеть запоминает не мелкие детали,
  а крупные черты,
  так как запоминание небольших деталей, постоянно меняющихся из-за шума,
  часто не приводит никуда.
  
  Vincent, Pascal, et al. "Extracting and composing robust features
  with denoising autoencoders."
  Proceedings of the 25th international conference on Machine learning.
  ACM, 2008.
  
  > Original Paper PDF
  http://machinelearning.org/archive/icml2008/papers/592.pdf
  
  Глубокие сети доверия (Deep belief networks, DBN)
  - сети, представляющие собой композицию нескольких RBM или VAE.
  Такие сети показали себя эффективно обучаемыми одна за другой,
  когда каждая сеть должна научиться кодировать предыдущую.
  Этот метод также называют "жадное обучение",
  он заключается в принятии оптимального на данный момент решение,
  чтобы получить подходящий, но, возможно, не оптимальный результат.
  DBN могут обучаться методами contrastive divergence
  или обратным распространением ошибки
  и учатся представлять данные в виде вероятностной модели,
  в точности как RBM или VAE.
  Однажды обученную и приведенную к стационарному состоянию модель
  можно использовать для генерации новых данных.
  
  Bengio, Yoshua, et al. "Greedy layer-wise training of deep networks."
  Advances in neural information processing systems 19 (2007): 153.
  
  > Original Paper PDF
  https://papers.nips.cc/paper/3048-greedy-layer-wise-training-of-deep-networks.pdf
  
  Свёрточные нейронные сети (convolutional neural networks, CNN)
  и глубокие свёрточные нейронные сети (deep convolutional neural networks, DCNN)
  кардинально отличаются от других сетей.
  Они используются в основном для обработки изображений,
  иногда для аудио и других видов входных данных.
  Типичным способом применения CNN является классификация изображений:
  если на вход подается изображение кошки, сеть выдаст <кошка>,
  если картинка собаки - <собака>.
  Такие сети обычно используют <сканер>,
  не обрабатывающий все данные за один раз.
  Например, если у вас есть изображение 200х200,
  вы захотите строить слой сети из 40 тысяч узлов.
  Вместо это сеть считает квадрат размера 20х20
  (обычно из левого верхнего угла),
  затем сдвинется на 1 пиксель и считает новый квадрат, и т.д.
  Заметьте, что мы не разбиваем изображение на квадраты,
  а скорее ползем по нему.
  Эти входные данные затем передаются через свёрточные слои,
  в которых не все узлы соединены между собой.
  Вместо этого каждый узел соединен только со своими ближайшими соседями.
  Эти слои имеют свойство сжиматься с глубиной,
  причём обычно они уменьшаются на какой-нибудь из делителей
  количества входных данных
  (например, 20 узлов в следующем слое превратятся в 10, в следующем - в 5),
  часто используются степени двойки.
  Кроме сверточных слоев есть также так называемые слои объединения
  (pooling layers).
  Объединение - это способ уменьшить размерность получаемых данных,
  например, из квадрата 2х2 выбирается и передается наиболее красный пиксель.
  На практике к концу CNN прикрепляют FFNN
  для дальнейшей обработки данных.
  Такие сети называются глубокими (DCNN),
  но названия их обычно взаимозаменяемы.
  
  LeCun, Yann, et al. "Gradient-based learning applied to document recognition."
  Proceedings of the IEEE 86.11 (1998): 2278-2324.
  
  > Original Paper PDF
  http://yann.lecun.com/exdb/publis/pdf/lecun-98.pdf
  
  Развёртывающие нейронные сети (deconvolutional networks, DN),
  также называемые обратными графическими сетями,
  - это свёрточные нейронные сети наоборот.
  Представьте, что вы передаёте сети слово "кошка"
  и обучаете ее генерировать картинки кошек путем сравнения получаемых картинок
  с реальными изображениями кошек.
  DNN тоже можно объединять с FFNN.
  Стоит заметить, что в большинстве случаев сети передаётся не строка,
  а бинарный классифицирующий вектор:
  например, <0, 1> - это кошка, <1, 0> - собака, а <1, 1> - и кошка, и собака.
  Вместо слоев объединения, которые часто встречаются в CNN,
  здесь присутствуют аналогичные обратные операции,
  обычно интерполяцию или экстраполяцию.
  
  Zeiler, Matthew D., et al. "Deconvolutional networks."
  Computer Vision and Pattern Recognition (CVPR),
  2010 IEEE Conference on. IEEE, 2010.
  
  > Original Paper PDF
  http://www.matthewzeiler.com/pubs/cvpr2010/cvpr2010.pdf
  
  .......
  
  //// Из комментариев.
  
  .......
  
  kryvichh
  31 окт 2016 в 15:43
  
  Спасибо большое!
  
  Но вот как сейчас, глядя на это многообразие,
  выбирать сеть наиболее оптимальную для конкретной задачи?
  
  Например, мы хотим сделать спелл-чекер русских слов на основе нейронной сети.
  Скормить ей словарь русских слов,
  чтобы она затем по последовательности букв на входе
  выдавала вероятность того, что это - нормальное слово.
  А еще лучше - предлагало вариант слова с исправлением ошибки.
  Какая тут сеть лучше подойдет?
  0
  
  .......
  
  //// Конец цитирования.
  
  И сразу же вторая часть этого замечательного обзора.
  
  "Зоопарк архитектур нейронных сетей. Часть 2"
  Автор: xopxe
  .
  31 окт 2016 в 15:40
  
  Автор оригинала: FJODOR VAN VEEN
  http://www.asimovinstitute.org/neural-network-zoo/
  
  //// Начало цитирования.
  
  ......
  
  Название "Глубокие сверточные обратные глубинные сети
  (Deep convolutional inverse graphics networks, DCIGN)"
  может ввести в заблуждение,
  так как на самом деле это вариационные автоэнкодеры
  со сверточными и развертывающими сетями
  в качестве кодирующей и декодирующей частей соответственно.
  Такие сети представляют черты изображения в виде вероятностей
  и могут научиться строить изображение кошки и собаки вместе,
  взглянув лишь на картинки только с кошками и только с собаками.
  Кроме того, вы можете показать этой сети фотографию вашего кота
  с надоедливой соседской собакой
  и попросить ее вырезать собаку и изображения,
  и DCIGN справится с этой задачей,
  даже если никогда не делала ничего подобного.
  Разработчики также продемонстрировали,
  что DCIGN может моделировать различные сложные преобразования изображений,
  например, изменение источника света или поворот 3D объектов.
  Такие сети обычно обучают методом обратного распространения.
  
  Kulkarni, Tejas D., et al. "Deep convolutional inverse graphics network."
  Advances in Neural Information Processing Systems. 2015.
  
  Original Paper PDF
  https://arxiv.org/pdf/1503.03167v4.pdf
  
  Генеративные состязательные сети
  (Generative adversarial networks, GAN)
  принадлежат другому семейству нейросетей,
  это близнецы - две сети, работающие вместе.
  GAN состоит из любых двух сетей
  (но чаще это сети прямого распространения или сверточные),
  где одна из сетей генерирует данные ("генератор"),
  а вторая - анализирует ("дискриминатор").
  Дискриминатор получает на вход или обучающие данные,
  или сгенерированные первой сетью.
  То, насколько точно дискриминатор сможет определить источник данных,
  служит потом для оценки ошибок генератора.
  Таким образом, происходит своего рода соревнование,
  где дискриминатор учится лучше отличать реальные данные от сгенерированных,
  а генератор стремится стать менее предсказуемым для дискриминатора.
  Это работает отчасти потому,
  что даже сложные изображения с большим количеством шума
  в конце концов становятся предсказуемыми,
  но сгенерированные данные, мало отличающиеся от реальных,
  сложнее научиться отличать.
  GAN достаточно сложно обучить,
  так как задача здесь - не просто обучить две сети,
  но и соблюдать необходимый баланс между ними.
  Если одна из частей (генератор или дискриминатор) станет намного лучше другой,
  то GAN никогда не будет сходиться.
  
  Goodfellow, Ian, et al. "Generative adversarial nets."
  Advances in Neural Information Processing Systems. 2014.
  
  Original Paper PDF
  https://arxiv.org/pdf/1406.2661v1.pdf
  
  Рекуррентные нейронные сети (Recurrent neural networks, RNN)
  - это те же сети прямого распространения,
  но со смещением во времени:
  нейроны получают информацию не только от предыдущего слоя,
  но и от самих себя в результате предыдущего прохода.
  Следовательно, здесь важен порядок,
  в котором мы подаем информацию и обучаем сеть:
  мы получим разные результаты, если сначала скормим ей "молоко",
  а затем "печеньки", или если сначала "печеньки", а потом уже "молоко".
  У RNN есть одна большая проблема
  - это проблема исчезающего (или взрывного) градиента:
  в зависимости от используемой функции активации
  информация со временем теряется,
  так же как и в очень глубоких сетях прямого распространения.
  Казалось бы, это не такая уж серьезная проблема,
  так как это касается только весов,
  а не состояний нейронов,
  но именно в весах хранится информация о прошлом;
  если вес достигнет значения 0 или 1 000 000,
  то информация о прошлом состоянии станет не слишком информативной.
  RNN могут использоваться в самых разнообразных областях,
  так как даже данные, не связанные с течением времени (не звук или видео)
  могут быть представлены в виде последовательности.
  Картинка или строка текста могут подаваться на вход
  по одному пикселю или символу,
  так что вес будет использоваться для предыдущего элемента последовательности,
  а не для того, что случилось X секунд назад.
  В общем случае, рекуррентные сети хороши
  для продолжения или дополнения информации, например, автодополнения.
  
  Elman, Jeffrey L. "Finding structure in time."
  Cognitive science 14.2 (1990): 179-211.
  
  Original Paper PDF
  https://crl.ucsd.edu/~elman/Papers/fsit.pdf
  
  Долгая краткосрочная память (Long short term memory, LSTM)
  - попытка побороть проблему взрывного градиента,
  используя фильтры (gates) и блоки памяти (memory cells).
  Эта идея пришла, скорее, из области схемотехники, а не биологии.
  У каждого нейрона есть три фильтра:
  входной фильтр (input gate), выходной фильтр (output gate)
  и фильтр забывания (forget gate).
  Задача этих фильтров - сохранять информацию,
  останавливая и возобновляя ее поток.
  Входной фильтр определяет количество информации с предыдущего шага,
  которое будет храниться в блоке памяти.
  Выходной фильтр занят тем, что определяет,
  сколько информации о текущем состоянии узла получит следующий слой.
  Наличие фильтра забывания на первый взгляд кажется странным,
  но иногда забывать оказывается полезно:
  если нейросеть запоминает книгу,
  в начале новой главы может быть необходимо забыть
  некоторых героев из предыдущей.
  Показано, что LSTM могут обучаться действительно сложным последовательностям,
  например, подражать Шекспиру или сочинять простую музыку.
  Стоит отметить, что так как каждый фильтр хранит свой вес
  относительно предыдущего нейрона,
  такие сети достаточно ресурсоемки.
  
  Hochreiter, Sepp, and Jurgen Schmidhuber.
  "Long short-term memory." Neural computation 9.8 (1997): 1735-1780.
  
  Original Paper PDF
  http://deeplearning.cs.cmu.edu/pdfs/Hochreiter97_lstm.pdf
  
  Управляемые рекуррентные нейроны (Gated recurrent units, GRU)
  - разновидность LSTM.
  У них на один фильтр меньше, и они немного иначе соединены:
  вместо входного, выходного фильтров и фильтра забывания
  здесь используется фильтр обновления (update gate).
  Этот фильтр определяет и сколько информации сохранить от последнего состояния,
  и сколько информации получить от предыдущего слоя.
  Фильтр сброса состояния (reset gate) работает почти так же,
  как фильтр забывания,
  но расположен немного иначе.
  На следующие слои отправляется полная информация о состоянии
  - выходного фильтра здесь нет.
  В большинстве случаем GRU работают так же, как LSTM,
  самое значимое отличие в том,
  что GRU немного быстрее и проще в эксплуатации
  (однако обладает немного меньшими выразительными возможностями).
  
  Chung, Junyoung, et al. "Empirical evaluation of gated recurrent neural networks
  on sequence modeling." arXiv preprint arXiv:1412.3555 (2014).
  
  Original Paper PDF
  https://arxiv.org/pdf/1412.3555v1.pdf
  
  Нейронные машины Тьюринга (Neural Turing machines, NMT)
  можно определить как абстракцию над LSTM
  и попытку "достать" нейросети из "черного ящика",
  давая нам представление о том, что происходит внутри.
  Блок памяти здесь не встроен в нейрон, а отделен от него.
  Это позволяет объединить производительность
  и неизменность обычного цифрового хранилища данных
  с производительностью и выразительными возможностями нейронной сети.
  Идея заключается в использовании адресуемой по содержимому памяти и нейросети,
  которая может читать из этой памяти и писать в нее.
  Они называются нейронными машинами Тьюринга,
  так как являются полными по Тьюрингу:
  возможность читать, писать и изменять состояние на основании прочитанного
  позволяет выполнять все, что умеет выполнять универсальная машина Тьюринга.
  
  Graves, Alex, Greg Wayne, and Ivo Danihelka. "Neural turing machines."
  arXiv preprint arXiv:1410.5401 (2014).
  
  Original Paper PDF
  https://arxiv.org/pdf/1410.5401v2.pdf
  
  Двунаправленные RNN, LSTM и GRU (BiRNN, BiLSTM и BiGRU)
   не изображены на схеме, так как выглядят в точности так же,
  как их однонаправленные коллеги.
  Разница лишь в том, что эти нейросети связаны не только с прошлым,
  но и с будущим.
  Например, однонаправленная LSTM может научиться прогнозировать слово "рыба",
  получая на вход буквы по одной.
  Двунаправленная LSTM будет получать также и следующую букву
  во время обратного прохода,
  открывая таким образом доступ к будущей информации.
  А значит, нейросеть можно обучить не только дополнять информацию,
  но и заполнять пробелы,
  так, вместо расширения рисунка по краям,
  она может дорисовывать недостающие фрагменты в середине.
  
  Schuster, Mike, and Kuldip K. Paliwal.
  "Bidirectional recurrent neural networks."
  IEEE Transactions on Signal Processing 45.11 (1997): 2673-2681.
  
  Original Paper PDF
  http://www.di.ufpe.br/~fnj/RNA/bibliografia/BRNN.pdf
  
  Глубокие остаточные сети (Deep residual networks, DRN)
  - это очень глубокие FFNN с дополнительными связями между слоями,
  которых обычно от двух до пяти,
  соединяющими не только соседние слои, но и более отдаленные.
  Вместо того, чтобы искать способ находить
  соответствующие исходным данным входные данные через, скажем, пять слоев,
  сеть обучена ставить в соответствие входному блоку
  пару "выходной блок + входной блок".
  Таким образом входные данные проходят через все слои нейросети
  и подаются на блюдечке последним слоям.
  Было показано, что такие сети могут обучаться образцам глубиной до 150 слоев,
  что намного больше, чем можно ожидать от обычной 2-5-слойной нейросети.
  Тем не менее, было доказано,
  что сети этого типа на самом деле просто RNN без явного использования времени,
  а также их часто сравнивают с LSTM без фильтров.
  //// А вот это интересное доказательство.
  //// Получается, что "интерференция" может рассматриваться как реккурентность,
  //// но не назад, а вперед, но с тем же результатом.
  //// Если конечно я правильно понял.
  //// В общем, это точно можно использовать, для алгоритмов "наставника",
  //// но в обратном направлении.
  //// И вообще, появилась мысль, что рассматривать "обратное распространение",
  //// как "виртуальную" нейронку, т.е. динамически возникающую сеть.
  //// и соответственно все что сказано про DRN для нее подходит.
  //// В общем, эта сеть и есть "наставник" и соответственно,
  //// можно рассматривать процесс прямого распространения,
  //// как, помимо целевой задачи, как обучение наставника,
  //// а обратное распространение как обучение студиоса.
  //// И не забыть еще и тот элемент из Sparse autoencoder,
  //// который дает "штраф за количество активированных нейронов".
  
  He, Kaiming, et al. "Deep residual learning for image recognition."
  arXiv preprint arXiv:1512.03385 (2015).
  
  Original Paper PDF
  https://arxiv.org/pdf/1512.03385v1.pdf
  
  Нейронные эхо-сети (Echo state networks, ESN)
  - еще один вид рекуррентных нейросетей.
  Они выделяются тем, что связи между нейронами в них случайны,
  не организованы в аккуратные слои,
  и обучаются они по-другому.
  Вместо подачи на вход данных и обратного распространения ошибки,
  мы передаем данные, обновляем состояния нейронов
  и в течение некоторого времени следим за выходными данными.
  Входной и выходной слои играют нестандартную роль,
  так как входной слой служит для инициализации системы,
  а выходной слой - в качестве наблюдателя
  за порядком активации нейронов,
  который проявляется со временем.
  Во время обучения изменяются связи только между наблюдателем и скрытыми слоями.
  //// Тоже можно/нужно использовать, но с меньшей зависимостью от случайности.
  //// Или, наоборот, с управляемой случайностью.
  
  Jaeger, Herbert, and Harald Haas. "Harnessing nonlinearity: Predicting
  chaotic systems and saving energy in wireless communication."
  science 304.5667 (2004): 78-80.
  
  Original Paper PDF
  https://pdfs.semanticscholar.org/8922/17bb82c11e6e2263178ed20ac23db6279c7a.pdf
  
  Extreme learning machines (ELM) - это те же FFNN,
  но со случайными связями между нейронами.
  Они очень похожи на LSM и ESN,
  но используются скорее подобно сетям прямого распространения,
  и не это связано не с тем, что они не являются рекуррентными или импульсными,
  а с тем, что их обучают методом обратного распространения ошибки.
  
  Cambria, Erik, et al. "Extreme learning machines [trends & controversies]."
  IEEE Intelligent Systems 28.6 (2013): 30-59.
  
  Original Paper PDF
  http://www.ntu.edu.sg/home/egbhuang/pdf/ieee-is-elm.pdf
  
  Машины неустойчивых состояний (Liquid state machines, LSM) подобны ESN.
  Главное их отличие в том, что LSM
  - это разновидность импульсных нейронных сетей:
  на замену сигмоидальной кривой приходят пороговые функции,
  и каждый нейрон также является накопительным блоком памяти.
  Когда состояние нейрона обновляется,
  значение рассчитывается не как сумма его соседей,
  а складывается с самим собой.
  Как только порог превышен, энергия освобождается
  и нейрон посылает импульс другим нейронам.
  //// Этакий импульсный накопитель.
  //// Тоже реализуемо. Но применительно к обучению.
  
  Maass, Wolfgang, Thomas Natschlager, and Henry Markram.
  "Real-time computing without stable states:
  A new framework for neural computation based on perturbations."
  Neural computation 14.11 (2002): 2531-2560.
  
  Original Paper PDF
  https://web.archive.org/web/20120222154641/http://ramsesii.upf.es/seminar/Maass_et_al_2002.pdf
  
  Метод опорных векторов (Support vector machine, SVM)
  служит для нахождения оптимальных решений в задачах классификации.
  В классическом смысле метод способен категоризировать
  линейно разделяемые данные:
  например, определить, на каком рисунке изображен Гарфилд, а на каком - Снупи.
  В процессе обучения сеть как бы размещает всех Гарфилдов и Снупи на 2D-графике
  и пытается разделить данные прямой линией
  так, чтобы с каждой стороны были данные только одного класса
  и чтобы расстояние от данных до линии было максимальным.
  Используя трюк с ядром, можно классифицировать данные размерности n.
  Построив 3D граф, мы сможем отличить Гарфилда от Снупи и от кота Саймона,
  и чем выше размерность, тем больше мультяшных персонажей
  можно классифицировать.
  Этот метод не всегда рассматривается как нейронная сеть.
  
  Cortes, Corinna, and Vladimir Vapnik. "Support-vector networks."
  Machine learning 20.3 (1995): 273-297.
  
  Original Paper PDF
  http://image.diku.dk/imagecanon/material/cortes_vapnik95.pdf
  
  И наконец, последний обитатель нашего зоопарка
  - самоорганизующаяся карта Кохонена
  (Kohonen networks, KN, или organising (feature) map, SOM, SOFM).
  KN использует соревновательное обучение
  для классификации данных без учителя.
  Сеть анализирует свои нейроны на предмет максимального совпадения
  с входными данными.
  Наиболее подходящие нейроны обновляются так,
  чтобы еще ближе походить на входные данные,
  кроме того, к входным данным приближаются и веса их соседей.
  То, насколько изменится состояние соседей,
  зависит от расстояния до наиболее подходящего узла.
  KN также не всегда относят к нейронным сетям.
  
  Kohonen, Teuvo. "Self-organized formation of topologically correct feature maps."
  Biological cybernetics 43.1 (1982): 59-69.
  
  Original Paper PDF
  http://cioslab.vcu.edu/alg/Visualize/kohonen-82.pdf
  
  .......
  
  //// Конец цитирования.
  
  Если после этого "посещения кунсткамеры" структур нейросетей,
  у Вас голова пошла кругом, то не расстраивайтесь - Вы не одиноки.
  Не заплутать в этих аббревиатурах, а самое главное,
  в настоящем "водовороте идей", у меня тоже пока не получается.
  Но мне было чуть легче при чтении этого текста -
  я пытался не запомнить все эти структуры/аббревиатуры,
  а вычленить какие подсказки для формирования набора гипотез
  для различных методов/подходов к обучению нейросетей.
  И что-то действительно удалось "углядеть" и приспособить к делу, см.:
  "Концепция "стапеля" для обучения нейронок".
  
  Собственно именно для этой цели я и счел нужным процитировать
  весь текст без существенных купюр.
  Рано или поздно появится, другая задача, или другое видение той же задачи,
  и будет полезно "пробежаться по кунсткамере"
  в поисках давно забытых "новых подходов".
  
  
  =========
  
  10.02.2024 19:53
  
  Структуры нейросетей для задач компьютерного зрения.
  В оглавление.
  
  Применение нейросетей в системах компьютерного зрения исторически было,
  наверно, одним из самых первых успешных реализаций
  подхода "машинного обучения" к решению практических задач.
  На этих задачах отрабатывались и методика обучения, и новые подходы
  и различные варианты структур нейросетей.
  И процесс этот продолжается и по сей день:
  
  "Компьютерное зрение сквозь года".
  Автор: NikitaShlapak (Никита Шлапак)
  https://habr.com/ru/articles/791532/.
  5 фев 2024 в 16:51
  
  //// Начало цитирования.
  
  Введение
  
  Как-то я столкнулся с довольно тривиальной, но новой для себя задачей
  - оптического распознавания символов (OCR).
  Так сложилось, что готовые инструменты (типа tesseract-ocr) мне не подошли,
  поэтому пришлось изобретать велосипед.
  Но к этому процессу я решил подойти со всей ответственностью:
  проверить несколько подходов, определить их преимущества, недостатки
  и выбрать наиболее подходящий для конкретной задачи.
  По итогу это мини-исследование вылилось в данную обзорную статью.
  Здесь я хочу привести примеры нейросетевых моделей,
  характерных для различных этапов становления области компьютерного зрения
  (далее - CV)
  в том виде, в котором мы его знаем сейчас. Итак, начнём...
  
  Постановка задачи
  
  Подготовка данных
  
  Довольно актуальной является задача получения текста с фотографии
  или скана документа.
  Самым простым способом является разбиение текста на отдельные буквы
  с дальнейшим распознавание каждой буквы по отдельности.
  
  Таким образом, сравнивать модели будем в контексте задачи
  классификации изображения.
  
  Датасет для обучения генерировался на основании написания русских букв 11-ю шрифтами:
  
  .....
  
  К каждой букве применялись аугментации из следующего списка:
  
   Зеркальное отображение (по вертикали и/или горизонтали)
  
   Размытие
  
   Поворот на случайный угол (до 15 градусов) по или против часовой стрелки
  
  Каждая аугментация применялась к изображению со своим шансом.
  При этом сохранялись все изображения:
  исходные и после каждой аугментации.
  После этого к некоторым из них применялось зашумление.
  
  Рис. Пример того, как буквы выглядят после нескольких аугментаций
  
  Условия сравнения
  
  Сравнивать модели будем по следующим параметрам:
  
   Точность (CategoricalAccuracy) - процент "угаданных" букв;
  
   Значение функции потерь (CategoricalCrossentropy)
   - не всегда информативный параметр,
   но при равных точностях может дать дополнительную информацию;
  
   Число параметров и скорость работы
   - для обработки текста по букве крайне важно,
   чтобы модель была небольшой и работала быстро;
  
   Время обучения и вес модели - чисто прикладные характеристики.
   Наиболее полезны будут, если кто-то захочит повторить этот эксперимент.
  
  Эксперимент
  
  Выбор конкурсантов
  
  Для эксперимента я отобрал 5 моделей:
  
   Простая свёрточная нейросеть;
  
   VGG-16;
  
   DenseNet;
  
   Vision Transformer (ViT)
  
   SWin
  
  По моему мнению, такой выбор довольно репрезентативен.
  Если у читателя на этот счёт другое мнение - прошу им поделиться.
  
  Непосредственно классифицирующая часть у всех моделей
  имеет одинаковое строение.
  Также для ускорения процесса обучения было использовано 2 колбека:
  
   ReduceLROnPlateau - уменьшение learning rate
   если длительное время нет улучшения целевой метрики.
  
   EarlyStopping - если длительное время целевая метрика не растёт,
   то обучение прекращается.
  
  В качестве целевой метрики в обоих случаях
  было значение функции потерь на валидационных данных (val_loss)
  
  Всё было написано с помощью библиотеки keras,
  которая с недавнего времени совместима как с tensorflow, так и с pytorch.
  Для детального ознакомления код и данные доступны в репозитории.
  
  Модели будем обозревать в логико-хронологическом порядке.
  Что это такое - поймёте сразу.
  
  Convolution Neural Network (CNN)
  
  Для начала разберёмся с базовым подходом.
  Свёрточные нейросети изначально разрабатывались для классификации изображений,
  поэтому использование свёрточной архитектуры напрашивается в первую очередь.
  
  Эксперименты показали, что самым оптимальным решением
  с точки зрения соотношения скорости обучения и финальной точности
  является использование трёх свёрточных слоёв.
  Структура модели приведена на рисунке.
  
  Рис. Свёрточная модель
  
  Значения метрик для этой и прочих моделей будут приведены в конце,
  а здесь отмечу, что по сравнению с конкурентами эта модель
  обучалась довольно быстро.
  Также к преимуществам можно отнести семантическую простоту
  (для понимания принципа работы эта архитектура самая простая).
  Однако существенным недостатком является её размер.
  Обученная модель весит более 100 Мб, что в разы больше, чем у конкурентов.
  
  Принцип работы свёрточной сети заключается в том,
  что свёрточные слои выделяют из изображения определённые признаки,
  формируя новое изображение - "карту признаков" -
  из которого в дальнейшем также можно извлечь признаки.
  В конце для классификации все эти признаки,
  выделенные из признаков,
  выделенные из... и. д.
  подаются на вход обычного многослойного перцепртона (MLP),
  который в данном случае является классификатором.
  
  Таким образом, качество классификации изображения свёрточной
  (да и, в принципе, любой другой) нейросетью
  определяется двумя вещами:
  качеством выделения признаков
  и качеством классификатора.
  Если с классификатором всё понятно:
  всё, что нужно, это перебрать различные числа слоёв и нейронов
  и выбрать те, которые дадут самую высокую точность,
  то с выделением признаков не всё так просто.
  Логическим продолжением идей простой свёрточной нейросети
  стало появление более сложных моделей,
  способных выделять более мелкие, сложные или неочевидные признаки.
  
  VGG-16
  
  Схематически структуру этой модели традиционно изображают так:
  
  Рис. VGG-16
  
  В ней свёрточные слои (чёрные) извлекают признаки,
  а операция "max pooling" отбирает из них наиболее значимые.
  И так 5 раз.
  Затем идёт уже знакомый нам MLP-классификатор.
  
  Как можно заметить, авторы решили пойти по пути увеличения числа слоёв.
  Действительно, это одна из первых мыслей,
  которая приходит в голову,
  когда ты остаёшься недоволен своей свёрточной нейросетью.
  Однако, в представленной модели имеют место целых 16
  (что и отражено в названии) слоёв,
  12 из которых - свёрточные.
  Используйся эти слои без каких-либо ухищрений
  (что, конечно же не так),
  это привело бы к просто непомерной "тяжести" модели.
  
  К счастью, ухищрения, всё-таки, присутствуют.
  Здесь используется конструкция из нескольких свёрточных слоёв подряд.
  Это позволяет охватывать большую область для определения признаков,
  не слишком сильно увеличивая число обучаемых и хранимых весов.
  
  Возвращаясь к нашей задаче, эта (и следующая) модель
  были использованы в предобученном виде.
  Т.е. оставалось только обучить классификатор.
  В конечном счёте эта модель показала достойную точность
  при меньшем, чем у простой свёрточной, объёме занимаемой памяти.
  Однако, в скорости она уступила.
  
  Увеличивать число слоёв свёрточных моделей до бесконечности нельзя.
  Точнее, конечно, можно,
  но рано или поздно пришлось бы для обучения таких моделей
  использовать квантовые суперкомпьютеры.
  Поэтому, в развитии свёрточных архитектур
  следующим шагом стала передача признаков с одного слоя на другой
  минуя промежуточные.
  
  DenseNet
  
  Характерным примером модели-классификатора,
  использующей этот приём (т.н. "skip connection") является DenseNet:
  
  Рис. DenseNet
  
  Как видно из иллюстрации, модель состоит из нескольких блоков
  и информация передаётся от предыдущего к последующему двумя путями:
  через все промежуточные блоки и напрямую - минуя их.
  
  Модель довольно громоздкая и рассчитана на задачи куда сложнее,
  чем определение буквы на чёрно-белой картинке,
  поэтому в эксперименте выдающихся результатов не показала.
  Но всё же модель гораздо больше всех своих конкурентов
  и гораздо медленнее VGG-16.
  
  Свёрточные архитектуры продолжают развиваться до сих пор
  и всё ещё являются отличными классификаторами
  (занимая первое место на соревнованиях по типу ImageNet) ,
  но среди многих из них прослеживается общая тенденция:
  не слишком впечатляющая скорость работы и огромные размеры.
  Это и стало причиной появления принципиально нового подхода.
  
  Vision Transformer (ViT)
  
  Как это часто случается в науке,
  прорыв произошёл благодаря тому,
  что кто-то обратил внимание на разработки коллег в другой области.
  В данном случае - области обработки естественного языка.
  А именно, вдохновением послужила модель Transformer.
  Эта модель представляет собой автоэнкодер с добавлением механизма внимания.
  
  Визуальный трансформер - это адаптация традиционно языковой архитектуры
  для задач компьютерного зрения.
  В оригинальной статье предлагается разделять картинку на фрагменты,
  затем генерировать для них позиционное кодирование
  и обрабатывать это всё как последовательность.
  Т.к. в нашем случае картинки довольно маленькие,
  то было решено упростить архитектуру до предела:
  отбросить позиционное кодирование
  и подавать на вход никак не изменённую картинку:
  
  Рис. Структура используемого трансформера
  
  Внутри для более качественного извлечения признаков
  стоит сразу 4 слоя TransformerEncoder.
  Такая архитектура не уступает свёрточной по скорости обучения,
  но сильно выигрывает в размере.
  Правда, скорость обработки у неё пониже.
  
  Модели на базе визуальных трансофрмеров сразу же стали активно развиваться.
  Одним из наследников стала модель с забавным
  для русскоговорящего человека названием SWin.
  
  Vision Transformer using Shifted Windows (SWin):
  
  Swin - это одна из самых совершенных архитектур на базе трансформеров.
  У неё есть 2 главных улучшения по сравнению с оригинальным ViT:
  
   Иерархическая структура.
   Он разбивает изображение не на фрагменты одного размера,
   как это делает базовый ViT,
   а сначала крупные,
   затем эти крупные фрагменты разбивает на фрагменты помельче и т.д.
  
   Матрицы внимания вычисляются 2 раза:
   для разбитой картинки и для такой же картинки,
   разбитой на фрагменты такого же размера, но со смещением
  
  На самом деле усовершенствований там довольно много.
  Есть статья, в которой это всё разобрано.
  https://habr.com/ru/articles/599057/
  
  В нашем случае, опять же, сильно усложнять нужды нет.
  Поэтому упрощаем.
  В данном случае код практически без изменений был скопирован
  с официальной документации.
  https://keras.io/examples/vision/swin_transformers/
  
  Рис. Структура модели на базе SWin
  
  Swin на голову опережает CNN и ViT по всем параметрам,
  кроме одного: скорости обучения.
  И точность у него примерно такая же, как и у всех остальных.
  Обучается он в 5-10 раз дольше и на первых эпохах обучения
  значения метрик у него крайне низкие
  (после 5 эпохи точность у него была около 50% при том,
  что ViT к этому моменту уже преодолел порог точности на обучающей выборке в 95%).
  
  Эта архитектура показала отличную точность классификации,
  обойдя все "трансформерные" модели и практически все свёрточные на ImageNet в момент выхода,
  чем по праву заслужила внимание, уделённое ей.
  Она получила улучшение в виде модели SWin-2 в апреле 2022 года
  https://arxiv.org/pdf/2111.09883.pdf
  и духовного преемника в виде NAT - в мае 2023.
  https://arxiv.org/pdf/2204.07143.pdf
  
  Итоги соревнования
  
  Численные сравнения приведены ниже.
  Жирным шрифтом выделены лучшие результаты по каждому критерию
  
  ......
  
  *модели были взяты с весами ImageNet согласно официальной документации keras
  
  **обучение проводилось на видеокарте NVidia 4060 для ноутбуков.
  
  Если обобщать, то в задаче оптического распознавания символов
  есть смысл использовать архитектуру на базе SWin,
  однако, стоит учитывать, что более сложные модели
  требуют гораздо больше времени и данных для обучения.
  В случае, если датасет небольшой и расширению поддаётся плохо,
  неплохо себя показывает базовая модель ViT,
  а если добавить позиционное кодирование,
  то точность можно повысить ещё больше.
  
  Полезные ссылки
  
  Документация Keras (примеры кода, инструкции по применению и объяснения)
  
  ......
  
  Статьи на хабре
  
   Свёрточные нейросети
  https://habr.com/ru/articles/348000/
  
   Максимально подробно про трансформер
  https://habr.com/ru/articles/341240/
  
   Тоже хорошая статья про ViT
  https://habr.com/ru/articles/599677/
  
   ...и про Swin
  https://habr.com/ru/articles/599057/
  
  
  Официальные публикации крутых дядек
  
   Attention is All You Need- про транформер
  
   An Image is Worth 16x16 Words- про визуальный трансформер (ViT)
  
   Swin Transformer: Hierarchical Vision Transformer using Shifted Windows -
  вершина эволюции визуальных трансформеров
  
   Swin Transformer V2 - как SWin,только лучше
  
   Neighborhood Attention Transformer - и ещё лучше
  
   Densely Connected Convolutional Networks - DenseNet
  
  И ссылка на репозиторий:
  
  https://github.com/NikitaShlapak/OCR
  
  .......
  
  //// Конец цитирования.
  
  По-моему, очень неплохой материал для начального введения
  в структуры нейросетей, используемые в компьтерном зрении.
  Отталкиваясь от него можно попробовать разбираться более детально
  с каждой из упомянутых структур.
  
  
  ========
  
  30.01.2024 9:10
  
  Структуры нейросетей для задач визуального детектирования.
  В оглавление.
  
  Нейросети для визуального детектирования объектов,
  это практически те же системы компьютерного зрения,
  но с некоторой существенной "спецификой".
  Это уже не просто классификатор объектов на картинке,
  но еще и инструмент для визуализации того в каком "месте" изображения
  идентифицирован тот или иной объект.
  
  Первоначально такие системы базировались на сверточных нейросетях (CNN)
  Но дальнейшее развитие этой области, новые задачи и новые требования
  привели к появлению все новых и новых, порой весьма экзотических структур.
  Вот и будем понемногу с ними разбираться, чтобы выделить основные тенденции:
  
  "Детекция объектов. R-CNN, Fast R-CNN, Faster R-CNN. Часть 1".
  Автор: nepexom (Максим Переходкин)
  https://habr.com/ru/articles/789942/.
  29 янв 2024 в 22:56
  
  //// Начало цитирования.
  
  ......
  
  Первая часть будет посвящена постановке задачи детекции
  и обзору первых алгоритмов.
  Последующие части будут уже про актуальные модели, в частности, про YOLO.
  
  Введение. Кто такой детектор?
  
  Ранее с CNN мы решали задачу классификации,
  где на вход модели подавалось изображение,
  а на выходе мы получали вектор вероятностей,
  где каждая компонента соответствует вероятности какого-то класса.
  
  В задаче детекции мы не только хотим знать КТО на изображении,
  но ещё и ГДЕ он находится.
  Положение объекта определяет прямоугольник,
  охватывающий объект и называется он Bounding box
  или в народе ббокс
  (красный прямоугольник на картинке сверху).
  
  Ббокс описывается пятью числами: x, y, w, h, c:
  
   x, y - иксовая и игрековая компоненты центра
  
   w, h - ширина и высота соответственно
  
   c - уверенность в том, что внутри этого ббокса
   вообще находится хоть какой-то объект
  
  + для каждого ббокса нам надо предсказать класс содержащегося внутри объекта.
  Вот список популярных датасетов с разметкой для детекции:
  
   Pascal voc 2012
  
   COCO
  
  Итак, еще разок. Модель должна предсказывать прямоугольники,
  в которых содержатся объекты + определять,
  к каким классам они принадлежат.
  Давайте немного погрузимся в историю и посмотрим,
  как люди начинали решать эту задачу.
  
  Первый подход к решению задачи детекции. Sliding-window (скользящее окно)
  
  Представим, что нам поставили задачу выделить прямоугольником лицо.
  Как бы мы её решали, если у нас уже есть
  обученная модель классификатора изображений?
  
  Ну поскольку классификатор уже есть,
  и нужно просто понять, где находится объект
  - давайте сделаем окно, которое будет попиксельно двигаться по изображению
  и кропать (обрезать) его,
  а затем кропнутые изображения кидать в модель классификатора.
  Если классификатор выдаст высокую вероятность лица,
  значит оно нашлось и нашелся соответствующий прямоугольник.
  
  Мы также хотим варьировать размер окна,
  чтобы улавливать объекты разной формы и масштаба,
  поэтому будет вложенный цикл по параметрам окна и по изображению.
  В целом такая схемка работает,
  но она очень неэффективная...
  Вот гифка того, как оно происходит для окна фиксированного размера:
  
  Двухстадийные детекторы
  
  Окей, скользящее окно не очень эффективно,
  поэтому надо думать дальше.
  А что если не перебирать втупую все возможные варианты положения объекта,
  а попробовать как-то сузить круг поиска?
  Именно эта идея легла в основе архитектур двухстадийных детекторов.
  Двухстадийными они называются,
  так как сначала мы находим Default Boxes
  (наши гипотезы о местонахождении объекта),
  а затем уже, опираясь на них, даем ответ.
  
  Архитектура R-CNN
  
  R-CNN сужает поиск возможных положений объекта
  при помощи алгоритма Region Proposal (Selective Search).
  Данный алгоритм получает на вход изображение,
  а на выходе выдает массив прямоугольников,
  в которых возможно находится объект.
  При этом в основе алгоритма лежит классический Computer Vision
  (вдаваться в подробности этого алгоритма думаю нет смысла,
  так как на практике он уже давно не используется).
  //// Но познакомиться, наверно, имеет смысл.
  
  Итак, сначала мы запускаем на изображении Selective Search,
  а далее в цикле подаем кропы с этих регионов в классификатор.
  Ниже приведена архитектура из оригинальной статьи:
  https://arxiv.org/abs/1311.2524
  
  ......
  
  Помимо метки класса мы так же предсказываем поправки (offset) к прямоугольникам.
  т. е. дополнительно предсказываем соответствующие поправки к x, y, w, h
  и строим функцию потерь для обучения,
  состоящую из потери для классификации и регрессии.
  
  Теперь алгоритм стал эффективнее,
  чем просто полный перебор всех возможных местоположений,
  НО все равно не достаточно эффективно.
  Ведь для каждого региона нужно запускать классификатор.
  Например, что если Selective Search выдал 100 регионов,
  а наш классификатор это жирный VGG,
  который будет работать около секунды?
  Получается больше минуты на поиск объекта на одном изображении.
  Тут ни о каком риалтайме и речи идти не может,
  поэтому нужно думать дальше.
  
  Архитектура Fast R-CNN
  
  Что нам не понравилось в прошлой архитектуре?
  Конечно же запуск сверточной сетки для каждой гипотезы,
  полученной из Selective Search.
  Именно эту проблему решает новая архитектура Fast R-CNN.
  Делает она это следующим образом:
  
   Сначала мы прогоняем изображение через сверточную сеть
   и получаем Feature Map
  
   Запускаем на изображении Selective Search
   и проецируем прямоугольники прямо на Feature Map.
  https://www.educative.io/answers/what-is-a-feature-map
   Например, если тензор исходного изображения был размерности [3, 244, 244],
   а размерность выходного тензора после сверток [1, 32, 32],
   то для того, чтоб спроецировать координаты ббоксов,
   нам нужно просто посчитать aspect ratio
   и умножить на него соответствующие координаты ббоксов.
   Дальше уже просто делать кропы с feature map.
  
   Приводим ббоксы на feature map к одному размеру
   и в цикле пробрасываем их в полносвязный слой.
   За этот пункт отвечает процедура RoI Pooling (RoI - region of interest)
  
  Что же поменялось?
  И тогда и сейчас мы запускали цикл по каждому предположению.
  НОО сейчас в цикле не запускается сверточная сеть,
  так как прямоугольники мы отмечали прям на feature map.
  Поэтому архитектура стала в разы эффективнее.
  Вот, кстати, схема из статьи с моим небольшим рисунком:
  https://arxiv.org/abs/1504.08083
  
  .......
  
  Ранее я говорил, что мы решаем две задачи в детекции:
  классификацию и регрессию (для корректировки прямоугольников),
  поэтому после FCs мы видим разветвление.
  Выход из полносвязных слоев идет в softmax (для классификации)
  и в bbox regressor (для поправок к ббоксам).
  Далее строится мульти-таск лосс,
  который выглядит примерно так
  (b - это поправки к прямоугольникам, c - вектор вероятностей классов):
  
  L(c_{pred}, b_{pred}, c_{true}, b_{tue}) = L_1(c_{pred}, c_{true}) + L_2(b_{pred}, b_{true})
  
  Faster R-CNN
  
  Это улучшение заменяет Selective Search на нейронную сеть.
  Теперь поиск ббоксов - это тоже обучаемый алгоритм под названием RPN.
  Цитата из оригинальной статьи:
  "The RPN is thus a kind of fully convolutional network (FCN)
  and can be trained end-to-end specifically
  for the task for generating detection proposals".
  
  Идейно это единственное отличие.
  т. е. раньше у нас был Selective Search,
  который брал на вход картинку, генерил нам боксы,
  ресайзил их с нужным коэффициентом и накладывал на Feature Map,
  а теперь, в Faster R-CNN,
  это делает отдельный модуль Region Proposal Network,
  который так же нам генерирует боксы на основе нашего датасета.
  //// И вот это надо будет внимательно посмотреть.
  
  Думаю далее вдаваться в подробности RPN не имеет смысла,
  так как архитектура не актуальна на сегодняшний день.
  Тут скорее хотелось дать качественное описание того, что менялось:)
  
  Заключение
  
  Итак, мы разобрались с тем, что такое детекция,
  и какие были первые подходы к решению этой задачи.
  Некоторые идеи из двухстадийных детекторов продолжили своё существование
  в новых одностадийных детекторах,
  которым будет посвящена моя следующая статья.
  Если быть конкретнее, то речь пойдет про архитектуру YOLO
  и то, чем она так всем угодила.
  
  .......
  
  //// Из Комментариев.
  
  ti_uporot
  9 часов назад
  
  Yolo по факту будет по круче, как минимум по причине того,
  что как минимум в 3-ей версии уже были анкоры,
  за счёт чего у тебя уже уменьшение по ресурсам идёт,
  а не перебирать буквально каждый пиксель)
  
  .......
  
  AndreyDmitriev
  30 янв в 11:14
  
  По поводу YOLO тут пара недель назад в линкед ин
  
  проскочила информация о YOLO 8.1,
  которая умеет в Oriented Bounding Boxes (OBB),
  ну то есть возвращаемые регионы не просто прямоугольники,
  а повёрнутые - к примеру тут модель на наборе данных DOTA v1:
  
  Я было попробовал со своим набором,
  но детальной информации практически нет,
  хотя бы как правильно разметку делать при обучении и как описать эти регионы.
  
  .....
  
  Если предположить. что всё, что у меня есть
  - куча своих изображений всяких разных деталек,
  то за пошаговое руководство "от А до Я" как установить, разметить
  и натренировать YOLO, чтобы получить результат типа такого:
  
  ......
  
  вероятно благодарность сообщества не имела бы границ в пределах разумного.
  
  ......
  
  //// Конец цитирования.
  
  Самое интересное, на мой взгляд, анализируя этот материал
  - это возможность обучения нейронок на выделение "ббоксов",
  причем делать это как-то инвариантно по отношению к масштабу этих "ббоксов".
  Вот как бы понять как это происходит.
  Есть интуитивное ощущение, что это, возможно, ключевой вопрос для понимания
  не только систем данного типа, но вообще систем в которых есть это самое
  "внутреннее свернутое представление", то бишь, "эмбеддинги".
  
  
  =========
  
  17.02.2024 17:16
  
  Структура сети YOLO для задач визуального детектирования.
  В оглавление.
  
  Продолжим изучение нейросетей предназначенных для визуального детектирования,
  как достаточно простых по архитектуре, если сравнивать их теми же LLM,
  но очень интересных по заложенных в них идеях:
  
  "Детекция объектов. YOLO. Часть 2".
  Автор: nepexom (Максим Переходкин)
  https://habr.com/ru/articles/792926/.
  11 фев 2024 в 15:25
  
  //// Начало цитирования.
  
  Введение.
  
  Когда пытаешься разобраться в работе YOLO по статьям в интернете,
  постоянно натыкаешься на примерно такое объяснение:
  <Алгоритм делит изображение сеткой SxS,
  где каждому элементу этой сетки соответствует N ббоксов с координатами,
  предсказаниями классов и тд...>.
  Но лично мне становилось только непонятнее от такого высокоуровнего описания..
  Ведь в исследованиях часто всё происходит примерно так:
  перебирают гипотезы, пока не получат приемлемый результат,
  а потом уже придумывают красивое описание.
  Поэтому для ясности хочется рассказать,
  как вообще приходили к идеям,
  которые ложились в основу YOLOv1 и последующих версий.
  
  Немного про особенности Feature Map
  
  Сначала поговорим про Feature Map,
  чтобы потом стало понятно откуда взялась эта непонятная сетка SxS.
  Итак, давайте представим, что у нас есть
  маленькое трехканальное (RGB) изображение 10*10 пикселей.
  Мы прогоняем его через две свёртки:
  с ядром 5*5 и ядром 3*3.
  
  .....
  
  Рис. Визуализация кода
  
  На изображении видно, что левая верхняя ячейка Feature map 2
  является результатом свертки выделенной области из Feature map 1.
  В то же время, каждая ячейка из выделенной области на Feature map 1
  является результатом сверки соответствующей области исходного изображения.
  Получается, что выделенный элемент на Feature map 2
  отображает признаки выделенной области на исходном изображении Input image.
  Поскольку Feature map 2 имеет размер 4*4
  - можно сказать, что он как бы делит исходное изображение сеткой 4*4,
  так как каждый его элемент смотрит на 1 из 16 частей изображения.
  
  Вдобавок становится понятно,
  что чем глубже находится Feature Map,
  тем более высокоуровневые признаки на изображении он описывает.
  Вот довольно популярная картинка, которая показывает это свойство:
  
  Рис. Low, Mid, High Level Features
  
  Low-Level Feature описывает всякие непонятные линии и закарючки,
  так как ядро сворачивает очень маленькую часть изображения.
  Mid-Level Feature описывает уже что-то более осмысленное,
  так как отображает часть побольше.
  И наконец High-Level Feature уже содержит информацию,
  которую можно как-то интерпретировать
  (наличие колеса, фар, решетки радиатора и тп)
  
  YOLOv1
  
  В 2015 году Joseph Redmon опубликовал статью You
  Only Look Once: Unified, Real-Time Object Detection.
  https://arxiv.org/abs/1506.02640
  Гипотеза, которую ему удалось проверить
  и получить хороший результат заключалась в следующем:
  <А что если взять какую-то предобученную модель
  для классификации картинок
  и просто заменить последний слои так,
  чтобы она предсказывала не вероятность классов,
  а какой-то тензор,
  в котором будет содержаться информация о ббоксах и классах.
  
  Архитектура
  
  В статье сначала строится архитектура для классификации изображений,
  вдохновленная GoogLeNet:
  
  Рис. я тут немного порисовал,
  так как в оригинальной статье уже сразу финальная архитектура
  с последними слоями для детекции.
  
  Эта архитектура училась классифицировать изображения на ImageNet (1000 classes)
  и на валидации вошла в top-5 Accuracy с 88%.
  После того, как мы обучили классификатор,
  замораживаем первые 20 слоёв.
  Т.е. их веса больше не будут меняться в ходе дальнейшего обучения
  (ничего волшебного - это обычный Fine-Tuning)
  
  Теперь у нас есть предобученные 20 слоёв,
  которые извлекают информацию из изображения.
  Добавим к ним 4 необученных сверточных слоя + полносвязный слой.
  В самом конце возвращается тензор,
  в котором будет информация о ббоксах и соответствующих классах.
  
  Вот финальная архитектура (Изменились только последние слои ):
  
  Рис. Архитектура YOLOv1
  
  Пока что не обращаем внимание на размерность выходного тензора 7\times7\times30
  
  Давайте подумаем, а как вообще записать информацию о ббоксах в выходной тензор?
  
  Размер выходного тензора
  
  В прошлой статье я говорил, что для описания бокса нам нужно 5 чисел:
  x, y, w, h, conf
  
  Для того, чтоб предсказать класс объекта, находящегося в боксе,
  нам нужен вектор длины C ,
  где C - это количество классов
  (каждая компонента соответствует вероятности какого-то класса).
  В датасете Pascal Voc 20 классов, так что C=20 .
  Следовательно для информации об одном ббоксе
  нам нужен вектор длины 25 (5 +20=25)
  
  Ббоксы должны соответствовать какой-то области изображения,
  следовательно, выходной тензор будет иметь размер S \times S,
  где каждый элемент отражает область на исходном изображении.
  Автор взял S=7, то есть выходной тензор как бы разбивает исходное изображение
  на 7 * 7 частей.
  
  Далее, пусть каждой области соответствует B ббоксов (автор выбрал B=2)
  
  Т.е. каждому элементу выходного тензора S \times S должен быть сопоставлен
  вектор размера B \cdot(5 + C).
  В статье класс решили предсказывать только для ббокса с самым большим conf ,
  поэтому формула немного упростится и станет B \cdot 5 + C
  
  Общая формула размера выходного тензора выглядит так:
  S\times S \times (B \cdot5 + C)
  
  Отсюда мы и получаем 7 \times 7 \times 30
  
  Лосс и обучение
  
  Вот и вся архитектура YOLOv1.
  Теперь остается только придумать функцию потерь,
  состоящую из ошибки предсказания ббоксов и классов.
  Далее в процессе обучения ошибка будет минимизироваться
  и в выходном тензоре будут получаться всё более и более осмысленные числа.
  
  Рис. Функция потерь YOLOv1
  //// Очень многочленная формула.
  //// И напрашивается вопрос, а может быть лучше не одна общая функция потерь
  //// а несколько разных с несколько соответствующих проходов
  //// обратного распространения ошибок?
  
  YOLO предсказывает несколько ббоксов для каждой области изображения.
  Во время обучения, мы хотим, чтобы только один ббокс
  был ответственным за каждый объект.
  Ответственным выбирается тот, у кого самый большой IoU c Ground Truth
  (истинным ббоксом из разметки)
  
  Далее в статье показываются метрики,
  по которым видно, насколько YOLO быстрее, чем Fast R-CNN
  и какая у неё хорошая метрика mAP на валидационном датасете VOC 2007.
  Интересно заметить, что в таблицах показаны метрики
  для комбинированной модели YOLO + Fast R-CNN,
  которые дают хороший результат по качеству.
  
  YOLOv2 (YOLO9000)
  
  На волне хайпа уже в следующем году Joseph Redmon публикует улучшение YOLOv1
  в этой статье.
  https://arxiv.org/abs/1612.08242
  Название 9000 говорит о том, что модель способна отличить аж 9к классов!
  При этом оставаясь достаточно качественной и быстрой.
  
  Главным недостатком предыдущей модели были
  ошибки локализации + маленький recall,
  по сравнению с двухстадийными детекторами.
  Относительно маленький recall значит,
  что модель часто вообще не видит объект там,
  где его видит, например, Fast R-CNN.
  Поэтому основная задача - это улучшить
  геометрическую точность предсказания ббоксов и recall.
  
  Anchor Boxes
  
  Помимо всяких улучшений за счет батч норма, увеличения разрешения и тп,
  вводится очень важное архитектурное изменение,
  заключающееся в добавлении Anchor Boxes
  (я не знаю как это перевести на русский).
  Ранее YOLO предсказывала координаты с нуля,
  прямо из полносвязного слоя.
  Как мы помним, двухстадийные детекторы предварительно имели
  целый набор гипотез для ббоксов.
  Как показывает практика,
  модели гораздо проще предсказывать поправки к наперед заданным ббоксам,
  чем с нуля их строить.
  Поэтому в YOLOv2 решили взять хорошую идею из двухстадийных детекторов
  и использовать Anchor Boxes!
  (Возможно такая идея пришла как раз после работы
  с комбинированной моделью YOLOv1 + Fast R?CNN).
  Такое нововведение также позволило предсказывать гораздо больше ббоксов.
  //// Очень интересная идея сама по себе.
  //// Использовать нейросеть как "корректор" какого-то
  //// предварительного "предсказания" полученного другим способом
  //// или другой системой.
  
  После добавления Anchor Boxes в YOLO появилась проблема,
  заключающаяся в том, что размеры боксов подбираются вручную.
  Решением проблемы стало использование k-means clustering
  для автоматической генерации гипотез.
  По сути дефолтные боксы (Anchor Boxes) в YOLO
  генерируются на основе конкретного датасета,
  на котором вы хотите обучать модель.
  
  Другая проблема заключалась в том,
  что на ранних итерациях обучения,
  нейронке довольно сложно предсказывать (x, y),
  поскольку изначально её веса рандомные,
  и смещение дефолт бокса может быть произвольным,
  т. е. он может вообще уплыть в любую часть изображения.
  Чтобы этого избежать,
  YOLOv2 вместо предсказания поправок,
  предсказывает относительные координаты внутри grid cell
  (элемент сетки, которая "делит" изображение),
  и коэффициенты для поправок к ширине и высоте.
  //// Вот это совсем не понял. Причем здесь трудности обучения,
  //// и как эта трудность была преодолена.
  
  Сеть выдаёт по прежнему 5 чисел для каждого ббокса: t_x, t_y, t_w, t_h, t_0
  
  Пусть (с_x, c_y) - это смещение координат левого верхнего угла grid cell
  (это надо для расчета абсолютных координат,
  тк ранее мы говорили, что предсказывать будем относительные координаты)
  
  Пусть (p_w, p_h) - это ширина и высота дефолт бокса
  
  Тогда финальные координаты предсказанного бокса считаются следующим образом:
  
   \begin{cases} b_x=\sigma(t_x)+c_x \\ b_y=\sigma(t_y) + c_y\\ b_w=p_w e^{t_w} \\ b_h=p_he^{t_h} \end{cases}
  
  Выглядит сложно на первый взгляд,
  но по сути модель просто КАК-ТО предсказала свои 5 чисел,
  потом для координат мы используем функцию активации \sigma(x),
  у которой область значений [0, 1],
  а далее прибавили координаты левого угла grid cell,
  чтобы перейти к абсолютным координатам.
  Ширину и высоту дефолт бокса мы просто домножили на коэффициенты,
  зависящие от параметров модели.
  Важно помнить, что это мы сами так ввели и определили вычисление координат ббоксов,
  а дальше оно само уже под капотом обучится.
  
  Детекция объектов на маленьких участках изображения
  
  Чтобы находить объекты разного масштаба,
  нам надо иметь несколько Feature Map.
  Как я уже говорил в начале этой статьи:
  есть Low-Level Features и High-Level Features.
  Так вот, чтобы находить мелкие объекты
  - нам нужен Low-Level Feature Map.
  В YOLOv2 используется passthrough layer,
  который конкатенирует разные Feature Map,
  предварительно приводя их к одному размеру.
  
  Немного конкретнее:
  в YOLOv2 после первых сверток есть Feature Map размера 26\times26\times512 ,
  который содержит в себе низкоуровневую информацию.
  После последних сверток у нас есть Feature Map размера 13\times13 .
  Чтобы их объединить,
  нам надо сделать reshape для низкоуровневых фичей:
  26\times26\times512=13*2\times13*2\times512=13\times13\times2048
  и теперь можно объединять с High-Level Features
  //// Интересное это "конкатенирование", очень созвучно с реализацией
  //// какого-то там "внутреннего внимания".
  //// Скорее всего и механизм действия этой "магии" однотипен.
  
  Новый Feature extractor
  
  В YOLOv2 поменяли backbone, теперь в основе лежит сеть Darknet-19.
  Она чем-то похожа на VGG, тк в основном там фильтры 3x3,
  но она не такая толстая и ресурсозатратная.
  Думаю про Darknet-19 читатель может отдельно почитать,
  если возник такой интерес.
  
  В целом, это все основные изменения в архитектуре YOLOv2
  
  YOLOv3
  
  Свою третью последнюю статью про YOLO Joseph Redmon
  начинает многообещающе со следующих слов:
  https://arxiv.org/abs/1804.02767
  I didn't do a whole lot of research this year.
  Spent a lot of time on Twitter.
  Played around with GANs a little.
  I had a little momentum left over from last year.
  I managed to make some improvements to YOLO.
  But, honestly, nothing like super interesting,
  just a bunch of small changes that make it better
  
  Во-первых, YOLOv3 теперь может работать уже на ТРЕХ разных скейлах.
  //// "Скейл", наверно, надо понимать как "масштаб".
  //// Но зато как круто звучит, особенно для "непосвященных".
  Это значит, что информация извлекается из 3-х разных Feature Map.
  Вдобавок в статье уже ссылаются на Feature Pyramid Networks.
  По сути эти "пирамиды" описывают способ,
  которым можно объединить Feature Map с разных уровней сверток.
  Вот пример того, как он работает:
  
  .......
  
  Отлично! Теперь надо сложить high_feature_map и mid_feature_map.
  Для этого сделаем high_feature_map такого же размера при помощи nn.Upsample
  
  .....
  
  Теперь аналогично делаем Upsampling для high_mid_feature_map,
  складываем его с low_feature_map и получаем тензор,
  который содержит информацию c 3-х разных scale.
  Таким образом YOLOv3 может видеть ещё более мелкие объекты на изображении.
  
  Darknet-19 ---> Darknet-53
  
  В YOLOv3 поменялся Feature extractor,
  теперь там 53 сверточных слоя, отсюда и название))
  Сеть стала значительно глубже, что позволило улучшить точность.
  В Darknet-53 встречаются Residual блоки,
  аналогичные тем, что используются в сети ResNet.
  Эти блоки позволяют эффективно передавать информацию через слои,
  что способствует обучению более глубоких нейронных сетей.
  Модель обычно предварительно обучается на больших наборах данных
  (например, ImageNet),
  а затем дообучается на конкретной задаче обнаружения объектов.
  Она является ключевым компонентом YOLOv3,
  обрабатывая входные изображения и извлекая признаки,
  которые затем используются для обнаружения объектов на изображениях.
  
  Заключение
  
  Сам создатель YOLO Joseph Redmon опубликовал 3 статьи,
  которые тут и описываются.
  Дальнейшие улучшения уже делали его последователи
  в YOLOv4, YOLOv5, YOLOv6 и тд.
  Тем не менее основные идеи и дальнейший вектор развития
  был заложен именно в первых трех версиях.
  YOLO сейчас широко используется для задач обнаружения объектов
  в реальном времени.
  Например, обработка кадров с видеопотока мобильного устройства, умных камер и тд.
  Следующие статьи думаю будут больше про практику
  и применение / внедрение моделей :)
  
  .......
  
  //// Конец цитирования.
  
  На что стоит, на мой взгляд, обратить внимание в этом материале.
  Это во-первых, на идею использования нейросети не как "генератора с нуля",
  а как корректора какого-то предварительного предсказания.
  Во-вторых, на сам подход использовать на выходе нейросети
  уже не просто вектор, а тензор, т.е. возможность более тонко настраивать
  нейросеть за счет, фактически, параллельного обучения по нескольким каналам,
  соответствующих разным "компонентам тензора".
  И в третьих, все более широкое использование Residual блоков,
  т.е. связей в обход отдельных слоев нейросети.
  Фича, которая как-то работает, но как именно особого понимания пока нет.
  
  Кстати, одна из целей этого модуля как раз и заключается в попытке
  разобраться именно с этой "фичей", точнее с тем почему и как она работает
  на самом деле, а не в путанных и противоречивых объяснениях/догадках,
  разбросанных по самым разным материалам.
  Даже устоявшегося термина нет, и это при всей любви к звучным терминам/аббревиатурам.
  Поэтому и такое внимание, к каждому упоминанию этого "архитектурного элемента".
  В данном тексте его применение обосновывается облегчением обучения
  И передачей какой-то информации от входных слоев к выходным.
  Но какой именно не уточняется - считается, что и так все понятно.
  Представляется, что именно такие "связи" это те самые "кончик нитки",
  которые могут помочь распутать "клубок" загадки
  "свернутого/скрытого пространства эмбеддингов".
  
  
  ==========
  
  10.02.2024 17:47
  
  Пошаговый разбор работы трансформера.
  В оглавление.
  
  Возможно, для того чтобы лучше понимать как работают различные структуры нейронок,
  стоит детально, пошагово пройтись по разбору работы какой-то конкретной структуры.
  И в этом случае, наверно, лучше всего подойдет материал
  по наиболее "хайповой" на данный момент архитектуре - трансфомерному блоку
  и, соответственно, "лидеру всех рейтингов" GPT:
  
  "Как работают трансформеры: разбираем математику".
  Автор: PatientZero
  https://habr.com/ru/articles/785474/.
  18 янв 2024 в 10:16
  
  Автор оригинала: Omar Sanseviero
  https://osanseviero.github.io/hackerllama/blog/posts/random_transformer/
  
  Материал объемный и сложный, но весьма полезный для понимания
  как работают реальные, а не учебные модели нейросетей.
  Постарался по максимуму урезать, но без потери смысла.
  Так что не обессудьте на то, что получилось.
  Надеюсь, это позволит оценить необходимость обращаться к оригиналу.
  
  //// Начало цитирования.
  
  В этом посте я представлю подробный пример математики,
  используемой внутри модели трансформера,
  чтобы вы получили хорошее представление о работе модели.
  Чтобы пост был понятным, я многое упрощу.
  Мы будем выполнять довольно много вычислений вручную,
  поэтому снизим размерность модели.
  Например, вместо эмбеддингов из 512 значений
  мы используем эмбеддинги из 4 значений.
  Это позволит упростить понимание вычислений.
  Мы используем произвольные векторы и матрицы,
  но при желании вы можете выбрать собственные значения.
  
  Как вы увидите, математика модели не так уж сложна.
  Сложность возникает из-за количества этапов и количества параметров.
  Перед прочтением этой статьи я рекомендую прочитать пост
  Illustrated Transformer
  (или читать их параллельно) [перевод на Хабре].
  https://habr.com/ru/articles/486358/
  Это отличный пост,
  объясняющий модель трансформера интуитивным (и наглядным!) образом,
  поэтому я не буду объяснять то, что уже объяснено в нём.
  Моя цель заключается в том,
  чтобы объяснить, как работает модель трансформера,
  а не что это такое.
  Если вы хотите углубиться в подробности,
  то изучите известную статью Attention is all you need
  [перевод на Хабре: первая и вторая части].
  https://habr.com/ru/companies/ruvds/articles/723538/
  https://habr.com/ru/companies/ruvds/articles/725618/
  
  Обязательные требования
  
  Для понимания статьи необходимы базовые знания линейной алгебры;
  в основном мы будем выполнять простые матричные умножения,
  так что специалистом быть необязательно.
  Кроме того, будут полезны знания основ машинного обучения и глубокого обучения.
  
  Что рассматривается в статье?
  
  Полный пример математических вычислений,
  происходящих в модели трансформера в процессе инференса
  
  Объяснение механизмов внимания
  
  Объяснение остаточных связей и нормализации слоёв
  
  Код для масштабирования модели
  
  Наша цель будет заключаться в использовании модели трансформера
  в качестве инструмента для перевода,
  чтобы мы могли передать модели входные данные
  и ожидать от неё генерации перевода.
  Например, мы можем передать на английском
  и ожидать на выходе получить на испанском.
  
  Давайте взглянем на пугающую диаграмму трансформера
  (не бойтесь, скоро вы её поймёте!):
  
  Рис. Модель трансформера из статьи
  
  Исходная модель трансформера состоит из двух частей:
  кодировщика (encoder) и декодера (decoder).
  Кодировщик занимается <пониманием> или <осознанием смысла> входного текста,
  а декодер выполняет генерацию выходного текста.
  Давайте рассмотрим кодировщик.
  
  Кодировщик
  
  Цель работы кодировщика заключается в генерации
  обогащённого эмбеддингами
  описания входного текста.
  Этот эмбеддинг отражает семантическую информацию о входном тексте
  и передаётся декодеру для генерации выходного текста.
  Кодировщик состоит из стека из N слоёв.
  Прежде чем переходить к слоям,
  нужно разобраться, как передавать слова (или токены) в модель.
  
  Примечание
  
  Термин <эмбеддинг> используется слишком часто.
  Сначала мы создадим эмбеддинг,
  который будет входными данными для кодировщика.
  Кодировщик тоже создаёт на выходе эмбеддинг
  (иногда называемый hidden states).
  Декодер тоже получает эмбеддинг!
  Весь смысл в том, что эмбеддинг описывает токен в виде вектора.
  
  0. Токенизация
  
  Модели машинного обучения могут обрабатывать числа, а не текст,
  так что нам нужно превратить входной текст в числа.
  Именно это и выполняет токенизация!
  Это процесс разбиения входного текста на токены,
  с каждым из которых связан ID.
  Например, мы можем разделить текст
  на два токена: и .
  Также мы можем разбить его на символы:
  , , , , , < >,, , , , .
  Мы сами можем выбирать принцип токенизации,
  он зависит от данных, с которыми мы работаем.
  
  Для токенизации по словам
  (разбиения текста на слова)
  требуется очень большой словарь
  (всех возможных токенов).
  В нём слова наподобие и или и
  будут разными токенами.
  Словарь символов потребует меньшего объёма,
  но будет обладать меньшим смыслом
  (он может быть полезен в языках наподобие китайского,
  где каждый символ содержит больше информации).
  
  Прогресс двинулся в сторону токенизации по подсловам.
  Это нечто среднее между токенизацией по словам и по символам.
  Мы разделяем слова на подслова.
  Например, слово можно разбить на и .
  Как принимается решение о месте разбиения слов?
  Это часть обучения токенизатора
  при помощи статистического процесса,
  задача которого заключается в выявлении подслов,
  которые лучше всего выбрать для конкретного датасета.
  Это детерминированный процесс
  (в отличие от обучения модели машинного обучения).
  
  В этой статье я для простоты использую токенизацию по словам.
  Наша цель будет заключаться
  в переводе с английского на испанский.
  Пример мы разобьём на токены и .
  Каждому токену присваивается в словаре модели ID.
  Например, может быть токеном 1, а - токеном 2.
  
  1. Эмбеддинг текста
  
  Хотя мы можем передать модели ID токенов (то есть 1 и 2),
  эти числа не несут никакого смысла.
  Нужно превратить их в векторы (список чисел).
  Именно это и выполняет процесс эмбеддинга!
  Эмбеддинги токена сопоставляют ID токена
  с вектором фиксированной длины,
  имеющим семантическое значение токенов.
  Это создаёт интересные свойства:
  схожие токены будут иметь схожий эмбеддинг
  (иными словами, вычисление косинусного коэффициента
  между двумя эмбеддингами даст нам хорошее понимание степени схожести токенов).
  
  Стоит заметить,
  что отображение токена в эмбеддинг изучается моделью.
  Хотя мы можем использовать уже обученный эмбеддинг
  наподобие word2vec или GloVe,
  в процессе своего обучения
  модели трансформеров
  изучают эти эмбеддинги.
  Это большое преимущество,
  поскольку модель может изучить наилучшее описание токенов
  для поставленной перед ней задачи.
  Например, модель может научиться тому,
  что и должны иметь схожие эмбеддинги.
  
  Все эмбеддинги в одной модели имеют одинаковый размер.
  В трансформере из научной статьи использовался размер 512,
  но чтобы мы могли выполнять вычисления, снизим его размер до 4.
  Я назначу каждому токену случайные значения
  (как говорилось выше, это отображение обычно изучается моделью).
  
  Hello -> [1,2,3,4]
  
  World -> [2,3,4,5]
  
  Примечание
  
  После публикации статьи многие читатели задали вопросы
  о представленных выше эмбеддингах.
  Мне было лениво и я просто записал числа,
  с которыми будет удобно выполнять вычисления.
  На практике эти числа будут изучаться моделью.
  Чтобы это было понятнее, я дополнил пост.
  
  Мы можем вычислить схожесть этих векторов
  при помощи косинусного коэффициента,
  который для представленных выше векторов будет слишком высоким.
  На практике вектор, скорее всего, будет выглядеть примерно так:
  [-0.071, 0.344, -0.12, 0.026, ..., -0.008].
  //// Т.е. в реальном эмбеддинге значения каких-то элементов могут быть
  //// ОТРИЦАТЕЛЬНЫМИ. И это достаточно плохо согласуется с версией,
  //// что эмбеддинг это просто распределение вероятностей,
  //// и больше с версией что эмбеддинг это координата в многомерном пространстве.
  //// Но по моим представлениям, это просто крайние случаи представления,
  //// а в общем случае "пространство эмбеддингов" это нечто другое,
  //// чему, возможно, еще и подходящего термина не придумано.
  //// Или есть, но где-то в самых "темных закоулках" ТОПОЛОГИИ.
  
  Мы можем представить наши входные данные в виде единой матрицы
  
  Примечание
  
  Хотя мы и можем обрабатывать два эмбеддинга как два отдельных вектора,
  проще работать с ними как с единой матрицей,
  потому что в дальнейшем мы будем выполнять умножение матриц.
  
  2. Позиционное кодирование
  
  Отдельные эмбеддинги в матрице не содержат информации
  о позиции слов в предложении,
  так что нам нужна информация о позиции.
  Её можно создать, добавив к эмбеддингу позиционное кодирование.
  
  Получить его можно различными способами;
  мы можем использовать изученный эмбеддинг или фиксированный вектор.
  В исходной научной статье используется фиксированный вектор,
  потому что авторы не увидели почти никакой разницы
  между двумя методиками
  (см. раздел 3.5 статьи).
  Мы тоже воспользуемся фиксированным вектором.
  Функции синуса и косинуса имеют волнообразный паттерн и повторяются.
  Благодаря использованию этих функций каждая позиция в предложении
  получает уникальное,
  но согласованное позиционное кодирование.
  Их повторяемость
  поможет модели проще изучать паттерны
  наподобие близости и расстояния между элементами.
  В статье используются следующие функции:
  
  ......
  
  Смысл заключается в интерполяции между синусом и косинусом
  для каждого значения в эмбеддинге
  (для чётных индексов используется синус, для нечётных используется косинус).
  Давайте вычислим их для нашего примера!
  
  Для
  
  i = 0 (чётный): PE(0,0) = sin(0 / 10000^(0 / 4)) = sin(0) = 0
  
  i = 1 (нечётный): PE(0,1) = cos(0 / 10000^(2*1 / 4)) = cos(0) = 1
  
  i = 2 (чётный): PE(0,2) = sin(0 / 10000^(2*2 / 4)) = sin(0) = 0
  
  i = 3 (нечётный): PE(0,3) = cos(0 / 10000^(2*3 / 4)) = cos(0) = 1
  
  Для
  
  i = 0 (чётный): PE(1,0) = sin(1 / 10000^(0 / 4)) = sin(1 / 10000^0) = sin(1) ? 0.84
  
  i = 1 (нечётный): PE(1,1) = cos(1 / 10000^(2*1 / 4)) = cos(1 / 10000^0.5) ? cos(0.01) ? 0.99
  
  i = 2 (чётный): PE(1,2) = sin(1 / 10000^(2*2 / 4)) = sin(1 / 10000^1) ? 0
  
  i = 3 (нечётный): PE(1,3) = cos(1 / 10000^(2*3 / 4)) = cos(1 / 10000^1.5) ? 1
  
  В итоге получаем следующее:
  
   -> [0, 1, 0, 1]
  
   -> [0.84, 0.99, 0, 1]
  
  Обратите внимание, что эти кодировки имеют ту же размерность,
  что и исходный эмбеддинг.
  
  Примечание
  
  Мы используем синус и косинус, как и в исходной научной статье,
  но есть и другие способы реализации.
  В очень популярном трансформере BERT
  применяются обучаемые позиционные эмбеддинги.
  
  3. Добавляем позиционное кодирование и эмбеддинг
  
  Теперь мы добавим к эмбеддингу позиционное кодирование.
  Это выполняется сложением двух векторов.
  
   = [1,2,3,4] + [0, 1, 0, 1] = [1, 3, 3, 5]
  
   = [2,3,4,5] + [0.84, 0.99, 0, 1] = [2.84, 3.99, 4, 6]
  
  То есть наша новая матрица,
  которая будет входными данными для кодировщика, выглядит так:
  
   [ 1, 3, 3, 5]
   [2.84, 3.99, 4, 6]
  
  Если посмотреть на изображение из научной статьи,
  то можно увидеть, что мы только что выполнили
  левую нижнюю часть изображения
  (эмбеддинг + позиционное кодирование).
  //// Вот это новенькое для меня. Я почему-то думал,
  //// что позиционное смещение добавляется в виде новых элементов вектора.
  //// а оказывается все по-другому. Нужно думать, как это интерпретировать.
  
  Рис. Модель трансформера из статьи
  
  4. Самовнимание
  
  4.1 Определение матриц
  
  Теперь мы введём концепцию многоголового внимания (multi-head attention).
  Внимание - это механизм,
  позволяющий модели сосредоточиться на определённых частях входных данных.
  Многоголовое внимание позволяет модели совместно уделять внимание информации
  из различных подпространств описаний.
  Для этого используются множественные головы внимания.
  Каждая голова внимания имеет собственные матрицы K, V и Q.
  
  Давайте в нашем примере используем две головы внимания.
  Для этих матриц мы применим случайные значения.
  Каждая матрица будет иметь размер 4x3.
  Благодаря этому каждая матрица будет преобразовывать четырёхмерные эмбеддинги
  в трёхмерные ключи (K), значения (V) и запросы (Q).
  Это снижает размерность механизма внимания,
  что помогает управлять вычислительной сложностью.
  Стоит отметить, что использование слишком малого размера внимания
  уменьшит точность модели.
  Давайте используем следующие значения (выбраны произвольно):
  
  Для первой головы
  
  .......
  
  Для второй головы
  
  .......
  
  4.2 Вычисление ключей, запросов и значений
  
  Для получения ключей, запросов и значений нужно умножить
  входные эмбеддинги на матрицы весов.
  
  Вычисление ключей
  
  .......
  
  На самом деле, нам не нужно вычислять всё это вручную,
  это будет слишком монотонно.
  Давайте схитрим и воспользуемся NumPy.
  
  Сначала определим матрицы
  
  ......
  
  
  И убедимся, что в приведённых выше вычислениях нет никаких ошибок.
  
  ......
  
  Отлично! Теперь давайте получим значения и запросы
  
  Вычисление значений
  
  .......
  
  Вычисление запросов
  
  .......
  
  Давайте пока пропустим вторую голову
  и сосредоточимся на окончательном результате первой головы.
  Ко второй голове мы вернёмся позже.
  
  4.3 Вычисление внимания
  
  Для вычисления показателя внимания требуется пара шагов:
  
  Вычисление скалярного произведения запроса и каждого ключа
  
  Деление результата на квадратный корень размерности вектора ключа
  
  Применение функции softmax для получения весов внимания
  
  Умножение каждого вектора значения на веса внимания
  
  4.3.1 Скалярное произведение запроса и каждого ключа
  
  Для вычисления результата для
  необходимо вычислить скалярное произведение q1
  и каждого вектора ключа (k1 и k2)
  
  .......
  
  В мире матриц это будет равно Q1, умноженному на перестановку K1
  
  .......
  
  
  4.3.2 Деление на квадратный корень размерности вектора ключа
  
  Затем мы делим показатели на квадратный корень размерности (d) ключей
  (в данном случае это 3, но в научной статье она была равна 64).
  Почему? При больших значениях d скалярное произведение растёт слишком быстро
  (ведь мы складываем умножение кучи чисел, что приводит к большим значениям).
  А большие значения - это плохо!
  //// А почему?
  Подробнее мы поговорим об этом чуть позже.
  
  ......
  
  4.3.3 Применение функции softmax
  
  Далее используем softmax для нормализации,
  чтобы все они были положительны и в сумме равнялись 1.
  
  Что такое softmax?
  
  Softmax - это функция, получающая вектор значений
  и возвращающая вектор значений между 0 и 1,
  в котором сумма значений равна 1.
  Это удобный способ получения вероятностей.
  Функция определяется следующим образом:
  
  .....
  
  Не пугайтесь этой формулы, на самом деле она довольно проста.
  Допустим, у нас есть следующий вектор:
  
  ......
  
  Softmax этого вектора будет такой:
  
  ......
  
  Как видите, все значения положительны и в сумме дают 1.
  
  ......
  
  //// Интересно, что здесь используется экспонента,
  //// тут действительно "большие числа" вырубят все что можно.
  
  4.3.4 Умножение матрицы значений на веса внимания
  
  Далее мы умножаем на матрицу значений
  
  ......
  
  Давайте объединим 4.3.1, 4.3.2, 4.3.3 и 4.3.4
  в одну формулу с использованием матриц
  (это из раздела 3.2.1 научной статьи):
  
  ......
  
  Да, вот и всё!
  Все проделанные нами вычисления можно легко свести
  к показанной выше формуле внимания!
  Давайте перенесём это в код.
  
  .......
  
  Мы убедились, что значения те же, что и получены выше.
  Давайте воспользуемся этим кодом для получения показателей внимания
  второй головы внимания:
  
  .......
  
  Если вас интересует, как внимание стало одинаковым для двух эмбеддингов,
  то это вызвано тем, что softmax переводит показатели в 0 и 1. Смотрите:
  
  .......
  
  Это вызвано плохой инициализацией матриц
  и маленьким размерам векторов.
  Большие различиях в показателях до применения softmax
  будут лишь усилены,
  приводя к том,
  что одно значение будет близко к 1, а другие к 0.
  На практике наши исходные значения матрицы эмбеддингов
  были слишком велики,
  что привело к высоким значениям для ключей, значений и запросов,
  которые при умножении становились только выше.
  
  Помните, как мы выполняли деление на квадратный корень размерности ключей?
  Именно поэтому мы это и делали,
  в противном случае значения скалярного произведения
  были бы слишком большими,
  из-за чего получились бы большие значения после softmax.
  Однако в данном случае, похоже, этого не было достаточно,
  учитывая наши небольшие значения!
  В качестве быстрого хака мы можем уменьшить масштаб значений
  на меньшее значение, чем квадратный корень трёх.
  Давайте переопределим функцию внимания,
  уменьшив масштаб на 30.
  В долгой перспективе это плохое решение,
  но оно поможет нам получить разные значения для показателей внимания.
  Позже мы вернёмся к более качественному решению.
  
  .....
  
  
  4.3.5 Выходные значения внимания голов
  
  Следующий слой кодировщика ожидает на входе одну матрицу, а не две.
  Первым этапом будет конкатенация выходных значений двух голов
  (см. раздел 3.2.2 научной статьи)
  
  .......
  
  Затем мы умножаем эту конкатенированную матрицу на матрицу весов,
  чтобы получить окончательный результат слоя внимания.
  Этой матрице весов модель тоже обучается!
  Размерность матрицы гарантирует,
  что мы вернёмся к той же размерности,
  что была у эмбеддинга (в нашем случае 4).
  
  .......
  
  Всё это можно объединить в изображение из The Ilustrated Transformer
  
  .......
  
  5. Слой с прямой связью
  
  5.1 Простой слой с прямой связью
  
  После слоя самовнимания у кодировщика идёт нейронная сеть с прямой связью
  (feed-forward neural network, FFN).
  Это простая сеть с двумя линейными преобразованиями
  и активацией ReLU между ними.
  В посте The Illustrated Transformer подробностей об этом нет,
  так что я вкратце объясню этот слой.
  Цель FFN заключается в обработке и трансформировании описания,
  созданного механизмом внимания.
  Поток обычно выглядит так (см. раздел 3.3 научной статьи):
  
  Первый линейный слой:
  обычно он расширяет размерность входных данных.
  Например, если размерность входных данных равна 512,
  то размерность выходных данных может быть равна 2048.
  Это выполняется для того,
  чтобы позволить модели изучать более сложные функции.
  В нашем простом примере с размерностью 4 мы расширимся до 8.
  
  Активация ReLU:
  нелинейная функция активации. Это простая функция,
  возвращающая 0, если входные данные отрицательны,
  и входные данные, если они положительны.
  Это позволяет модели обучаться нелинейным функциям.
  Вычисления выглядят так:
  
  .......
  
  Второй линейный слой: он противоположен первому линейному слою.
  Этот слой снова возвращает размерность к исходной.
  В нашем примере он выполнит снижение с 8 до 4.
  
  Всё это можно описать следующим образом
  
  .......
  
  Напомню, что входными данными для этого слоя является Z,
  которое мы вычислили в самовнимании.
  Вот какие значения мы там получили
  
  ......
  
  Теперь давайте зададим произвольные значения для матриц весов
  и векторов смещений.
  Я сделаю это в коде, но если у вас хватит терпения,
  то можете задать их вручную!
  
  ......
  
  А теперь давайте запишем функцию прямого прохода
  
  ......
  
  5.2 Объединяем всё: произвольный кодировщик
  
  Теперь давайте напишем код,
  чтобы объединить в блоке кодировщика многоголовое внимание и прямую связь.
  
  Примечание
  
  Код оптимизирован для понимания и образовательных целей,
  а не для производительности,
  не судите слишком строго!
  
  .......
  
  Вспомним наши входные данные в матрице E,
  имеющие позиционное кодирование и эмбеддинг.
  
  .....
  
  Теперь передадим это нашей функции random_encoder_block
  
  .......
  
  Отлично! Это был всего один блок кодировщика.
  В научной статье применяются шесть кодировщиков.
  Выходные данные одного кодировщика передаются на следующий и так далее:
  
  ......
  
  5.3 Остаточные связи и нормализация слоёв
  
  Ой-ёй! У нас начали появляться NaN!
  Похоже, наши значения слишком велики
  и при передаче следующему кодировщику они оказываются слишком большими
  и <взрываются>!
  Эта проблема слишком больших значений
  часто возникает при обучении моделей.
  Например, когда мы выполняем обратное распространение ошибки
  (методику, при помощи которой модели обучаются),
  градиенты могут оказаться слишком большими
  и в результате <взрываются>;
  это называется взрывом градиентов (gradient explosion).
  Без нормализации небольшие изменения во входных данных на первых слоях
  в последующих слоях усиливаются.
  Это распространённая проблема в глубоких нейросетях.
  Существует два способа борьбы с этой проблемой:
  остаточные связи и нормализация слоёв
  (они вкратце упоминаются в разделе 3.1 научной статьи).
  
  Остаточные связи просто прибавляют входные данные слоя к его выходным данным.
  Например, мы складываем исходный эмбеддинг с выходными данными внимания.
  Остаточные связи устраняют проблему исчезающих градиентов.
  Логика в том, что если градиент слишком мал,
  то мы можем просто сложить входные данные к выходным,
  и градиент станет больше. Вычисления очень просты:
  //// Т.е. внедрение "интерференции" объясняется
  //// борьбой с взрывающимися, исчезающими градиентами.
  
  Вот и всё!
  Мы сделаем это для выходных данных внимания
  и выходных данных слоя с прямой связью.
  
  Нормализация слоя - это методика нормализации входных данных слоя.
  Она выполняет нормализацию по размерности эмбеддинга.
  Логика в том, что мы хотим нормализовать входные значения слоя,
  чтобы они имели среднее значение 0 и квадратическое отклонение 1.
  //// Насчет среднего значения понятно, а вот квадратичное отклонение,
  //// это уже от "лукавой математики".
  Это помогает с градиентным потоком.
  Вычисления на первый взгляд выглядят не так уж просто.
  
  ......
  
  Давайте объясним каждый параметр:
  
  ? - это среднее значение эмбеддинга
  
  ? - это квадратическое отклонение эмбеддинга
  
  ? - это малое число, чтобы избежать деления на ноль.
  В случае нулевого значения квадратичного отклонения
  этот маленький эпсилон спасает нас.
  
  ? и ? - это изучаемые параметры,
  управляющие этапами масштабирования и сдвига.
  
  В отличие от пакетной нормализации
  (batch normalization, не волнуйтесь, если не знаете, что это такое),
  нормализация слоёв нормализует по размерности эмбеддинга;
  это означает, что на каждый эмбеддинг
  не будут влиять другие сэмплы в пакете.
  Идея заключается в том, что мы хотим нормализовать входные данные слоя,
  чтобы они имели среднее значение 0 и квадратичное отклонение 1.
  
  Зачем мы добавляем изучаемые параметры ? и ??
  Причина в том, что мы не хотим терять силу представления слоя.
  Если просто нормализовать входные данные,
  то какая-то информация может потеряться.
  Добавляя изучаемые параметры,
  мы можем научиться масштабировать и сдвигать нормализованные значения.
  
  Соединив эти уравнения, мы получим уравнение для всего кодировщика:
  
  ......
  
  Давайте проверим его на нашем примере! Возьмём прежние значения E и Z:
  
  .....
  
  Теперь давайте вычислим нормализацию слоя;
  можно разделить этот процесс на три этапа:
  
  Вычисление среднего и дисперсии для каждого эмбеддинга.
  
  Нормализация вычитанием среднего в своей строке
  и делением на квадратный корень дисперсии строки
  (плюс малое число, чтобы избежать деления на ноль).
  
  Масштабирование и сдвиг умножением на гамму и прибавлением беты.
  
  5.3.1 Среднее и дисперсия
  Для первого эмбеддинга
  
  ......
  
  То же самое можно сделать для второго эмбеддинга.
  Пропустим сами вычисления и покажем только результат.
  
  ......
  
  Давайте проверим при помощи Python
  
  .......
  
  Отлично! Теперь нормализуем
  
  5.3.2 Нормализация
  
  При нормализации из каждого значения в эмбеддинге
  мы вычитаем среднее и делим его на квадратичное отклонение.
  Эпсилон - это очень маленькое значение, например, 0,00001.
  Чтобы упростить, будем считать, что ? = 1, а ? = 0.
  
  .......
  
  Для второго эмбеддинга мы не будем выполнять вычисления вручную.
  Проверим их при помощи кода.
  Переопределим функцию encoder_block, внеся следующее изменение:
  
  .........
  
  Сработало! Давайте ещё раз попробуем пропустить эмбеддинг
  через шесть кодировщиков.
  
  ........
  
  Отлично! Значения приемлемые и отсутствуют NaN!
  Идея стека кодировщиков заключается в том,
  что на выходе они выдают непрерывное описание z,
  передающее смысл входной последовательности.
  //// А вот как именно - большой вопрос.
  Затем это описание передаётся декодеру,
  который генерирует выходную последовательность символов
  по одному элементу за раз.
  
  Прежде чем приступать к декодеру,
  взглянем на изображение из потрясающего поста Джея:
  
  .......
  
  Каждый из элементов в левой части должен быть вам уже понятен!
  Впечатляет, правда?
  А теперь давайте перейдём к декодеру.
  
  Декодер
  
  Большинство знаний, полученных при изучении кодировщиков,
  будет использоваться и в декодере!
  Декодер имеет два слоя самовнимания,
  один для кодировщика, другой для декодера.
  Также декодер имеет слой с прямой связью.
  Давайте разберём каждую из частей по порядку.
  
  Блок декодера получает два элемента входных данных:
  выходные данные кодировщика и сгенерированную выходную последовательность.
  Выходные данные кодировщика
  - это описание входной последовательности.
  В процессе инференса сгенерированная выходная последовательность
  начинается с особого токена начала последовательности
  (start-of-sequence token, SOS).
  Во время обучения целевая выходная последовательность
  - это действительная выходная последовательность,
  сдвинутая на одну позицию.
  Скоро это станет вам понятнее!
  
  Имея сгенерированный кодировщиком эмбеддинг и токен SOS,
  декодер генерирует следующий токен последовательности,
  то есть .
  Декодер авторегрессивен,
  то есть он берёт ранее сгенерированные токены
  и снова генерирует второй токен.
  
  Итерация 1: входные данные - SOS, выходные -
  
  Итерация 2: входные данные - SOS + , выходные -
  
  Итерация 3: входные данные - SOS + + , выходные - EOS
  
  Здесь SOS - это токен начала последовательности,
  а EOS - токен конца последовательности.
  После генерации токена EOS декодер прекращает работу.
  Он генерирует по одному токену за раз.
  Обратите внимание, что во всех итерациях используется эмбеддинг,
  сгенерированный кодировщиком.
  
  Примечание
  
  Такая авторегрессивная структура замедляет работу декодера.
  Кодировщик способен генерировать свой эмбеддинг за один прямой проход,
  а декодеру необходимо выполнить множество прямых проходов.
  Это одна из причин, по которым архитектуры,
  использующие один кодировщик
  (например, BERT или модели схожести предложений) гораздо быстрее,
  чем архитектуры с одними только декодерами
  (например, GPT-2 или BART).
  
  Давайте разберём каждый из этапов!
  Как и кодировщик, декодер состоит из стека блоков декодеров.
  Блок декодера чуть сложнее, чем блок кодировщика.
  Его общая структура такова:
  
  Слой самовнимания (маскированный)
  
  Остаточная связь и нормализация слоя
  
  Слой внимания кодировщика-декодера
  
  Остаточная связь и нормализация слоя
  
  Слой с прямой связью
  
  Остаточная связь и нормализация слоя
  
  Мы уже знакомы со всей математикой пунктов 1, 2, 3, 5 и 6.
  Взглянув на правую часть изображения ниже,
  вы увидите, что все эти блоки вам уже известны :
  
  Модель трансформера из статьи
  
  1. Эмбеддинг текста
  
  Первый текст декодера нужен для эмбеддинга входных токенов.
  Входным токеном является SOS,
  так что мы выполняем его эмбеддинг.
  Используется та же размерность эмбеддинга,
  что и для кодировщика.
  Предположим, вектор эмбеддинга для SOS имеет такой вид:
  
  ......
  
  2. Позиционное кодирование
  
  Теперь мы добавим в эмбеддинг позиционное кодирование,
  как делали это в случае с кодировщиком. Учитывая, что это так же позиция,
  что и у , у нас будет то же позиционное кодирование, что и раньше:
  
  i = 0 (чётный): PE(0,0) = sin(0 / 10000^(0 / 4)) = sin(0) = 0
  
  i = 1 (нечётный): PE(0,1) = cos(0 / 10000^(2*1 / 4)) = cos(0) = 1
  
  i = 2 (чётный): PE(0,2) = sin(0 / 10000^(2*2 / 4)) = sin(0) = 0
  
  i = 3 (нечётный): PE(0,3) = cos(0 / 10000^(2*3 / 4)) = cos(0) = 1
  
  3. Сложение позиционного кодирования и эмбеддинга
  
  Сложение позиционного кодирования с эмбеддингом выполняется
  сложением двух векторов:
  
  .......
  
  4. Самовнимание
  
  Первый этап в блоке декодера - это механизм самовнимания.
  К счастью, у нас есть для этого код и мы можем просто его использовать!
  
  ......
  
  Примечание
  
  С точки зрения инференса всё довольно просто,
  однако с точки зрения обучения есть сложности.
  При обучении мы используем неразмеченные данные:
  просто кучу текстовых данных,
  которые собираем частым скрейпингом в вебе.
  Цель кодировщика - передача всей информации входных данных,
  а задача декодера -предсказание следующего наиболее вероятного токена.
  Это значит, что декодер может использовать
  только ранее сгенерированные токены
  (он не может схитрить и посмотреть следующие токены).
  
  Из-за этого мы используем маскированное самовнимание:
  маскируем ещё не сгенерированные токены.
  Это выполняется присвоением показателям внимания значений -inf.
  Так делается в научной статье (раздел 3.2.3.1).
  Пока мы это пропустим,
  но важно помнить,
  что при обучении декодер чуть сложнее.
  
  5. Остаточные связи и нормализация слоёв
  
  Здесь нет ничего таинственного,
  мы просто складываем входные данные с выходными данными самовнимания
  и применяем нормализацию слоя.
  Используется тот же код, что и выше.
  
  .......
  
  6. Внимание кодировщика-декодера
  
  Эта часть новая!
  Если вы задавались вопросом,
  куда направляются генерируемые кодировщиком эмбеддинги,
  то сейчас самое время для них!
  
  Предположим, что выходными данными кодировщика является такая матрица:
  
  .....
  
  В механизме самовнимания мы вычисляем запросы, ключи и значения
  для входного эмбеддинга.
  
  Во внимании кодировщика-декодера мы вычисляем запросы
  из предыдущего слоя декодера и ключи и значения
  из выходных данных кодировщика!
  Все вычисления остаются такими же, что и раньше;
  единственное отличие в том,
  какой эмбеддинг использовать для запросов.
  Давайте взглянем на код
  
  ......
  
  Сработало! Возможно, вы зададитесь вопросом: <зачем мы это делаем?>.
  Дело в том, что мы хотим, чтобы декодер сосредоточился
  на релевантных частях входного текста (то есть ).
  Внимание кодировщика-декодера позволяет
  каждой позиции в декодере посетить все позиции входной последовательности.
  Это очень полезно для таких задач, как перевод,
  когда декодеру нужно сосредоточиться на релевантных частях
  входной последовательности.
  Декодер будет учиться сосредотачиваться на релевантных частях
  входной последовательности,
  учась генерировать правильные выходные токены.
  Это очень мощный механизм!
  
  7. Остаточные связи и нормализация слоя
  
  Всё то же, что и раньше!
  
  .......
  
  8. Слой с прямой связью
  
  И тут то же самое! После этого я также выполню остаточную связь
  и нормализацию слоя.
  
  .......
  
  9. Объединяем всё: произвольный декодер
  
  Давайте напишем код для одного блока декодера.
  Самое главное изменение заключается в том,
  что теперь у нас есть дополнительный механизм внимания.
  
  .......
  
  Генерация выходной последовательности
  
  У нас уже есть все необходимые части!
  Давайте сгенерируем выходную последовательность.
  
  У нас есть кодировщик, получающий входную последовательность
  и генерирующий его обогащённое описание.
  Он состоит из стека блоков кодировщиков.
  
  У нас есть декодер, получающий выходные данные кодировщика
  и сгенерированные токены
  и генерирующий выходную последовательность.
  Он состоит из стека блоков декодеров.
  
  Как перейти от выходных данных декодера к слову?
  Нужно добавить поверх декодера последний линейный слой и слой softmax.
  Весь алгоритм в целом выглядит так:
  
  Обработка кодировщиком:
  кодировщик получает входную последовательность
  и генерирует контекстуализированное описание всего предложения
  при помощи стека блоков кодировщиков.
  
  Инициализация декодера:
  процесс декодирования начинается с эмбеддинга токена SOS (Start of Sequence),
  соединённого с выходными данными кодировщика.
  
  Работа декодера:
  декодер использует выходные данные кодировщика
  и эмбеддинги всех ранее сгенерированных токенов
  для создания нового списка эмбеддингов.
  
  Линейный слой для логитов:
  линейный слой применяется к последнему выходному эмбеддингу декодера
  для генерации логитов,
  представляющих сырые предсказания следующего токена.
  
  Softmax для вероятностей:
  затем эти логиты передаются через слой softmax,
  преобразующий их в распределение вероятностей
  по потенциальным следующим токенам.
  
  Итеративная генерация токенов:
  этот процесс повторяется,
  и на каждом этапе декодер генерирует следующий токен
  на основании кумулятивных эмбеддингов
  ранее сгенерированных токенов
  и исходных выходных данных кодировщика.
  
  Формирование предложения:
  эти этапы генерации продолжаются,
  пока не будет создан токен EOS (End of Sequence)
  или не достигнута заранее заданная максимальная длина предложения.
  
  Об этом говорится в разделе 3.4 научной статьи.
  
  1. Линейный слой
  
  Линейный слой - это простое линейное преобразование.
  Он получает выходные данные декодера
  и преобразует их в вектор размера vocab_size.
  Это размер словаря.
  Например, если у нас есть словарь из 10000 слов,
  то линейный слой преобразовал бы выходные данные декодера
  в вектор размера 10000.
  Этот вектор содержал бы вероятность того,
  что каждое слово будет следующим словом в последовательности.
  Для простоты можно начать со словаря из 10 слов
  и предположить, что первые выходные данные декодера
  - это очень простой вектор: [1, 0, 1, 0].
  Мы используем произвольные веса и матрицы перекосов размера
  vocab_size x decoder_output_size.
  
  ......
  
  Примечание
  
  Что используется в качестве входных данных для линейного слоя?
  Декодер будет выводить по одному эмбеддингу
  для каждого токена в последовательности.
  Входными данными для линейного слоя станет
  последний сгенерированный эмбеддинг.
  Последний эмбеддинг включает в себя информацию
  для всей последовательности до этого этапа,
  то есть содержит всю информацию,
  необходимую для генерации следующего токена.
  Это значит, что каждый выходной эмбеддинг декодера
  содержит информацию о всей последовательности до этого этапа.
  
  2. Softmax
  
  Они называются логитами,
  но интерпретировать их не так просто.
  Для получения вероятностей можно применить функцию softmax.
  
  softmax(x)
  array([[0.01602618, 0.06261303, 0.38162024, 0.03087794, 0.0102383 ,
   0.00446011, 0.01777314, 0.00068275, 0.46780959, 0.00789871]])
  
  И так мы получили вероятности!
  //// Точнее мы получили вектор эмбеддинга, который автор интерпретирует
  //// как распределение вероятностей. Но так ли это на самом деле?
  Предположим, словарь имеет такой вид:
  
  .....
  
  Мы видим, что вероятности таковы:
  
  hello: 0.01602618
  
  mundo: 0.06261303
  
  world: 0.38162024
  
  how: 0.03087794
  
  ?: 0.0102383
  
  EOS: 0.00446011
  
  SOS: 0.01777314
  
  a: 0.00068275
  
  hola: 0.46780959
  
  c: 0.00789871
  
  Из этого видно, что наиболее вероятный следующий токен - это .
  Если всегда выбирается наиболее вероятный токен,
  это называется жадным декодингом.
  Это не всегда наилучший подход,
  потому что он может привести к субоптимальным результатам,
  //// Т.е. версия "вероятностей" не совсем работоспособна,
  //// но от этой мысли отмахиваются разными ссылками, типа "субоптимальности".
  но пока мы не будем сейчас углубляться в методики генерации.
  Если хотите узнать о них подробнее,
  то прочитайте потрясающий пост.
  
  3. Случайный трансформер из кодировщика и декодера
  
  Давайте напишем код целиком.
  Зададим словарь, сопоставляющий слова с их изначальными эмбеддингами.
  Надо отменить, что это тоже изучается при обучении,
  но пока мы используем случайные значения.
  
  ........
  
  А теперь напишем произвольный метод generate ,
  авторегрессивно генерирующий токены.
  
  .......
  
  Давайте запустим код!
  
  ......
  
  Отлично, теперь у нас есть токены , и .
  Это неправильный перевод, но этого вполне можно было ожидать,
  ведь веса мы использовали случайные.
  
  Советую ещё раз подробно изучить всю архитектуру кодировщика-декодера
  из научной статьи:
  
  ......
  
  Заключение
  
  Надеюсь, пост показался вам интересным и информативным!
  Мы рассмотрели множество аспектов.
  Но разве это всё?
  На самом деле, практически да!
  В архитектуры новых трансформеров добавляют множество трюков,
  но фундамент трансформера именно таков,
  каким мы его описали.
  В зависимости от задачи также можно использовать
  только кодировщик или декодер.
  Например, в задачах, требующих понимания,
  например, в классификации,
  можно использовать стек кодировщиков с линейным слоем поверх него.
  Для задач, требующих генерации,
  например, в переводе,
  можно использовать стеки кодировщиков и декодеров.
  А для свободной генерации, например, как в ChatGPT или Mistral,
  можно применять только стек декодеров.
  
  Разумеется, мы многое упростили.
  Давайте вкратце проверим, какие были числа в научной статье о трансформере:
  
  Размерность эмбеддингов: 512 (в нашем примере 4)
  
  Количество кодировщиков: 6 (в нашем примере 6)
  
  Количество декодеров: 6 (в нашем примере 6)
  
  Размерность прямой связи: 2048 (в нашем примере 8)
  
  Количество голов внимания: 8 (в нашем примере 2)
  
  Размерность внимания: 64 (в нашем примере 3)
  
  Мы рассмотрели множество тем, но довольно интересно,
  то мы можем достичь впечатляющих результатов,
  увеличив масштабы этих вычислений и проведя умное обучение.
  Мы не рассмотрели в посте обучение,
  потому что наша цель заключалась в понимании вычислений
  при использовании готовой модели,
  но я надеюсь, что это станет надёжным фундаментом для перехода к обучению!
  
  Также можно найти более формальный документ с вычислениями в этом PDF.
  https://johnthickstun.com/docs/transformers.pdf
  
  Упражнения
  Вот несколько упражнений, чтобы попрактиковаться в понимании трансформера.
  
  В чём предназначение позиционного кодирования?
  
  Чем отличаются самовнимание и внимание кодировщика-декодера?
  
  Что произойдёт, если размерность внимания слишком мала? А если слишком велика?
  
  Вкратце опишите структуру слоя с прямой связью.
  
  Почему декодер медленнее кодировщика?
  
  Какова цель остаточных связей и нормализации слоёв?
  
  Как выполняется переход от выходных данных декодера к вероятностям?
  
  Почему выбор каждый раз самого вероятного следующего токена
  может вызвать проблемы?
  
  Ресурсы
  
  The Illustrated Transformer [перевод на Хабре]
  https://habr.com/ru/articles/486358/
  
  Attention is all you need [перевод на Хабре: первая и вторая части]
  https://habr.com/ru/companies/ruvds/articles/723538/
  https://habr.com/ru/companies/ruvds/articles/725618/
  
  The Annotated Transformer
  
  Hugging Face free NLP course
  
  ......
  
  //// Из комментариев.
  
  Kreastr
  1 час назад
  
  Эмбеддинг это словарь переводящий слова/токены в вектора.
  Сам словарь составляется на отдельном этапе обучения.
  ЕМНИП принцип составления
  - задать такие значения многомерных векторов,
  чтобы для любой пары слов векторное произведение
  максимально хорошо коррелировало
  с вероятностью встретить их рядом в одном предложении
  в исходном корпусе текстов.
  //// А что происходит при добавлении позиционного кодирования
  //// так, как это описано в данном материале?
  //// Ведь таким образом эта корреляция прямо разрушается.
  0
  
  johnfound
  21 минуту назад
  
  А зачем тогда нужны токены?
  Можно сразу по словарю преобразовать в эмбединги.
  Ведь, они однозначно идентифицируют токен.
  
  Kreastr
  19 янв в 14:39
  
  Токен не всегда равен слову.
  В ранних системах токенами были слова больше минимальной длины
  и с обрезанными формами (падежами, лицами и временами смотря какой язык).
  Сейчас вроде как токенайзеры делят на группы букв сами.
  То есть отдельно токен приблизительно равный корню, отдельно окончания.
  Но может и приставку отделить и суффикс.
  Там нет четкой цели, чтобы оно совпало с грамматической интерпретацией.
  
  johnfound
  19 янв в 16:33
  
  Я имел ввиду, что если из токена однозначно получается эмбединг
  и наоборот из эмбединга однозначно получается токен,
  то сам токен не нужен.
  Можно из текста сразу получать эмбединги.
  
  Kreastr
  19 янв в 17:13
  
  Вообще не однозначно.
  Разные схемы токенизации дают разные разбиения на токены с разными свойствами.
  Разные способы расчета и размерности матриц эмбеддингов
  дают еще один слой для оптимизаций.
  То, что в примере из it is student получается три вектора
  причем каждое слово дает ровно один вектор
  - просто упрощение процесса.
  Так делали раньше.
  Но сейчас есть более эффективные подходы к токенизации и эмбеддингам,
  поэтому слова уже почти никогда не то же, что и токен,
  но объяснить проще, когда слово принимается за токен.
  
  ........
  
  //// Конец цитирования.
  
  17.02.2024 23:38
  
  Ну как лучше Вы стали понимать как работает в частности трансформер,
  и в целом ГПТэшка? Думаю, что не очень. Слишком много непонятных слов,
  и не смотря на "победный пафос" материала, есть ощущение,
  что что-то главное в объяснении каких-то ключевых, но неозвученных вопросов
  осталось где-то "за кадром".
  Если, конечно, такие объяснения на сегодняшний день вообще существуют.
  Какие-то детали, да, понятны, а вот какого-то общего понимания
  что происходит на тех же элементах суммирования, матричного умножения,
  и магической функции softmax, вот у меня почему-то не складывается.
  И самый главный вопрос почему это все-таки как-то работает
  остается без ответа.
  
  Именно поэтому и приходится раскапывать принципы работы нейросетей,
  опираясь на что-то другое, чем даже такое подробное описание.
  Такие описания могут ответить только на вопрос "как",
  но для вопросов "почему" и, тем более, "зачем",
  большей частью малопродуктивны.
  
  для того чтобы получить что-то похожее на уже работающую схему,
  с минимальной правкой кода такие материалы, безусловно, полезны.
  Ведь это действительно хороший, добротный, проработанный материал,
  и за это и автору и переводчику большое спасибо.
  Проблема недостаточного понимания процессов происходящих в нейросети,
  это "болячка" не одного этого текста, а, скорее всего,
  всей современной "нейронауки".
  
  И чтобы придумать что-то новое нужно искать и в таких материалах и где-то еще.
  И, самое главное, включать "режим" самостоятельного поиска понимания,
  тех вопросов, о которых "стыдливо умалчивают" либо "отделываются общими фразами".
  У меня, во всяком случае, этот текст особенно в той части,
  где описывается способ позиционного кодирования, используемый в трансфомере,
  привел к очень интересной дискуссии на эту тему с Bing,
  и в итоге родился достаточно интересный, для мнея, фрагмент, см.:
  "Заковыристая" структура вектора эмбеддинга."
  с последующим переосмыслением подходов к пониманию "пространства эмбеддингов".
  
  Желаю и Вам найти свое собственное представление/понимание
  и вектора эмбеддинга и пространства эмбеддингов.
  "И да пребудет с Вами Сила!"
  
  
  ========
  
  24.02.2024 10:50
  
  Структура сети ViT.
  В оглавление.
  
  Обычно объяснения того, как работают трансформеры,
  предлагаются на основе рассмотрения их классической архитектуры.
  И таких примеров/материалов даже в рамках этого проекта достаточно много,
  например, см.:
  "Трансформеры простыми словами."
  Очень большая и хорошая статья Стефена Вольфрама.
  Интересные и понятные ссылки о том, что у ГПТэшек "под капотом".
  
  Но могу судить по себе, что это не закрывает всех возникающих вопросов.
  Полного интуитивного понимания как же все-таки это работает "под капотом",
  даже после проработки всех этих материалов, как-то не сформировалось.
  
  Поэтому попробуем подступиться к этой достаточно сложной для понимания темы,
  как работают трансформеры немного с другой стороны.
  А именно, как используют структуру трансформеров для других задач,
  не только обработки текстов, но изображений.
  Что при этом изменяется, что становится не актуальным, ну и т.д.
  Может быть, это что-то прояснит в понимании основных идей трансформеров
  или даст какую-то новую "пищу для размышлений":
  
  "ViT - на кухне фаворит".
  Автор: 19blackadder97 (Денис Кузнеделев)
  https://habr.com/ru/articles/599677/.
  8 янв 2022 в 18:13
  
  //// Начало цитирования
  
  Прошедший 2021-й год ознаменовался настоящей революцией
  в области компьютерного зрения.
  
  Трансформеры, подобно новым штамма Ковида,
  вытеснившие конкурентов в области обработки естественного языка (NLP)
  и задачах, связанных с обработкой звука,
  добрались и до компьютерного зрения.
  
  Сверточные сети, чье место на Олимпе в различных бенчмарках компьютерного зрения
  и первые места в топах на PapersWithCode казались незыблемы
  (в том смысле, что против лома нет приема, если нет другого лома)
  были сброшены с них рядом архитектур
  частично или полностью основанных на механизме внимания.
  
  В данном обзоре я хотел бы рассказать о нескольких самых ярких прорывах и идеях
  в совершенствовании архитектур и обучении ViT-ов (Visual Transformers).
  
  Введение
  
  До сравнительно недавнего (если смотреть не по меркам DL) времени
  сверточные сети (CNN) безраздельно доминировали
  в области компьютерного зрения (Computer Vision).
  Сверки обладают рядом замечательных свойств
  - локальностью , позволяющей учитывать отношения близости между соседними пикселями,
  применением одних и тех же весов к каждому пикселю карты активации (feature map),
  построением иерархических представлений
  - от простых примитивов вроде границ и контуров до более сложных и составных понятий
  вроде кошек и собак
  (во всяком случае, так утверждается многими).
  
  Казалось бы, что можно вообще было бы придумать более подходящее и оптимальное
  с точки зрения использования параметров и вычислений
  среди возможных архитектур нейронной сети?
  Тем более, что за последние несколько лет было придумано
  множество наворотов и ухищрений для повышения качества сверточной нейронной сети,
  либо скорости работы.
  
  В качестве самых значимых достижений можно вспомнить
  добавление разных видов skip-connections, depthwise сверток, inverted bottlenecks.
  Современные архитектуры вроде EfficientNet, NFNet
  прошли большой путь эволюции по сравнению с vanilla ResNetа-ми.
  
  Но все же, сверточные сети несовершенны.
  Локальность операции свертки, преподнесенная выше как достоинство,
  является и недостатком.
  Пиксель в выходной карте активаций может зависеть
  лишь от области входной карты в пределах ядра свертки.
  Поэтому для сбора глобальной информации требуется большое количество слоев
  (при пулингах и свертках стандартного размера типа 2,3,5).
  
  Но статья Attention is all you need получила свое название не просто так,
  и название оказалось даже более глубокомысленным
  чем, полагаю, даже исходно полагали сами авторы.
  
  Трансформеры произвели настоящий фурор
  в области задач (NLP) обработки естественного языка,
  камня на камне не оставив от популярных ранее
  многослойных реккурентных сетей на LSTM и GRU,
  и вообще в задачах связанных с последовательностями.
  
  Но как применить self-attention в задачах компьютерного зрения
  стало очевидно далеко не сразу.
  Первое, что могло бы прийти в голову
  - рассматривать каждый пиксель картинки, как слово,
  и считать attention между всеми пикселями внутри картинки.
  Проблема здесь в том, что вычислительная сложность и обьем используемой памяти
  в стандартном self-attention
  растет квадратично с длиной последовательности.
  Картинки на датасете больше игрушечных MNIST и CIFAR-10
  имеют разрешение порядка сотен пикселей вдоль каждой размерности
  (скажем 224x224)
  и считать в лоб self-attention выходит слишкои накладно.
  
  Были работы, которые считали его локально,
  но такой подход в каком-то смысле сродни сверткам.
  В DETR было предложено использовать feature map с нижнего слоя ResNet,
  где количество пикселей уже невелико, для self-attention
  //// Т.е. чисто трансформерная архитектура имеет ограничение
  //// на размерность "входного эмбеддинга"
  //// и имеет смысл его как-то предварительно "сжать".
  //// Вопрос в том, за счет чего должно происходить это "сжатие",
  //// и что остается в "сжатом эмбеддинге".
  и полученная конструкция сработала довольно неплохо в задаче детекции.
  Но в этих решениях основной рабочей лошадкой не был механизм внимания.
  
  An image is worth 16x16 words
  
  Настоящий триумф трансформеров в компьютерном зрении пришел с работой
  An image is worth 16x16 words.
  https://arxiv.org/abs/2010.11929
  
  Решение, позволившее добиться адекватной вычислительной стоимости и памяти
  для хранения, оказалось гениальным в своей простоте
  - использовать в качестве слов не отдельные пиксели,
  а кусочки картинки некоторого размера P \times P,
  тем самым уменьшив вычислительную сложность с \mathcal{O}((H W)^2)
  до \mathcal{O}((H W / P^2)^2).
  Для стандартного разрешения на ImageNet - 224
  и патча размера 16 выходит вполне себе подьемно (196 токенов).
  //// Т.е. кусочки картинки стали токенами, или элементами эмбеддинга?
  
  Рис. (Слева) Принцип работы ViT. (Справа) Блок трансформера в ViT.
  
  Использованная архитектура является по существу цепочкой энкодеров а-ля BERT.
  
  Для задачи классификации в дополнение к токенам,
  соответствующим отдельным патчам, добавляется дополнительный [CLS] токен
  для классификации.
  
  Рис. SOTA на ImageNet на момент публикации статьи
  
  На момент публикации самая большая версия полученной архитектуры
  - ViT-H/14 (H - Huge) установила новый
  SOTA (state-of-the-art)
  на ImageNet-1k.
  Здесь, правда, нужно отметить важный нюанс
  - для достижения такого высокого качества необходимо обучение
  на огромном количестве данных.
  В распоряжении исследователей Google был датасет JFT-300M.
  Без предобучения на большом количестве данных,
  даже с сильной регуляризацией (weight_decay = 0.1)
  модель подвержена переобучению и работает заметно хуже ResNet-ов.
  //// Интересное замечание в том смысле,
  //// что обучение трансформеров "кусочкам картинки" много труднее,
  //// чем обучение той же сверточной сети.
  //// Но, вообще, сама оценка скорости обучения как критерий соответствия
  //// выбранной структуры нейросети поставленной задаче,
  //// тоже, наверно, имеет смысл.
  //// А пока "завяжем узелок на память", что для трансформеров,
  //// при обучении "в лоб", "кусочки картинки" более трудны для "понимания",
  //// "чем фрагменты текстов.
  
  Рис. Качество на ImageNet-1k в зависимости от датасета,
  на котором проходило предобучение.
  BiT - модификация ResNet.
  
  DeiT (Data-Efficient Image Transformer)
  
  Тот же ViT, но лучше.
  
  Рис. Кривые Парето для разных моделей на ImageNet.
  По оси пропускная способность V100 по количеству картинок в секунду.
  
  Необходимость предобучения на громадном количестве картинок
  могла бы ограничить применимость трансформеров в компьютерном зрении,
  но вскоре после вышеупомянутой работы вышла статья
  Training data-efficient image transformers & distillation through attention.
  https://arxiv.org/abs/2012.12877
  
  Так как основной проблемой трансформеров в исходной постановке
  является подверженность переобучению,
  //// Т.е. чтобы обучить трансформер "картинкам" требуется длительное обучение,
  //// но длительное обучение приводит к "переобучению".
  //// Противоречие.
  //// Типичная ситуация "хрупкого баланса".
  то естественно было бы предложить более совершенную процедуру регуляризации,
  и аугментация является признанным и эффективным средством
  для эффективного увеличения размера данных и борьбы с переобучением.
  Вопрос в том - достаточно ли хороша она?
  //// Т.е. решать противоречие не стали, а попытались облегчить проблему
  //// "признанными и эффективными средствами" "допиливания напильником".
  //// А, проблема, наверно, все-таки в том,
  //// чтобы понять что нужно ПРИНЦИПИАЛЬНО изменить либо в подходе/пониманию
  //// обучения трансформеров, либо в природе возникновения
  //// и/или преодоления самого "переобучения".
  //// Но для принципиальных решений нужна хоть какая-то теория/гипотеза,
  //// а за неименением таковой,
  //// применяются "признанные полушаманские/полуэвристические приемы".
  
  В статье авторы использовали мощный набор аугментаций
  и регуляризационных процедур:
  
  Label smoothing.
  Правильной метке дается вероятность 1-\varepsilon,
  а остальная вероятность \varepsilon
  распределяется равномерно между остальными классами.
  
  Rand Augment.
  Выбирается некоторое множество преобразований,
  из которых случайным образом для каждого примера
  применяется какое-то количество из них с некоторой вероятностью и параметрами.
  
  Stochastic Depth.
  Так как в трансформерах есть skip-connections
  с некоторой вероятностью можно проигнорировать выход блока энкодера
  и подать просто выход прошлого слоя вперед.
  
  Mixup и CutMix.
  Mixup смешивает две картинки
  и соответствующие им целевые метки в классификации.
  CutMix вставляет уменьшенную версию одной картинки поверх другой
  и целевая метка классификации берется как смесь меток для каждого класса,
  причем доля класса пропорциональна занимаемой площади.
  
  Repeated Augmentation.
  Прогонять через аугментации можно не только лишь один,
  но и большее количество раз.
  
  Erasing.
  Из картинки вырезается некоторая область случайным образом.
  
  Авторы провели основательный анализ важности тех или иных аугментаций
  для достижения хорошего качества классификации.
  
  Рис. Ablation study для разных способов аугментации картинок из ImageNet.
  
  Другим решением, дополнительно повысившим качество модели была дистилляция
  (knowledge distillation).
  Вкратце напомню, что идея дистилляции в том,
  чтобы кроме ground_truth меток подавать еще предсказания модели (учителя),
  хорошо обученной на рассматриваемом наборе данных.
  //// Вообще, "прием дистилляции" требует отдельного рассмотрения,
  //// так как фактически модель в значительной мере учится уже
  //// не на чистых исходных данных,
  //// а на смеси с какими-то уже "переработанными" представлениями.
  //// Так, записываем в раздел "to do".
  
  Если в функцию потерь подаются вероятности (или логиты)
  то мы имеем дело с soft-distillation:
  
  \mathcal{L} = (1 - \lambda) \mathcal{L}_{CE} (y_{pred},y_{true} ) + \lambda \tau^{2} D_{KL} (y_{pred} / \tau, y_{teacher} / \tau)
  
  Здесь \lambda определяет вес лосса учителя (D_{KL} (:, :)
  - дивергенции Кульбака-Лейблера) по сравнению с кроссэнтропией
  между предсказанием и истинной меткой,
  а температура \tau - регулирует уверенность моделей в предсказании.
  
  Если же подается предсказанный учителем класс (он может быть и ошибочным),
  то это hard-distillation.
  
  \mathcal{L} = \frac{1}{2}\mathcal{L}_{CE} (y_{pred}, y_{true}) + \frac{1}{2} \mathcal{L}_{CE} (y_{pred}, y_{teacher})
  
  Что занятно (и мне непонятно), второй способ сработал лучше.
  //// Действительно, забавно.
  //// Если считать, что понимание, того как проходит обучение, верное.
  //// А вот если это не так, то это информация к размышлению.
  
  Рис. Сравнение различных моделей дистиляции для DeiT
  
  В качестве учителя лучше всего себя показали RegNet-ы (сверточные сети),
  лучше, чем более крупная модель трансформера.
  По всей видимости, так как сверточные сети и трансформеры
  имеют различный способ построения признаков,
  то знание, переданное от CNN более ново и полезно,
  чем просто от более мощной модели той же структуры.
  //// Интересная гипотеза. Стоит запомнить. И поискать под нее материал.
  //// Кстати, есть интуитивное ощущение, что эта гипотеза коррелирует
  //// с наблюдениями о том, что нейросети лучше работают,
  //// если они работают не "с нуля",
  //// а отталкиваясь от какого-то предварительно вычисленной оценки.
  //// Может быть, и в отношении обучения нейросетей работает нечто похожее.
  
  С точки зрения архитектуры - DeiT ничем не отличается от ViT.
  
  PVT (Pyramid Vision Transformer)
  
  Интересное решение, позволившее использовать более мелкие патчи
  было предложено в статье
  Pyramid Vision Transformer: A Versatile Backbone for Dense Prediction without Convolutions.
  https://arxiv.org/abs/2102.12122
  
  Рис. Слева) Извлечение пирамиды признаков в типичных CNN
  (Центр) ViT не обладает иерархией признаков
  (Справа) Извлечение пирамиды признаков в PS-ViT
  
  FPN (Feature Pyramid Network) и различные ее вариации
  довольно неплохо зарекомендовала себя в задачах сегментации и детекции.
  Признаки с верхних слоев фокусируются на извлечении мелких деталей и примитивов,
  в то время как более глубокие слои имеют представление о глобальной семантике.
  Использование признаков с разных слоев позволяет
  одновременно учитывать мелкие и крупные детали.
  В vanilla ViT все feature maps имеют один и тот же размер,
  поэтому нет разделения на мелкие и крупные признаки.
  Кроме того, крупные патчи не обеспечивают достаточного разрешения
  для разрешения мелких деталей.
  
  Рис. Архитектура PVT. На каждой стадии разрешение feature map уменьшается вдвое.
  Красный бледный прямоугольник (Spatial Reduction)
  - одна из основных наработок статьи
  
  В PVT было предложено использовать патчи размера 4x4 на первой стадии
  и затем последовательно уменьшать разрешение.
  На каждой стадии разрешение уменьшается вдвое с помощью strided свертки
  с увеличением размерности вектора embedding.
  
  Тем не менее, на первых слоях при размере патча 4x4
  все еще остается слишком много операций.
  Для того, чтобы уменьшить расход памяти на верхних слоях
  авторы предложили уменьшать длину последовательностей key и value.
  //// А как это повлияло на качество?
  //// К сожалению, в таких материалах слишком большой упор делается
  //// на усилия по обеспечению меньших затрат памяти и вычислительных ресурсов,
  //// по сравнению с усилиями на обеспечение понимания того,
  //// что, как и почему при этом происходит.
  //// И почему это никого, в том числе и меня самого, уже не удивляет?
  
  Сложность вычисления произведения Q K^T
  пропорциональна произведению длин последовательностей key - L_Kи query L_Q.
  Полученная матрица имеет размер L_Q \times L_K.
  Если последовательность value имеет ту же длину, что и ключи,
  то возможно умножить матрицу внимания \mathrm{softmax}(Q K^T/\sqrt{d}) на Vи
  выход будет иметь ту же длину, что и query.
  
  Уменьшение длины последовательностей key и query достигается следующим образом.
  Пусть H_iи W_i- количество патчей вдоль каждой из осей (высоты и ширины)
  а C_i размерность эмбеддинга на i- й стадии. Тогда:
  
  Входная последовательность длины H_i \cdot W_i
  и размерности эмбеддинга C_i решейпится (звучит ужасно, знаю)
  в последовательность длины H_i W_i / R_i^2
  c размерностью эмбеддинга R_i^2 C_i.
  
  Слой nn.Linear(R_i ** 2 * C_i, C_i) уменьшает размерность эмбеддинга
  до исходной (проектирует на подпространство).
  
  Рис. Схема работы Attention с Spatial Reduction
  
  После этого поступаем точно так же, как и в стандартном self-attention.
  В итоге получается экономия в R_i^2в вычислительной сложности и памяти.
  
  Данная модификация, несомненно, ограничивает выразительности сети,
  //// На сколько?
  но выбор архитектуры - почти всегда баланс между качеством и скоростью (размером).
  
  В первых слоях фактор R_i довольно большой - 8,
  и уменьшается вдвое на каждой следующей стадии.
  На самой последней стадии R_i = 1.
  Кроме того, патч размера 2x2 c feature map с прошлой стадии
  используется в качестве пикселя (элементарной ячейки карты активации)
  на следующей стадии.
  
  Рис. Разные версии моделей PVT.
  
  Наличие карт активации разного размера позволяет применить идею
  Feature Pyramid в PVT.
  
  Полученная модель неплохо себя показывает на ImageNet.
  
  Рис. PVT против других (порошков) моделей
  
  Но по-настоящему польза от PVT становится заметной на детекции и сегментации.
  
  Рис. Сравнение детекции + сегментации на MS COCO (val 2017)
  с использованием Mask R-CNN головы.
  
  Рис. Семантическая сегментация на ADE20K.
  Сравнение проводится по метрике mIoU (mean Intersection over Union)
  
  Swin (Hierarchical Vision Transformer using Shifted Windows)
  
  Рис. Дементий, тащи свиней!
  
  Основной проблемой при использовании ViT, особенно в Dense Prediction tasks
  - детекции и сегментации,
  является быстрый рост сложности с уменьшением размера патча.
  Патч размера 16x16 выходит слишком грубоватым для извлечения тонких деталей.
  
  В статье Swin Transformer: Hierarchical Vision Transformer using Shifted Windows
  https://arxiv.org/abs/2103.14030
  был предложен изящный способ уменьшить вычислительную сложность для feature map
  с большим количеством патчей.
  Как и PVT, подход в Swin мотивирован пирамидой признаков из CNN.
  Карта признаков на верхнем уровне составлена из мелких патчей
  (более конкретно, размера 4x4)
  и через некоторое количество слоев пространственная размерность
  уменьшается вдвое вдоль каждой оси
  (происходит слияние соседних патчей),
  а размерность эмбеддинга удваивается.
  
  Но способ "удешевления" attention в верхних слоях другой.
  В верхних слоях attention считается только в пределах окна некоторого размера,
  причем количество токенов в окне постоянно во всех слоях сети.
  То есть, если на нижней стадии размер патча P
  и attention захватывает для каждого токена все остальные токены,
  то на предыдущей стадии с размером патча P/2
  attention локализован лишь на четверти входной картинки,
  а слое еще ниже (где патчи имеют размер P/4 на 1/16 картинки.
  Благодаря этому становится возможным использование мелких патчей.
  
  Сравним вычислительную сложность windowed self-attention
  c глобальным self-attention.
  Пусть ширина и высота feature map на данном слое - H и W, соответственно.
  Тогда при использовании окон, захватывающих области высотой H/R и шириной W/R
  потребуется R^2 вычислять self-attention для каждого из окон.
  Но так как вычислительная сложность операции внимания
  растет квадратично с длиной последовательности,
  то в силу R \cdot O((H W / R^2)^2) = O((H W)^2) / R^2
  имеем в конечном итоге выигрыш в R^2 раз по сравнению с исходной операцией.
  
  Рис. Последовательное слияние патчей и увеличение размера окон для attention
  
  Но при таком подходе токены из соседних окон не взаимодействуют друг с другом,
  что ограничивает выразительную способность сети.
  Взаимодействие с соседями реализовано в Swin следующим образом:
  
  на четных слоях разбиваем на патчи одним способом
  (так чтобы верхний левый угол верхнего левого патча совпал
  с верхним левым углом всей картинки)
  
  на нечетных шагах сдвигаем разбиение на половину размера патча в данном слое
  
  Рис. Окна в Swin в двух последовательных блоках трансформера
  
  В остальном блоки трансформера в Swin повторяют ViT.
  Вычисление двух последовательных блоков в Swin имеет следующий вид:
  
  \begin{aligned} \hat{z}^{l} &= \mathrm{W-MSA}(\mathrm{LN} (z^{l})) + z^{l} \\ z^{l} &= \mathrm{MLP} (z^{l}) + \hat{z}^l \\ \hat{z}^{l+1} &= \mathrm{SW-MSA}(\mathrm{LN}(z^{l})) + z^{l} \\ z^{l+1} &= \mathrm{MLP}(\hat{z}^{l+1}) + \hat{z}^{l+1} \end{aligned}
  
  В итоге получился очень сильный бэкбоун для задачи классификации
  и Dense predictions tasks (детекции, сегментации).
  
  Рис. Сравнение моделей на ImageNet-1k
  (без использования дополнительных данных)
  
  При сопоставимом количестве операций с плавающей точкой
  модели Swin значительно превосходят ViT и DeiT
  (но все же уступают наиболее совершенным CNN вроде EfficientNet).
  
  Стандартные фреймворки детекции и сегментации состоят из backbone,
  который строит признаки и новое представление объекта,
  и головы (head) для детекции и сегментации.
  Для того, чтобы сравнить качество извлекамых с помощью Swin признаков
  авторы статьи обучили модели с Cascade Mask R-CNN
  (голова для одновременной детекции и сегментации) на MS COCO.
  
  Модели Swin заметно превзошли бейзлайны на основе ResNet-ов и DeiT
  с сопоставимыми характеристиками
  (числом параметров и операций)
  как в детекции, так и сегментации.
  
  Рис. Сравнение Swin-T и ResNet50 в качестве бэкбоуна
  для детекции с помощью Cascade MASK R-CNN.
  Сравнение метрик AP проводится на датасете MS COCO.
  
  Рис. Сравнение метрики mIoU (mean Intersection over Union)
  для сегментации на ADE20K.
  
  Использование shifted windows, как показывает ablation study,
  действительно важно для достижения хорошего результата,
  особенно для детекции и сегментации.
  
  Рис. Ablation study для испозования shifted windows.
  Сверху - без сдвига окон, снизу - со сдвигом окон.
  
  XCiT (Cross-Covariance Image Transformers)
  
  Еще один подход побороть квадратичную зависимость от количества патчей
  был предложен в статье XCiT: Cross-Covariance Image Transformers
  https://arxiv.org/abs/2106.09681
  от исследователей из Фейсбука (ныне Мета).
  
  Идея состоит в том, чтобы транспонировать операцию attention.
  //// Вот этого не понял.
  
  В исходной операции self-attention c hголовами:
  
  \mathrm{Attention} (Q, K, V) = \mathrm{softmax} (Q K^T / \sqrt{d}) V
  
  Сложность вычисления - O(d N^2), а расход по памяти O(h N^2 + N d).
  
  Для транспонированного внимания
  (называемого в статье cross-covariance)
  операция имеет следующий вид:
  
  \mathrm{XC-Attention}(Q, K, V) = V \mathrm{softmax} \ (K Q^T/ \tau)
  
  где \tau - некоторый параметр температуры.
  Квадратичная сложность переносится с длины последовательности
  на размерность эмбеддинга.
  Для cross-attention вычислительная сложность O(N d^2/h)
  и расход памяти - O(d^2/h + Nd).
  Поэтому вычислительная сложность для XCiT будет расти не так быстро,
  как для ViT, с уменьшением размера патчей или увеличением разрешения.
  
  Рис. XCA (Cross-covariance) блок в XCiT
  и различие между Self-Attention и Cross-Covariance Attention
  
  XC-attention, как и Self-attention,
  позволяет агрегировать глобальный контекст.
  Но агрегация происходит несколько в менее явной форме,
  через свертку по внутренней размерности в вычислении K Q^T.
  
  Для того, чтобы иметь явное взаимодействие между соседними патчами,
  авторы добавили так называемое локальное взаимодействие патчей
  (Local Patch Interaction).
  В качестве LPI используется последовательность двух depthwise сверток
  3 \times 3с батч-нормализацией и GeLU между ними.
  Последовательность токенов перед LPI разворачивается в 2d картинку,
  к этой картинке применяется описанная выше последовательность слоев,
  и картинка сворачивается обратно в последовательность токенов.
  
  Приятным бонусом от XC-attention является меньшая чувствительность
  к изменению разрешения подаваемой картинки.
  Так как свертка при вычислении XC-attention проводится вдоль внутренней оси,
  размер матрицы внимания не меняется.
  Качество модели, обученной на разрешении 224 \times 224
  проседает не так сильно при уменьшении разрешения,
  по сравнению с ResNet и DeiT,
  и даже заметно возрастает при увеличении разрешения до 288 \times 288.
  
  Рис. XCiT более устойчив к изменению разрешения входной картинки.
  
  Бэкбоун получился очень даже замечательным.
  При сопоставимых размерах различные варианты XCiT оказываются эффективнее
  не только EfficientNet-ов и ранних ViT,
  но и сильных конкурентов вроде Swin-ов.
  
  Рис. Сравнение различных моделей классификации на ImageNet
  cо сравнимыми характеристиками.
  
  В задаче детекции и сегментации XCiT показал себя с хорошей стороны,
  превзойдя бэкбоуны на основе PVT и ViL (не затронутого в данном обзоре).
  XCiT-S12/8 превзошел даже Swin-T с похожими характеристиками,
  но более крупный свин таки подложил свинью в сравнении с XCiT-S24/8.
  
  Рис. Сравнение разных моделей с MASK-RCNN головой на MS COCO
  в задаче детекции (сравнение проводится по AP^b)
  и instance сегментации (сравнение по AP^m).
  
  PS-ViT (Pooling and Attention Sharing)
  
  Рис. Нет, это совершенно здесь не при чем
  
  В сверточных сетях обыкновенно карты признаков на верхних слоях
  обладают большим разрешением,
  и постепенно посредством pooling или strided-сверток
  разрешение уменьшается с увеличением числа каналов.
  Таким образом, производится переход от локальных признаков
  к глобальным представлениям.
  
  Разумно предположить, что аналогичный подход может хорошо сработать
  и для visual трансформеров.
  
  И в работе Better Vision Transformer via Token Pooling and Attention Sharing
  https://arxiv.org/abs/2108.03428
  была предложена архитектура такая архитектура,
  давшая существенный прирост качества на ImageNet по сравнению с DeiT
  при том же числе операций (6.6% для PSViT-2D-Tiny по сравнению с DeiT-Tiny).
  
  В качестве основных результатов данной статьи следует отметить:
  
  Механизм уменьшения количества токенов с увеличением глубины сети
  
  Переиспользование одного и того же attention
  в нескольких последовательных блоках трансформера
  
  Рис. Структура PS-ViT. После каждого блока количество токенов уменьшается вдвое.
  
  Pooling в PS-ViT
  
  В статье авторы рассматривают разные стратегии модификации архитектуры
  (взяв за основу DeiT-Tiny)
  и сохраняя примерно то же количество FLOPs.
  
  Увеличение глубины сети (количества блоков)
  при сохранении размерности эмбеддинга неизменной
  
  Увеличение размерности эмбеддинга при том же количестве блоков
  
  И то, и то сработало достаточно неплохо,
  но увеличение ширины несколько лучше.
  Кроме того, авторы рассматривают два варианта пулинга.
  
  В первом случае, где классификация осуществляется через [CLS] токен,
  свертка 1x1 меняет размерность эмбеддинга,
  а затем проводится MaxPooling.
  Эта стратегия называется PSViT-1D.
  
  В другом случае для классификации используется
  результат усреднения последней карты активации
  и для пулинга strided свертка с шагом 2.
  Этот подход, называемый PSViT-2D, работает даже немного лучше.
  
  Рис. Сравнение глубокой и широкой сети по сравнению с исходным DeiT
  
  Вторым важным наблюдением является то,
  что карты внимания (attention map) в соседних слоях
  сильно скоррелированы друг с другом.
  Так как вычисление attention является дорогостоящим по числу параметров и операций,
  переиспользование его в следующем слое дает серьезную экономию.
  //// Опять интересный момент. Но опять же непонятный,
  //// и все потому, что нет интуитивного понимания,
  //// что же все-таки есть это пресловутый "attention",
  //// который еще может и по разному вычисляться,
  //// например, с уменьшенной размерностью или через "транспонирование".
  //// Похоже, "переиспользование attention" в чем-то аналогично,
  //// использованию различных "карт признаков",
  //// т.е. дополнительной связи между различными представлениями.
  //// "Но это не точно".
  
  Рис. Корреляции attention maps в соседних слоях
  
  И последним по порядку, но по значению
  является оптимальный выбор расположения элементов
  и количества слоев в трансформере.
  
  Полный перебор возможных вариантов расположения слоев
  с пулингом и размерностей эмбеддингов
  - слишком сложная комбинаторная задача,
  поэтому пространство поиска пришлось существенно ограничить.
  Размерности эмбеддинга и максимальное число блоков
  зафиксировано на каждой стадии (при фиксированном количестве токенов).
  
  В каждом блоке есть 3 выбора:
  
  Использовать обычный блок трансформера
  
  Два последовательных блока с одним и тем же attention
  
  Тождественную операцию (Identity)
  
  На каждом проходе (forward pass) один из трех вариантов
  выбирается из равномерного распределения
  и при обратном проходе (backward pass)
  обновляются параметры для этого варианта
  (если это не Identity, конечно).
  Оптимальная архитектура определяется с помощью эволюционного алгоритма.
  
  Рис. Суперсеть из возможных конструктивных элементов в PS-ViT.
  
  Возможная глубина сети от 0 (только Identity)
  до 36 (везде два Sharing Layer) блоков трансформера.
  
  Работает это, по всей видимости, и правда неплохо:
  
  Рис. Сравнение моделек на ImageNet
  
  VOLO (Vision Outlooker for Visual Recognition)
  
  Довольно занятную вариацию внимания предложили в статье VOLO
  https://arxiv.org/abs/2106.13112
  (если честно, я даже не понимаю, почему она работает так здорово).
  
  Блок энкодера имеет стандартный вид:
  
  \begin{aligned} \hat{X} &= \mathrm{OutlookAttn} (\mathrm{LN}(X)) + X\\ Z &= \mathrm{MLP} (\mathrm{LN} (\hat{X})) + \hat{X}\end{aligned}
  
  Здесь \mathrm{LN}(...)- это LayerNorm,
  а вот что действительно интересно,
  так это операция\mathrm{OutLookAttn}(...).
  Делается она следующим образом (C - число каналов, K - размер ядра свертки):
  
  Линейный слой nn.Linear(C, K ** 4) для каждого пикселя из feature map
  создает вектор размерности K ** 4.
  
  Полученный вектор решейпится (прошу прощения за англицизм)
  в матрицу K ** 2 x K ** 2.
  Данная матрица играет роль матрицы внимания в пределах окна размера K x K.
  То есть матрица внимания предсказывается в один шаг,
  без создания ключей (keys) и запросов (queries)
  c последующим вычислением попарных скалярных произведений.
  //// То есть keys и queries оказываются не обязательными?
  //// И это тоже будет "трансформер"?
  
  Линейный слой nn.Linear(C, С) выдает значения (values) для каждого токена
  (как в обычном трансформере).
  
  Полученная на шаге 2 матрица attention перемножается на values
  и получается выходное представление.
  
  Рис. Как работает Outlook Attention
  
  Таким образом, получается некий trade-off между локальностью операции
  и вычислительной сложностью.
  В стандартном self-attention вычислительная сложность растет
  как O((H W / P^2)^2)
  поэтому использовать патчи размером меньше 16,
  особенно при большом разрешении довольно проблематично.
  В предложенном подходе же асимптотика линейна по количеству токенов O((HW/P^2) K^4).
  Размер ядра свертки K должен быть небольшим (в работе K= 3).
  Благодаря этому можно брать меньший патч (скажем 8)
  при большом разрешении (384x384, 512x512).
  
  Рис. Разные версии VOLO
  
  OutlookAttn - гибрид свертки и стандартного self-attention
  - локальный, но с большим receptive field.
  При таком подходе большой receptive field
  может быть достигнут при меньшем числе блоков, чем в типичной CNN
  и в то же время зашито понятие локальности и близости в саму архитектуру.
  
  Рис. Кривые Парето для VOLO и еще нескольких современных моделей на ImageNet
  
  Получился классный бэкбоун, позволивший добиться впечатляющих результатов
  не только на ImageNet (87.1% без дополнительных данных),
  но и в задачах семантической сегментации на Cityscapes и ADE20K.
  
  Рис. (Слева) Качество сегментации (по mIoU) на CityScapes.
  (Справа) Качество сегментации (по mIoU) на ADE20K.
  
  Заключение
  
  Универсальность и гибкость архитектуры трансформера,
  способность улавливать глобальный контекст,
  оказалась полезной и в области компьютерного зрения.
  
  За год с небольшим, прошедших с публикации An image is worth 16x16 words,
  трансформеры сильно изменили наши представления о том,
  как надо решать задачи компьютерного зрения, толкнули науку далеко вперед.
  //// Это не "наука", а "практика", т.к. отсутствует "теоретическая база".
  
  В данном обзоре я рассмотрел лишь отдельные работы
  из моря публикаций по этой теме за 2021 год.
  Многие другие интересные идеи,
  вроде Transformer in Transformer и CoAtNet
  https://arxiv.org/abs/2103.00112
  не были затронуты в силу ограниченности объема обзора.
  Кроме того, были рассмотрены только задачи классификации,
  детекции и сегментации картинок.
  ViT-ы показали впечатляющие задачи так же в мультимодальных задачах,
  при работе с видео и self-supervised, semi-supervised learning,
  генеративных моделях.
  
  В настоящий момент сложно сказать,
  как будет развиваться эта область в будущем.
  Мне кажется, что в следующие несколько лет мы увидим
  последовательное развитие и улучшение архитектур Visual трансформеров,
  которое имело место для сверточных сетей.
  Будет ли архитектура на основе механизма внимания
  или ее гибрид со свертками конечным этапом развития нейронных сетей
  в компьютерном зрении
  или придет другая, еще более мощная и универсальная архитектура,
  не берусь судить.
  
  Но я уверен, что за развитием этой области будет очень интересно следить в 2022.
  
  Список источников
  
  Статьи
  
  An image is worth 16x16 words
  
  Training data-efficient image transformers & distillation through attention
  
  Pyramid Vision Transformer: A Versatile Backbone for Dense Prediction without
  Convolutions
  
  Swin-Transformer
  
  PSViT: Better Vision Transformer via Token Pooling and Attention Sharing
  
  XCiT: Cross-Covariance Image Transformers
  
  VOLO
  
  Stand-Alone Self-Attention in Vision Models
  
  DETR
  
  Большой Перечень архитектур ViT
  https://github.com/dk-liang/Awesome-Visual-Transformer
  
  Ну и куда без Янника Килхера
  https://www.youtube.com/c/YannicKilcher
  
  .......
  
  //// Из комментариев.
  
  masai
  8 янв 2022 в 18:27
  
  \\\ Но статья Attention is all you need
  \\\ получила свое название не просто так, и название оказалось даже более
  \\\ глубокомысленным чем, полагаю, даже исходно полагали сами авторы.
  
  Говорят, что и внимание не очень-то нужно. :)
  https://github.com/sail-sg/poolformer
  
  Да и ResNet хоронить пока что рано - ResNet strikes back.
  https://arxiv.org/abs/2110.00476
  
  19blackadder97
  8 янв 2022 в 18:40
  
  спасибо, про Poolformer не видел статью.
  Правда, навскидку сравнивая перформанс Poolformer и Swin на ImageNet,
  кажется, что Swin эффективнее выходит (именно Swin а не Swin-Mixer).
  Про ResNet читал статью - действительно процедура обучения решает многое,
  и к моменту массового использования ViT у исследователей
  был большой опыт в подборе сильных процедур обучения.
  Но все же кажется, что если ViT-ы смогли составить сходу конкуренцию
  давно развиваемым сверточным сетям,
  то у них еще большой потенциал для дальнейшего развития.
  
  masai
  8 янв 2022 в 21:13
  
  Ну, там идея в том, что attention не так уж и важен сам по себе.
  PoolFormer - это просто пример.
  
  Я вовсе не против трансформеров.
  Наоборот, мне кажется, всё это очень интересно
  и нам только предстоит понять, что делает те или иные модели эффективными.
  
  Скажем, недавно была статья, в которой сделали NeRF без нейронок.
  То есть, значительная часть эффективности приходится
  на дифференцируемый рендерер,
  вносящий inductive bias с информацией о внешнем мире.
  https://habr.com/ru/post/591779/
  Статья Deep Image Prior показала, что сам факт использования свёрток
  - это уже важная штука,
  с помощью которых многое можно сделать.
  (И, кстати, идеи оттуда были использованы в известной статье
  про ретайминг видео.)
  
  В общем, всё это очень и очень любопытно. :)
  
  19blackadder97
  8 янв 2022 в 23:25
  
  Очень познавательно! Действительно, интересные работы.
  Кажется, что практика сильно убежала вперед теории.
  Интересно, смогут ли когда нибудь теоретики приблизиться
  к сколько либо точному предсказанию поведения нейронной сети
  на реальном датасете при условиях, близких к реальным нейронным сетям
  (то есть не в пределе NTK или среднего поля, скажем)?
  
  masai
  9 янв 2022 в 03:19
  
  Да, deep learning - это сейчас экспериментальная наука.
  Но может, в ближайшее время появится хорошая теория, кто знает.
  
  kraidiky
  10 окт 2023 в 15:00
  
  Я бы даже сказал, что пора распрощаться с мыслью,
  что нейросети - точная наука,
  и начать относиться к ней, как к естественной.
  Как биологи, разглядывающие под микроскопом своих подопечных дрозофил
  и изучающие даже всякие химические и генетические взаимосвязи,
  но признающие при этом, что их понимание бесконечно не полно.
  //// Очень печально было прочитать этот комментарий от автора,
  //// который десять лет назад как раз и пытался
  //// что-то новое и оригинальное сказать
  //// именно в области понимания нейросетей.
  //// Но, похоже, не получив ни понимания, ни одобрения своим устремлениям,
  //// пришел к такому печальному прогнозу относительно этой "точной науки".
  
  .......
  
  19blackadder97
  9 янв 2022 в 12:54
  
  Идея сделать предобучение, как BERT, выглядит естественно,
  но вот главный вопрос был в том к поставить задачу,
  чтобы представить картинку как слово.
  Авторы BeiT придумали хорошее решение
  с подачей патчей в дискретный автоэнкодер,
  и, как я понял, их решение достаточно быстро файнтьюнится на ImageNet и сегментации.
  Работает даже немного лучше, чем DINO, судя по табличкам в их статье.
  
  Еще есть свежий результат в этом направлении
  - Masked Autoencoders Are Scalable Vision Learners.
  Тут авторы маскируют большой процент (75% токенов)
  прогоняют через энкодер незамаскированные патчи
  и декодером восстанавливают картинку на предобучении.
  На файнтьюнинге используется только энкодер со всей
  (незамаскированной картинкой).
  
  .......
  
  ount_enable
  9 янв 2022 в 00:48
  \\\ При сопоставимом количестве операций с плавающей точкой модели Swin
  \\\ значительно превосходят ViT и DeiT и сравнимы с EfficientNet
  \\\ (эффективнее по числу операций, чуть уступают в плане эффективности по
  \\\ параметрам).
  
  В табличке выше самый мелкий трансформер на 4.5 Гфлопс имеет точность 81.3,
  а EfficientNet на 1.8 Гфлопс выдает 81.6%.
  Где они эффективнее?
  
  Ещё с трансформерами большая проблема в квантизации.
  Если свёрточные сети спокойно квантизируются в 8 бит
  или даже меньше с минимальной потерей точности,
  то трансформеры сильно ухудшаются,
  и совершенно неэффективны для практических применений,
  особенно вне дата-центра.
  
  ......
  
  19blackadder97
  9 янв 2022 в 08:09
  Ух, куда же я смотрел в этот момент) Действительно, EfficientNet выходит круче.
  Интересно, что в плане throughput таблица наиболее выигрышная для них,
  хотя, казалось бы, что он должен напрямую зависеть от FLOPs.
  
  С квантизацией не доводилось особо работать.
  Могу предположить, что причина падения качества
  - более резкие оптимумы по сравнению с сверточными сетями
  (большая кривизна босс-поверхности).
  //// Думаю, что не в этом дело,
  //// а в "топологической сложности пространства эмбеддингов".
  Вероятно, если брать модели, обученные с помощью SAM,
  они будут лучше квантоваться.
  Возможно ли дообучение квантованных моделей в низкой точности?
  
  По личному опыту еще могу сказать, что visual transformer плохо прунится.
  //// То бишь, плохо "сжимается"
  //// за счет исключения "вроде как" несущественных связей.
  //// А это может быть свидетельством, что "внутреннее пространство"
  //// трансформеров более сложное или более связное, чем у сверточных сетей.
  Если ResNet можно запрунить без потери качества достаточно сильно,
  EfficientNet и NFNet не так хорошо,
  в силу их оптимизированности,
  до 70-80% обычно качество не проседает,
  а при небольшом прореживании качество слегка растет даже на валидации,
  то для ViT (DeiT, Swin) я наблюдал монотонное ухудшение качества
  и модель c 50% весов уже теряет пару процентов на ImageNet.
  
  count_enable
  9 янв 2022 в 21:44
  
  Я навскидку посмотрел - уже есть пара публикаций о квантизации трансформеров,
  авось через пару лет и дойдут до практических примеров.
  
  Прунинг звучит круто ("мы выбросили 90% параметров!!!111"),
  на практике очень редко даёт ускорение
  ибо всё железо заточено под плотные,
  а не разряженные матрицы,
  и кроме слабеньких процессоров мало где можно получить ощутимый выигрыш.
  
  .......
  
  9blackadder97
  10 янв 2022 в 23:40
  
  Справедливо, спасибо за замечание.
  Похоже, что реальная польза будет в массовых применениях,
  если каким-то образом железо на мобильных устройствах
  сможет поддерживать и эффективно обрабатывать разреженные тензоры.
  
  kraidiky
  10 окт 2023 в 15:09
  
  На обычной моей карточке разреженные тензоры обрабатываются,
  грубо говоря x3 по сравнению с dense с таким же количеством весов.
  Так что как только вы напрунили больше чем две трети вы уже вы выигрыше.
  
  А кроме того никто, почему-то, не говорит,
  что удалять можно не только веса, но и целиком нейроны или свёртки.
  Это делается вообще без накладных расходов.
  Прунинг явно сильно недооценён.
  
  ........
  
  
  kraidiky
  12 окт 2023 в 11:28
  
  Я с полносвязаными слоями работаю,
  использую https://pypi.org/project/torch-sparse/
  У него манипулирование индексами показалось менее проблематичным.
  Там кроме весов хранится ещё тензор с индексами x2 размером
  потому что две координаты,
  так что экономия по памяти начинается только после того,
  как проредили хотя бы на 2/3 и по скорости исполнения та же ситуация,
  примерно раза в три медленнее при том же количестве весов.
  Для моих достаточно экспериментальных целей подходит.
  Если зарубаться за скорость инференса думаю можно
  и что-то более эффективное подыскать.
  Я почти уверен, что если подумать головой можно хранить один индекс,
  а не два и не требовать обязательно long int,
  учитывая реальные размеры матриц,
  а хранить оба индекса в одном лонге.
  
  >> 30-40% ускорения при сохранении качества не реальной задаче
  - это хороший результат, и требует обычно серьезного дообучения.
  
  30-40% процентов на инференсе это не просто бабло, а баблище,
  и я не знаю почему народ
  это не стало золотым стандартом постобработки сети перед инференсом.
  
  ........
  
  count_enable
  12 янв 2022 в 16:52
  
  И вот опять свёрточные сети лучше всех: https://arxiv.org/abs/2201.03545 .
  
  19blackadder97
  13 янв 2022 в 12:14
  
  Да, похоже , пространство параметров в архитектурах еще мало исследовано.
  Здесь, правда замечу, что разница все же не так велика
  в производительности Swin и их ConvNext,
  более того, если сравнивать с XCiT,
  то они выйдут круче обоих моделей.
  
  .......
  
  Справедливости ради надо заметить, они с обучались дистилляцией с учителем,
  и разницу может делать именно этот факт.
  
  А вообще, кажется что оптимальная архитектура бы брала лушчее из двух миров
  - свертки с сильным inductive bias
  и attention со свойством улавливания глобального контекста.
  
  .......
  
  //// Конец цитирования.
  
  Опять, вроде, не сильно много добавилось к пониманию трансформеров,
  но совершенно бесполезным этот материал тоже никак нельзя считать.
  Например, мне очень заинтересовала информация
  об особенностях обучения трансформеров "элементам картинок",
  досточно "вольным обращением" с матрицами key и value,
  возможностью "переиспользования attention map",
  как механизма связи различных сегментов сети.
  ну, и куча полезных ссылок, вкупе с личными авторскими оценками.
  
  И, кроме того, подсказал еще одно из возможных направлений поиска
  - "метод дистилляции".
  Похоже, тут, тоже можно что-то интересное накопать, см.:
  "Дистилляция диффузионки" для "чайников".
  
  Короче, моя признательность и автору этого материала и комментариев к нему, есть о чем задуматься.
  
  
  ==========
  
  20.02.2024 21:16
  
  Структура сети Swin.
  В оглавление.
  
  Продолжим изучение архитектуры трансформеров на примере их применения
  в обработке изображений:
  
  "Обзор архитектуры Swin Transformer".
  Автор: vovaf709 (Филипенко Владимир)
  https://habr.com/ru/articles/599057/.
  1 янв 2022 в 23:18
  
  //// Начало цитирования.
  
  Трансформеры шагают по планете!
  В статье вспомним/узнаем как работает visual attention,
  поймём, что с ним не так,
  а главное как его поправить, чтобы получить на выходе best paper ICCV21.
  
  CV-трансформеры in a nutshell
  
  Attention Is All You Need
  
  Начнём издалека, а именно с 2017 года, когда A Vaswani et al.
  опубликовали знаменитую статью ,
  в которой была предложена архитектура нейронной сети Transformer
  для решения задачи seq2seq и в частности машинного перевода.
  Не буду говорить о том, насколько значимым было это событие для всего NLP.
  Скажу лишь, что на данный момент почти каждое ML решение,
  работающее с текстом,
  пожинает плоды того успеха,
  используя Transformer-based архитектуру напрямую,
  работая с эмбеддингами из BERT-а
  или еще каким-нибудь образом.
  Ключевым и идейно чуть ли не единственным компонентом трансформера
  является слой Multi-Head Attention.
  В применении к задаче машинного перевода он дал возможность
  учитывать взаимодействие между словами,
  находящимися на произвольно большом расстоянии в тексте,
  что выгодно выделило трансформер на фоне других моделей перевода
  и позволило ему занять место под солнцем.
  Формально этот слой записывается в терминах следующих преобразований:
  
  \text{Attention}(Q, K, V) = \text{Softmax}\left(\frac{QK^{\mathsf{T}}}{\sqrt{d_k}}\right)V,
  
  \text{MultiHeadAttention}(Q, K, V) = \text{Concat}(\text{head}_1, \dots, \text{head}_h)W^O,
  
  где
  
  \text{head}_i = \text{Attention}(QW_i^Q, KW_i^K, VW_i^V).
  
  С 2017 года было предложено бесчисленное множество модификаций трансформера
  (Linformer, Reformer, Perfomer, etc.),
  делающих его более вычислительно эффективным,
  стабилизирующих обучение и так далее.
  Такой бум трансформеров не мог не затронуть
  другие сферы применения глубинного обучения помимо NLP,
  и с ~2020 года они начали проникать в CV.
  
  Трансформеризация Computer Vision-а
  
  Вообще идея применения трансформера к изображениям изначально
  может смутить читателя.
  Всё-таки текст и картинки - это довольно отличающиеся модальности,
  как минимум тем, что текст является последовательностью слов.
  Изображение - это тоже в некотором смысле последовательность (пикселей),
  направление которой можно определить искусственно,
  например построчно, правда у такого определения
  не будет семантического смысла в отличие от текста.
  Однако не стоит забывать, что Multi-Head Attention
  на самом деле является операцией не над последовательностями,
  а над неупорядоченными множествами векторов,
  а последовательной структурой текст наделяется искусственно
  с помощью positional encoding-а,
  так что аргумент выше становится невалидным.
  Валидным аргументом против Visual Transformer-ов может быть
  отсутствие в них приятных inductive bias-ов,
  имеющихся у свёрточных сетей:
  эквивариантности относительно сдвигов
  и предположении о пространственной локальности принзнаков.
  Однако это так же спорный момент,
  подробнее про который можно почитать здесь.
  https://habr.com/ru/post/591779/
  А пока сомневающиеся сомневались,
  исследовательские группы делали,
  и явили миру несколько Visual Transoformer-ов (неплохой survey),
  https://arxiv.org/abs/2111.06091
  в том числе ViT, на примере которого мы выясним
  как же переформулировать Multi-Head Attention для изображений.
  
  An Image Is Worth 16x16 Words
  
  Авторы ViT-иа предложили довольно прямолинейную архитектуру:
  
  Исходная картинка нарезается на патчи 16x16,
  они вытягиваются в вектора и все пропускаются через линейный слой.
  Далее к ним прибавляются обучаемые вектора,
  играющие роль positional embedding-ов,
  а также к набору добавляется отдельный обучаемый эмбеддинг,
  являющийся прямым аналогом CLS-токена BERT-а.
  А на этом то и всё!
  Далее идёт самый обычный Transformer Encoder
  (N x Multi-Head Attention если угодно),
  и класс изображения предсказывается маленьким перцептроном,
  берущим на вход то, что получилось на месте CLS-токена.
  Как и ~любой трансформер, модель получилась очень прожорливой
  в том смысле, что для получения околосотовых результатов
  ей нужно предобучаться на громадных датасетах,
  таких как закрытый гугловский JFT-300M.
  Тем не менее в определённом сетапе сетка смогла обойти
  сотовых BiT-L и Noisy Student-а,
  что можно считать успехом.
  За подробностям отсылаю читателя к оригинальной статье,
  https://arxiv.org/abs/2010.11929
  много интересного можно найти в ablation-е,
  особенно советую изучить графики Mean Attention Distance-а,
  являющимся аналогом receptive field-а.
  
  Всё вроде и неплохо, но не классификацией единой занимаются в CV.
  Есть задачи по типу Object Detection-а,
  в которых зачастую важны мелкие детали,
  или же задачи сегментации,
  для которой вообще необходимо делать pixel-level предсказание.
  Все это требует как минимум возможности работы
  с изображениями высокого разрешения,
  то есть значительного увеличения размера входа.
  А как нетрудно видеть, Attention работает
  за квадратичное по входу время,
  что в случае картинок 1920х1920 является острейшей проблемой,
  так как время forward pass-а взмывает до небес.
  К тому же мелкие детали могу потеряться уже на первом слое,
  который суть свёртка 16х16 со страйдом 16.
  Кто виноват и что делать?
  На первый вопрос ответ +- понятен -
  дело в слишком твердолобой адаптации трансформерной архитектуры под CV.
  А ответу на второй вопрос посвящается оставшаяся часть этой статьи.
  
  Swin Transformer
  
  Проблемы ViT-а обозначились ещё в предыдущем параграфе,
  поэтому не будем ходить вокруг да около и сразу перейдем
  к рассмотрению архитектуры, предложенной в статье
  :
  https://arxiv.org/abs/2103.14030
  
  .........
  
  Первый слой качественно такой же, как и в ViT-е
  - исходная картинка нарезается на патчи и проецируется линейным слоем.
  Единственное отличие в том, что в Swin-е на первом слое патчи имеют размер 4х4,
  что позволяет обрабатывать более мелкий контекст.
  Далее идут несколько Patch Merging и Swin Transformer Block слоёв.
  Patch Merging занимается тем, что конкатенирует фичи
  соседних (в окне 2х2) токенов и понижает размерность,
  получая более высокоуровневое представление.
  Таким образом, после каждого Stage-а образуются <карты> признаков,
  содержащие информацию на разных пространственных масштабах,
  что как раз и позволяет получить иерархическое представление изображения,
  полезное для дальнейшей сегментации/Object Detection-а/etc:
  
  .......
  
  Благодаря этому Swin Transfomer может служить универсальным backbone-ом
  для различных задач CV.
  
  Swin Transformer Block - ключевая изюминка всей архитектуры:
  
  ......
  
  Как видно из схемы, два последовательных блока представляют собой
  два классических трансформерных блока с MLP, LayerNorm-ами
  и Pre-Activation Residual-ами,
  однако Attention заменён на нечто более хитрое,
  к разбору чего мы непременно переходим.
  
  (Shifted) Window Multi-Head Attention
  
  Как было упомянуто, проблемой Multi-Head Attention-а
  является его квадратичная сложность,
  больно стреляющая в ногу при применении на картинках высокого разрешения.
  На ум приходит довольно простое решение,
  представленное еще в статье про Longformer
  - давайте для каждого токена считать Attention
  не со всеми другими токенами,
  а только с находящимися в некотором окне фиксированного размера
  (Window Mutli-Head Attention).
  Если размерность токенов - C, а размер окна - MxM,
  то сложности для (Window) Multi-Head Self Attention-ов получаются следующие:
  
  \Omega(MSA) = 4hwC^2 + 2(hw)^2C,\Omega(W\text{-}MSA) = 4hwC^2 + 2M^2hwC
  
  То есть Attention теперь работает за линейное по hw время!
  Однако такой подход уменьшает общую репрезентативную способность сети,
  так как токены из различных окон никак не будут взаимодействовать.
  Чтобы исправить ситуацию, авторы поступили любопытным образом.
  После каждого блока с Window Multi-Head Attention-ом
  они поставили аналогичный слой,
  со смещёнными по диагонали окнами Attention-а:
  
  ......
  
  Это вернуло взаимодействие между токенами,
  оставив при этом линейную вычислительную сложность.
  //// Интересное решение. Как бы его сформулировать так, чтобы понять и не забыть.
  //// Может быть так, делим на меньшие независимые части,
  //// а затем эти независимые части связываем за счет частичного наложения.
  //// Вроде, понятная формулировка схожая с тем,
  //// что используется в сверточных сетях, но реализуемая несколько иначе.
  
  Как проиллюстрировано выше,
  сдвиг окон Attention-а увеличивает их количество.
  Это значит, что реализация этого слоя
  с наивным паддингом исходной <карты> признаков нулями
  обяжет считать больше Attention-ов (9 вместо 4 в примере),
  чем мы посчитали бы без сдвига.
  Чтобы не производить лишних вычислений,
  авторы предложили перед подсчётом циклически сдвигать само изображение
  и вычислять уже маскированный Attention,
  чтобы исключить взаимодействие не соседних токенов.
  Такой подход вычислительно эффективнее наивного,
  так как количество считаемых Attention-ов не увеличивается:
  //// Вот этого приема не понял.
  
  .......
  
  Также в Swin-е авторы использовали несколько другие positional embedding-и.
  Их заменили на обучаемую матрицу В,
  называемую relative position bias,
  которая прибавляется к произведению query и key под софтмаксом:
  
  \text{Attention}(Q, K, V) = \text{Softmax}\left(\frac{QK^{\mathsf{T}}}{\sqrt{d_k}}+ B\right)V.
  
  Как оказалось, такой поход приводит к лучшему качеству.
  //// А вот это стоит запомнить.
  //// И, наверно, что-то подобное, скоро появится и в языковых моделях.
  //// Ведь "позиционное кодирование" в тексте не обязательно должно быть
  //// "математически точным",
  //// а, наверняка, лучше если бы это было "смысловое позиционирование".
  
  Эксперименты и результаты
  
  Всего авторы предложили 4 модели разных размеров:
  
  Для честного сравнения параметры были подобраны так,
  чтобы по размерам и количеству вычислений Swin-B
  примерно соответствовал ViT-B/DeiT-B,
  а Swin-T и Swin-S ResNet-50 и ResNet-101 соответственно.
  
  ImageNet-1k классификация
  
  В данном бенчмарке были проверены два сетапа:
  обучение на ImageNet-1k и предобучение на ImageNet-22K
  с дообучением на ImageNet-1K.
  Модели сравнивались по top-1 accuracy.
  
  В первой постановке Swin-ы более чем на 1.5%
  обошли другие Visual Transformer-ы, в том числе ViT-ы,
  отстающие от первых на целых 4%.
  Сотовые же EfficienetNet-ы и RegNet-ы оказались соперником посерьёзнее
  - статистически значимо тут можно говорить
  разве что об улучшении баланса между точностью и быстродействием.
  Во второй постановке предобучение на ImageNet-22K дало ~2%-ый прирост точности,
  а Swin-L достиг 87.3% top-1 accuracy.
  Это ещё раз подтверждает важность предобучения
  в особенности для трансформерных архитектур.
  
  COCO детектирование объектов
  
  Для оценки Swin-а в качестве backbone-а для детекции
  авторы использовали его вместе с такими фреймворками детекции
  как Cascade Mask R-CNN, ATSS, RepPointsV2 и Sparse R-CNN.
  В качестве backbone-ов для сравнения были взяты ResNe(X)t, DeiT
  и несколько сотовых свёрточных аритектур.
  
  Для всех фреймворков Swin backbone дал уверенные +3.5-4.2% AP
  относительно классического ResNet50.
  Относительно ResNe(X)t-а Swin также показал рост в ~3% AP
  сразу для нескольких его версий Swin-T, Swin-S и Swin-B.
  DeiT проиграл Swin-у чуть меньше - около 2% AP,
  но был сильно медленнее из-за честного Multi-Head Attention-а по всей картинке.
  Ну и относительно большого набора сотовых детекторов Swin-L с HTC
  показал улучшение в ~2.6 AP.
  
  ADE20K семантическая сегментация
  
  Для сегментации с помощью Swin-а был выбран фреймворк UperNet,
  он сравнивался с несколькими популярными сегментаторами,
  а так же с моделью на основе DeiT.
  Swin-S обошел Deit-S на целых 5.3 mIoU, а ResNet-101
  и ResNeSt на 4.4 и 2.4 mIou соответственно.
  При этом Swin-L, предобученный на ImageNet-22k,
  выбил 53.5 mIoU, обойдя SETR на 3.2 mIoU.
  
  Итоги
  
  В результате имеем следующее:
  авторам удалось несколько переформулировать трансформерную архитектуру
  под задачи CV,
  сделав её вычислительно более оптимальной
  за счёт использования локального Attention-а.
  При этом Shifted Window Multi-Head Attention
  оставил репрезентативную способность сети на уровне,
  достаточном, чтобы соревноваться с текущими сотовыми моделями.
  Благодаря этому стало возможным построить архитеткуру,
  позволяющую извлекать из изображений фичи
  на разных пространственных масштабах,
  что позволило успешно использовать Swin как backbone
  в задачах сегментации и детекции,
  где до этого трансформеры были на более низких позициях.
  This is success!
  
  Полезные ссылки
  
  
   https://arxiv.org/abs/2103.14030
  
  
   https://arxiv.org/abs/2010.11929
  
   Реализация Swin Transformer на PyTorch
   https://github.com/microsoft/Swin-Transformer
  
   NLP Course | For You - качественный ресурс по NLP,
   где в том числе подробно разбирается механизм Attention
   https://lena-voita.github.io/nlp_course.html#main_page_content
  
  .......
  
  //// Конец цитирования.
  
  24.02.2024 14:56
  
  Основная идея, насколько я понял, позволившая этой архитектуре
  успешно конкурировать с другими решениями,
  это своеобразное решение в виде комбинации "иерархичного" и "сетевого" подходов,
  т.е. как бы разбиения на более простые/частные в вычислительном отношении задачи,
  а затем "принудительное скрещивание" частных решений.
  Как в части классической "мультиголовости",
  так и в части применения соединительных слоев "со смещением".
  
  Это не совсем иерархический подход, и не совсем сетевой,
  даже подходящего термина подобрать не получается.
  И представляется, что в таком ракурсе стоит еще раз проработать тему
  иерархического подхода применительно к нейросетевым архитектурам,
  задавшись целью понять, а где имеет смысл использовать такой "гибридный подход".
  Попытаться нащупать принципы декомпозиции задач,
  и, наоборот, какого осмысленной увязки частных решений.
  
  Отдельного внимания заслуживает интересная идея
  относительно "обучаемого" позиционного кодирования,
  которая, наверняка получит свое развитие.
  Впрочем, как и, скорее всего, большинство "точных математических операций",
  особенно вычислительно затратных, в обозримом будущем будут,
  так или иначе, заменяться на "обучаемые нейросетевые блоки".
  Но это, наверно, будет следующим этапом в развитии нейросетвых архитектурах.
  
  И в этом отношении интересен вопрос, что именно представляют
  собой различные блоки в архитектуре нейросетей с позиций inductive bias.
  
  
  ========
  
  26.02.2024 21:57
  
  Сверточная сеть "для чайников".
  В оглавление.
  
  Сверточная нейронная сеть (СНС/CNN) архитектура достаточно старая
  и "всем хорошо известная". И к тому же,
  если хотя бы немного с ней разобраться,
  она, наверно, наиболее "интуитивно" понятна
  из всех действительно работоспособных нейронок.
  Поэтому, как Вы могли уже заметить, упоминание этой архитектуры,
  отсылки к ее компонентам встречаются в материалах по нейронным сетям,
  практически через раз.
  
  И имеет смысл, если эта архитектура полностью отсутствует в "вашем багаже",
  хотя бы вскользь с ней познакомиться.
  Можно это сделать с материала по-проще, см.:
  "Сверточные сети простыми словами."
  А можно с более углубленного материала,
  правда, в нем частично нестандартная терминология:
  
  "Сверточная нейронная сеть, часть 1:
  структура, топология, функции активации и обучающее множество"
  Автор: HybridTech (Иван Голиков)
  https://habr.com/ru/articles/348000/
  31 янв 2018 в 16:47
  
  //// Начало цитирования.
  
  .......
  
  Введение
  
  Наилучшие результаты в области распознавания лиц показала
  Convolutional Neural Network или сверточная нейронная сеть (далее - СНС),
  которая является логическим развитием идей таких архитектур НС
  как когнитрона и неокогнитрона.
  Успех обусловлен возможностью учета двумерной топологии изображения,
  в отличие от многослойного персептрона.
  
  Сверточные нейронные сети обеспечивают частичную устойчивость
  к изменениям масштаба, смещениям, поворотам, смене ракурса и прочим искажениям.
  Сверточные нейронные сети объединяют три архитектурных идеи,
  для обеспечения инвариантности к изменению масштаба,
  повороту сдвигу и пространственным искажениям:
  
   локальные рецепторные поля
   (обеспечивают локальную двумерную связность нейронов);
  
   общие синаптические коэффициенты
   (обеспечивают детектирование некоторых черт в любом месте изображения
   и уменьшают общее число весовых коэффициентов);
  
   иерархическая организация с пространственными подвыборками.
  
  На данный момент сверточная нейронная сеть и ее модификации
  считаются лучшими по точности и скорости алгоритмами нахождения объектов на сцене.
  //// Речь идет о 2018 годе. Т.е. уже "очень очень давно".
  Начиная с 2012 года, нейросети занимают первые места
  на известном международном конкурсе по распознаванию образов ImageNet.
  
  ......
  
  Структура сверточной нейронной сети
  
  СНС состоит из разных видов слоев:
  сверточные (convolutional) слои,
  субдискретизирующие (subsampling, подвыборка) слои
  и слои <обычной> нейронной сети - персептрона,
  в соответствии с рисунком 1.
  
  Рисунок 1 - топология сверточной нейронной сети
  
  Первые два типа слоев (convolutional, subsampling), чередуясь между собой,
  формируют входной вектор признаков для многослойного персептрона.
  
  Свое название сверточная сеть получила по названию операции - свертка,
  суть которой будет описана дальше.
  
  Сверточные сети являются удачной серединой
  между биологически правдоподобными сетями и обычным многослойным персептроном.
  На сегодняшний день лучшие результаты в распознавании изображений
  получают с их помощью.
  В среднем точность распознавания таких сетей превосходит обычные ИНС на 10-15%.
  СНС - это ключевая технология Deep Learning.
  
  Основной причиной успеха СНС стало концепция общих весов.
  //// Стоит обдумать этот момент. Может быть, это "ключик"
  //// к чему-то не совсем тривиальному.
  //// Может быть, стоит рассмотреть концепцию "группового обучения параметров"
  Несмотря на большой размер,
  эти сети имеют небольшое количество настраиваемых параметров
  по сравнению с их предком - неокогнитроном.
  Имеются варианты СНС (Tiled Convolutional Neural Network),
  похожие на неокогнитрон, в таких сетях происходит,
  частичный отказ от связанных весов,
  но алгоритм обучения остается тем же
  и основывается на обратном распространении ошибки.
  СНС могут быстро работать на последовательной машине
  и быстро обучаться за счет чистого распараллеливания процесса свертки
  по каждой карте,
  а также обратной свертки при распространении ошибки по сети.
  
  На рисунке ниже продемонстрирована визуализация свертки и подвыборки:
  
  ......
  
  Топология сверточной нейросети
  
  Определение топологии сети ориентируется на решаемую задачу,
  данные из научных статей и собственный экспериментальный опыт.
  
  Можно выделить следующие этапы влияющие на выбор топологии:
  
   определить решаемую задачу нейросетью
   (классификация, прогнозирование, модификация);
  
   определить ограничения в решаемой задаче
   (скорость, точность ответа);
  
   определить входные
   (тип: изображение, звук, размер: 100x100, 30x30,
   формат: RGB, в градациях серого)
   и выходных данные (количество классов).
  
  ......
  
  Рисунок 2 - Топология сверточной нейросети
  
  Входной слой
  
  Входные данные представляют из себя цветные изображения типа JPEG,
  размера 48х48 пикселей.
  Если размер будет слишком велик, то вычислительная сложность повысится,
  соответственно ограничения на скорость ответа будут нарушены,
  определение размера в данной задаче решается методом подбора.
  Если выбрать размер слишком маленький,
  то сеть не сможет выявить ключевые признаки лиц.
  Каждое изображение разбивается на 3 канала: красный, синий, зеленый.
  Таким образом получается 3 изображения размера 48х48 пикселей.
  
  Входной слой учитывает двумерную топологию изображений
  и состоит из нескольких карт (матриц),
  карта может быть одна, в том случае,
  если изображение представлено в оттенках серого, иначе их 3,
  где каждая карта соответствует изображению с конкретным каналом
  (красным, синим и зеленым).
  
  Входные данные каждого конкретного значения пикселя нормализуются
  в диапазон от 0 до 1, по формуле:
  
  ......
  
  Сверточный слой
  
  Сверточный слой представляет из себя набор карт
  (другое название - карты признаков, в обиходе это обычные матрицы),
  у каждой карты есть синаптическое ядро
  (в разных источниках его называют по-разному: сканирующее ядро или фильтр).
  
  Количество карт определяется требованиями к задаче,
  если взять большое количество карт,
  то повысится качество распознавания, но увеличится вычислительная сложность.
  Исходя из анализа научных статей, в большинстве случаев предлагается брать
  соотношение один к двум,
  то есть каждая карта предыдущего слоя
  (например, у первого сверточного слоя, предыдущим является входной)
  связана с двумя картами сверточного слоя,
  в соответствии с рисунком 3.
  Количество карт - 6.
  
  Рисунок 3 - Организация связей между картами сверточного слоя и предыдущего
  
  Размер у всех карт сверточного слоя - одинаковы и вычисляются по формуле 2:
  
  .....
  
  Ядро представляет из себя фильтр или окно,
  которое скользит по всей области предыдущей карты
  и находит определенные признаки объектов.
  Например, если сеть обучали на множестве лиц,
  то одно из ядер могло бы в процессе обучения выдавать наибольший сигнал
  в области глаза, рта, брови или носа,
  другое ядро могло бы выявлять другие признаки.
  Размер ядра обычно берут в пределах от 3х3 до 7х7.
  Если размер ядра маленький, то оно не сможет выделить какие-либо признаки,
  если слишком большое, то увеличивается количество связей между нейронами.
  Также размер ядра выбирается таким,
  чтобы размер карт сверточного слоя был четным,
  это позволяет не терять информацию при уменьшении размерности
  в подвыборочном слое, описанном ниже.
  
  Ядро представляет собой систему разделяемых весов или синапсов,
  это одна из главных особенностей сверточной нейросети.
  В обычной многослойной сети очень много связей между нейронами,
  то есть синапсов, что весьма замедляет процесс детектирования.
  В сверточной сети - наоборот, общие веса позволяет сократить число связей
  и позволить находить один и тот же признак по всей области изображения.
  
  ......
  
  Изначально значения каждой карты сверточного слоя равны 0.
  Значения весов ядер задаются случайным образом в области от -0.5 до 0.5.
  Ядро скользит по предыдущей карте и производит операцию свертка,
  которая часто используется для обработки изображений, формула:
  
  .......
  
  Неформально эту операцию можно описать следующим образом
  - окном размера ядра g проходим с заданным шагом (обычно 1) все изображение f,
  на каждом шаге поэлементно умножаем содержимое окна на ядро g,
  результат суммируется и записывается в матрицу результата, как на рисунке 4.
  
  .......
  
  Рисунок 4 - Операция свертки и получение значений сверточной карты (valid)
  
  Рис. Операция свертки и получение значений сверточной карты.
  Ядро смещено, новая карта получается того же размера, что и предыдущая (same)
  
  При этом в зависимости от метода обработки краев исходной матрицы
  результат может быть меньше исходного изображения (valid),
  такого же размера (same) или большего размера (full),
  в соответствии с рисунком 5.
  
  Рисунок 5 - Три вида свертки исходной матрицы
  
  В упрощенном виде этот слой можно описать формулой:
  
  .......
  
  При этом за счет краевых эффектов размер исходных матриц уменьшается, формула:
  
  .......
  
  Подвыборочный слой
  
  Подвыборочный слой также, как и сверточный имеет карты,
  но их количество совпадает с предыдущим (сверточным) слоем, их 6.
  Цель слоя - уменьшение размерности карт предыдущего слоя.
  Если на предыдущей операции свертки уже были выявлены некоторые признаки,
  то для дальнейшей обработки настолько подробное изображение уже не нужно,
  и оно уплотняется до менее подробного.
  К тому же фильтрация уже ненужных деталей помогает не переобучаться.
  
  В процессе сканирования ядром подвыборочного слоя (фильтром)
  карты предыдущего слоя, сканирующее ядро не пересекается
  в отличие от сверточного слоя.
  Обычно, каждая карта имеет ядро размером 2x2,
  что позволяет уменьшить предыдущие карты сверточного слоя в 2 раза.
  Вся карта признаков разделяется на ячейки 2х2 элемента,
  из которых выбираются максимальные по значению.
  
  Обычно в подвыборочном слое применяется функция активации RelU.
  Операция подвыборки (или MaxPooling - выбор максимального)
  в соответствии с рисунком 6.
  
  Рисунок 6 - Формирование новой карты подвыборочного слоя
  на основе предыдущей карты сверточного слоя.
  Операция подвыборки (Max Pooling)
  
  Формально слой может быть описан формулой:
  
  ......
  
  Полносвязный слой
  
  Последний из типов слоев это слой обычного многослойного персептрона.
  Цель слоя - классификация,
  моделирует сложную нелинейную функцию,
  оптимизируя которую, улучшается качество распознавания.
  
  ........
  
  Нейроны каждой карты предыдущего подвыборочного слоя связаны
  с одним нейроном скрытого слоя.
  Таким образом число нейронов скрытого слоя равно числу карт подвыборочного слоя,
  но связи могут быть не обязательно такими,
  например, только часть нейронов какой-либо из карт подвыборочного слоя
  быть связана с первым нейроном скрытого слоя,
  а оставшаяся часть со вторым,
  либо все нейроны первой карты связаны с нейронами 1 и 2 скрытого слоя.
  Вычисление значений нейрона можно описать формулой:
  
  .......
  
  Выходной слой
  
  Выходной слой связан со всеми нейронами предыдущего слоя.
  Количество нейронов соответствует количеству распознаваемых классов,
  то есть 2 - лицо и не лицо.
  Но для уменьшения количества связей и вычислений для бинарного случая
  можно использовать один нейрон
  и при использовании в качестве функции активации гиперболический тангенс,
  выход нейрона со значением -1 означает принадлежность к классу "не лица",
  напротив выход нейрона со значением 1 - означает принадлежность к классу лиц.
  
  Выбор функции активации
  
  Одним из этапов разработки нейронной сети является
  выбор функции активации нейронов.
  Вид функции активации во многом определяет
  функциональные возможности нейронной сети
  и метод обучения этой сети.
  Классический алгоритм обратного распространения ошибки
  хорошо работает на двухслойных и трехслойных нейронных сетях,
  но при дальнейшем увеличении глубины начинает испытывать проблемы.
  Одна из причин - так называемое затухание градиентов.
  По мере распространения ошибки от выходного слоя к входному
  на каждом слое происходит домножение текущего результата
  на производную функции активации.
  Производная у традиционной сигмоидной функции активации
  меньше единицы на всей области определения,
  поэтому после нескольких слоев ошибка станет близкой к нулю.
  Если же, наоборот, функция активации имеет неограниченную производную
  (как, например, гиперболический тангенс),
  то может произойти взрывное увеличение ошибки
  по мере распространения,
  что приведет к неустойчивости процедуры обучения.
  
  В данной работе в качестве функции активации в скрытых и выходном слоях
  применяется гиперболический тангенс,
  в сверточных слоях применяется ReLU.
  Рассмотрим наиболее распространенные функций активации,
  применяемые в нейронных сетях.
  
  ......
  
  Функция активации сигмоиды
  
  Эта функция относится к классу непрерывных функций
  и принимает на входе произвольное вещественное число,
  а на выходе дает вещественное число в интервале от 0 до 1.
  В частности, большие (по модулю) отрицательные числа превращаются в ноль,
  а большие положительные - в единицу.
  Исторически сигмоида находила широкое применение,
  поскольку ее выход хорошо интерпретируется, как уровень активации нейрона:
  от отсутствия активации (0) до полностью насыщенной активации (1).
  Сигмоида (sigmoid) выражается формулой:
  
  ......
  
  График сигмоидальной функции в соответствии с рисунком ниже:
  
  ......
  
  Крайне нежелательное свойство сигмоиды заключается в том,
  что при насыщении функции с той или иной стороны (0 или 1),
  градиент на этих участках становится близок к нулю.
  
  Напомним, что в процессе обратного распространения ошибки
  данный (локальный) градиент умножается на общий градиент.
  Следовательно, если локальный градиент очень мал,
  он фактически обнуляет общий градиент.
  В результате, сигнал почти не будет проходить через нейрон
  к его весам и рекурсивно к его данным.
  Кроме того, следует быть очень осторожным
  при инициализации весов сигмоидных нейронов,
  чтобы предотвратить насыщение.
  Например, если исходные веса имеют слишком большие значения,
  большинство нейронов перейдет в состояние насыщения,
  в результате чего сеть будет плохо обучаться.
  
  Сигмоидальная функция является:
  
   непрерывной;
   монотонно возрастающей;
   дифференцируемой.
  
  Функция активации гиперболический тангенс
  
  В данной работе в качестве активационной функции для скрытых и выходного слоев
  используется гиперболический тангенс.
  Это обусловлено следующими причинами:
  
   симметричные активационные функции,
   типа гиперболического тангенса обеспечивают более быструю сходимость,
   чем стандартная логистическая функция;
  
   функция имеет непрерывную первую производную;
  
   функция имеет простую производную,
   которая может быть вычислена через ее значение,
   что дает экономию вычислений.
  
  График функции гиперболического тангенса показан на рисунке:
  
  .....
  
  Функция активации ReLU
  
  Известно, что нейронные сети способны приблизить сколь угодно сложную функцию,
  если в них достаточно слоев и функция активации является нелинейной.
  Функции активации вроде сигмоидной или тангенциальной являются нелинейными,
  но приводят к проблемам с затуханием или увеличением градиентов.
  Однако можно использовать и гораздо более простой вариант
  - выпрямленную линейную функцию активации (rectified linear unit, ReLU),
  которая выражается формулой:
  
  .....
  
  График функции ReLU в соответствии с рисунком ниже:
  
  ......
  
  Преимущества использования ReLU:
  
   ее производная равна либо единице, либо нулю,
   и поэтому не может произойти разрастания или затухания градиентов,
   т.к. умножив единицу на дельту ошибки мы получим дельту ошибки,
   если же мы бы использовали другую функцию,
   например, гиперболический тангенс, то дельта ошибки
   могла, либо уменьшиться, либо возрасти, либо остаться такой же,
   то есть, производная гиперболического тангенса возвращает число
   с разным знаком и величиной, что можно сильно повлиять
   на затухание или разрастание градиента.
   Более того, использование данной функции приводит к прореживанию весов;
  
   вычисление сигмоиды и гиперболического тангенса требует выполнения
   ресурсоемких операций, таких как возведение в степень,
   в то время как ReLU может быть реализован с помощью
   простого порогового преобразования матрицы активаций в нуле;
  
   отсекает ненужные детали в канале при отрицательном выходе.
  
  Из недостатков можно отметить, что ReLU не всегда достаточно надежна
  и в процессе обучения может выходить из строя (<умирать>).
  Например, большой градиент, проходящий через ReLU,
  может привести к такому обновлению весов,
  что данный нейрон никогда больше не активируется.
  Если это произойдет, то, начиная с данного момента,
  градиент, проходящий через этот нейрон, всегда будет равен нулю.
  Соответственно, данный нейрон будет необратимо выведен из строя.
  Например, при слишком большой скорости обучения (learning rate),
  может оказаться, что до 40% ReLU <мертвы>
  (то есть, никогда не активируются).
  Эта проблема решается посредством выбора надлежащей скорости обучения.
  
  Обучающие выборки использующиеся в экспериментах
  
  Обучающая выборка состоит из положительных и отрицательных примеров.
  В данном случае из лиц и "не лиц".
  Соотношение положительных к отрицательным примерам 4 к 1,
  8000 положительных и 2000 отрицательных.
  
  В качестве положительной обучающей выборки использовалась база данных LFW3D [7].
  Она содержит цветные изображения фронтальных лиц типа JPEG,
  размером 90x90 пикселей, в количестве 13000.
  
  ......
  
  Пример лиц из базы данных показан в соответствии с рисунком ниже:
  
  ......
  
  В качестве отрицательных обучающих примеров использовалась база данных SUN397 [8],
  она содержит огромное количество всевозможных сцен,
  которые разбиты по категориям.
  Всего 130000 изображений, 908 сцен, 313000 объектов сцены.
  
  ......
  
  Результаты
  
  Прямое распространение сигнала от входного изображения размером 90х90 пикселей
  занимает 20 мс (на ПК), 3000 мс в мобильном приложении.
  При детектировании лица в видеопотоке в разрешении 640х480 пикселей,
  возможно детектировать 50 не перекрытых областей размером 90х90 пикселей.
  Полученные результаты с выбранной топологией сети хуже
  по сравнению с алгоритмом Виолы-Джонса.
  
  Выводы
  
  Сверточные нейронные сети обеспечивают частичную устойчивость
  к изменениям масштаба, смещениям, поворотам, смене ракурса и прочим искажениям.
  
  Ядро - представляет из себя фильтр, который скользит по всему изображению
  и находит признаки лица в любом его месте (инвариантность к смещениям).
  
  Подвыборочный слой дает:
  
   увеличение скорости вычислений (минимум в 2 раза),
   за счет уменьшение размерности карт предыдущего слоя;
  
   фильтрация уже ненужных деталей;
  
   поиск признаков более высокого уровня (для следующего сверточного слоя).
  
  Последние слои - слои обычного многослойного персептрона.
  Два полносвязных и один выходной.
  Этот слой отвечает за классификацию,
  с математической точки зрения моделирует сложную нелинейную функцию,
  оптимизируя которую, улучшается качество распознавания.
  Число нейронов в слое 6 по числу карт признаков подвыборочного слоя.
  
  Возможные улучшения
  
   рассмотреть нейросети Fast-RCNN, YOLO;
   распараллеливание процесса обучения на графические процессоры;
   использование Android NDK (C++) для улучшения производительности
  
  Обучение сверточной нейронной сети описано во второй части.
  https://habrahabr.ru/post/348028/
  
  .......
  
  Ссылки
  
  - Что такое свёрточная нейронная сеть
  https://habr.com/post/309508/
  
  - Обучающие множества:
  Effective Face Frontalization in Unconstrained Images // Effective Face. SUN Database // MIT Computer Science and Artificial Intelligence Laboratory
  
  - Информация по сверточным нейронным сетям
  http://mechanoid.kiev.ua/
  
  - О функциях обучения нейросети
  https://www.monographies.ru/ru/book/section?id=2465
  
  - Виды нейронных сетей (подобная схема классификации нейронных сетей)
  https://ai-science.ru/vidy-nejronnyx-setej/
  
  - Нейронные сети для начинающих: раз и два.
  https://habrahabr.ru/post/312450/
  https://habrahabr.ru/post/313216/
  
  ......
  
  //// Конец цитирования.
  
  Вроде все с этой архитектурой более-менее понятно,
  но это только в теории, а на практике почему-то вылезают
  какие-то "неясные детали".
  Вот что пишут в комментариях к такого рода описаниям архитектур:
  
  \\\ https://habr.com/ru/articles/309508/comments/
  
  \\\ DistortNeo
  \\\ 9 сен 2016 в 01:52
  
  \\\ \\\ почему ядро свертки 3*3, 5*5 или 11*11
  
  \\\ А это просто объяснить через аналогию с фонариком.
  \\\ Вырезаете из картинки кусочек определённого размера
  \\\ и пытаетесь понять,
  \\\ можно ли только по этому кусочку сделать обработку или классификацию.
  \\\ Если нет (кусочек слишком мал) - берите размер фильтра побольше.
  \\\ Если же вам кажется, что размер кусочка можно уменьшить,
  \\\ не потеряв в точности классификации - смело уменьшайте.
  \\\ Чем меньше лишних данных принимает алгоритм машинного обучения,
  \\\ тем легче он обучается и более точные результаты выдаёт.
  
  \\\ \\\ нужно или нет ресайзить исходные картинки,
  \\\ \\\ и если надо в какое разрешение и aspect-ratio
  
  \\\ Зависит от конкретной задачи.
  \\\ В общем случае да, нужно подавать на вход нормализованные данные.
  \\\ Вместо обучения нейросети на нахождение объектов разных размеров
  \\\ (отличие в разы)
  \\\ эффективнее обучать на нахождение объектов фиксированного размера
  \\\ и масштабировать саму картинку.
  //// Т.е. масштабировать нейронка все-таки умеет плохо?
  //// Или тут особенность обучения.
  
  \\\ \\\ как выбрать топологию сети, сколько слоёв
  
  \\\ Если честно, то:
  \\\ 1. Методом научного тыка:
  \\\ попробовать разные варианты и выбрать наиболее удачный.
  
  \\\ 2. Поизучать научную литературу по данной тематике
  \\\ и выбрать готовую успешную топологию из статьи,
  \\\ авторы которой потратили кучу времени
  \\\ и добились успешных результатов, применяя один из этих двух методов.
  
  И как показывает анализ комментариев к материалам по архитектуре СНС
  есть два варианта:
  Либо пытаться реализовать эту структуру с нуля самостоятельно,
  т.е. на основе чисто теоретических знаний.
  Либо "честно содрать" какой-то работающий вариант,
  с использованием стандартных библиотек,
  и попытаться чуть-чуть доработать для своей задачи.
  
  По срокам, то второй вариант, при удачном стечении обстоятельств,
  может занять где-то неделю.
  А первый, при неудачном раскладе, и за год не осилить.
  
  Так что даже хорошее понимание одной конкретной архитектуры
  не дает гарантию того, что для новой задачи/архитектуре
  все сложится более-менее удачно.
  "Наука имеет много гитик".
  
  И в итоге опять остаются два варианта,
  либо махнуть руко на все это "безобразие",
  и перейти к "честному подражательству".
  либо копать дальше тему структур нейросетей,
  в надежде, что когда-то придет "просветление".
  
  \\\ JetHabr
  \\\ https://habr.com/ru/companies/jetinfosystems/articles/791974/
  \\\ 7 фев 2024 в 11:55
  
  \\\ Пришёл ученик к мастеру. И спросил:
  \\\ - Что вы делали до просветления? Как жили?
  \\\ Мастер ответил:
  \\\ - Колол дрова, носил воду, готовил еду.
  \\\ - А что вы делаете после просветления? - спросил ученик.
  \\\ - Колю дрова, ношу воду, готовлю еду, - ответил мастер.
  \\\ - А что изменилось?
  \\\ - Да всё!
  
  
  ========
  
  16.03.2024 17:51
  
  И еще немного сверточных сетей.
  В оглавление.
  
  Чтобы лучше понимать и структуру сверточных нейронных сетей (СНС/CNN)
  и то влияние которые они оказали на архитектуры других нейронок,
  полезно взглянуть, хотя бы вкрадце, на их историю развития.
  Неплохой обзор на эту тему появился и исчез на Хабре,
  но что-то в архивах осталось:
  
  "Заметки на полях из истории развития свёрточных нейросетей".
  Автор: anikengur (Аня Кангур)
  https://habr.com/ru/articles/800077/
  13 мар 2024 в 19:35
  
  Так как сейчас материал не доступен по прямой ссылке,
  то приведу его максимально подробно.
  Есть в нем и хорошие формулировки, и интересные наблюдения.
  
  //// Начало цитирования.
  
  Эти заметки отражают лишь небольшую часть истории развития
  сверточных нейронных сетей,
  и каждый из этих моментов играл важную роль
  в улучшении производительности и эффективности нейронных сетей
  в области компьютерного зрения.
  
  Ключевые элементы:
  
  Convolution Layer (сверточный слой)
  https://habr.com/ru/articles/795223/
  - наложение фильтров (ядер) на разные кусочки изображения (окна).
  На выходе получается карта активаций,
  которая говорит о том, насколько фильтр оказался похож
  на кусочек изображения, к которому был приложен.
  Находится скалярным произведением.
  
  Pooling (слой подвыборки)
  объединяет информацию из соседних нейронов.
  MaxPool - выбор максимального значения окна,
  AvgPool - вычисление среднего из окна.
  Обычно применяется после сверточного слоя.
  
  Activation function (функция активации)
  привносит нелинейность в нейронную сеть.
  Известные функции: Sigmoid, Tanh, ReLU, ELU и другие.
  Применяется поэлементно.
  
  Flatten преобразует многомерный массив в вектор построчно.
  
  Fully Connected Layer (полносвязный слой)
  - самый обычный нейронный слой:
  на вход подаются все значения из предыдущего слоя
  и скалярно перемножаются на веса.
  
  SoftMax преобразует вектор чисел в вектор вероятностей.
  В выходном векторе сумма всех элементов равна 1.
  
  Архитектуры:
  
  LeNet
  
  AlexNet
  
  VGG - Visual Geometry Group
  
  GoogLeNet
  
  ResNet
  
  1. LeNet (1998)
  
  Архитектура LeNet была предложена Яном Лекуном
  для решения задачи распознавания рукописных цифр от 0 до 9 из датасета MNIST.
  Датасет состоит из 60k обучающих и 1k тестовых примеров размером 28 x 28 (одноканальные).
  
  LeNet пропускает изображения через два набора свёрток,
  затем распрямляет вектор,
  и применяет полносвязные слои.
  На выходе получается вектор из 10 цифр - вероятностей классов.
  //// Возможно с этого решения и пошла вся последующая "традиция"
  //// трактовать результаты выходного слоя как "распределения вероятностеей".
  //// Причем, именно для этой конкретной архитектуры это выглядело
  //// вполне логично и обоснованно.
  В качестве функции активации используется сигмоида или гиперболический тангенс,
  но в современных реализациях предпочтение отдаётся ReLU и его вариациям.
  
  Архитектура LeNet имела огромное значение для развития области
  компьютерного зрения и глубокого обучения,
  показав, что сверточные нейронные сети могут эффективно применяться
  для задач распознавания изображений.
  
  2. AlexNet (2012)
  
  Задача MNIST - несколько игрушечная.
  Современные нейронные сети соревнуются в решении ImageNet 1000:
  задачи о разбиении 15 миллионов изображений на тысячу классов
  (автомобили, породы собак, какие-то канцелярские принадлежности и т.д.).
  Причем, хороших изображений (которые действительно относятся
  к этой тысяче классов) около 1.5 миллиона.
  Первая нейронная сеть, которая научилась решать эту задачу - AlexNet.
  
  На вход принимается трехканальные изображение размером 224 x 224.
  AlexNet содержит восемь слоев:
  первые пять - сверточные
  (за некоторыми из них следуют MaxPooling слои),
  а последние три - полносвязные.
  
  Из "трюков":
  MaxPooling используется после каскада сверток (нескольких сверток подряд),
  а проблема затухающего градиента решается с помощью функции активации ReLU.
  
  3. VGG - Visual Geometry Group (2014)
  
  Большое количество функций активаций все равно приведет к затуханию градиента.
  При этом, VGG, в своем финальном варианте содержит аж 19 слоев
  и показало хорошие результаты благодаря своему особому способу обучения:
  
  Сначала обучаются лишь 11 слоёв (8 сверток и 3 полносвязных слоя).
  
  Затем, к сети добавляются еще два сверточных слоя на глубоких слоях
  (после первой и второй свертки).
  В результате, добавленные слои дообучаются чуть быстрее,
  чем если бы сразу делалась такая сеть.
  //// Интересно было бы найти исследование по такому последовательному обучению
  //// с анализом того, что именно при этом происходит в обучаемых слоях,
  //// как новых, так и предобученных.
  
  После, добавляются ещё три слоя (свертки 1 x 1 после 6, 8 и 10 слоев)
  и дообучается сеть. Так она адаптируется под дополнительные элементы.
  
  Затем выбрасываются свёртки 1 x 1
  и добавляются на их место свёртки размером 3 x 3, и дообучаются.
  //// Тоже интересный момент с этой заменой сверток разной размерности.
  //// Как это проявляется в процессе обучения?
  
  После, добавляются еще три свёрточных слоя после 7, 10 и 13 слоев
  и дообучаются.
  
  Построенный таким образом процесс обучения приводит
  к достаточно сложной, но хорошо обученной нейронной сети,
  в которой и первые слои и последние слои обучены достаточно хорошо.
  //// А что, промежуточные слои обучены "недостаточно хорошо"?
  //// Что подразумевается под этой фразой?
  
  VGG - достаточно мощная сеть с большим количеством параметров.
  Она может использоваться в качестве backbone для более сложных архитектур.
  
  Backbone значит что можно убрать последние полносвязные слои из VGG,
  <заморозив> все предыдущие сверточные
  (не обучать, оставить параметры как есть),
  добавить свои новые сверточные и полносвязные слои
  и обучить новую сеть под свою задачу.
  
  4. GoogLeNet
  
  Более сложная архитектура,
  решившая задачу ImageNet 1000 с использованием трюка
  под названием Inception Block:
  одновременное применение нескольких разных сверток или pooling-ов,
  с последующей поканальной конкатенацией результатов
  (выходные изображения должны быть одинакового размера).
  
  Рис. Inception Block
  
  BottleNeck (бутылочное горлышко)
  - свертки 1 x 1 для уменьшения или увеличения количества каналов.
  
  GoogLeNet - огромная сеть с 22 слоями,
  состоящая преимущественно из inception блоков.
  
  Проблему затухающего градиента они решили
  с помощью вспомогательных функций потерь.
  Идея такая:
  если при обратном распространении ошибки на слой приходит маленький градиент,
  то основная функция потерь заменяется на вспомогательную
  и вглубь начинает распространяться новый градиент, достаточно большой.
  Такие вспомогательные функции можно было поставить в каждом Inception блоке,
  но в GoogLeNet их всего две.
  //// Тоже интересная идея, в том смысле,
  //// что оказывается можно сильно подкорректировать
  //// "классическое обратное распространение ошибки",
  //// просто принудительно используя "вспомогательные функции".
  //// Интересно, было ли дальнейшее развитие этой методики?
  
  Рис. GoogLeNet
  
  5. ResNet, Residual neural network (Microsoft, 2015)
  
  Свое название архитектура получила благодаря трюку
  под названием Residual Block.
  Основная идея в том, что входные данные передаются через блоки (слои)
  без изменений и соединяются с выходным данным блока.
  Таким образом была решена проблема затухания градиента
  при обучении очень глубоких нейронных сетей.
  //// Мне почему-то кажется, что решение "проблемы затухающего градиента"
  //// в этом приеме далеко не главное,
  //// Использование таких прямых или, наоборот, обходных связей
  //// несет в себе возможность более глубокого анализа входных данных,
  //// более точной настройки на какие-то "детали".
  //// И по факту, Residual Block, правда часто называемых как-то по-другому,
  //// сейчас используются очень широко в различных архитектурах,
  //// включая и трансформерные блоки.
  //// И то, что такое решение, попутно уменьшает проблему "затухающих градиентов",
  //// на самом деле, просто "приятный бонус" к чему-то более существенному.
  
  Рис. Residual Block
  
  Сеть ResNet состоит из Residual Block-ов следующих друг за другом.
  При этом, вариантов ResNet несколько:
  ResNet18 (состоящий из 18 слоев), ResNet32 и даже ResNet1024.
  
  Рис. ResNet
  
  Так же, в ResNet отсутствуют полносвязные слои.
  Вместо этого, с помощью AvgPooling,
  тензор масштабируется до размера полносвязного слоя.
  После пропускается через один полносвязный слой
  (чтобы на выходе был вектор 1 x 1000) и применятся SoftMax.
  За счет этого ResNet неважно,
  сколько пикселей во входном изображении,
  но, желательно, чтобы размер был кратен 32,
  т.к. в сети происходит 5 раз уменьшение изображения в 2 раза.
  
  ResNet довольно часто используется как backbone.
  Например, вот недавнее упоминание в статье
   о прогнозировании последствий извержения вулканов на Камчатке.
  https://habr.com/ru/companies/yandex/articles/794883/
  
  ........
  
  //// Конец цитирования.
  
  На мой взгляд, очень неплохой материал для расширения кругозора.
  Почему к нему закрыли доступ, мне совершенно непонятно,
  Может быть, автор в чем-то там ошиблась, не знаю - квалификации не хватает,
  а возможно решила в чем-то его доработать.
  В любом случае, спасибо и за этот вариант.
  
  
  ========
  
  16.03.2024 17:51
  
  И снова трансформеры.
  В оглавление.
  
  Еще один очень неплохой материал по трансформерам.
  Во всяком случае, именно по материалу я разобрался в парочке вопросов,
  которые ну никак не удавалось осмыслить по другим материалам.
  Очень рекомендую познакомиться с ним в оригинале,
  там очень наглядные иллюстрации, которые обязательно нужно увидеть,
  чтобы понимание работы трансформеров поднялось на новый уровень:
  
  "Наглядно о том, почему трансформеры работают настолько хорошо".
  Автор: factorial42
  https://habr.com/ru/companies/skillfactory/articles/562928/
  20 июн 2021 в 17:17
  
  Автор оригинала: Ketan Doshi
  https://towardsdatascience.com/transformers-explained-visually-not-just-how-but-why-they-work-so-well-d840bd61a9d3
  
  //// Начало цитирования.
  
  Трансформеры за последние несколько лет штурмом захватили мир NLP,
  а сегодня они с успехом применяются в выходящих за рамки NLP приложениях.
  Они обладают такими возможностями благодаря модулю внимания,
  который схватывает отношения между всеми словами последовательностей.
  Но самый важный вопрос - как именно трансформеры делают это?
  Попытаемся ответить и понять,
  почему трансформеры способны выполнять такие вычисления.
  Итак, цель статьи, чуть сокращённым переводом которой мы делимся
  к старту курса о машинном и глубоком обучении,
  - разобраться не только с тем, как что-то работает,
  но и почему работает так.
  Чтобы понять, что движет трансформерами,
  мы должны сосредоточиться на модуле внимания.
  Начнём с входных данных и посмотрим, как они обрабатываются.
  
  Как входная последовательность попадает в модуль внимания
  
  Модуль внимания присутствует в каждом энкодере внутри стека каждого энкодера,
  а также внутри стека каждого декодера.
  Сначала внимательно посмотрим на энкодер.
  
  Рис. Модуль внимания в энкодере
  
  Для примера предположим,
  что мы работаем над задачей перевода с английского на испанский,
  где исходная последовательность слов - ,
  а целевая последовательность - .
  
  Исходная последовательность сначала проходит
  через слой векторного представления и позиционного кодирования,
  генерирующего векторы векторного представления
  для каждого слова последовательности.
  Векторное представление передаётся в энкодер,
  где вначале попадает в модуль внимания.
  
  Внутри модуля внимания последовательность векторного представления
  проходит через три линейных слоя,
  создающих три отдельные матрицы
  - запроса (Query), ключа (Key) и значения (Value).
  Именно эти три матрицы используются для вычисления оценки внимания
  [прим. перев. - оценка определяет, сколько внимания нужно уделить
  другим частям входного предложения,
  когда мы кодируем слово в определённой позиции].
  Важно помнить, что каждая "строка" этих матриц соответствует
  одному слову исходной последовательности.
  
  Рис. Поток исходной последовательности
  
  Каждая входная строка - это слово из последовательности
  
  Чтобы понять, что происходит с модулем внимания,
  мы начнём с отдельных слов исходной последовательности,
  проследив их путь через трансформер.
  Если конкретнее, мы хотим сосредоточиться
  на происходящем внутри модуля внимания.
  Это поможет нам чётко увидеть,
  как каждое слово в исходной и целевой последовательностях
  взаимодействует с другими словами этих последовательностей.
  
  Пока вы разбираетесь с этим объяснением,
  сосредоточьтесь на том, какие операции выполняются с каждым словом
  и как каждый вектор отображается на исходное входное слово.
  Не нужно думать о множестве других деталей,
  таких как формы матриц, особенности арифметических вычислений,
  множественное внимание и так далее,
  если эти детали не относятся напрямую к тому,
  куда направляется каждое слово.
  Итак, чтобы упростить объяснение и визуализацию,
  давайте проигнорируем размерность векторного представления
  и будем отслеживать только строки для каждого слова.
  
  Рис. Расположение каждого слова в исходной последовательности
  
  Каждое слово проходит серию обучаемых преобразований (трансформаций)
  
  Каждая такая строка была сгенерирована из соответствующего исходного слова
  посредством серии трансформаций
  - векторного представления, позиционного кодирования и линейного слоя.
  Все эти трансформации возможно обучить;
  это означает, что используемые в этих операциях веса не определены заранее,
  а изучаются моделью таким образом,
  чтобы они давали желаемые выходные прогнозы.
  
  Рис. Линейные веса и веса векторного представления обучены
  
  Ключевой вопрос заключается в том, как трансформер определяет,
  какой набор весов даст ему наилучшие результаты?
  Держите этот момент в памяти - мы вернёмся к нему немного позже.
  
  Оценка внимания
  - это скалярное произведение матрицы ключа и матрицы запроса слов
  
  Модуль внимания выполняет несколько шагов,
  но здесь мы сосредоточимся только на линейном слое и на оценке внимания.
  
  Рис. Многоголовое внимание
  
  Рис. Расчёт оценки внимания
  
  Как видно из формулы, первый шаг в рамках модуля внимания
  - умножение матрицы, то есть скалярное произведение
  между матрицей Query (Q) и транспонированием матрицы ключа Key (K).
  /// "транспонированной".
  Посмотрите, что происходит с каждым словом.
  Итог - промежуточная матрица
  (назовём её <факторной> матрицей [матрицей множителей]),
  где каждая ячейка - это результат матричного умножения двух слов.
  
  Рис. Скалярное произведение матрицы запроса и матрицы ключа
  
  Например, каждый столбец в четвёртой строке
  соответствует скалярному произведению между четвёртым словом запроса
  и каждым ключевым словом.
  
  Рис. Скалярное произведение между матрицами запроса и ключа
  
  Оценка внимания - скалярное произведение между запросом-ключом
  и значением слов
  
  Следующим шагом является матричное умножение
  между этой промежуточной матрицей <множителей>
  и матрицей значений (V),
  чтобы получить оценку внимания,
  который выводится модулем внимания.
  Здесь мы можем видеть,
  что четвёртая строка соответствует четвёртой матрице слов запроса,
  умноженной на все остальные ключевые слова и значения.
  
  Рис. Скалярное произведение между матрицами ключа запроса и значения
  
  //// На мой взгляд, это ключевая иллюстрация в данном материале.
  //// Во всяком случае, именно этой иллюстрации мне лично не хватало,
  //// чтобы понять идеологию "внутреннего внимания",
  //// как суммы произведения матриц "запроса" и "ключа" на вектор "значения".
  
  Получается вектор оценки внимания (Z),
  который выводится модулем внимания.
  Выходной результат можно представить следующим образом:
  для каждого слова это закодированное значение каждого слова
  из матрицы <Значение>,
  взвешенное матрицей множителей.
  Матрица множителей представляет собой
  точечное произведение значения запроса для данного конкретного слова
  и значения ключа для всех слов.
  
  Рис. Оценка внимания - это взвешенная сумма значения слов
  
  //// Ну наконец-то окончательно понял эту математику.
  //// Лишь бы к завтрашнему дню не забыть.
  //// И, интересно, что сразу же появились мысли, как это хотелось бы
  //// представить/преобразовать в "побитной логике".
  
  Какова роль слов запроса, ключа и значения?
  
  Слово запроса - это слово,
  для которого мы рассчитываем внимание.
  В свою очередь слово ключа и значения
  - это слово, на которое мы обращаем внимание,
  то есть определяем, насколько это слово соответствует слову запроса.
  
  Рис. Оценка внимания для слова обращает внимание на каждое слово
  
  //// Т.е., по факту, речь идет об определенной "связанности"
  //// элементов входной последовательности,
  //// реализуемой посредством "умножения обучаемых матриц",
  //// и последующего "взвешивания".
  
  Например, для предложения
  строка для слова будет содержать оценку внимания
  для слова с каждым вторым словом.
  Здесь - это слово запроса,
  а другие слова - <ключ/значение>.
  Выполняются и другие операции,
  такие как деление и softmax,
  но мы можем проигнорировать их в этой статье.
  Они просто изменяют числовые значения в матрицах,
  но не влияют на положение каждой строки слов в ней.
  Они также не предполагают никаких взаимодействий между словами.
  
  Скалярное произведение сообщает нам о сходстве слов
  
  Итак, мы увидели, что оценка внимания отражает некоторое взаимодействие
  между определённым словом и каждым другим словом
  в предложении путём скалярного произведения
  с последующим их сложением.
  Но как матрица умножения помогает трансформеру
  определять релевантность между двумя словами?
  
  Чтобы понять это, вспомните,
  что строки запроса, ключа и значения
  на самом деле являются векторами с размерностью векторного представления.
  Давайте посмотрим, как умножаются матрицы между этими векторами.
  
  Рис. Каждая ячейка представляет собой скалярное произведение двух векторов слов
  
  Для получения скалярного произведения двух векторов мы умножаем пары чисел,
  а затем суммируем их.
  
   Если два парных числа (например, и выше) оба положительны
   или оба отрицательны, произведение положительно.
   Произведение увеличит итоговую сумму.
  
   Если одно число положительное, а другое отрицательное,
   произведение будет отрицательным.
   Произведение уменьшит итоговую сумму.
  
   Если произведение положительное,
   то, чем больше два числа, тем больше их вклад в окончательную сумму.
  
  Это означает, что, если знаки соответствующих чисел в двух векторах выровнены,
  итоговая сумма будет больше.
  //// Все больше и больше в голову приходят мысли о "побитовой логике".
  
  Как трансформер изучает релевантность между словами?
  
  Скалярное произведение также применимо к оценке внимания.
  Если векторы для двух слов более выровнены, оценка внимания будет выше.
  Итак, какого поведения мы хотим от трансформера?
  Мы хотим, чтобы оценка внимания была высокой
  для двух релевантных друг другу слов в предложении.
  И мы хотим, чтобы оценка двух слов, не связанных друг с другом, была низкой.
  
  Например, в предложении
  слово очень релевантно к ,
  возможно, немного менее релевантно для ,
  и нерелевантно к .
  Мы хотим, чтобы и давали высокую оценку внимания,
  чтобы и давали немного более низкую оценку,
  а для и - незначительную.
  Мы хотим, чтобы модель научилась воспроизводить этот результат.
  Чтобы достичь воспроизводимости,
  векторы слов и должны быть выровнены.
  Векторы и несколько разойдутся.
  А для и они будут совершенно разными.
  
  Давайте вернёмся к вопросу, который мы откладывали:
  как трансформер определяет,
  какой набор весов даст ему наилучшие результаты?
  Векторы слов генерируются на основе векторного представления слов
  и весов линейных слоёв.
  Следовательно, трансформер может изучить эти векторные представления,
  линейные веса и так далее, чтобы создать векторы слов, как требуется выше.
  
  Другими словами, он будет изучать эти векторные представления и веса
  таким образом, что если два слова в предложении релевантны друг другу,
  то их векторы слов будут выровнены,
  следовательно, получат более высокую оценку внимания.
  Для слов, которые не имеют отношения друг к другу,
  их векторы не будут выровнены и оценка внимания будет ниже.
  
  Следовательно, векторные представления слов и
  будут очень согласованными и обеспечат высокую оценку внимания.
  Они будут несколько отличаться для и ,
  производить немного более низкую оценку
  и будут совершенно разными в случае и :
  оценка внимания будет низкой
  - вот лежащий в основе модуля внимания принцип.
  //// Принцип, вроде, понятен.
  //// Но остается вопрос: "как происходит обучение матриц "запроса" и "ключа"
  //// "не в принципе, а в кожухе"?
  //// И этот вопрос теперь следующий в очереди на понимание
  //// работы трансформерных блоков.
  //// И что-то пока я не видел ни одного материала на эту тему.
  
  Итак, как же работает трансформер?
  
  Скалярное произведение между запросом и ключом
  вычисляет релевантность между каждой парой слов.
  Эта релевантность затем используется
  как <множитель> для вычисления взвешенной суммы всех <значений> слов.
  Эта взвешенная сумма выводится как оценка внимания.
  Трансформер изучает векторные представления и т. д.
  таким образом, что релевантные друг другу слова были более согласованы.
  
  В этом кроется одна из причин введения трёх линейных слоёв
  и создания трёх версий входной последовательности:
  для запроса, ключа и значения.
  Такой подход даёт модулю внимания ещё несколько параметров,
  которые он может изучить, чтобы подстроить процесс создания векторов слов.
  
  Самовнимание энкодера в трансформере
  
  Внимание используется в трансформере в трёх местах:
  
   Самовнимание в энкодере
   - исходная последовательность обращает внимание на себя.
  
   Самовнимание в декодере
   - целевая последовательность обращает внимание на себя.
  
   Энкодер-декодер-внимание в декодере
   - целевая последовательность обращает внимание на исходную последовательность.
  
  Рис. Внимание в трансформере
  
  В самовнимании энкодера мы вычисляем релевантность каждого слова
  в исходном предложении каждому другому слову в исходном предложении.
  Это происходит во всех энкодерах стека.
  
  Декодер самовнимания в трансформере
  
  Большая часть того, что мы только что видели в энкодере самовнимания,
  применима и к вниманию в декодере,
  но с некоторыми существенными отличиями.
  
  Рис. Внимание в декодере
  
  В декодере самовнимания мы вычисляем релевантность каждого слова
  в целевом предложении каждому другому слову в целевом предложении.
  
  Рис. Самовнимание декодера
  
  Энкодер-декодер модуля внимания в трансформере
  
  В энкодере-декодере запрос получается из целевого предложения,
  а ключ/значение - из исходного предложения.
  Таким образом, он вычисляет релевантность каждого слова
  в целевом предложении каждому слову в исходном предложении.
  
  Рис. Энкодер-декодер Внимания
  
  Заключение
  
  Надеюсь, статья дала вам хорошее представление
  об элегантности архитектуры трансформера.
  Прочтите также другие статьи о трансформере из моей серии,
  чтобы лучше представлять, почему сегодня трансформер
  - это предпочтительная архитектура многих приложений глубокого обучения.
  
  Здесь мы видим, что за сложными идеями скрываются простые решения.
  Более того, есть ощутимая вероятность того,
  что вскоре понимание внутренних механизмов глубокого обучения
  станет <второй грамотностью>,
  как сегодня второй грамотностью стало знание ПК в целом...
  
  .....
  
  //// Конец цитирования.
  
  Очень полезная для меня оказалась эта статья.
  И как раз вовремя.
  Совместно с работой/размышлениями над структурой значений
  одноэлементного эмбеддинга, подробнее см.:
  "Металоция неведомого. Модуль Э. Эмбеддинги."
  этот материал послужил толчком к разработке структуры битовых нейросетей (БНС),
  за что и автору и переводчику этого материала
  глубокая и искренняя благодарность.
  
  P.S.
  Если интересно, что это за БНС, то какую-то первоначальную формулировку см.:
  "Первая попытка сформулировать концепцию битовой нейронной сети (БНС)".
  
  
  ========
  
  23.03.2024 11:13
  
  Что общего между структурным мышлением и структурой нейросетей?
  В оглавление.
  
  Знакомство с "зоопарком" и "кунсткамерой" нейросетей
  - дело, конечно, полезное.
  Но все-таки главная цель этого не только понимать существующие конструкции,
  но и научиться видеть определенные перспективы их дальнейшего развития.
  И чтобы как-то начать подступаться к этому вопросу,
  на мой взгляд, стоит попытаться разобраться,
  а что собственно не хватает существующим архитектурам:
  
  "Структурное мышление или важное отличие человека от ИИ".
  Автор: Atmyre (Татьяна Гайнцева)
  https://habr.com/ru/articles/687646/
  14 сен 2022 в 16:00
  
  //// Начало цитирования.
  
  В этой статье я расскажу об одном из самых важных отличий
  человеческого мышления от того,
  как работают нейросети:
  о структурном восприятии мира.
  Мы поймем, как это отличие мешает ИИ эффективно решать многие задачи,
  а также поговорим об идеях,
  с помощью которых можно внедрить в нейросети понимание структуры.
  В том числе обсудим недавние работы таких известных в области AI людей,
  как Джеффри Хинтон и Ян ЛеКун.
  
  .......
  
  Структурное мышление
  
  Существуют убедительные данные, что мы - люди - воспринимаем мир
  с помощью структуры.
  
  (ссылки на научные работы касательно структурного восприятия мира человеком,
  подкрепляющие утверждения этого раздела,
  можно найти в разделе "Литература" в конце статьи)
  
  Это значит, что мы делим все сложные абстрактные понятия на части,
  и воспринимаем все объекты и понятия
  как сложные составные сущности,
  состоящие из простых элементов (building blocks),
  которые взаимодействуют между собой (имеют relations).
  
  ........
  
  Эти понятия (улица, город, страна в нашем примере) и связи между ними
  создают иерархическую структуру с взаимодействиями
  между элементами у нас в голове.
  
  ........
  
  Вообще, иерархия - самый эффективный способ организации систем
  с точки зрения взаимодействия элементов системы,
  их специализации и передачи информации между частями системы.
  Почему это так, можно прочитать в книге "Азбука системного мышления"
  (Глава 3: "Почему системы так хорошо работают")
  https://www.mann-ivanov-ferber.ru/books/azbuka-sistemnogo-myishleniya/
  Скорее всего, иерархическое мышление у людей также развилось
  по причине его эффективности.
  Мысля таким образом, мы затрачиваем меньше энергии,
  чем если бы мышление было устроено другим образом.
  
  Далее, кроме иерархии мы также оперируем ассоциациями:
  проводим аналогии, ищем связи между различными сущностями.
  Ассоциации могут основываться на совершенно разном:
  форме объектов, запахе, цвете, звуковых сигналах.
  По сути, ассоциации - это вид взаимодействий между объектами,
  который основан на их схожести по какому-то принципу.
  
  ......
  
  Структурное ассоциативное мышление помогает нам
  эффективно воспринимать мир и приспосабливаться к новому.
  Вот как:
  
  Сталкиваясь с чем-то новым,
  мы пытаемся разделить это новое
  на известные нам из прошлого опыта составляющие
  (те самые building blocks)
  и таким образом создать структурное представление новой сущности.
  Как только структурное представление новой сущности создано,
  мы можем делать выводы о новой сущности.
  Эти выводы основаны на том,
  из каких известных элементов состоит структура нового объекта
  и наших знаний об этих известных элементах и их взаимодействиях.
  //// Но ведь это по факту ассоциативно-структурное мышление,
  //// где ассоциации идут впереди структуры.
  
  Некоторые элементы, на которые мы разделили новую сущность,
  могут быть новыми:
  точно таких же вы никогда не видели.
  Но ассоциативное мышление может создать связь между этим новым элементом
  и тем, что вы видели раньше.
  Перенеся свойства ранее виденного элемента на новый,
  вы многое поймете о новом элементе.
  //// Похоже, "телега" (структура), поставлена впереди "лошади" (ассоциаций).
  //// Странно, что данный исследователь этого не замечает.
  
  ......
  
  Идем далее:
  структурное мышление позволяет нам создавать новое
  на основе отдельных известных частей:
  спроектировать новый город будущего,
  по-разному соединяя отдельные известные части (building block'и: дома и улицы)
  с помощью разных известных взаимосвязей (relations).
  Например, кто-то же создал несуществующее животное с картинки выше.
  Оно состоит из вполне стандартных, известных нам элементов.
  
  .......
  
  Таким образом, структурное мышление помогает нам взаимодействовать с миром,
  жить и развиваться.
  Так или иначе, мы каждый день сталкиваемся с чем-то новым
  и успешно с ним взаимодействуем благодаря механизму восприятия,
  описанному выше.
  Столкнувшись с чем-то новым,
  мы либо встраиваем новую сущность
  в существующую в нашей голове структуру мира,
  либо изменяем вид структуры в голове так,
  чтобы новая сущность и старый опыт органично вписывались в эту структуру.
  //// Либо откладываем это действие до получения дополнительной информации.
  
  Это умение разбивать высокоуровневые понятия на структурные элементы,
  осознавать и создавать новое,
  собирая его из хорошо известных старых понятий,
  называется комбинаторным обобщением (conbinatorial generalization).
  И это - то, что суперлегко дается мозгу человека
  и суперсложно - искусственному интеллекту.
  В частности, подходам, основанным на нейросетях.
  //// Все это имело смысл заявлять два года назад,
  //// а сейчас уже очевидно, что "что-то не так".
  
  ......
  
  Нейросети и структура
  
  Если посмотреть на принципы работы современных нейросетей,
  в них, на самом деле, можно найти структурные элементы.
  
  Возьмем, к примеру, сверточные нейросети (CNN).
  Сверточные слои состоят из фильтров,
  которые выделяют из изображения информацию о паттернах,
  которые присутствуют на изображении.
  Причем каждый последующий сверточный слой реагирует
  на все более сложные, высокоуровневые паттерны, чем предыдущие слои.
  //// А не наоборот, на все более "унифицированное", то бишь "упрощенное"?
  //// Тут вопрос, что есть "высокоуровневое" представление?
  
  Рис. https://www.quora.com/How-does-a-convolutional-neural-network-recognize-an-occluded-face
  Примеры паттернов, на которые реагируют последовательные слои сверточной нейросети.
  Первые слои реагируют на низкоуровневые паттерны
  вроде вертикальных/диагональных линий,
  следующие слои реагируют на более сложные паттерны (глаз/нос),
  последние - на паттерны наличия лица.
  
  Получается, сверточные слои как бы обрабатывают картинку,
  распознавая на ней сначала низкоуровневые паттерны,
  а затем постепенно собирая эти паттерны вместе в более сложные конструкции.
  //// Типично "ассоциативно-структурное представление".
  //// Кстати, сверточная сеть очень удобный пример для такого анализа,
  //// и именно поэтому в этом модуле ей, наряду с трансформерами,
  //// уделяется особое внимание.
  //// В какой-то мере идея этого модуля родилась под влиянием этого текста.
  Это напоминает структуру:
  нейросеть учится находить на изображении отдельные элементы (паттерны),
  а затем собирает целое из составных элементов.
  
  Однако такой идеи устройства нейросети недостаточно,
  чтобы нейросеть развила понимание структуры,
  приближенное к тому, как структуру понимает человек.
  Свидетельством этому служат проблемы,
  которые возникают и у сверточных,
  и у практически всех других нейросетей повсеместно.
  Далее мы рассмотрим некоторые из них.
  
  Можете подумать о том, почему той структуры,
  что есть в сверточных нейросетях,
  не хватает для имитации восприятия человека.
  Чего недостает сверточным сетям?
  
  Общие проблемы нейросетей
  
  У нейросетей есть несколько известных общих проблем.
  Общих - потому что эти проблемы характерны для всех видов нейросетей.
  Рассмотрим три из них:
  те, которые, на мой взгляд, связаны
  с отсутствием у нейросетей понимания структуры.
  
   Знания нейросетей плохо переносятся из домена в домен,
   даже если домены сильно похожи.
   Например, нейросеть, которая отлично распознает лица европейцев,
   будет плохо работать на лицах людей из Африки.
   Эта проблема называется domain shift / out-of-domain.
   Или, еще по-другому - отсутствие у нейросетей обобщающей способности.
   Есть отдельные направления исследований,
   которые ищут подходы для улучшения адаптации нейросетей к новым доменам:
   эти области называются domain adaptation или transfer learning.
   Но все эти техники далеки от совершенства,
   проблема domain shift еще не решена.
  //// И опять эта информация устаревшая, особенно по отношению к LLM.
  
   Для человека проблемы domain shift практически не стоит.
   Мы легко проводим аналогии между объектами из двух доменов,
   выделяя в каждом структурные элементы и сопоставляя их между собой.
  //// Неверно, отличать лица европейцев европейцам на порядок легче чем лица азиатов.
   Выделив в объекте из неизвестного домена знакомую структуру,
   мы понимаем, что примерно представляет из себя объект
   и как с этим объектом взаимодействовать.
   Другими словами, мы сравниваем разные объекты из разных доменов
   между собой на основе структуры,
  //// Структуры или ассоциаций?
  //// Вопрос не риторический, ведь если для "ассоциаций" в той же сверточной сети
  //// есть хоть какая-то "аппаратная поддержка",
  //// то для "структур" как-то ничего не наблюдается.
  //// А что есть у человека вообще неизвестно.
   не обращая внимания на мелкие неважные различия.
   Мы поймем, что перед нами человек,
   даже если этот человек будет неизвестной нам ранее расы:
   мы поймем это, проведя аналогию между людьми известных нами рас
   и людьми новой расы на основе того,
   что оба типа людей состоят из одинаковых структурных элементов:
   головы, глаз, носа, рук и т.д.
   Таким образом, умение к комбинаторному обобщению
  //// Комбинаторное обобщение - интересный термин.
  //// А как его можно реализовать?
  //// И нет ли здесь какой-то связи/аналогии с трансформерными блоками?
   позволяет людям взаимодействовать
   со структурно похожими элементами из разных доменов.
  
   Нейросети чувствительны к шуму и малым изменениям в данных
   (это проблема отсутствия устойчивости/робастности нейросетей).
  //// Это не совсем так, а иногда совсем не так.
  //// Ту скорее проблема "нелинейности"/"разрывности" структуры значений эмбеддингов.
   Даже самое малое изменение картинки, малое добавление шума
   может сильно изменить ответ нейросети.
   Посмотрим, например, на две картинки ниже.
   Человеку явно понятно, что на картинках один и тот же объект,
   и малый шум не мешает это осознать,
   точно так же как и новая шляпа из примера выше не мешала понять,
   что перед нами тот же друг Петя.
   Просто для нас картина и шум - это две сущности,
   которые взаимодействуют между собой.
   И взаимодействуют они так,
   что шум не меняет значения объектов на картине.
  //// Это выделение шума/фона/ритма чем-то похожа и чем-то обратна
  //// задаче "учета контекста". Так что может быть и решение будет
  //// очень похожим в виде "нойз-трансформера".
  
   У нейросетей же так не получается:
   совсем малый шум может сильно изменить восприятие объекта нейросетью.
   Это выдает отсутствие в нейросетях структуры,
   а также позволяет создавать adversarial атаки на сети.
   Adversarial атака - это когда входящий объект изменяется
   очень малым образом,
   так, что человеку практически не заметно,
   но ответ нейросети на этот объект при этом сильно искажается.
   Более подробно об adversarial атаках можно почитать тут.
  https://engineering.purdue.edu/ChanGroup/ECE595/files/chapter3.pdf
  
  Рис. https://medium.comr/the-unusual-effectiveness-of-adversarial-attacks-e1314d0fa4d3
  Пример adversarial attack.
  При подаче в нейросеть картинки слева модель классифицирует ее правильно: "поросенок".
  Но при добавлении небольшого шума, не видного глазу,
  нейросеть начинает классифицировать правую картинку как "авиалайнер".
  
   Для обучения нейросетей требуется огромное количество данных.
   При малом количестве обучающих данных нейросети переобучаются.
  //// Опять эта мантра про "переобучение".
  //// И когда много данных тоже может быть "переобучение" и когда мало,
  //// а кто-то пытался сформулировать условия,
  //// когда его гарантированно быть не может?
   Человек же может обучиться под новую задачу на основе ограниченного опыта.
   Это умение людей, опять же, связано со структурным мышлением:
   как было показано в примере с диким зверем,
   мы можем собирать общее представление о новом объекте,
   разложив объект на известные составные части
   и проанализировав их взаимодействия.
   Пары объектов нового вида будет достаточно,
   чтобы на основе их структуры сделать о них выводы
   и научиться правильно с ними взаимодействовать.
  
   По сути, эта проблема - следствие первой проблемы
   (отсутствия обобщающей способности).
  //// А как тогда быть с повальным "увлечением" нейросетями именно
  //// из-за их какой-то "магической обобщающей способности"?
  //// Или это какой-то другой вид "обобщающей способности"?
   Если бы нейросети обладали хорошей обобщающей способностью,
   то хорошее предобучение нейросети позволило бы дообучать
   ее на новые задачи,
  //// А именно это сейчас как раз и есть основной тренд в обучении.
   используя малое количество данных.
   Здесь предобучение сети можно сравнить с человеческим опытом:
   человек быстро научается решать новые задачи
   благодаря структурному мышлению и опыту.
  
  В общем-то, все описанные проблемы имеют одну основу:
  нейросети плохо справляются с любыми данными,
  которые как-то отличаются от тех, на которых нейросеть была обучена.
  //// Все это имело смысл до "явления ChatGPT народу и миру".
  
  Один из возможных способ решить эту проблему
  - наделить нейросети способностью к комбинаторному обобщению,
  "заставив" нейросеть воспринимать объекты структурно.
  //// А вот с этим полностью соглашусь.
  //// Неплохо бы это сделать, вот только как?
  
  Есть несколько идей, как это можно сделать.
  Далее мы рассмотрим некоторые из них.
  
  Внедрить в нейросеть понимание структуры
  
  ......
  
  Идея #1: Больше данных в модель!
  
  Многие считают, что чтобы нейросеть стала лучше "понимать мир",
  нужно просто сделать очень большую модель (с огромным количеством параметров)
  и обучить ее на намного большем и разнообразном количестве данных,
  чем это делается сейчас.
  Типа, очень большая модель в процессе обучения на разнообразных данных
  сама поймет, как лучше всего представлять объекты,
  и в итоге у нее само собой возникнет понятие структуры.
  В этом есть резон: практика показывает,
  что чем больше в обучающей выборке разнообразных примеров,
  тем лучше генерализация нейросети,
  и тем менее проявляются эффекты out of domain, adversarial attack
  и чувствительности к шуму.
  
  Но достаточно ли этого,
  чтобы достичь комбинаторного обобщения?
  Похоже, что все-таки нет.
  Посмотрим на DALL-E 2: нейросеть для text-to-image,
  которая обучалась на просто огромном количестве данных.
  При этом понимания структуры у этой нейросети,
  увы, не возникло.
  Казалось бы, это странно: DALL-E 2 отлично генерирует картинки
  по текстовым запросам, комбинируя различные сущности:
  даже те, которые обычно несовместимы (вспомним знаменитый авокадо-стул).
  Но нет. Ученые из Гарварда провели исследование,
  по итогам которого сделали вывод,
  что у DALL-E 2 нет даже базового понимания отношений между объектами
  и, соответственно, структуры
  (цитата: "... current image generation models do not yet have
  a grasp of even basic relations involving simple objects and agents")
  //// А вот мне встретился материал с противоположным выводом, см.:
  //// "Тарабарские языки", используемые ИИ-системами".
  //// И кто в данном случае прав?
  //// А спросишь того же Bing об отношениях категорий в какой-нибудь
  //// математической формулировке, то просто балдеешь от того,
  //// как он "раскладывает все по полочкам".
  //// Так что этот аргумент, как минимум, устарел.
  //// И как раз LLM это наглядно продемонстрировали.
  //// Так что, скорее всего, это связано с конкретным процессом обучения И,
  //// может быть, со специфическими конструктивными решениями,
  //// а не "врожденной неспособностью" нейросетей
  //// "разобраться в конкретных отношениях/связях".
  
  Рис. https://arxiv.org/pdf/2208.00005.pdf
  Пример генерации DALL-E 2 по запросу "чашка под цилиндром".
  Видно, что модель не понимает отношения "под":
  на большинстве картинок чашка не расположена под цилиндром.
  //// Еще бы запросили "под наркозом",
  //// и этим бы аргументировали свой окончательный вывод.
  
  ......
  
  Обратимся поэтому к другим идеям того,
  как внедрить понимание структуры в нейросети.
  Другая идея состоит в том, чтобы как-то изменить
  идею устройства модели.
  Другими словами, внедрить в модель некий inductive bias,
  спроектировать архитектуру модели так,
  чтобы при обучении она была вынуждена выучивать
  некое подобие структуры и отношений между объектами.
  //// Ну, структуры точно со временем поменяются,
  //// но в какую сторону пока неясно.
  //// Но "inductive bias" - запомним.
  
  В случае с text-to-image моделями, к слову,
  такой подход работает: добавление в архитектуру сети некоторых трюков
  помогает улучшить восприятие моделью отношений между объектами.
  К примеру, text-to-image модель Parti (Google, 2022)
  достаточно хорошо передает взаимодействия объектов:
  
  Рис. https://gweb-research-parti.web.app/parti_paper.pdf
  Пример генерации картинок моделью Parti.
  Видно, как точно на картинке переданы отношения между объектами
  (wombat, chair, martinim keyboard), описанные в тексте.
  
  .....
  
  Идея #2: Графовые нейросети
  
  Графовая нейросеть -это архитектура,
  которая прямо в своем устройстве содержит понятие структуры
  и связей между объектами,
  и успешно применяется для работы с определенными видами данных.
  Как понятно из названия, основа графовой нейросети - граф.
  
  Граф - это, наверное, самый наглядный способ представления структур.
  Вершины графа соответствуют сущностям (понятиям, объектам),
  а ребра между вершинами - отношениям между этими сущностями.
  
  Некоторые виды данных прямо таки представляют собой графы.
  Примеры - графы социальных сетей или молекул веществ.
  
  С такими видами данных очень удобно работать с помощью графовых нейросетей
  //// А как быть с теми данными, которые НЕ ИМЕЮТ простого графого представления,
  //// например текст, изображение и др?
  
  ........
  
  Графовая нейросеть строит граф объекта.
  Во время обучения GNN выучивает эмбеддинги (векторы-описания) каждой вершины
  и каждого ребра.
  То есть, GNN выучивает информацию о каждом элементе (вершине) графа
  и о природе связей (ребер) между этими элементами.
  Получается, GNN в процессе обучения "понимает" структуру объекта.
  //// Т.е. опять все упирается в структуру/пространство "эмбеддинга".
  
  Подробно о том, как обучаются графовые нейросети,
  есть прекрасные статьи на distill.pub, towardsdatascience и arxiv.
  https://distill.pub/2021/gnn-intro/
  https://towardsdatascience.com/a-gentle-introduction-to-graph-neural-network-basics-deepwalk-and-graphsage-db5d540d50b3
  https://arxiv.org/abs/1710.10903
  
  Успех графовых нейросетей в работе с графовыми типами данных очевиден:
  в последнее время большинство успешных моделей
  для разработки лекарств или других химических соединений
  были основаны на графовых нейросетях.
  Пример: MoLeR (модель от Microsoft для разработки новых лекарств).
  Эта модель - VAE, энкодер и декодер которой - графовые нейросети.
  
  К сожалению, применить графовые сети для работы с другими типами данных
  (вроде картинок или текста) намного сложнее.
  Их, при желании, тоже можно представить в виде графов,
  но это представление не будет идеальным.
  //// Т.е. "граф", а, возможно, и само структурное представление
  //// не являются универсальным инструментом для многих задач.
  //// Или, что скорее, могут являться, но не в том прямолинейном виде,
  //// как это предлагается сейчас.
  
  ......
  
  Получается, графовые нейросети - не универсальная идея,
  которая позволит внедрить структуру в модель для работы
  с любыми видами данных.
  По крайней мере, в том виде, в котором графовые нейросети существуют сейчас.
  
  В заключение про графовые сети порекомендую эту статью от DeepMind.
  https://arxiv.org/pdf/1806.01261.pdf
  В ней вводится понятие графовой нейросети:
  как она устроена, для каких задач применима и как ее обучать.
  Также в ней подробно разбирается то,
  как различные архитектуры нейросетей (сверточные, полносвязные, рекуррентные)
  оперируют связями между объектами
  (т.е. какой в них relational inductive bias),
  и в чем преимущество графовых нейросетей в этом плане.
  
  .......
  
  Идея #3: Мысли Джеффа Хинтона
  
  Джефф Хинтон в феврале 2021 года выпустил большую авторскую статью
  https://www.cs.toronto.edu/~hinton/absps/glomfinal.pdf
  под названием "How to represent part-whole hierarchies in a neural network".
  В своей работе он концентрируется именно на создании нейросетей
  для компьютерного зрения (обработки картинок и видео),
  но, тем не менее, содержит интересные идеи.
  
  Главный лейтмотив работы Хинтона - иерархическая структура.
  
  ......
  
  Хинтон в статье предлагает идею модели, которую он назвал GLOM.
  GLOM - это не четко прописанная архитектура,
  которую завтра можно написать на PyTorch и обучить;
  это, скорее, абстрактная идея устройства модели.
  
  ........
  
  Как мы могли бы представить изображение
  в виде иерархической структуры в компьютере?
  Очевидный ответ - в виде дерева
  (заметим, что тут мы снова приходим к идее графа. Дерево - это тоже граф).
  Вот как он будет выглядеть:
  
  Рис. Дерево иерархии портрета Мона Лизы
  
  Подобные деревья иерархии можно построить для любой сцены.
  Было бы очень круто научить нейросети создавать для изображений такие деревья:
  это гарантировало бы, что нейросеть "воспринимает" визуальные сцены структурно.
  
  Но с этой идеей есть серьезная проблема:
  деревья иерархии для разных изображений будут совершенно разные.
  Они будут разной глубины
  (отдельный вопрос: как понять, когда остановиться делить элементы
  на все более мелкие составляющие?),
  на каждом уровне будет разное количество вершин,
  и все вершины будут соответствовать разным элементам:
  лицу, носу, машине, цветку и т.д.
  Короче говоря, граф должен строиться динамически.
  И тогда в нейронной сети нейроны должны будут в зависимости от изображения
  "представлять" разные сущности и по-разному взаимодействовать между собой.
  Проще говоря, нейросети для обработки разных картинок
  должны будут иметь разную структуру.
  Это не согласуется с тем,
  что мы хотим строить универсальные нейросети,
  которые могут обрабатывать сразу огромное количество различных картинок.
  //// Это не согласуется с представлением, что "структура картинки"
  //// должна как-то "коррелировать" со "структурой сети".
  //// Это первый "камень преткновения", точнее первый барьер "инерции мышления",
  //// когда задача решалась в основном удачным подбором структуры нейросети.
  
  Стоит сказать, что добиться разных видов взаимодействий между нейронами сети
  в зависимости от входящей картинки, на самом деле, не так сложно.
  //// О, "тепленькая пошла".
  Можно применить механизм гейтов или тот же Attention.
  Но с остальным - как строить иерархические деревья
  с разным количеством вершин,
  которые будут соответствовать разным элементам - неясно.
  //// А здесь снова вернулись к упомянутому "барьеру".
  //// Нужно по другому научиться оперировать эибеддингами,
  //// и тогда, возможно, задача станет более понятной.
  //// Начать хотя бы с вопроса как вообще представлять иерахическую структуру,
  //// и попробовать ее решить методом детектирования объектов,
  //// как, например, упоминалось в материалах выше.
  
  Хинтон в своей статье предлагает устройство нейросети,
  которое обрабатывает изображения похожим образом.
  
  Делим изображение на регионы одинакового размера.
  Например, 8х8.
  Каждому региону ставим в соответствие пять автоэнкодеров
  (далее я буду часто вместо слова "автоэнкодер" писать AE, чтобы было короче).
  Латентный вектор каждого из этих автоэнкодеров
  будет содержать информацию об этом регионе изображения.
  Но векторы разных AE будут выражать разную по структуре,
  уровню абстракции информацию.
  Поясню, что имеется в виду.
  Посмотрим на картинку и выделенный красным регион:
  
  .....
  
  Этому региону будут соответствовать пять автоэнкодеров.
  Латентный вектор первого AE будет содержать информацию,
  что в этом регионе изображена сережка.
  Латентный вектор второго AE будет содержать информацию,
  что в регионе изображено ухо.
  Третьего AE - что в регионе изображено лицо человека.
  Четвертого - что тут изображен человек,
  пятого - что тут изображен человек на розовом фоне.
  
  То есть, каждый следующий автоэнкодер воспринимает регион изображения
  как часть все большей сущности.
  Первый AE концентрируется на "локальной" сути региона
  (на нем изображена сережка),
  следующий AE воспринимает регион как часть большей сущности (уха),
  третий - еще большей (лицо) и т.д.
  
  Тут может возникнуть вопрос:
  как второй и последующий атоэнкодеры понимают,
  что регион - это часть уха/лица/человека,
  если они не имеют доступ к другим регионам?
  Ответ такой: в процессе обработки картинки
  каждый автоэнкодер обменивается информацией с другими AE.
  А именно, каждый автоэнкодер получает информацию от:
  
   AE того же региона уровня ниже;
  
   AE того же региона уровня выше;
  
   AE соседних регионов того же уровня.
  
  Таким образом, после нескольких итераций обмена информацией между автоэнкодерами
  латентные векторы всех AE стабилизируются
  и будут содержать нужную информацию.
  //// Вот это ключевое. Вся "иерархическая информация" как-то закодирована
  //// в "латентном векторе", то бишь, "эмбеддинге".
  //// Вопрос в том: как именно?
  Разумеется, чтобы этого добиться,
  нужно грамотно построить процесс обучения модели GLOM.
  //// Этого мало. Надо научиться понимать "кодировку эмбединга".
  Как это сделать, читайте в оригинальной статье Хинтона.
  //// То бишь, скорее всего, конкретных прорывных решений пока нет.
  
  А мы заметим вот что:
  при таком подходе латентные векторы многих соседних AE уровней 2 и выше
  будут содержать одинаковую информацию.
  //// Но по-разному закодированную. И это принципиально важно понимать.
  Действительно, посмотрим на четыре соседних региона, выделенных красным:
  
  ......
  
  Все эти регионы - части лица человека.
  Поэтому векторы AE третьего уровня (и всех уровней выше)
  должны будут содержать одинаковую информацию
  - что в этих регионах изображено лицо.
  И чем выше уровень, тем больше соседних AE будут иметь
  похожие латентные векторы.
  //// А вот это не факт. Это только предположение. И, скорее всего, неправильное.
  //// Точнее не так. Что-то общее, конечно, будет, но что именно
  //// - никто заранее сказать не может, а это равносильно тому,
  //// что "искать иголку в стоге сена".
  
  Таким образом, AE каждого уровня буду распадаться на "островки",
  //// О, вот это уже более "конструктивно".
  //// Но, скорее всего, и это "не совсем так",
  //// какая-то структура/связи между этими "островками", наверняка, будет.
  //// Вспоминаем о "магическом свойстве генерализации" нейросетей,
  //// а "мозаичное"/"островное" представление вряд ли можно считать "обобщением".
  внутри каждого из которых латентные векторы будут похожи.
  Проиллюстрировать это можно так (рисунок взят из оригинальной статьи):
  
  Рис. https://www.cs.toronto.edu/~hinton/absps/glomfinal.pdf
  
  Здесь каждый столбик - пять AE, соответствующих одному региону картинки.
  Нижний квадрат в столбце - AE первого уровня,
  второй снизу квадрат - AE второго уровня и т.д.
  Видно, что чем выше уровень,
  тем больше соседних AE имеют одинаково направленные векторы.
  У AE верхнего уровня стоят знаки вопроса,
  потому что векторы этих AE еще не стабилизировались
  в процессе обработки изображения.
  
  Мы видим, что при таким подходе автоэнкодеры образуют
  явную иерархическую структуру,
  которая очень напоминает деревья иерархии,
  которые мы обсуждали выше.
  Действительно, каждый "островок" AE - это одна вершина дерева.
  Вершины могут выражать разную по семантике информацию
  в зависимости от того, что именно изображено на картинке.
  //// Учитывая разнообразие "картинок" количество возможных
  //// "разбиений на острова" совершенно не определено.
  //// Но сама мысль, на мой взгляд, идет в нужном направлении
  //// вектор эмбеддинга можно и нужно рассматривать не как "множество",
  //// а как "множество подмножеств", причем всех возможных комбинаций,
  //// т.е. по формуле "це из эн по эм".
  //// Тогда этот подход, вполне возможно, заиграет новыми красками.
  И из разных картинок могут получиться разные по устройству деревья иерархии:
  AE каждого уровня будут по-разному собираться в "островки".
  
  Вот такая изящная идея пришла в голову Хинтону.
  Конечно, к ней есть много вопросов.
  Самые очевидные, на мой взгляд, эти:
  
   Как выбрать количество AE для каждого региона
   (т.е. как понять, сколько будет уровней абстракции). Почему именно 5?
  
   Как выбрать деление картинки на регионы? Какого размера они должны быть?
  
  Сам Хинтон рассуждает об этих и других вопросах.
  А еще он утверждает, что такое устройство модели имеет связь с биологией.
  Подробнее обо всем этом - в его статье.
  https://www.cs.toronto.edu/~hinton/absps/glomfinal.pdf
  
  ......
  
  Идея #4: Мысли Яна ЛеКуна
  
  Если Джефф Хинтон концентрировался именно на AI для обработки картинок,
  то Ян ЛеКун мыслит шире:
  его работа посвящена устройству AGI (Artificial General Intelligence).
  Опять же, эта работа - не полное техническое описание модели,
  а набор идей и рассуждений.
  
  В начале статьи ЛеКун приводит три главных, на его взгляд,
  вызова для современного AI:
  
   Как машины могут научиться представлять мир,
   делать предсказания и действовать, основываясь на наблюдениях?
   (Тут имеется в виду, что человек учится, в основном взаимодействуя с миром.
   Дать AI возможность учиться на основе реальных взаимодействий
   - слишком сложно и дорого.
   Хочется обучить AI, скармливая ему только наблюдения)
  
   Как научить машину рассуждать и планировать способами,
   основанными на вычислениях градиентов?
   (Тут имеется в виду, что современный AI в большинстве своем
   основан на нейросетях, которые обучаются с помощью градиентного спуска.
   Это накладывает на нейросети существенное ограничение:
   все функции должны быть дифференцируемы)
  //// Вроде какая-то есть техника преодоления этого барьера.
  //// Но это не точно. Нужно поискать уточнение.
  
   Как машины могут научиться воспринимать мир
   и строить планы действий иерархически,
   на нескольких уровнях абстракции и в разных временных масштабах?
  
  Получается, один из трех наибольших вызовов AI, по мнению ЛеКуна
  - это то, как заставить AI думать иерархически, структурно.
  
  В статье ЛеКун предлагает идеи для решения всех этих вопросов.
  Мы здесь рассмотрим только ту идею, которая связана с иерархией.
  Это модуль JEPA (Joint Embedding Predictive Architecture).
  Ян называет этот модуль "центральной частью" (centerpiece) свой работы.
  
  Устройство JEPA показано на картинке ниже:
  
  ......
  
  На вход модуль принимает два объекта - х и y.
  Они могут быть разных модальностей:
  например, картинка и звук.
  Далее х и y прогоняются каждый через свой энкодер.
  На выходе получаются два векторных представления х и y - s_x и s_y.
  Потом s_x подается на вход модулю Pred,
  задача которого - на выходе получить s_y с волной,
  который будет близок к s_y ("близок" по некоторой метрике).
  Грубо говоря, задача модуля Pred - научиться по s_x предсказывать s_y.
  Или, по-другому, ассоциировать s_x с s_y.
  
  .......
  
  Конечно, чтобы JEPA работал именно так, как описано выше,
  нужно грамотно выстроить процесс обучения и подобрать лосс-функции.
  О том, как устроено обучение JEPA, читайте в разделе 4.5 статьи ЛеКуна.
  https://openreview.net/pdf?id=BZ5a1r-kVsf
  
  .......
  
  Чтобы наделить модель возможностью создавать ассоциации
  и предсказания разной семантики и уровня,
  ЛеКун предлагает объединить несколько модулей JEPA в иерархию.
  Он назвал это Hierarchical JEPA (H-JEPA).
  Схематично это можно представить так:
  
  ......
  
  Общая идея здесь в том, что несколько слоев энкодеров (Enc1, Enc2, ...)
  выделяют из входных объектов информацию разного уровня.
  Enc1 выделяет low-level информацию,
  содержащую больше низкоуровневых деталей.
  Enc2 использует выход Enc1 и фильтрует его далее:
  выделяет из входа более абстрактную, общую информацию,
  содержащую меньше деталей.
  Далее можно навесить еще энкодеры: Enc3 и т.д.
  
  На основе выходов Enc1, Enc2, ... модули Pred1, Pred2, ...
  строят ассоциации/предсказания разного уровня.
  К примеру, Pred2 на основе выхода Enc2 строит
  более далекое во времени предсказание, чем предсказание Pred1,
  так как для более близких во времени предсказаний требуется больше деталей.
  Точно так же ассоциация, построенная с помощью Pred2,
  будет более абстрактной, чем с помощью Pred1.
  
  Подробнее о H-JEPA читайте в статье (раздел 4.6).
  Также в разделе 4.7 приводятся идеи,
  как адаптировать H-JEPA и всю идею планирования на реальный мир,
  где присутствует очень много uncertanty
  и никакие предсказания не могут быть стопроцентно верными.
  
  Вот такие мысли крутятся в голове (а теперь и в статье) Яна ЛеКуна.
  На мой взгляд, довольно лаконичная идея,
  сочетающая в себе и ассоциативное мышление, и иерархию, и планирование.
  //// Не скажу, что суть идеи я уловил.
  //// Кроме разве, что построения ассоциаций и каскадирования энкодеров.
  
  ......
  
  Сложность внедрения структуры в модели
  
  В заключение темы структуры в AI добавлю такую мысль:
  на мой взгляд, основная сложность внедрения структурного восприятия
  в модели машинного обучения - это то, как сделать структуру гибкой.
  
  Люди с рождения начинают выстраивать структурное восприятие мира,
  но структура любой сущности в нашей голове постоянно меняется.
  Когда-то люди считали, что атом - это неделимая сущность,
  то есть, это единичный структурный элемент.
  Теперь же мы знаем, что атомы тоже состоят из частей:
  протонов, электронов, и т.д.
  То есть, наше структурное представление о веществе изменилось:
  в нем появился еще один уровень вложенности.
  И таких новых уровней может появляться бесконечное число:
  элементы могут делиться на новые структурные части.
  
  Или, еще интереснее:
  мы можем делить один и тот же элемент на структурные части по-разному.
  //// Вот именно. Причем самое характерное, что такие "деления"
  //// происходят тогда, когда нужно,
  //// а не изначально, при первом знакомстве с объектом.
  //// Изначально устанавливаются какие-то отдельные ассоциативные связи,
  //// а вовсе не "жесткий" и "законченный" граф.
  
  .......
  
  И вот то, как дать возможность нейросетям оперировать структурой
  так же гибко - это, на мой взгляд, основная сложность.
  Выше мы рассматривали несколько идей,
  как наделить модели структурным восприятием,
  но, кажется, ни одна ни из них не обладает достаточной гибкостью.
  В графовой нейросети количество вершин четко задано,
  больше появиться не может.
  В идее Хинтона четко заданы количество уровней автоэнкодеров
  и деление картинки на области.
  В модели ЛеКуна может быть ограниченное количество модулей JEPA,
  а один модуль отвечает за ассоциации определенного уровня.
  Как развить эти идеи, чтобы структура стала гибче,
  на мой взгляд, открытый вопрос.
  //// Типовой прием ТРИЗ - переход в другое пространство,
  //// а именно научиться работать не со структурой нейросети,
  //// а со структурой "пространства эмбеддингов".
  
  Заключение
  
  В этой статье мы рассмотрели одно из главных отличий современного AI
  от человека - структурное мышление.
  Мы поняли, как именно структура помогает человеку воспринимать
  и взаимодействовать с миром и рассмотрели основные проблемы AI,
  которые возникают от отсутствия понимания им структуры.
  Ну и разобрали несколько идей,
  как эту структуру в нейросеть внедрить.
  
  Разумеется, существует еще много идей того,
  как заставить AI воспринимать объекты более структурно.
  В статье я описала те, что привлекли мое внимание,
  и, на мой взгляд, являются наиболее гибкими и "общими",
  т.е. могут быть применены к широкому классу задач,
  и поэтому обладают хорошим потенциалом.
  В разделе "Литература" ниже вы найдете еще несколько ссылок на работы,
  в которых предлагаются механизмы для внедрения структурного знания
  в модели машинного обучения.
  
  Также стоит сказать такие две вещи:
  
   структурное восприятие мира - далеко не единственная преграда,
   отделяющая нас от создания AGI.
   Не менее интересная тема, к примеру - проблема causality vs correlation,
   т.е. Как научить AI оперировать причинно-следственными связями.
   Здесь проблемы начинаются прямо с порога:
   мы не можем даже дать нормального определения тому,
   что такое causality.
   Но это тема уже совершенно иной статьи =)
  
   описанные выше идеи - не единственные на тему того, как создать AGI.
   Есть, к примеру, не менее интересный подход embodied intelligence.
  https://link.springer.com/chapter/10.1007/978-3-662-43505-2_37
   Но тема этой статьи - не AGI, а структурное мышление,
   поэтому другие идеи AGI мы не рассматривали.
  
  На этом все, я уже и так слишком много слов написала. Спасибо за прочтение!
  Надеюсь, было интересно.
  
  Благодарности
  
  Выражаю огромную благодарность Александру Петюшко за вычитку статьи,
  ценные замечания и правки.
  
  Литература
  
  Ссылки на научные работы по структурному мышлению у людей,
  которые подкрепляют идеи из первой части статьи:
  
  ......
  
  //// Из комментариев.
  
  maslyaev
  16 сен 2022 в 10:26
  
  Ну здрасте, приехали.
  Ещё совсем недавно, каких-то 20 лет назад,
  отличием человеческого ума от ИИ было как раз то,
  что мы воспринимаем вещи как единое целое,
  а для ИИ (был тогда представлен экспертными системами, базами знаний,
  системами логического вывода) всё нужно разложить на структуры.
  
  По ходу дела, просто память у ребят короткая.
  -2
  
  ......
  
  CyaN
  21 сен 2022 в 15:51
  
  Иерархия это частный и очень узкий случай графа.
  0
  
  ......
  
  //// Конец цитирования.
  
  Безусловно, данный достаточно объемный материал,
  стоит рассматривать не как "сборник готовых рецептов",
  а направления поиска таких "рецептов".
  
  Во всяком случае для меня этот текст стал той "соломинкой",
  которая сподвигла и на работу по данному модулю,
  и подтолкнула мысль при проработке вопросов,
  связанных со структурой значений элементов эмбеддинга,
  "Металоция неведомого. Модуль Э. Эмбеддинги."
  а потом и проработки концепции битовых нейронных сетей (БНС).
  
  Так что я выражаю свою благодарность автору за материал,
  оказавшийся для меня весьма полезным, хоть и "немного" дискуссионным.
  Но это и к лучшему.
  Говорят, "в спорах рождается истина".
  До "истины", конечно, еще очень далеко,
  но хотя бы направление поиска можно как-то "оконтурить".
  
  
  ========
  
  23.03.2024 11:13
  
  Inductive bias в нейронных сетях.
  В оглавление.
  
  Заинтересовал меня термин "inductive bias" применительно к структурам нейросетей,
  и вот какой материал удалось раскопать в архивах Хабра:
  
  "Inductive bias и нейронные сети".
  Автор: Atmyre (Татьяна Гайнцева)
  https://habr.com/ru/articles/591779/
  26 ноя 2021 в 12:21
  
  //// Начало цитирования.
  
  В этой статье я расскажу, что такое inductive bias,
  зачем он нужен и где встречается в машинном обучении.
  Спойлер: везде.
  Любая нейросеть имеет inductive bias
  (даже та, что в человеческом мозге, хе-хе)
  
  Также вы узнаете:
  
   почему inductive bias - это очень хорошо
  
   способы внедрить inductive bias в модели машинного обучения
  
   какой inductive bias в сверточных нейросетях
   и как успех архитектуры Image Transformer связан с inductive bias
  
  Ну что, поехали:
  
  Что такое inductive bias
  
  Я намеренно не буду переводить термин "inductive bias" на русский язык:
  общепринятого перевода нет, а все разумные варианты перевода,
  на мой взгляд, не передают суть термина.
  К тому же, в профессиональной среде все используют англицизм.
  
  У термина inductive bias в литературе есть много определений.
  Все они - неформальные.
  Формального определения вообще не существует,
  а наиболее строгое из возможных опирается на формальную математическую логику.
  Мы здесь ограничимся следующим определением:
  
  Inductive bias - это априорные знания о природе данных,
  которые человек некоторым образом вкладывает в модель машинного обучения.
  //// Наверно, не только о "природе данных",
  //// но и ожидаемых способах их представлений/обработки.
  //// Причем, тут могут быть как желаемые/явные/"полезные" "подсказки",
  //// так и неявные и, соответственно, "нежелательные"/"паразитные" "артефакты".
  
  Чтобы лучше понять суть inductive bias, рассмотрим примеры:
  
   Модель линейной регрессии.
   Линейная регрессия строится в предположении,
   что между целевой переменной и зависимыми переменными (признаками)
   существует линейная зависимость.
   В модель как бы "вложены" знания о том, что данные имеют линейную природу.
   Из-за этого ограничения линейности модели
   линейная регрессия плохо обучается под любые данные,
   в которых целевая переменная от признаков зависит не линейно (см. рис ниже).
   Это предположение о линейной связи между признаками о ответом
   - и есть ее inductive bias
   (точнее, один из ее inductive bias'ов, как мы увидим далее)
  
  Рис. Ось Х - значение признака, ось Y - значение целевой переменной.
  Видно, что зависимость Y от Х нелинейна.
  Из-за этого модель линейной регрессии,
  которая пытается построить линейную зависимость между X и Y,
  будет очень плохо описывать эти данные.
  
   Модель K ближайших соседей (k-nearest neighbours).
   Эта модель работает в предположении "компактности",
   то есть "значение целевой переменной для неизвестного объекта
   однозначно определяется значениями целевой переменной
   для k ближайших (в некотором смысле) к нему объектов".
   Это допущение - inductive bias алгоритма k ближайших соседей.
   В модель KNN вложены знания о том,
   что ответ для любого объекта должен быть вычислен
   только на основе того, какие значения ответов были
   у ближайших к этому объекту элементов обучающей выборки.
  
  Рис. Иллюстрация классификации объекта (зеленая точка) алгоритмом KNN.
  Синие точки - объекты одного класса, оранжевые - объекты другого класса.
  При k=3 зеленая точка будет отнесена к "голубому" классу.
  
   Нелинейная регрессия:
   пусть у меня есть данные, полученные из некоторого физического эксперимента.
   Пусть в данных две переменные - x и y.
   Я хочу построить модель машинного обучения,
   которая могла бы по переменной x предсказывать значение y.
   Пусть я знаю из теоретической физики,
   что уравнение зависимости y от x должно выглядеть определенным образом:
   в виде функции y= w_1 \exp(w_2 x) + w_3.
   Тогда мне остается обучить модель машинного обучения
   находить подходящие значения коэффициентов w_1w_2 и w_3
   на основании моих данных с датчика.
   Я могу сделать это, например, с помощью градиентного спуска (см. рис).
   Это знание о том, что модель машинного обучения, описывающая наши данные,
   должна иметь вид определенной функции y= w_1 \exp(w_2 x) + w_3
   и есть inductive bias.
  
  Рис. Иллюстрация нахождения оптимальных коэффициентов функции y = w1*exp(w2*x) + w3
  для описания данных (голубые точки).
  
  Итак, подведем итог:
  inductive bias - это некоторые априорные допущения о природе данных,
  которые человек "передает" модели машинного обучения,
  накладывая ограничения на то,
  в каком виде модель будет искать зависимость значения целевой переменной
  от входящих данных.
  
  Здесь мы рассмотрели довольно тривиальные примеры inductive bias
  - те, которые достигаются наложением ограничений на сам вид модели.
  Вообще "передать" модели априорные знания
  (наделить модель inductive bias)
  можно разными способами:
  не только с помощью определенного устройства архитектуры модели.
  Об этом мы поговорим ниже.
  А пока что давайте заметим, что...
  
  Без inductive bias не обойтись
  
  Из примеров о линейной регрессии и KNN может показаться,
  что inductive bias - плохая штука.
  Ведь это ограничивает модели!
  Inductive bias линейной регрессии не позволяет ей хорошо обучаться под данные,
  которые не имеют линейной зависимости между целевой переменной и признаками.
  Inductive bias алгоритма KNN не позволяет ему хорошо работать на данных,
  в которых целевая переменная объекта
  не однозначно определяется значениями целевых переменных "близких" элементов.
  Одни недостатки!
  Можно ли сделать модель совсем без ограничений?
  
  Но без inductive bias модель машинного обучения существовать не может.
  Вот почему:
  
  Цель модели машинного обучения - используя обучающую выборку данных,
  вывести общее правило,
  по которому можно будет выдавать ответ на любой элемент из доменной области
  (а не только на элементы из обучающей выборки).
  //// Это только "надежда и вера" в "магическую генерализацию" нейросетей,
  //// а по факту имеется некая "корреляция" с таким поведением.
  //// Причем, "корреляция" именно из-за явных и неявных inductive bias модели.
  Пример задачи - имея 100.000 изображений лиц людей,
  научиться решать задачу распознавания лиц
  и уметь распознавать лица любого человека в мире.
  Этот процесс - выведение общего правила для всех элементов домена
  на основе ограниченного числа наблюдений -
  называется генерализацией (обобщением) модели машинного обучения.
  
  Рис. https://bit.ly/31bvCvP
  
  Такая генерализация невозможна без наличия inductive bias у модели.
  Почему?
  Потому что обучающая выборка всегда конечна.
  Она точно не покрывает все возможные в реальном мире наблюдения.
  А из конечного набора наблюдений,
  не делая совсем никаких дополнительных предположений о данных,
  вывести общее правило можно бесконечным числом способов.
  Ведь, в целом, значение целевой переменной
  для элементов вне обучающей выборки может быть каким угодно.
  
  Inductive bias - это дополнительная информация о природе данных для модели;
  способ показать модели, "в какую сторону думать",
  в каком виде искать решение,
  по какому принципу строить алгоритм генерализации.
  //// Не совсем так.
  //// Модель не "строит алгоритмы", а подбирает более-менее подходящие эвристики,
  //// причем в зависимости от последовательности обучающих примеров,
  //// "эвристики" могут быть сильно разные из "бесконечного числа" возможных.
  Он позволяет модели приоритизировать один способ генерализации над другим.
  Он загоняет модель в рамки при выборе метода генерализации,
  внутри которых практически все варианты генерализации
  будут достаточно адекватные.
  Модель становится как бы "сдвинута" (biased)
  в сторону решения определенного вида.
  
  Рис. Иллюстрация того, как inductive bias показывает модели,
  "в какую сторону думать"
  
  Например, inductive bias линейной регрессии заставляет модель
  из всех вариантов функций, описывающих данные,
  выбирать ту, которая имеет линейную природу.
  А inductive bias модели из третьего примера говорит модели,
  что искать зависимость ответа от входных данных
  нужно в виде определенной функции,
  и модели остается подобрать для этой функции подходящие параметры.
  
  И при выборе модели для обучения для решения определенной задачи
  нужно выбрать такую модель,
  чей inductive bias лучше проходит под природу данных
  и лучше позволит решить эту задачу.
  Вообще говоря, изобретение новых архитектур моделей машинного обучения
  (например, нейросетей)
  и состоит в том, чтобы изобрести такую архитектуру,
  которая будет иметь нужный inductive bias для решения конкретной задачи.
  //// Тоже не совсем так.
  //// Нормальное изобретательство опирается хоть на какую-то теоретическую базу,
  //// а вот в области "архитектуростроения" нейросетей "правит бал",
  //// откровенный "метод научного тыка",
  //// правда, с опорой на какие-то удачные и опробованные решения.
  
  Итак, мы поняли, что inductive bias - хорошая и полезная штука.
  Давайте поговорим о том, какими способами
  можно внедрить inductive bias в модель.
  Мы увидим, что манипулирование устройством архитектуры модели
  - лишь один из многих способов внедрения inductive bias.
  
  Способы внедрить inductive bias в модель.
  
  Выше мы рассматривали примеры inductive bias моделей линейной регрессии и KNN.
  У обеих этих моделей inductive bias "встроен" в саму архитектуру модели
  - в сам механизм того, как эти модели получают значение целевой переменной
  на основе входных данных.
  Давайте убедимся, что внедрить в модель априорные знания
  о данных можно и другими способами.
  Для этого рассмотрим нейронные сети и inductive bias в них.
  
  Прежде всего, каждая нейронная сеть обладает архитектурой (строением).
  Архитектура нейросети - это то, какие слои в ней присутствуют
  (полносвязные, сверточные, рекуррентные, ...),
  сколько нейронов в каждом слое, какая функция активации на каждом из слоев,
  используется ли dropout и attention и т.д.
  
  Архитектура нейросети описывает вид функций,
  которые может выражать нейросеть.
  Да, нейронная сеть по своей сути - это просто функция,
  описывающая зависимость выхода от входа,
  как и линейная регрессия или функция y = w1*exp(w2*x) + w3 из третьего примера.
  Только нейросеть - сильно более сложная функция,
  с большим числом обучаемых параметров и нелинейностей.
  Отсюда понятно, что архитектура нейросети - это уже ее inductive bias.
  
  Более того, каждый вид слоев сетей - сверточный, полносвязный, рекуррентный -
  имеют свой inductive bias, обусловленный строением этих слоев.
  Причем их inductive bias помогают им обрабатывать данные того вида,
  для которых они предназначены:
  сверточному слою - изображения,
  рекуррентному - данные, представленные в виде последовательностей.
  Об inductive bias сверточного слоя мы поговорим ниже.
  
  Далее, алгоритм обучения нейросети тоже накладывает на модель ограничения.
  Мы обучаем нейросеть с помощью алгоритма обратного распространения ошибки
  (backpropagation),
  а не с помощью какого-либо другого метода.
  И это тоже внедряет в модель некоторые знания о том,
  как должен быть устроен предпочтительный способ генерализации.
  А именно: алгоритм backpropagation минимизирует
  среднюю ошибку модели на обучающей выборке
  с точки зрения некоторой метрики качества.
  То есть заставляет модель из всех возможных способов генерализации
  выбирать такой, который будет показывать
  лучшее значение некоторой метрики в среднем на обучающей выборке.
  //// Вот тут хочется чуть не криком кричать,
  //// да не "выбирает модель" что-то, а ее "гнут через колено",
  //// чтобы хоть как-то улучшить "метрику качества",
  //// даже если при этом получаются какие-то "неприятные артефакты".
  
  Тут становится понятно, что выбор learning rate, алгоритма оптимизации
  (Adam, RMSProp, ...) - все это тоже вносит вклад в inductive bias:
  заставляет модель искать способ генерализации определенным способом.
  
  Далее: данные. Через обучающие данные тоже можно внести вклад в inductive bias.
  (то есть, через данные передать модели знания о данных, хе-хе)
  
  Пример: пусть мы обучаем нейросеть на задачу
  классификации изображений яблок и груш.
  И пусть на всех картинках из обучающей выборки яблоки и груши
  расположены ровно вертикально:
  
  ......
  
  Обучив нейросеть на такой выборке, мы, скорее всего, получим модель,
  которая будет плохо классифицировать фрукты, лежащие на боку.
  Это легко объяснимо:
  при обучении модель не видела ни одного фрукта,
  расположенного не вертикально,
  и просто не научилась их классифицировать.
  Мы хотим избежать такого и заставить модель выбрать тот способ генерализации,
  при котором она смогла бы хорошо классифицировать фрукты,
  повернутые на любое число градусов.
  Для этого мы можем изменить обучающую выборку:
  аугментировать ее так, чтобы она содержала изображения повернутых фруктов:
  
  ......
  
  При обучении на таком аугментированном датасете
  модель будет вынуждена выбрать тот способ генерализации,
  при котором хорошо сможет классифицировать не только вертикальные,
  но и повернутые картинки фруктов.
  //// Модель не "выберет", а "настроится" на обучающую выборку
  //// и ... "метрику качества". Это ведь тоже inductive bias.
  //// И иногда самый существенный.
  
  Таким образом мы внедрили inductive bias в нейросеть
  с помощью аугментации датасета.
  Теперь обучающие данные и алгоритм обучения нейросети (backpropagation)
  устроены так, что модель в процессе обучения "понимает",
  что данные (картинки фруктов) бывают
  не только расположенными строго вертикально,
  но и повернутыми на произвольное число градусов.
  И учится одинаково хорошо классифицировать фрукты, повернутые по-разному.
  
  Обратите внимание, что нужный inductive bias
  - понимание, что картинки фруктов бывают не только вертикальные -
  появляется у модели не только благодаря наличию повернутых
  на разное число градусов картинок фруктов в обучающем датасете,
  но и благодаря определенному устройству процесса обучения нейросети.
  Backpropagation заставляет нейросеть учиться
  одинаково хорошо классифицировать все картинки из обучающего датасета,
  и поэтому нейросеть учится классифицировать и повернутые фрукты в том числе.
  //// Но такое обучение не обеспечивает "понимание",
  //// что есть "груша" сама по себе как "объект",
  //// и есть ориентация "объекта" самого по себе.
  //// И это опять же результат используемого inductive bias
  //// в виде и структуры нейросети и метода ее обучения.
  
  Это важное замечание для понимания сути inductive bias,
  потому как чаще всего когда говорят о внедрении inductive bias в нейросети,
  упоминают только манипуляции с архитектурой нейросети
  и/или обучающими данными.
  Так происходит, потому что все нейросети по умолчанию
  обучаются с помощью backpropagation
  и о роли этого алгоритма во внедрении inductive bias в нейросеть
  можно умолчать.
  Однако без определенного устройства алгоритма обучения
  манипуляции с обучающими данными могли бы не иметь желаемого эффекта.
  //// Здесь полностью согласен.
  //// Только хочу добавить, что понимание этого момента
  //// требует разработки каких-то еще алгоритмов обучения,
  //// или хотя бы понимания того как можно более умно использовать backpropagation.
  
  Проиллюстрируем это на примере:
  представьте, что мы поменяли алгоритм обучения нейросети.
  Пусть мы вместо backpropagation используем следующий алгоритм обучения сети:
  
   100 раз выбери случайные значения параметров нейросети;
  
   для каждого значения параметров посчитай значение
   метрики качества на тестовом датасете;
  
   "обученная" нейросеть - это нейросеть с параметрами,
   для которых получено лучшее значение метрики на тестовом датасете
  
  Будет ли при таком способе обучения достигаться хорошее качество нейросети
  в задаче классификации?
  А сможем ли мы утверждать, что при таком способе обучения
  и добавлении в обучающие данные повернутых картинок фруктов
  сеть будет хорошо работать на повернутых изображениях фруктов?
  Кажется, что нет.
  При таком способе обучения никакие махинации с обучающими данными
  особо не повышают вероятность улучшения работы алгоритма.
  
  Более того:
  устройство архитектуры тоже играет роль в том,
  будут ли махинации с датасетом иметь нужный эффект.
  Например, какой бы inductive bias вы ни вложили в данные и обучающий алгоритм,
  вы никогда не научите линейную регрессию хорошо решать
  задачу распознавания лиц.
  
  Таким образом, внедрение любого inductive bias в модель машинного обучения
  опирается на определенные характеристики архитектуры модели,
  обучающего алгоритма и обучающих данных.
  Все это совместно влияет на то,
  как алгоритм выбирает способ генерализации и какой inductive bias получает.
  
  Иногда случается и так, что те ограничения,
  которые человек наложил на модель в целях получить некий inductive bias,
  имеют не тот эффект, который ожидался.
  Это случается потому, что человек не учел всех особенностей строения модели,
  данных и способа ее обучения:
  чаще всего это сделать просто невозможно.
  //// Особенно это относится к такому inductive bias как backpropagation.
  Об этом мы поговорим в разделе,
  где обсудим inductive bias сверточной нейросети.
  
  Далее в этой статье мы также будем предполагать,
  что при обучении нейросетей используется алгоритм backpropagation
  и будем умалчивать о его роли в формировании inductive bias.
  //// Очень жаль. Проблемы и следствия, порождаемые бездумным использованием
  //// backpropagation заслуживают отдельной и наверно очень объемной статьи.
  //// Жаль, что пока не могу найти такой развернутый материал,
  //// по-видимому, стоит завести специальный модуль по этому вопросу.
  Мы будем говорить об inductive bias,
  которые модель получает из определенного устройства архитектуры
  и обучающих данных.
  
  Итак, мы поняли, что внедрить inductive bias в модель
  можно произвольным способом
  - манипуляциями с архитектурой модели, данными, способом ее обучения.
  Главное - придумать, каким из возможных способов
  передать модели нужную вам информацию о данных,
  чтобы она получила желаемый inductive bias.
  
  Inductive bias и размер обучающей выборки
  
  Выше мы обсудили, что обучающие данные также являются
  способом внедрения в модель inductive bias .
  Заметим теперь, что чем больше и разнообразнее обучающая выборка,
  тем больше знаний о природе данных модель получает во время обучения.
  А значит, тем меньше вероятность модели выбрать "плохой" способ генерализации,
  который будет плохо работать на данных вне обучающей выборки.
  
  Короче говоря, чем больше данных, тем лучше обучится модель.
  И наоборот: чем меньше данных,
  тем больше вероятность модели выбрать плохой способ генерализации.
  
  Вы, наверное, знаете,
  что если обучающая выборка мала, нейронные сети часто переобучаются.
  Например, при решении задачи классификации изображений кошек и собак
  иногда обращают внимание на фон, а не на самих животных.
  Переобучение модели - не что иное,
  как выбор неудачного способа генерализации
  из-за отсутствия достаточно информации в обучающих данных.
  Чтобы помочь модели не переобучиться,
  отсутствующие в датасете "знания" о природе данных
  нужно передать ей другим способом
  - например, через внедрение более сильного inductive bias
  в архитектуру модели путем создания больших ограничений
  на устройство модели.
  
  Отсюда вывод: чем меньше обучающая выборка и сложнее задача,
  тем более сильный inductive bias требуется вложить в устройство модели
  для успешного обучения модели.
  Иными словами, тем большие ограничения нужно наложить на модель,
  чтобы она не "ушла сильно в сторону".
  
  Кстати, если вы спросите, почему люди, в отличие от нейросетей,
  могут быстро обучиться на задачу классификации кошек и собак,
  имея всего десяток картинок в обучающей выборке
  - это потому, что у людей есть inductive bias:
  мы знаем, что на картинке есть фон, а есть объект,
  и при классификации картинок нужно обращать внимание только на сам объект.
  А нейросеть до обучения ни о каких "фонах" и "объектах" не знает
  - ей просто дают разные картинки и просят научиться их отличать.
  
  Давайте увидим работу принципа
  "чем меньше данных - тем больший нужен inductive bias в архитектуре" на примере.
  Для этого рассмотрим две архитектуры нейросетей для работы с изображениями:
  сверточные нейросети и Visual Transformer.
  Поймем, как их успех связан с inductive bias
  и в чем заключается различие их принципа обработки картинок.
  
  Inductive bias сверточного слоя
  
  Рассмотрим сверточный слой (convolution).
  
  Рис. Принцип работы свертки
  https://brandinho.github.io/mario-ppo/
  
  Inductive bias сверточного слоя
  - предположение компактности и нечувствительности к переносу
  (translation invariance).
  Фильтр свертки устроен так, что за один раз захватывает
  компактную часть всего изображения
  (например, квадрат 3х3 пикселя, как показано на гифке),
  не обращая внимания на дальние пиксели изображения.
  Также в сверточном слое один и тот же фильтр используется
  для обработки всего изображения
  (как на гифке - один и тот же фильтр обрабатывает все квадраты 3х3 изображения).
  
  Эти inductive bias помогают сверточным нейросетям (CNN)
  обрабатывать изображения так, как их "обрабатывает" человек:
  предположение компактности отвечает человеческому представлению о том,
  что каждый объект на изображении расположен компактно,
  т.е. в определенной области изображения,
  а не разреженно по всей площади картинки;
  а нечувствительность к переносу заставляет нейросеть
  одинаково обрабатывать один и тот же объект на изображении
  вне зависимости от того, в какой части картинки он находится (см. рис. ниже):
  
  Рис. Объект на картинке (собака) расположена компактно.
  Плюс, обрабатывая обе картинки сверточной нейросеть,
  мы хотим получить один и тот же результат
  (например, ответ в задаче классификации, что на картинке - собака).
  
  Получается, сверточный слой устроен так,
  что его inductive bias отлично соотносится с природой изображений и объектов на них,
  поэтому сверточные нейросети так хороши в обработке картинок.
  
  Какие inductive bias у других слоев:
  рекуррентного, полносвязного и т.д.,
  предлагаю подумать самостоятельно =)
  А мы упомянем о таком явлении,
  как "скрытый inductive bias" (implicit inductive bias):
  
  Скрытые inductive bias
  
  Часто бывает так, что устройства нейросетей или обучающих данных
  порождают не только нужные inductive bias,
  но и "скрытые" - такие, которые человек не хотел сознательно вкладывать в модель
  и которые сложно выявить при первом взгляде на устройство модели.
  Исследователи проводят много экспериментов с нейросетями,
  пытаясь выявить наличие и суть таких скрытых эффектов.
  
  Пример со свертками:
  сверточные нейросети строились так, чтобы наделить их двумя inductive bias,
  которые описаны выше:
  предположением компактности и нечувствительности к переносу.
  Эти bias - те, которые хотел вложить в сверточные сети человек,
  и они явно порождены самой структурой операции свертки.
  Но оказалось, что кроме этих двух inductive bias архитектура сверток
  порождает и другие, которые не так просто выявить,
  просто взглянув на то, как работает свертка.
  
  Например, не так давно одно исследование показало,
  что у сверток есть inductive bias,
  касающийся текстуры изображений:
  оказывается, сверточные сети устроены так,
  что при обработке картинок обращают больше внимания на текстуры,
  а не на формы объектов.
  Это пример вредного inductive bias:
  мы бы хотели, чтобы было наоборот:
  чтобы нейросеть делала выводы не на основе текстур,
  а на основе форм предметов.
  Из-за этого "перекоса" в сторону текстур
  сверточные сети плохо распознают картинки,
  на которых текстуры объекта сильно отличаются от текстур тех картинок,
  что были в обучающей выборке.
  
  Чтобы избавиться от такого нежелательного поведения сверток,
  нужно внедрить в нейросеть еще один inductive bias,
  который заставит модель обращать больше внимания на формы объектов,
  а не на их текстуры.
  Такой inductive bias внедряется через изменение обучающих данных,
  а не архитектуры модели.
  Изображения из тренировочного датасета аугментируются так,
  чтобы датасет содержал больше изображений одинаковой формы
  (например, картинок слонов),
  но с разными видами текстур (см. рис. ниже)
  
  Рис. https://arxiv.org/pdf/1811.12231.pdf
  Пример аугментации изображений тренировочной выборки,
  чтобы уменьшить влияние текстуры изображений на работу CNN.
  Слева - исходное изображение;
  справа - аугментированные версии левого изображения с разными текстурами,
  но одной формой.
  
  //// А интересно, как такой нежелательный эффект - зависимость от текстуры -
  //// можно устранить "архитектурными приемами"?
  //// Представляется, что это было бы очень полезные "приемчики"
  //// в самых разных задачах.
  
  Это еще один пример того,
  как разные inductive bias могут внедряться в модель посредством разных техник
  - не только с помощью изменения архитектуры модели,
  но и манипуляцией тренировочными данными.
  А также пример того, что наличие любых inductive bias
  зависит не от отдельного компонента - архитектуры модели,
  устройства данных или алгоритма обучения - а от всех сразу.
  
  Понимание, какие скрытые inductive bias есть у модели,
  помогает лучше понять, как именно модель обрабатывает данные
  и сделать модель более эффективной,
  если выявленные скрытые inductive bias окажутся вредными.
  
  В английском языке "скрытые" inductive bias называются implicit.
  А те, которые человек осознанно вложил в модель - explicit.
  
  Итак, мы выяснили, как inductive bias сверточных слоев
  помогает CNN эффективно обрабатывать изображения.
  Рассмотрим другую архитектуру нейросетей для работы с картинками
  - Visual Transformer - и поймем,
  как ее недавний успех связан с inductive bias.
  
  Visual Transformer и inductive bias
  
  Возможно, вы слышали об архитектуре Visual Transformer.
  Это НЕсверточная архитектура нейросетей для обработки изображений,
  которая показывает лучшие результаты, чем сверточные сети,
  на некоторых задачах:
  например, на задаче классификации картинок из датасета JFT-300M.
  В этом наборе данных 300 миллионов изображений.
  
  Модель Visual Transformer основана на той же идее,
  что и архитектура Transformer из области обработки естественного языка (NLP):
  на механизме Attention.
  По сути, Visual Transformer - это адаптация модели Transformer для языка
  на область картинок.
  Модель была предложена сравнительно недавно - в 2020 году -
  но уже завоевала популярность,
  получила широкое применение в задачах и считается "убийцей сверток".
  Подробно об архитектуре читайте в оригинальной статье.
  
  Мы же поговорим о том, почему Visual Transformer работает лучше, чем свертки,
  правда ли, что свертки больше не нужны и при чем тут inductive bias:
  
  Так как у Visual Transformer нет сверток,
  у этой архитектуры нет и inductive bias,
  которые есть у сверточных нейросетей.
  При этом, конечно, некоторые inductive bias у Transformer все же есть
  - как мы убедились выше, совсем без них нейросеть сделать нельзя.
  
  Visual Transformer почти полностью основан на механизме attention (внимания),
  поэтому модель имеет те inductive bias, которые есть у attention.
  Один из них - сдвиг в сторону простых функций.
  Как и у сверток и всех нейросетей в целом,
  у трансформеров есть скрытые inductive bias,
  и все они пока неизвестны:
  ведутся исследования для их выявления.
  Вот, например, ссылка на одно такое.
  https://arxiv.org/pdf/2106.13122.pdf
  В общем, предстоит еще много исследований трансформеров,
  но что можно сказать точно
  - inductive bias трансформера намного проще,
  чем у сверточных нейросетей,
  они накладывают меньше ограничений на модель.
  //// Т.е. пока, на момент написания статьи,
  //// список inductive bias для трансформеров реально неизвестен.
  
  Меньшие ограничения на модель дают Visual Transformer
  больше возможностей для выбора лучшего способа генерализации при обучении.
  И на очень больших датасетах типа JFT-300M трансформеры
  действительно показывают лучшие результаты при обучении, чем свертки.
  В JFT-300M достаточно изображений,
  чтобы нейросеть с очень легким inductive bias хорошо обучилась решать задачу,
  и не выбрала "неправильный" способ генерализации.
  
  Но вот на датасетах размером поменьше (как ImageNet)
  Visual Transformer проигрывает классическим сверткам.
  На графике ниже представлены результаты нескольких моделей,
  обученных на разных датасетах:
  ImageNet (~1.2 млн изображений), ImageNet-21k (~15 млн изображений)
  и JFT-300M (~300 млн изображений).
  
  BiT - сверточная архитектура на основе ResNet,
  ViT - архитектура Visual Transformer.
  На графике видно, что трансформеры начинают показывать результаты лучше сверток
  только на больших датасетах:
  
  https://arxiv.org/pdf/2010.11929.pdf
  
  Результаты моделей BiT (ResNet-based) и ViT (Visual Transformer)
  на датасетах разных размеров.
  Внутри серой области заключены результаты различных моделей BiT.
  Видно, что ViT начинает выигрывать у BiT
  только при достаточно большом размере датасета
  
  Другими словами, если у вас есть огромный датасет для обучения сети,
  Transformer - ваш выбор,
  однако для обучения на небольших датасетах лучше выбрать свертки.
  
  Преимущество Visual Transformer над свертками на больших датасетах
  имеется ровно потому,
  что у архитектуры Visual Transformer нет inductive bias,
  какие есть у сверточного слоя.
  Здесь мы наблюдаем подтверждение того,
  что чем меньше обучающий датасет,
  тем более сильный inductive bias нужен для успешного обучения модели.
  Но верно и обратное:
  чем больший датасет есть у нас в распоряжении,
  тем меньший inductive bias требуется
  и тем лучше модель может обучиться под задачу
  (потому что у нее меньше ограничивающих bias'ов,
  а величина датасета позволяет получить всю нужную информацию
  для хорошей генерализации из него)
  
  А также убеждаемся, что inductive bias сверточных нейросетей
  действительно сильно помогает для решения задач,
  связанных с изображениями.
  
  Свертки + Transformer
  
  Выше мы разобрали два подхода к обработке картинок нейросетями:
  с помощью сверточных слоев и архитектуру Transformer.
  Оба подхода имеют преимущества и недостатки:
  у сверток сильный inductive bias,
  но они хорошо показывают себя на небольших датасетах,
  а трансформеры могут показывать лучшие результаты в обработке изображений,
  но им для этого требуется очень много данных.
  
  Ребята из Facebook (ой, Меты, извините) решили использовать
  преимущества обоих подходов:
  совместить архитектуры Transformer и CNN.
  Гибридная модель ConViT сможет обрабатывать картинки почти так же хорошо,
  как и Transformer,
  при этом требуя меньше данных для обучения.
  Вот статья с описанием предлагаемой модели и рассуждениями,
  почему это должно сработать (там есть слова inductive bias!)
  
  Надеюсь, такое погружение в устройство сверток и трансформеров
  помогло глубже осознать понятие inductive bias =)
  
  Заключение
  
  Итак, сделать модель без inductive bias в принципе невозможно,
  так как уже само устройство модели вносит ограничения в ее возможности
  и порождает inductive bias.
  Да и делать такую модель не нужно:
  как мы увидели из статьи, inductive bias часто помогает в решении задач.
  Вопрос лишь в том, насколько сильный нужен inductive bias
  для решения конкретной задачи,
  насколько он поможет решить нужную задачу
  и как создать архитектуру модели, которая породит нужный inductive bias
  (ну и вместе с этим не породит много вредных скрытых bias).
  
  Главная задача при создании архитектуры модели машинного обучения
  - наделить модель таким inductive bias,
  чтобы он помогал модели обучиться решать поставленную задачу
  (как в случае сверток),
  а не мешал. Собственно, в изобретении таких inductive bias
  и заключается задача поиска новых эффективных архитектур нейросетей.
  
  Надеюсь, эта статья помогла вам в понимании того,
  что такое Inductive bias и почему он полезен,
  а не вреден =)
  Вот еще несколько полезных ссылок по теме:
  
  Литература:
  
  ......
  
  //// И самое интересное из комментариев.
  
  aarmaageedoon
  27 ноя 2021 в 11:42
  
  Отличная статья, спасибо.
  
  Очень ценно замечание,
  что несмотря на способность нейросетей аппроксимировать
  сколь угодно сложные функции,
  их архитектура может быть заточена под определенные условия,
  что в свою очередь также вызывает смещение моделей.
  Как это ускользало от меня.
  0
  
  ......
  
  Alexey2005
  27 ноя 2021 в 17:14
  
  Основная проблема backpropagation в том,
  что этот метод требует дифференцируемой loss-функции.
  В итоге даже очень простые правила запихнуть в loss-функцию
  оказывается крайне сложно.
  
  Допустим, мы хотим натренировать наш трансформер так,
  чтобы в выдаче отсутствовали какие-то словосочетания.
  Вот каждое слово по отдельности присутствовать могло,
  а в указанной комбинации - нет.
  
  И вот тут возникает проблема таких масштабов,
  что проще оказывается применить фильтрацию выдачи
  - генерировать в разы больше результатов, чем нужно,
   а потом прогонять их через фильтр.
  Потому что в loss-функцию вы даже такое простейшее правило не запихнёте.
  Т.е. тренировать сеть так,
  чтобы <штрафовать> её за нарушение некоего набора правил,
  оказывается крайне сложно.
  Backpropagation для этого не годится.
  0
  
  Atmyre
  27 ноя 2021 в 20:00
  
  Да, такая проблема у backprop есть, вы правы)
  я и не говорю, что backprop - панацея, нет,
  я лишь говорю, что он вносит вклад в inductive bias.
  0
  
  dimka11
  14 дек 2021 в 16:31
  
  Возможно с развитием RL, что-то получится сделать с этой проблемой
  0
  
  Atmyre
  16 дек 2021 в 19:28
  
  ну кстати да, я еще в 2017 году свой бакалаврский диплом делала по тому,
  как с помощью RL обучать сеть для NLP на недифференцируемую функцию потерь.
  //// Интересное замечание: RL vs BP. Надо подумать.
  //// Ради одного этого замечания стоило прорабатывать всю статью.
  Так что охотно верю)
  0
  
  ......
  
  Atmyre
  1 дек 2021 в 00:08
  
  Да, вы правы. Это вопрос того, что вы от модели хотите при обучении,
  то есть, на какую метрику обучаете)
  В зависимости от того, что вам нужно, чтобы модель делала,
  нужно внедрять соответствующий inductive bias
  и, в частности, конструировать соответствующую лосс-функцию.
  0
  
  victorsenkevich
  16 дек 2021 в 19:29
  
  Inductive bias ~ abductive relation Или, проще,
  можно понимать как область существования (модели etc)
  Или как общая функция, описывающая рассматриваемые данные
  (которая может быть неизвестной).
  Или как смысл - это самое короткое определение.
  Кстати, inductive этот bias, строго говоря,
  не является, поскольку индуктивным выводом его не получить.
  0
  
  ......
  
  victorsenkevich
  21 дек 2021 в 14:24
  
  Ваш комментарий это тоже пример Inductive bias.
  Смысл субъективен и существует лишь для тех, кто его воспринимает.
  Если чего-то не понимаешь, то это действительно не существует.
  А для того, кто понимает, существует.
  Так что мы оба правы.
  Inductive bias это фактически понимание.
  Ну или смысл, как я уже писал.
  У меня статья на эту тему.
  Там есть формальное определение когнитивных понятий,
  в том числе "смысл".
  И определение интеллекта из 2(двух) слов.
  Ссылку давать не буду.
  Пожалуй, лишь добавлю, что фраза "не понимаю поэтому неверно"
  является очевидно неверной.
  
  Да, и <Шерлок Холмс использовал абдукцию, а не дедукцию>
  \\\ "Sherlock Holmes practised abduction, not deduction"
  
  Поэтому индукция тут ни при чем. Впрочем, и это я уже писал.
  0
  
  ......
  
  nicmname
  16 дек 2021 в 19:29
  
  Англицизм "inductive bias" не воспринимается, вот вообще никак.
  Прям отторжение. Неужели нет термина соответствующего в математике,
  я полагаю это же всё равно основано на каком-то математическом аппарате?
  И ещё хотелось бы подробный разбор Альфафолда "для чайников", можно?
  Мне бы даже в частном формате, понимаю, что статью писать
  - это большой и долгий труд.
  0
  
  Atmyre
  16 дек 2021 в 19:31
  
  Что ж, а я не воспринимаю русские аналоги ?\_(?)_/?
  
  Я пишу статью и стараюсь, чтобы всем было максимально понятно,
  о чем идет речь.
  В моем понимании "максимально понятно" - это вот так.
  Потому что именно этот термин используется в проф. среде
  (по крайней мере, я так его слышу)
  и человек, прочитав статью, сразу поймет, о чем речь.
  +1
  
  ......
  
  //// Конец цитирования.
  
  На мой взгляд, очень хороший материал для понимания того,
  что любое решение при разработке архитектуры нейросетей
  и процесса ее обучения имеет "много гитек"
  не только в плане "полуэвристических правил",
  но и, так сказать, в "методологическом плане".
  И которые нужно заранее превратить в согласованную систему,
  а не пытаясь постфактум пытаться исправить
  откуда-то позаимствованную архитектуру с обучающим датасетом
  какими-то "полушаманскими методами", типа подбора гиперпараметров.
  
  Хотя в настоящее время ничего лучше этого никто предложить не может.
  Слишком много явных/известных и неявных/неизвестных inductive biases
  по факту приходится использовать в моделях "машинного обучения".
  
  
  ========
  
  20.04.2024 10:34
  
  Двоичные нейронные сети "для чайников".
  В оглавление.
  
  В процессе проработки материалов по различным структурам нейросетей
  меня заинтересовала сама концепция бинарных/битовых нейросетей (BNN)
  с самых разных точек зрения.
  Даже попытался самостоятельно сформулировать собственное видение того,
  что и как в эту концепцию стоит включить.
  Но, естественно, я не первооткрыватель такого подхода к конструкции нейросетей
  и, соответственно, стоит ознакомится с тем, что в этом направлении уже сделано,
  и с чем столкнулись при реализации.
  
  К сожалению, русскоязычных материалов по этой тематике оказалось
  очень не много, и большей частью достаточно "древние"
  по меркам сегодняшней эпохи "бури и натиска" в нейротехнологиях.
  Так что наиболее интересную часть информации удается найти
  даже не в самих публикациях, а в комментариях к ним,
  вот как в данном случае:
  
  "Как работают двоичные нейронные сети, и почему они будут популярными в 2020-м".
  Автор: SLY_G (Вячеслав Голованов)
  https://habr.com/ru/articles/483674/
  13 янв 2020 в 10:00
  
  Автор оригинала: Henk Muller
  https://thenextweb.com/podium/2019/12/20/how-binarized-networks-work-and-why-theyll-be-big-for-ai-in-2020/
  
  //// Начало цитирования.
  
  Нейросети - штука классная,
  однако их потенциал до сих пор ограничивают стоимость и энергия;
  с этим, возможно, помогут справиться двоичные нейросети
  
  Концепция нейросетей впервые появилась более 40 лет назад,
  когда учёные экспериментировали с математическим моделированием функций мозга.
  Они придумали, как сделать механическую реализацию нейросети,
  которую можно обучить распознаванию закономерностей и классификации данных
  - к примеру, распознавать, есть ли на видео кошка или собака.
  
  За последнее десятилетие сложность и способности нейросетей значительно выросли.
  Совместно с беспрецедентным ростом мощностей недорогих и доступных суперкомпьютеров
  и графических процессоров (GPU)
  они вышли на передний план в качестве метода по умолчанию для решения задач,
  распознавания закономерностей и обнаружения аномалий.
  Сегодня организации используют их для составления прогнозов,
  исследования предпочтений пользователей,
  подтверждения данных и управления риском.
  //// Но не для управления реальными производственными процессами.
  //// Пока, в лучшем случае, диагностика, но в основном - рекомендации.
  
  Но, несмотря на такое их активное использование,
  у них есть свои недостатки, ограничивающие их потенциал.
  Святой Грааль - это нейросеть, способная быстро анализировать информацию,
  будучи недорогой и не жадной до энергии.
  //// Не, даже не это, а точность на уровне минимум "шесть девяток".
  Создать удовлетворяющую этим критериям сеть - сложная задача,
  но её нужно решить,
  чтобы мы смогли воспользоваться преимуществами нейросетей ближе к краю IT
  и сетей связи, а также на оконечных устройствах.
  
  Одна из альтернатив, которые изучают многие организации
  - двоичные сети.
  Это достаточно новая технология,
  но она, вероятно, станет достаточно влиятельной в 2020-м.
  //// Здесь автор сильно ошибся - мир увлекся "трансформерами".
  Чтобы понять, почему, нам нужно уяснить, как работают оба типа сетей.
  
  Как работают нейросети
  
  Нейросети состоят из нескольких слоёв взвешенных сумм.
  Каждая взвешенная сумма даёт число,
  которое либо говорит о том, что в этих данных,
  вероятно, есть некий признак,
  или его там, вероятно, нет.
  Эти слои комбинируют, к примеру, необработанные изображения в наборы признаков,
  и рекомбинируют их,
  чтобы в итоге прийти к ответу.
  //// Это так. Ключевая операция в обычных сетях - суммирование.
  
  Проще говоря, допустим, вы хотите,
  чтобы нейросеть могла распознавать лица на фотографиях.
  Система делит изображение на небольшие сегменты,
  а потом слои сети сканируют каждый сегмент изображения,
  ища признак, который их научили определять.
  Первый слой, допустим, может искать базовые признаки:
  чёрные круги, белые круги, белые прямоугольники, цвет кожи.
  Эти признаки просто заметить.
  
  Второй слой может искать глаза (чёрный круг внутри белого),
  рты (набор белых прямоугольников, расположенных рядом, и окружённых кожей),
  следующей слой может искать два глаза надо ртом и с кожей вокруг.
  Каждый признак даёт каждому сегменту изображения
  оценку вероятности присутствия нужного признака
  в этой части фотографии.
  Затем эти вероятности комбинируются,
  и если достаточное количество слоёв считает,
  что разыскиваемый признак имеется на фото,
  то сеть делает заключение, что лицо там есть.
  
  Рис. 1
  
  На рис. 1 (а это фото Барака Обамы) видно,
  как эти слои анализа и вероятностей суммируются,
  позволяя сети, работающей с приближёнными значениями,
  выдавать относительно точный ответ.
  
  Отметим, что такие признаки, как чёрные круги, глаза или рот
  не программируются человеком, а обнаруживаются сетью во время обучения.
  Возможно, что для поиска лиц лучше подходит другая закономерность
  (допустим, нос, уши или линия волос),
  и прелесть нейросетей в том,
  что их можно использовать для поиска подобных закономерностей.
  //// Вопрос в том, что мы до конца не понимаем
  //// как реально ищутся/фиксируются "подобные закономерности".
  
  Недостатки традиционных нейросетей
  
  Проблема в том, что в поисках наивысшей возможной точности
  возникает необходимость иметь дело
  с очень подробно разграниченными уровнями вероятности,
  а для этих математических расчётов требуются серьёзные ресурсы.
  Из-за использования чисел с плавающей запятой для анализа сегментов,
  нейросетям требуется относительно много вычислительных мощностей,
  памяти и времени на работу.
  
  Хотя в облаках есть достаточно вычислительных мощностей и памяти,
  многие краевые приложения не могут полагаться на облако.
  К примеру, робомобилям требуется принимать решения мгновенно
  на основе их окружения,
  и в этом они не могут положиться на ограниченную по пропускной способности связь.
  
  Нейросети, работающие с числами с плавающей запятой,
  на конечных устройствах использовать не получается.
  Многие компании из-за этого используют целочисленную арифметику,
  что экономит большое количество памяти и вычислительных мощностей,
  однако есть способ лучше - именно здесь и проявляют себя двоичные нейросети.
  
  Как работают двоичные сети
  
  Если обычная нейросеть - это картина Пикассо,
  то двоичная нейросеть - это грубый карандашный набросок.
  
  Если нейросети присваивают каждому сегменту точно подсчитанную вероятность,
  то двоичные нейросети, как следует из их имени,
  сводят вероятные значения к чёрно-белому варианту,
  то есть, либо к -1 (если сеть считает, что признака в этом фрагменте нет),
  либо +1 (если он есть).
  
  Теперь взвешенная сумма оценивает каждый признак либо положительно
  (умножая на +1),
  либо отрицательно
  (умножая на -1),
  и вместо полных перемножений нам нужно рассматривать
  лишь умножения на +1 и -1.
  
  Рис. 2
  
  Такой подход жертвует определённой долей точности,
  но мы можем возместить потери, немного увеличив сеть.
  Двоичные сети по своей сути гораздо проще.
  
  По сравнению со своими двойниками с плавающей запятой,
  им требуется в 32 раза меньше места для хранения числа (1 бит вместо 32),
  и в сотни раз меньше энергии,
  из-за чего они куда как более применимы для <краевых приложений>
  типа робомобилей,
  когда сами устройства могут обработать информацию,
  не привлекая облачные вычисления.
  
  Обычно в двоичной сети всё же встречаются слои с небинарными значениями,
  особенно на входе, и иногда на выходе.
  На входе изображение будет, скорее всего, полноцветным,
  и его нужно будет численно интерпретировать перед тем,
  как начнутся двоичные слои.
  И на выходном слое тоже всегда будет небинарный выход.
  
  Будущее двоичных сетей
  
  Такая простота открывает обширное поле для коммерческого применения в условиях,
  когда эффективность решает всё.
  На встроенном чипе с большей вероятностью получится хранить
  коэффициенты двоичной сети,
  чем сети с коэффициентами с плавающей запятой.
  Производителям процессоров нужно будет взять на вооружение эту технологию
  и обеспечить поддержку двоичных сетей.
  
  2020-й с большой вероятностью станет годом двоичных сетей.
  Компании активно работают над реализацией этой технологии,
  а ПО, требуемое для обучения двоичных сетей, быстро развивается.
  Мы, скорее всего, очень скоро увидим первое реальное применение этой технологии,
  и на краевых устройствах появятся недорогие чипы с низким энергопотреблением,
  способные классифицировать изображения или другие данные.
  
  Таким образом, следующее поколение технологий будет основано на простоте.
  //// Но прошло пять лет и "простых технологий" так и не появилось,
  //// а требования к сетям только усложнились,
  //// а сети стали еще более "прожорливы".
  //// Что пошло не так?
  
  .......
  
  //// Из комментариев.
  
  WhiteBlackGoose
  13 янв 2020 в 10:44
  
  Эээм. А что там по обучению этого чуда?
  "Классические" сетки основаны как раз на аналоговости своих весов.
  Если это пропадает, то мы не можем шагнуть на маленький шаг.
  
  Далее, для такой же точности, дайте угадаю, понадобится сетка,
  у которой в 32 раза больше весов, чем у классической?
  
  Alert1234
  13 янв 2020 в 10:58
  
  Возможно придумают как преобразовать аналоговую в бинарную.
  Тогда обучать ее будут по-старому,
  а в девайсах использоваться она будет в readonly в более производительном виде.
  //// Т.е. это "квантование" нейросетей в явном виде,
  //// которое все больше и больше применяется
  //// именно с целью добиться "экстремального уменьшения размерности".
  //// Может быть, успехи в этом направлении как раз уменьшают
  //// необходимость "задрав штаны бежать за комсомолом",
  //// то бишь, получить чистую бинарную сеть.
  
  P.S. Вот у интела написано, что только на этапе обучения
  используются полные веса
  software.intel.com/en-us/articles/binary-neural-networks
  
  WhiteBlackGoose
  13 янв 2020 в 11:17
  
  Действительно, что-то не догадался. Тогда уже интереснее
  
  buriy
  13 янв 2020 в 15:24
  
  1) с обучением как раз всё как-то работает:
  как один из вариантов решения,
  в бинарных сетях используется стохастическое обучение.
  Если backprop даёт 0.65, то это значит,
  то с вероятностью 0.65 текущий вес поменяется.
  Плохонько, но работает.
  Кроме того, пока что не придумали,
  как к такому прикрутить тот же BatchNorm (хотя Dropout - запросто).
  
  2) нет, опыты показывают, что float32 хранит в среднем
  только 5 значащих разрядов.
  Поэтому примерно ему можно поставить в соответствие 5-10 бинарных нейрончиков
  (5 при идеальном разбиении, 10 при неидеальном).
  Итого экономия в 3-6 раз.
  Но вот прунинг показывает более хорошие результаты - в 10-50 раз:
  \\\ Прунинг нейронных сетей - это метод сжатия
  \\\ (уменьшения расхода памяти и вычислительной сложности) сети
  \\\ за счет устранения части параметров в предобученной модели.
  
  3) но вообще, нейроны на выходах и так бинарные:
  но вот что делать со входом?
  Как нормально заменить в традиционной компьютерной архитектуре
  аналоговое суммирование с 10-100 входов?
  тем более, бинаризовав:
  ну, есть векторные popcnt и and,
  но это нам чтобы считать каждый нейрон нужно конвертировать результаты в int8/int16,
  а потом перевести в бинарный вид.
  вот если железо будет ещё больше заточено на это,
  то выигрыш может быть ещё в разы или в десятки раз больше,
  наверное.
  
  но, заметим, что такой же трюк с аккумуляцией и умножением
  можно применить и для float16 входов:
  и получаем 100 TFlops на видюшке для подобных же вычислений,
  и не меньшую эффективность на нейрон, чем с бинарными данными,
  но без требований стохастической бинаризации,
  снижающей скорость и качество обучения.
  
  ситуация может в очередной раз поменяться
  только когда вместо 10-1000 ALU на устройстве
  мы захотим сделать миллионы ALU с собственной памятью,
  вот тогда бинаризация существенно упростит конструкцию
  и расход энергии на один ALU.
  //// Т.е. Существующие и вновь разрабатваемые "железячные ускорители",
  //// "заточенные" под существующие архитектуры нейросети,
  //// достаточно эффективно блокируют потребность в новых подходах.
  
  leshabirukov
  13 янв 2020 в 16:03
  
  1)... Вроде бы стохастическое это скорее так:
  у нас есть бинаризованный вес, и есть непрерывный,
  в расчетах прямого и обратного прохода используем бинаризованный,
  но вычисленный градиент прибавляем к непрерывному,
  а его используем как вероятность выбора нового веса для следующего прохода.
  
  Как нормально заменить в традиционной компьютерной архитектуре
  аналоговое суммирование с 10-100 входов?
  Да всё также, умножением на матрицу весов, только веса +-1.
  Вон, NVidia поддержала 4-битные данные,
  у нас вот в Нейроматриксе есть умножение на упакованный вектор двухбитных чисел.
  
  Brak0del
  13 янв 2020 в 21:13
  
  \\\ ситуация может в очередной раз поменяться только
  \\\ когда вместо 10-1000 ALU на устройстве мы захотим сделать
  \\\ миллионы ALU с собственной памятью,
  \\\ вот тогда бинаризация существенно упростит конструкцию и расход энергии
  \\\ на один ALU.
  
  Вроде как такие вещи хорошо делаются на FPGA, например.
  https://www.nallatech.com/wp-content/uploads/Nalllatech-Whitepaper-FPGA-Accelerated-BNN.pdf
  
  buriy
  15 янв 2020 в 23:34
  
  Ага, в теории. А на практике, по ссылке лишь 200к ALUs на 35 вт,
  и никакой бинаризации.
  А без бинаризации получилось решение в 5 раз слабее видеокарты,
  жрущее в 5 раз меньше энергии, и не дешевле.
  
  Brak0del
  16 янв 2020 в 23:07
  
  Вот ещё ссылка, правда здесь уже не коробочный акселератор,
  https://arxiv.org/abs/1702.06392
  а университетское исследование на стартките.
  В таблице в конце 7.6 TOPs на 8 Вт.
  В статье они также грубо оценивают вычислительный параллелизм GPU и FPGA,
  при этом на 1 LUT в среднем по их прикидке выходит 2.5 операции XNOR.
  Не знаю, корректно ли это считать за АЛУ,
  но если да, то вот вам порядка миллиона АЛУ на кристалле.
  
  Конечно есть вопросы к их реализации:
  как и в ссылке на Nallatech,
  они тоже кодили с использованием средств высокоуровневого синтеза (HLS),
  вероятно обычным RTL было бы эффективнее по ресурсам и частоте,
  кроме того, по идее могли бы попробовать вписаться
  в меньший и более дешёвый кристалл.
  У них там дорогой Virtex за 5K$,
  хотя наверно удалось бы влезть в Kintex за 1.5К$.
  
  За пределами FPGA что-то похожее на описанные вами
  миллионы АЛУ с собственной памятью делают GSI Technology:
  вот презентация их APU,
  здесь простейшие вычислители совмещены с ячейками памяти.
  
  buriy
  17 янв 2020 в 15:22
  
  Спасибо. Да, многие пытаются,
  но пока вычислительная эффективность на традиционных дизайнах FPGA
  не очень высока почему-то...
  Но энергоэффективность при предсказании при этом раз в 3-10 выше
  по сравнению с максимальным TDP неспециализированной видюшки,
  поэтому крупные компании их всё же используют.
  
  Мои догадки: остаётся критичной узкая шина обращения к памяти,
  и плохо исследованы эффективные под FPGA модификации
  алгоритмов обучения и предсказания с бинарными весами:
  предсказания на сетке с прунингом+int8 сейчас работают лучше
  (заметим, что всё это обычно и исследуется на картинках, где int8 на входе).
  
  Я надеюсь на то, что допилят мемристоры,
  энергоэффективность ALU повысится,
  проблема с памятью рядом с вычислениями решится:
  в результате, аналоговые/float вычисления станут
  ещё более конкурентоспособными,
  можно будет делать быстрое обучение прямо на чипе,
  и одновременно решится проблема быстрого суммирования при inference
  - в том числе, бинарного.
  
  mpakep
  13 янв 2020 в 11:59
  
  У таких сетей есть еще масса преимуществ.
  Не обязательно считать всю сеть а можно лишь ее часть.
  Я считал как то сколько это может быть и у меня вышли такие цифры
  Для расчета достаточно 3.2% (32 нейрона) при сети в тысячу нейронов,
  0.1% (1 тыс) при миллионе <нейронов> в сети
  и 0.003% (32 тыс) при сети размером в миллиард <нейронов>.
  Цифры могут немного разница от результата расчета,
  но порядки будут оставаться в близких пределах.
  Это даст просто огромное преимущество
  на действительно больших массивах данных.
  И еще одной свойство это отсутствие эффекта переобучения,
  то, чем страдает большая часть <аналоговых> алгоритмов.
  
  kuza2000
  13 янв 2020 в 13:02
  
  \\\ И еще одной свойство это отсутствие эффекта переобучения,
  \\\ то, чем страдает большая часть <аналоговых> алгоритмов
  
  А можно пруфы?
  Не вижу никаких причин для отсутствия переобучения в таких сетях:
  
  kogemrka
  13 янв 2020 в 13:41
  
  Предупреждаю, у этого товарища своё определение <Переобучения>,
  никак не связанное с настоящим переобучением.
  А ещё свой чудесный алгоритм без <переобучения> (в его формулировке).
  
  WhiteBlackGoose
  13 янв 2020 в 19:08
  
  Может он имеет ввиду проблемы со значениями весов
  (которые, правда, фиксятся L1 и L2)?
  
  arquolo
  13 янв 2020 в 21:36
  
  Нет, у него переобучение
  - это не когда <на трейне - отлично, на тесте - хреново>,
  а когда с увеличением количества эпох на тренировочной
  (и единственной, ибо весь тест слит туда) выборке данных
  не растёт точность.
  
  Его в ods.ai уже на протяжении 5700 сообщений народ переубедить пытается.
  
  ........
  
  KvanTTT
  13 янв 2020 в 23:43
  
  А что если вместо одного бита использовать чуть больше: 2 или 4?
  
  .......
  
  
  Vinchi
  15 янв 2020 в 20:52
  
  https://arxiv.org/abs/1602.02830
  Есть bnn
  Возможно речь о них.
  Вопрос один есть ли готовая библиотека для создания обучения и тестов?
  
  Leo_Gan
  17 фев 2020 в 07:16
  
  Статья отражает многие современные исследования.
  На ум приходит компания Numenta,
  Jeff Howkins with Hierarchical Temporal Memory.
  У них много есть чего на youtube в том числе очень интересные курсы по HTM.
  Так вот они тоже все строят на бинарной идее.
  
  Далеко ходить не надо. Наш мозг построен на бинарной основе
  и пока что никакие супер-сложные и быстрые процессоры его не переплюнули.
  Numenta как раз идет от работы мозга.
  Так что, я тоже думаю, что бинарные сети будут рулить.
  Похоже, что самая большая проблема на этом пути
  - в создании "правильного" двоичного железа.
  Не того, что моделирует плавающую арифметику на двоичной элементной базе,
  а железа, похожего на HTM.
  ... и вдогонку.
  Дискуссии о проблемах имплементирования бинарных сетей
  на существующих процессорах понятны,
  но, по большому счету, мало что значат.
  Как в свое время быстренько выдумали GPU для каких-то там игра,
  так и сейчас, быстренько сварганят двоичные процессоры для бинарных сетей.
  С современными компьютерами - это небольшая работа :)
  //// Т.е. проблемы не в "железе", а скорее в "идеологии".
  //// Нет хороших архитектурных решений, подтвержденных практикой,
  //// а тем более нет "хорошей теории", ведь не считать же таковой,
  //// ссылки на биологические нейросети.
  
  .....
  
  //// Конец цитирования.
  
  Суммируя вышесказанное, можно сказать,
  что основным стимулом исследований в этом направлении
  пока является стремление снизить требования к нейросетям
  по необходимой памяти и вычислительным мощностям.
  При этом ориентиром служат биологические нейронные сети,
  и устоявшиеся решения в традиционных ИИ-моделях,
  в частности, обучение методом обратного распространения ошибки.
  И при таких "вводных" бинарные нейронные сети
  составить реальную конкуренцию традиционным архитектурам нейросетям
  на сегодняшний день явно не смогли.
  Не смотря ни на какие "обоснованные прогнозы".
  Хотя, конечно, "еще не вечер".
  
  Но, с моей точки зрения, бинарные нейронные сети заслуживают большего внимания
  совершенно по иной причине, причем, не столько технической
  - память и вычислительные мощности, это чисто технические параметры,
  и они в соответствии с "законом Мура" будут удваиваться каждые полтора года,
  так что в исторической перспективе это не самая большая проблема.
  Главное, что могут дать бинарные нейронные сети
  - это принципиально новые технические решения
  как архитектурные, так и алгоритмические,
  которые в мэйнстриме традиционных нейросетей
  могут проявиться очень не скоро.
  В области "идей" "закон Мура" пока не работает.
  Скорее, даже, наоборот - зачем придумывать что-то новое,
  если старый подход еще работает.
  
  И в первую очередь это может касаться действительно "болевой точки" нейронауки
  - новых методов "машинного обучения" нейросетей.
  И об одном таком непривычном подходе в следующем материале.
  
  
  ========
  
  16.04.2024 21:34
  
  Насколько реально обучение BNN методом сплошного перебора?
  В оглавление.
  
  Продолжая тему бинарных/битовых нейронных сетей (BNN),
  хочу предложить Вам для ознакомления один достаточно "древний" материал,
  в котором предлагается метод обучения бинарной нейронной сети методом,
  на первый взгляд, чудовищно неэффективным - сплошным перебором параметров.
  Но "не все так однозначно", есть в этом предложении пара интересных моментов,
  помимо других не менее интересных предложений.
  А, впрочем, судите сами, но не забудьте посмотреть комментарии:
  
  "Бинарная матричная нейронная сеть".
  Автор: akazant (Александр Казанцев)
  https://habr.com/ru/articles/343304/
  27 ноя 2017 в 16:10
  
  //// Начало цитирования
  
  Бинарная матричная нейронная сеть
  
  Искусственная нейронная сеть в виде матрицы,
  входами и выходами которой являются наборы битов,
  а нейроны реализуют функции двоичной логики нескольких переменных.
  Такая сеть значительно отличается от сетей перцептронного типа
  //// Т.е. основанных на суммировании входов.
  //// Это принципиальное отличие.
  //// И, вообще, хорошая формулировка принципиального разделения
  //// BNN от других традиционных NN.
  и может дать такие преимущества как конечное число вариантов
  полного перебора функций сети,
  а следовательно и конечное время обучения,
  сравнительная простота аппаратной реализации.
  
  Рис.
  
  Предпосылки создания бинарной матричной нейронной сети
  
  Попытки создания искусственных нейронных сетей основываются
  на факте существования их естественных прототипов.
  Способ передачи и обработки информации в естественной нейронной сети
  определяется химико-биологическими свойствами живых клеток-нейронов.
  Однако, модель искусственной нейронной сети
  не обязана полностью копировать
  как функцию нейронов, так и структуру естественного мозга,
  так как реализует только функцию преобразования информационных входов в выходы.
  //// Вот это одно из ключевых положений в инженерии информационных систем,
  //// которое почему-то как-то не акцентируется в "традиционной нейронауке",
  //// при том, что, по факту, только это и применяется.
  Поэтому реализация функции искусственной нейронной сети
  может значительно отличаться от ее естественного аналога.
  Попытка прямого копирования структуры естественного мозга
  неизбежно сталкивается со следующими проблемами,
  которые, при отсутствии их решения,
  могут оказаться непреодолимыми.
  Как известно, в мозге млекопитающих выход нейрона
  может быть подключен к входам нескольких других нейронов.
  
  Как узнать входы каких нейронов
  должны быть связаны с выходами других нейронов?
  Сколько нейронов должно быть связано с каждым конкретным нейроном в сети
  для того чтобы сеть выполняла свою функцию?
  
  Ответов на эти вопросы пока нет,
  а подключение нейронов друг к другу методом перебора
  гарантирует практически бесконечное время обучения такой сети,
  учитывая, что количество нейронов реального мозга исчисляется миллиардами.
  
  В искусственных нейронных сетях перцептронного типа
  все нейроны соседних слоев связаны друг с другом.
  А "сила" связи определяется значением коэффициентов.
  Связь "все-со-всеми", это решение проблемы связей нейронов
  методом "грубой силы".
  В этом случае, нейронная сеть может содержать
  только сравнительно небольшое число нейронов на промежуточных слоях
  для приемлемого времени обучения,
  например, в течение нескольких недель [2].
  
  Прежде чем нейронная сеть станет выдавать результат,
  например, классифицировать изображения,
  она должна пройти этап обучения,
  то есть этап настройки.
  На этапе обучения как раз и определяются конфигурация взаимодействия
  и общая функция нейронов сети.
  По сути, обучить нейронную сеть означает
  подобрать функцию преобразования таким образом,
  чтобы на заданных входах она давала правильные выходы
  с заданным уровнем ошибки.
  Затем, после обучения,
  мы даем на вход сети произвольные данные,
  и надеемся, что функция нейронной сети подобрана достаточно точно
  //// Хорошая формулировка "надеемся".
  и сеть станет правильно,
  с нашей точки зрения,
  классифицировать любые другие входные данные.
  //// А если "надежды" не оправдались, начинаем рассуждать
  //// о "локальных минимумах" и "переобучении".
  В популярных сетях перцептронного типа структура сети
  задается изначально фиксированной,
  см. например [2],
  а функция находится подбором коэффициентов связей нейронов промежуточных слоев.
  Прежде чем переходить к описанию матрицы,
  заметим, что одновременную связь всех нейронов соседних слоев
  можно разложить в последовательные связи
  пар нейронов
  пользуясь тем, что функция нейрона
  это линейная комбинация выходов нейронов предыдущего слоя
  и коэффициентов связи.
  То есть, по крайней мере, для сетей перцептронного типа,
  каждый нейрон можно представить как принимающий данные
  только от двух других нейронов.
  //// Вот это момент, на мой взгляд очень важен.
  //// Представление какой-то одной связи/нейрона комбинацией нескольких,
  //// более простых в реализации позволяет, в конечном итоге,
  //// перейти от регулярных структур нейросетей к не регулярным,
  //// а затем и к самонастраивающимся.
  
  Принцип разложения нескольких параллельных связей
  в последовательность пар или троек связей
  только соседних нейронов
  и лежит в основе матрицы описываемой ниже.
  Принимается ограничение,
  что вовсе не обязательно обучать сеть подключая к нейрону
  все остальные,
  достаточно ограничиться только соседними нейронами,
  а затем последовательно уменьшать ошибку функции обучения сети.
  Данная версия нейронной сети основывается
  на предыдущей работе автора [1].
  
  Структура матрицы и нейрона
  
  Следующая матричная структура нейронной сети
  позволяет решить проблему подключения нейронов
  и ограничить число комбинаций при поиске функции нейронной сети.
  Эта сеть также в теории позволяет найти функцию нейронной сети
  с нулевой ошибкой на обучающих наборах входов/выходов
  за счет того, что функция сети является
  дискретной векторной функцией нескольких переменных.
  
  На рис.1 представлен пример бинарной матрицы.
  Входы и выходы этой матрицы - двоичные четырех-компонентные векторы.
  Входы подаются снизу, сверху получаем выходные значения.
  Каждая клетка матрицы это нейрон с двоичной функцией нескольких переменных f.
  Каждый нейрон имеет горизонтальную и вертикальную перегородки,
  отделяющие его от соседних нейронов и определяющие перетоки данных.
  Вертикальная перегородка нейрона, изображена слева от каждого нейрона,
  может иметь три положения:
  закрыто (темная полоса),
  открыта вправо (зеленая стрелка вправо),
  открыта влево (желтая стрелка влево).
  
  Горизонтальная перегородка, изображена снизу от нейрона,
  может иметь два положения:
  закрыто <стоп> (темная полоса)
  или открыто вверх (зеленая стрелка).
  Таким образом, переток данных в матрице может быть снизу вверх и влево/вправо.
  Для того чтобы избежать выделения граничных разрядов данных
  первый и последний нейроны в каждом ряду логически зациклены,
  то есть, например, стрелка влево первого нейрона в ряду
  является входом последнего нейрона в этом же ряду,
  как показано на рис.1 для нейронов второго ряда.
  
  Рис. 1. Пример бинарной матрицы из 3-х строк и 4-х двоичных входов/выходов.
  
  Структура матрицы подчиняется правилам поэтапного построчного построения.
  Если данный набор строк нейронов не решает задачу,
  то к ним добавляются следующие,
  и так пока целевая функция не будет достигнута.
  //// Тут стоит еще подумать, как сделать матрицу "переменной по ширине",
  //// чтобы, например, обеспечить реализацию "бутылочного горлышка",
  //// сжимающего размерность "эмбеддинга"/"латента".
  
  Перед обучением матрица состоит из одной первой строки.
  Обучение матрицы заключается в последовательном добавлении строк.
  Новые строки добавляются после нахождения одной
  или нескольких конфигураций перегородок на текущей строке,
  а также внутренних параметров нейронов,
  при которых значение ошибки на обучающих наборах матрицы минимально
  и меньше чем значение ошибки обучения на предыдущей строке.
  
  Нейроны выполняют функцию преобразования данных,
  передачу или остановку сигнала. Функция нейрона f,
  в зависимости от текущей конфигурации перегородок и внутренних констант,
  должна удовлетворять следующим обязательным требованиям:
  
  1. иметь возможность передачи данных без изменений;
  
  2. уметь передавать константу (0 или 1) без входных данных;
  
  3. не должна зависеть от последовательности применения входных данных
  от соседних нейронов,
  то есть нейрон выдает результирующее значение
  от всех своих входов поступивших как бы одновременно.
  
  Один из вариантов такой функции f это сложение по модулю 2
  или исключающее ИЛИ или XOR,
  как она часто обозначается в языках программирования.
  
  Передача без изменения означает фактическое отсутствие нейрона
  и нужна только с точки зрения пропускания уровня матрицы без изменения данных.
  //// Ну, тут стоит подумать над возможностью прямых связей
  //// между нейронами различных уровней напрямую, наподобие Residual Blocks,
  //// чтобы уменьшить количество просто транзитных нейронов.
  //// А это, в свою очередь, откроет возможность отказаться от структуры
  //// "плотной матрицы" и перейти к "разреженной"
  //// и, по факту, вообще к "свободной" архитектуре нейросети,
  //// в которой понятие "слоя" вообще становится чисто условным.
  //// Т.е. в предлагаемой архитектуре нужно сделать более гибкой,
  //// а, точнее, настраиваемой АДРЕСАЦИЮ связей каждого отдельного нейрона.
  
  Кроме обработки и передачи сигнала нейроны также имеют функцию памяти
  и ее использования или неиспользования в зависимости
  от функции реализуемой нейроном.
  
  В зависимости от положения (значений) перегородок нейрона
  и его соседних нейронов,
  каждый нейрон может иметь от нуля до трех входов
  (снизу, справа и слева)
  и всегда один выход (вверх),
  который, однако, может быть не подключен к нейрону следующей строки,
  из за положения горизонтальной перегородки верхнего нейрона "стоп".
  //// А тогда зачем он нужен? Как резерв? Ну, может быть и так.
  
  Рис. 2. Нейрон с бинарной функцией f, ячейкой памяти Memo и полем Res.
  
  Каждый нейрон выполняет одну и ту же двоичную функцию f,
  //// Не обязательно. Это может быть набор матричных операций,
  //// потенциально реализующих более богатый функционал, чем одна операция.
  //// И лучше если это будет определяться в результате обучения/настройки.
  которая отличается только количеством входных значений
  в зависимости от конфигурации перегородок нейрона,
  которые разрешают входные данные от нейрона предыдущей строки
  и двух боковых соседних нейронов,
  а также от бинарной внутренней константы Memo.
  //// Можно "немного" расширить количество одновременно рассматриваемых данных,
  //// как минимум, до разрядности логического устройства процессора,
  //// например, 8 или даже 64 бит.
  
  Нейрон получает данные на вход,
  выполняет двоичную функцию нейрона f на основе входов и поля Memo
  и помещает результат в поле Res.
  Варианты использования поля Memo могут быть различны.
  Если выход всей матрицы зависит только от входов сети,
  то поле Memo является частью конфигурации сети
  вместе со значениями перегородок нейронов.
  Если же сеть должна обучаться также и на основе предыдущих значений,
  то есть обладать памятью,
  например, для задач реализации искусственной жизни,
  то поле Memo может принимать вновь вычисленное значение Res
  как показано на рис. 2 пунктирной стрелкой.
  //// Наверно, можно рассмотреть вариант,
  //// когда ячейки Memo и Res, собственно, одно и то же,
  //// и таким образом обеспечить реализацию нейроном БИХ
  //// - бесконечную импульсную характеристику.
  
  Допустим что функция нейрона f это бинарная операция XOR
  применяемая последовательно ко всем входным параметрам.
  Проверим, что она отвечает трем необходимым требованиям.
  
  1. Передача данных без изменений обеспечивается вариантом,
  изображенным на Рис. 3.
  Здесь Memo = 0,
  Горизонтальная нижняя перегородка в значении "вверх",
  Левая и правая перегородки в значении "стоп".
  
  Рис. 3. Вариант параметров нейрона,
  реализующий передачу входа с предыдущей строки без изменения в случае f = XOR.
  
  2. Передача константы обеспечивается значениями горизонтальной
  и вертикальных перегородок "стоп",
  а значение Memo - это значение передаваемой константы.
  
  Рис. 4. Нейрон с функцией, передающей независимую бинарную константу Memo.
  Входные значения снизу, слева и справа не используются.
  
  3. Требование независимости значения функции нейрона
  от последовательности обработки входных значений нейрона
  обеспечивается ассоциативностью XOR.
  
  Число комбинаций полного перебора функций строки
  
  Последовательное, построчное построение функции матрицы
  позволяет эффективно оптимизировать процесс обучения
  за счет замены полного перебора комбинаций бинарных функций
  всех нейронов матрицы полным перебором комбинаций функций нейронов строк.
  Одним из ключевых моментов в обучении сети
  является количество комбинаций полного перебора функций нейронов одной строки.
  
  Для варианта нейрона описанного выше в переборе функций нейрона участвуют:
  
  1. горизонтальная перегородка с двумя положениями: стоп и вверх;
  
  2. вертикальная перегородка нейрона с тремя положениями: стоп, влево и вправо;
  
  3. двоичное поле Memo со значениями 0 и 1.
  
  Чтобы подсчитать число вариантов функций нейрона
  на основе комбинаций этих параметров
  перемножаем количество вариантов значений для каждого из этих параметров:
  
  $Q_n = 2\times2\times3=12$.
  
  Таким образом, каждый нейрон,
  в зависимости от количества пришедших на вход параметров,
  может иметь один из 12 вариантов двоичной функции.
  Подсчитаем число вариантов полного перебора функций одной строки матрицы из 8 нейронов,
  которая, таким образом, может обрабатывать данные размером 1 байт:
  Q_s=12^8=429 981 696.
  
  Для современного персонального компьютера
  это не очень большое число вычислений.
  При выборе функции нейрона c меньшим числом вариантов,
  например, без поля Memo,
  число комбинаций значительно уменьшается до 6^8=1 679 616.
  Даже такая значительно упрощенная версия функции нейрона
  демонстрирует уменьшение ошибки обучения в процессе оптимизации.
  В программных тестах с разными вариантами нейронных функций на языке C#
  автору удавалось получить скорость перебора
  в диапазоне 200-600 тысяч вариантов в секунду,
  что дает полный перебор вариантов функций строки матрицы примерно за 3 секунды.
  Однако, это не означает, что например, матрица размером 8x8
  будет обучена в течении 24 секунд.
  Дело в том, что возможно несколько вариантов функции строки
  дающих одно и то же текущее минимальное значение ошибки обучения (метрики).
  Какая из этих, десятков, сотен или тысяч комбинаций приведет в итоге
  к нулевой ошибке обучения всей матрицы мы не знаем,
  и тогда в наихудшем случае нужно будет проверить каждую из них,
  что приводит к построению дерева оптимизационного поиска.
  //// Тут нужно думать. Интуитивно понятно, что какая-то оптимизация.
  //// наверняка, возможна, но в этих вопросах я "не копенгаген".
  
  Естественным образом возникает вопрос,
  а какая двоичная функция нейрона f является наилучшей для обучения матрицы.
  Очевидно, что идеальной будет функция обладающая
  свойством функциональной полноты [3]
  для строки матрицы в заданном наборе параметров перегородок и поля Memo.
  В этом случае мы будем иметь большую,
  если не полную, гарантию нахождения матрицы с нулевой ошибкой обучения.
  Однако, вопрос нахождения такой функции нейрона еще требует изучения.
  
  Построение дерева оптимизации или поиска нуля ошибки обучения матрицы
  
  Функцию ошибки обучения матрицы будем называть метрикой.
  Значение метрики показывает степень отклонения выхода матрицы
  от ожидаемого на обучающих данных.
  
  Пример метрики.
  Предположим что входы и выходы матрицы это 4-х битные числа.
  И мы хотим обучить матрицу умножать входные числа на $2$.
  Допустим, что для обучения используется три входных значения $\{1, 2, 3\}$,
  идеальный выход для которых будут числа $R_1,R_2,R_3:\{2, 4, 6\}$.
  
  Тогда входы обучения для матрицы будут четырех-битовые значения:
  $\{0001, 0010, 0011\}$,
  а выходы, соответственно
  $\{0010, 0100, 0110\}$,
  по одному биту на нейрон входной и выходной строк, соответственно.
  
  Процесс обучения матрицы состоит в последовательном переборе
  положений перегородок нейронов и значений полей Memo в нейронах строки,
  которые вместе выполняют роль параметров поиска.
  После каждого изменения одного из этих параметров,
  то есть, например, смены положения горизонтальной перегородки
  одного из нейронов из положения <стоп> на положение <вверх>
  или смены значения поля Memo c 1 на 0,
  получаем текущую комбинацию перегородок и полей
  и вычисляем значение метрики.
  
  Чтобы получить значение метрики на некоторой комбинации перегородок
  и полей Memo
  //// А вот как учесть это Memo в метриках совершенно непонятно.
  подставляем значения обучающих входов в матрицу и получаем выходы.
  
  Например,
  на некоторой комбинации перегородок и полей
  мы получили выходные значения матрицы $\{0010, 0001, 1000\}$.
  Переводим их в десятичный вид $r_1, r_2, r_3: \{2, 1, 8\}$.
  
  Получаем значение метрики для текущих выходов матрицы:
  
  $M=\sum\limits_{i=1}^3{|R_i-r_i|}=|2-2|+|4-1|+|6-8|=5$
  
  В данном случае ошибка обучения равна 5
  и задача найти такую конфигурацию нейронов на текущей верхней строке матрицы,
  для которой значение метрики меньше $5$.
  
  Рассмотрим один из вариантов поиска нуля метрики,
  при котором каждая новая строка матрицы добавляется
  к предыдущим строкам с конфигурацией перегородок и полей Memo,
  дающей минимальное значение метрики на обучающих данных.
  //// Напрашивается стратегия добавления не целой строки матрицы нейронов,
  //// а такого количества нейронов, которого достаточно для запоминания
  //// конкретного примера.
  
  Общий алгоритм построения дерева оптимизации матрицы.
  
  1. Задаем начальное положительное значение метрики, например max(Int32).
  Создаем матрицу, изначально состоящую из одной строки
  с начальными значениями перегородок "стоп" и нулевыми константами Memo.
  
  2. Цикл: для каждой конфигурации перегородок и констант нейронов первой строки
  вычисляем значение метрики по всему обучающему набору данных.
  
   a. Если значение метрики меньше ее текущего минимального значения,
   то запоминаем новое минимальное значение,
   а матрицу заносим в список поиска как точку ветвления,
   предварительно очистив этот список.
  
   b. Если значение метрики равно текущему,
   то заносим текущую конфигурацию матрицы в список поиска
   как точку ветвления.
  
   c. Если значение метрики больше текущего минимального,
   то матрица отбрасывается, берем следующую комбинацию
   и идем на начало цикла.
  
   d. Если значение метрики равно нулю,
   то поиск закончен и найден один
   (из нескольких возможных)
   вариант обученной матрицы.
  
  3. После перебора всех комбинаций функций на первой строке
  берем последовательно матрицы из списка поиска на первой строке,
  добавляем к ним строку и для каждой из этих матриц применяем алгоритм поиска.
  
  Детали этого алгоритма могут быть различны,
  как в плане экономии памяти, так и ускорения скорости работы,
  например, сортировкой списков
  за счет особенностей конфигураций перегородок нейронов матриц
  или отбрасывания предыдущих списков ветвлений
  в соответствии с уменьшением текущего значения метрики.
  
  Заключение
  
  Практические эксперименты показывают что алгоритм обучения матрицы
  в большинстве случаев сходится.
  //// Значит есть ситуации, когда даже такой алгоритм "не сходится",
  //// и становится чрезвычайно интересно, что это за случаи.
  Например, в одном из тестов с функцией нейрона XOR,
  матрица шириной 8 битов научилась умножать на 2 числа от 1 до 6
  с нулевой ошибкой обучения.
  Подставив на вход 7, на выходе получил 14,
  значит матрица научилась экстраполировать на один ход вперед,
  но уже на числе 8 матрица дала неправильный результат.
  Все обучение заняло несколько минут на домашнем персональном компьютере.
  Однако эксперименты с более сложными обучающими выборками
  требуют иных вычислительных мощностей.
  
  Кроме передачи данных снизу вверх,
  можно также рассмотреть и обратные потоки,
  когда некоторые нейроны в текущей конфигурации матрицы
  передают результаты на предыдущие строки.
  С одной стороны, такие конфигурации могут давать необычные функции матрицы,
  включая циркулирующие данные,
  но, с другой стороны, увеличивают время обучения матрицы,
  так как добавляют еще один параметр конфигурации
  при переборе вариантов решения.
  
  От плоских нейронов можно перейти к трехмерным,
  т.е. рассматривать их не как квадратные элементы,
  а как кубики, каждая грань которых получает или передает данные,
  и тогда (пока теоретически) можно получить вполне осязаемый
  трехмерный искусственный мозг.
  
  Ссылки
  
  1. A.V. Kazantsev, VISUAL DATA PROCESSING AND ACTION CONTROL USING BINARY NEURAL NETWORK
  - IEEE Eighth International Workshop (WIAMIS '07)
  Image Analysis for Multimedia Interactive Services, 2007.
  http://ieeexplore.ieee.org/document/4279131/
  
  2. Наталья Ефремова, Нейронные сети: практическое применение (habrahabr.ru)
  https://habrahabr.ru/post/322392/
  
  3. Функциональная полнота булевых функций (Wikipedia)
  https://ru.wikipedia.org/wiki/Функциональная_полнота
  
  ..........
  
  //// Из комментариев.
  
  Randl
  27 ноя 2017 в 23:28
  
  Show me the code!
  //// Как-то приходилось читать про одного физика,
  //// который на всех семинарах прерывал докладчиков пытающихся,
  //// что-то объяснить простыми словами,
  //// требованием "пишите формулы".
  //// Наверное, по этому физика стала такой "понятной".
  
  Или хотя бы результаты решения стандартной задачи посложнее XOR
  
  akazant
  28 ноя 2017 в 15:26
  
  Немного <причешу> код и выложу проект на C# в общий доступ.
  
  akazant
  29 ноя 2017 в 21:09
  
  Демо-исходники github.com/vuguzum/BinaryNeuralNetwork
  
  fareloz
  28 ноя 2017 в 13:20
  
  Очень интересная концепция и статья выделяется
  на фоне других однотипных статей в стиле <нейросети для чайников>
  которых сейчас слишком много на ресурсе.
  Но это все теория и ее сложно понять без каких-либо практических
  (а еще лучше - графических) примеров.
  
  BelerafonL
  28 ноя 2017 в 14:44
  
  Правильно ли я понял, что автор предлагает обучать свою сеть брутфорсом?
  
  akazant
  28 ноя 2017 в 15:23
  
  Наоборот, брутфорса стараемся всячески избегать.
  Последовательное, построчное построение функции матрицы
  позволяет эффективно оптимизировать процесс обучения
  за счет замены полного перебора комбинаций бинарных функций
  всех нейронов матрицы полным перебором комбинаций функций нейронов строк.
  
  Согласитесь, что, например, восемь полных переборов восьми нейронов каждой
  из строк по отдельности быстрее, чем полный перебор всей матрицы 8x8.
  
  mazkorulez
  28 ноя 2017 в 14:44
  
  Нейронные сети обычно позволяют параллельно выполнять умножение,
  суммирование, вычисление функции для каждого из нейрона
  на уровне одного слоя.
  Как в Вашем случае с учетом перегородок и распространение данных
  осуществляются параллельные вычисления?
  
  akazant
  28 ноя 2017 в 15:40
  
  Если кратко, то в текущей программной реализации
  пришлось идти на уловки которые позволяют достичь эффекта параллельности
  при фактически последовательном алгоритме.
  Но в принципе, в требованиях к функции нейрона указано,
  что последовательность применения входных значений не меняет выход нейрона,
  что позволяет распараллелить процесс.
  
  mazkorulez
  28 ноя 2017 в 16:23
  
  Тогда такой вопрос, как эффективно распараллелить такую сеть
  с учетом того, что сеть необходимо тактировать
  (ведь при получении элементом сети сигнала справа и снизу
  её выход можно будет рассчитать только после того,
  как сигнал справа и снизу будет получен)?
  Иными словами, в слое появляются зависимости между нейронами,
  которые накладывают ограничения на параллельное выполнение кода.
  //// Хороший вопрос.
  //// В том смысле, что подталкивает мысль
  //// к какой-то иной схеме работы нейросети,
  //// не просто к прямому последовательному распространению
  //// входных данных от слоя к слою, но и как-то иначе как в RNN.
  
  akazant
  28 ноя 2017 в 17:00
  
  Затронули интересный вопрос.
  В процессе его решения лично я пришел к довольно неожиданному,
  двоякому результату.
  Во-первых, действительно, возбуждение нейрона означает,
  что все входы у него актуальны на данный момент.
  И тогда передача данных по сети должна представляться
  как передача некой волны сигнала,
  на фронте которой возбуждаются нейроны.
  На практике для этого нужно запрограммировать специальный механизм,
  который находит все нейроны на фронте
  (можно назвать это уровнем) этой волны,
  независимо подставляет в них данные,
  выполняет нейронные функции и находит нейроны реципиенты,
  которые будут возбуждены на следующем шаге волны, и т.д.
  
  Однако, после создания такого механизма на практике,
  получилось, что для вычисления функции метрики в процессе обучения
  нужно было прогонять обучающие входы через всю матрицу
  от первой строки до текущей последней и получать выходы.
  Теоретически так и надо делать,
  но для отладки это долго.
  Ведь изменяются только параметры нейронов последней (одной) строки,
  а прогонять тестовые значения приходится через всю матрицу.
  Если структура матрицы такова,
  что выходы на предыдущей строке на заданных входах остаются известными,
  то эти выходы и будут входами следующей обучаемой строки.
  Эта модификация, на мой взгляд, не сильно меняет концепцию
  одновременной обработки данных нейронами.
  Просто в этом случае мы ограничиваем <фронт волны>
  одной единственной строкой.
  То есть принимаем что одновременно могут возбуждаться
  только нейроны одной строки,
  затем данные передаются на следующую строку и т.д.
  
  LaRN
  29 ноя 2017 в 18:07
  
  В вашем варианте нейронной сети количество нейронов
  должно быть сильно больше чем в традиционной,
  для решения аналогичной задачи.
  Не сведет ли увеличение количества нейронов в вашей сети
  (по сравнению с традиционной сетью) на нет
  преимущество простоты расчета?
  Ну т.е. процесс обучения у вас вроде бы вычислительно проще,
  но и сеть сильно больше получается из-за того
  что нейрон не <аналоговый>, а <цифровой>.
  
  akazant
  29 ноя 2017 в 21:22
  
  Вопрос закономерный.
  Тесты на сложных данных в программной реализации
  даже в несколько потоков сейчас вряд ли возможны за приемлемое время.
  Впрочем, так же как и задачи быстрой визуализации в 3D графике, например.
  Поэтому для них делают аппаратные ускорители ).
  
  //// Конец цитирования.
  
  Лично для меня, этот материал оказался очень полезным в плане того,
  что показал что на методе обратного распространения ошибки
  "свет клином не сошелся".
  Возможны и другие варианты и думать в этих направлениях,
  вполне возможно, далеко не бесполезно.
  И даже "грубый" сплошной перебор можно где-то с успехом применить.
  
  А с другой стороны, показал, что проблем/вопросов у бинарных/битовых нейросетей
  пока что больше чем достаточно.
  И простая "ставка" на уменьшение требований к памяти и вычислительным ресурсам
  в легкую перебивается "ставкой" трудностью обучения, распараллеливания,
  и просто непонимания, что же принципиально нового они могут предложить.
  
  В общем, надо продолжать поиск.
  Хотя, похоже, активные публикации по теме BNN практически "сошли на нет".
  Поэтому имеет смысл попытаться "переложить" сегодняшние разработки
  в области перцептронных нейросетей в контексте бинарных нейросетей.
  
  
  ========
  
  04.05.2024 12:29
  
  KAN - это новая эра глубокого обучения?
  В оглавление.
  
  В мире "нейронауки" очередной "переполох"
  - анонс новой и, каком-то смысле, давно назревший подход к архитектуре нейросетей -
  перенос акцента с обучения просто весов/параметров связей нейронов
  на обучение функциональных зависимостей, реализуемых этими связями:
  
  "Исследователи разработали принципиально новую архитектуру нейросетей,
  которая работает лучше перцептрона".
  Автор: DataSecrets
  https://habr.com/ru/news/811619/
  1 мая 2024 в 21:18
  
  //// Начало цитирования.
  
  В основе всех архитектур глубокого обучения,
  в том числе систем компьютерного зрения и больших языковых моделей,
  лежит многослойный перцептрон (MLP).
  У него есть веса и нейроны,
  в которых расположены функции активации.
  Этой парадигмой ученые пользуются с 1957 года,
  когда ее предложил Фрэнк Розенблатт.
  
  Сейчас, спустя 67 лет, исследователи представили альтернативу MLP
  https://arxiv.org/pdf/2404.19756
  - новую архитектуру нейронной сети,
  получившую название Kolmogorov-Arnold Networks (KAN),
  в которой реализовано перемещение активаций на <ребра> сети.
  //// Т.е. на связи между нейронами.
  
  То есть, в то время как MLP имеют детерминированные функции активации в нейронах,
  в KAN они перемещены непосредственно на веса внутри сети
  и становятся объектами обучения.
  //// Вполне закономерный шаг.
  //// В том смысле, что "функции активации" закономерно давно должны были получить
  //// дополнительную степень "гибкости" и "обучаемости".
  //// Проблема была в сложности такой реализации
  //// применительно к функциям активации непосредственно нейронов.
  //// Соответственно, решение было найдено путем "вынесения" требуемого функционала
  //// за границы собственно нейрона в "функционал связей" путем их усложнения,
  //// добавление к свойству просто линейного изменение/настройки значения веса/параметра
  //// еще и свойства "настройки функциональной зависимости".
  //// Т.е. полное соответствие приемам ТРИЗ - "вынесение оперативной зоны",
  //// и "повышение уровня динамизации".
  В работе подчеркивается,
  что идея KAN основана на глубоких математических принципах:
  в частности, на теореме об аппроксимации Колмогорова-Арнольда.
  //// А мне почему-то представляется, что здесь не столько сработала "математика",
  //// сколько "инженерия".
  //// Хотя вполне возможно, что изначально авторы шли именно от "математики".
  
  KAN продемонстрировала значительные преимущества в точности
  перед многослойным перцептроном.
  //// Ну, это-то понятно, так как замена "простой настраиваемой линейности"
  //// какой-то "обучаемой нелинейности" однозначно может повысить точность
  //// просто за счет уменьшения ошибок в точках "перелома"/"скачков"/"разрыва"
  //// искомой аппроксимируемой функции.
  При этом для достижения равного результата размер таких сетей
  может быть значительно меньше по сравнению с MLP.
  //// А это уже очень серьезно.
  Кроме того, за счет своей гибкости подход
  предоставляет новые возможности интерпретируемости сети.
  //// Тоже большая "вкусняшка",
  //// но надо посмотреть на то как это будет выглядеть в реальных системах.
  
  Однако стоит отметить, что по сравнению с традиционным MLP
  обучение KAN занимает больше времени
  и требует больших вычислительных мощностей
  из-за сложности обучаемых активаций.
  //// Это тоже вполне ожидаемо, но пока не представляется особой проблемой
  //// - возможность получить точность, как минимум, на одну девятку больше,
  //// вполне "стоит свеч".
  //// Но опять же надо посмотреть на практику обучения реальных систем
  //// - возможно, всплывут какие-то неожиданные "артефакты".
  
  Тем не менее, KAN становится многообещающей альтернативой MLP
  и открывает новые возможности для улучшения существующих моделей.
  Это может значительно повлиять на развитие технологий искусственного интеллекта
  в ближайшем будущем.
  Возможно сегодня мы наблюдаем зарождение новой эры глубокого обучения.
  
  .........
  
  //// Из комментариев.
  
  Safreliy
  17 часов назад
  
  Вовсе не удивительно, что на основе аппроксимационной теоремы Колмогорова
  можно строить такие же функции в виде сетей, как и в случае MLP.
  MLP в свою очередь обосновываются аппроксимационной теоремой Хехта-Нильсена
  (и её обобщением на класс измеримых функций, данным Алексеевым).
  
  Как в случае MLP, так и в случае KAN у нас доказывается сходимость
  представленной структуры в пространстве измеримых функций,
  но ничего не говорится об их оптимальности.
  По всей видимости это в принципе очень трудная проблема,
  сравнимая с задачами тысячелетия.
  Всё сравнивается с эффективностью на конкретных задачах,
  но не производится никаких обобщений.
  Таким образом мы просто метаемся от одного представления к другому,
  так и не исследовав глубокие морфологические свойства подобных разложений,
  не поняв структуру созданных сетей и то,
  как же всё-таки сопоставить классы всевозможных сетей
  с классами всевозможных функций, чем бы они не являлись.
  //// Представляется, что вопрос "математической оптимальности",
  //// пусть простят меня "настоящие математики",
  //// все-таки вторичен.
  //// Более актуальным представляется вопрос "реализуемости",
  //// т.е. достижения требуемой точности в приемлемые сроки,
  //// причем из какой-то понятной начальной конфигурации.
  //// А если невозможность достижения этого в конкретных случаях,
  //// со ссылками на "локальные минимумы" и "переобучение"
  //// будет таким же распространенным явлением, как и для обычных "перцептронов",
  //// то все "доказанные теоремы об оптимальности" мало чего будут реально стоить.
  
  Imaginarium
  15 часов назад
  
  Да, мы в плену поиска частных и быстрых прикладных решений.
  Это проявление философского кризиса,
  явного перекоса в сторону прикладной науки в ущерб фундаментальной.
  
  pennanth
  12 часов назад
  
  Вы правы.
  
  Хотел только отметить, что эффективность на задачах или даже классе задач
  не означает эффективность на обобщениях этих задач.
  Более того, оптимальность в многомерных задачах теряется очень быстро
  при малых изменениях небольшого числа параметров.
  //// Вот что нужно исследовать в первую очередь в "теории оптимальности",
  //// а не "всеобщее доказательство".
  Скорее всего, оптимальность обобщенных задач нужно искать
  в их собственном пространстве напрямую, не в классах конкретных задач.
  //// Вот здесь полностью согласен.
  //// Нужно понимание "пространства задач" и "внутренних состояний/представлений",
  //// тех самых эмбеддингов/латентов.
  //// А этого пока даже и близко нет.
  
  ........
  
  erley
  4 часа назад
  
  В лаборатории ИИ на ВЦ в Новосибирском Академгородке 30 лет назад
  была группа которая вела исследования в этом направлении.
  К сожалению их не удалось завершить - большая часть коллектива эмигрировала,
  суровые 90-е разрушили многое.
  
  Тогда я заканчивал университет и немного общался с этими ребятами.
  Конечно, в опубликованной работе MIT ушли дальше,
  а в то время было непросто провести все численные эксперименты
  и работа шла безусловно медленнее.
  Забавно что только через 30 лет эта идея сформировалась во что-то конкретное.
  
  Идея не нова, сейчас появляются разные инициативы
  по улучшению базовых принципов работы НС
  (например Джеффри Хилтон год назад предлагал новую архитектуру НС).
  
  Основное преимущество KAN в том что
  за счёт замены активационной функции простым сумматором
  и усложнением весовой функции с простой линейной на сплайн-функцию
  достигается существенные улучшения по гибкости и точности.
  Да, для одинакового размера сети,
  KAN сложнее в обучении чем MLP,
  но как показано в данной работе,
  KAN даёт существенно больший выигрыш при гораздо меньшем размере НС.
  То есть в итоге утверждается, что KAN лучше при тех же затратах на обучение.
  
  Очень интересная работа кстати, почитайте их публикацию,
  там есть ссылка на их гитхаб, можно поэкспериментировать самому.
  
  AndrewAtResearch
  3 часа назад
  
  Ну вот, теперь появится возможность смешивать.
  
  Выход MLP подать на вход KAN.
  Выход KAN подать на вход MLP.
  Сделать все узлы в MLP из KAN.
  Не все узлы.
  То же, но наоборот: пусть функции в KAN реализуются с помощью MLP.
  Сетка, где левая половина (субсеть) KAN, а правая - MLP.
  
  "Двести тысяч вариантов уже готовы, миллион на подходе"
  
  .........
  
  Devastor87
  вчера в 17:57
  
  \\\ В основе всех архитектур глубокого обучения,
  \\\ в том числе систем компьютерного зрения и больших языковых моделей,
  \\\ лежит многослойный перцептрон (MLP). У него есть веса и нейроны,
  \\\ в которых расположены функции активации.
  \\\ Этой парадигмой ученые пользуются с 1957 года,
  \\\ когда ее предложил Фрэнк Розенблатт.
  
  MLP - одна из множества архитектур нейронных сетей (самая базовая),
  коих существуют десятки
  
  Нейронная сеть - одна из множества различных моделей,
  лежащих в основе глубокого обучения, cv и т.д.
  
  Таким образом, фраза выдает почти что нулевое знание и понимание
  области DS и ML.
  
  MLP - это только ОДНА из множества архитектур, ОДНОЙ из множества моделей.
  
  Всё равно что сказать: в основе всех домов лежат бревна...
  
  Konard
  вчера в 18:15
  
  А если посмотреть на это через призму теории связей,
  где и вершины и рёбра это связи.
  Получается можно сделать ещё один шаг
  и объединить оба подхода и исследовать на что способен общий случай.
  
  //// Конец цитирования
  
  В общем, очень интересная концепция просматривается.
  Захотелось узнать что-то более конкретное по ней,
  но пока информации совсем не много и больше "рекламная",
  например, что-то вот такое:
  
  "На практике пробуем KAN
  - принципиально новую архитектуру нейросетей".
  Автор: DataSecrets
  https://habr.com/ru/articles/812147/
  3 мая 2024 в 18:14
  
  И чуть более подробную статью этих же авторов:
  https://datasecrets.ru/articles/9
  
  //// Начало цитирования.
  
  .......
  
  Идею KAN ученые почерпнули из теоремы Колмогорова-Арнольда,
  именно в их честь и названа архитектура.
  Вообще говоря, исследование очень математичное,
  в статье 50 страниц с формулами, повсюду термины из мат.анализа,
  высшей алгебры, функана и прочего.
  
  ......
  
  В общем, эта статья поможет разобраться с устройством KAN и не сойти с ума.
  
  Поехали!
  
  Как работает перцептрон
  
  Для начала давайте вспомним базовую вещь:
  нейросети работают с функциями.
  В любой задаче обучения с учителем у нейросети есть обучающая выборка,
  состоящая из пар {xi, yi}, где x - это входные данные, а y - "ответ".
  Задача сети - найти такую многомерную функцию f,
  что f(xi) ? yi для всех точек пространства.
  Другими словами, нейросеть пытается найти функцию,
  обобщающую связь между входами и выходами задачи.
  
  Архитектура классического перцептрона предполагает поиск такой функции
  с помощью линейных слоев,
  на которых выполняется умножение входов на веса ребер,
  и функций активации в нейронах.
  
  Такая архитектура основана на теореме Цыбенко
  (universal approximation theorem),
  которая доказывает, что нейронная сеть может аппроксимировать
  любую непрерывную функцию с любой точностью.
  Однако есть и другие теоремы, связанные с аппроксимацией функций.
  С одной из них - теоремой Колмогорова-Арнольда, как раз и связан KAN.
  
  .....
  
  Теорема Колмогорова-Арнольда
  
  Чтобы точно понять строение KAN, нужно разобраться с математикой.
  Но обещаем, эта часть будет нескучной и совсем не сложной.
  
  Итак, заслуга Колмогорова и Арнольда заключается в том,
  что они доказали, что аппроксимация непрерывной ограниченной функции
  от множества переменных сводится к нахождению
  полиномиального числа одномерных функций:
  
  .....
  
  Казалось бы: это отличная новость для машинного обучения:
  получается, чтобы "воссоздать" большую страшную функцию связи
  между входами и выходами сети,
  нам нужны обычные одномерные функции,
  число которых с ростом параметров к тому же растет полиномиально,
  а не экспоненциально.
  
  Однако, не все так просто.
  
  Во-первых, наши одномерные функции могут оказаться негладкими
  и даже фрактальными,
  и их будет невозможно обучить.
  //// Это одна из главных болевых точек обратного распространения ошибок
  //// основанных на градиентном спуске.
  //// Т.е. о общем случае может потребоваться именно "фрактальное представление",
  //// а это входит в противоречие с парадигмой "непрерывного представления".
  
  Во-вторых, число таких функций и глубина композиции в теореме фиксированы,
  а значит наша нейронная сеть будет иметь всегда один и тот же размер
  (2 слоя и 2n+1 нейронов на них).
  Получается, что подход совсем деревянный и не масштабируется.
  
  Именно эти два пункта раньше останавливали ученых,
  которые пробовали применять Колмогорова-Арнольда в ML.
  Да-да, идея не новая, но по-настоящему развили ее только сейчас:
  в отличие от предшественников, авторы KAN придумали, как обойти проблемы,
  и в итоге получили блестящий результат.
  Итак, давайте посмотрим, что они сделали.
  
  Наивная архитектура KAN
  
  Сначала исследователи, как и другие ученые до них,
  пытались использовать теорему из предыдущего раздела "в лоб".
  Так как мы должны найти только функции,
  в этом случае у нас получается нейросеть,
  у которой вообще нет линейных весов и функций активации в нейронах.
  Здесь все наоборот.
  Вместо весов на ребрах сети мы обучаем функции,
  а в нейронах просто их складываем.
  
  Вот пример:
  для сети с двумя (n=2) входными параметрами мы получаем двухслойную
  (так как глубина композиции в теореме равна двум)
  нейросеть с пятью (так как в теореме участвует 2*n+1 = 5 функций) нейронами
  на скрытом слое.
  
  .....
  
  "А что там с тем, что функции могут быть необучаемыми?" - спросите вы.
  Ну, во-первых, авторы обосновали,
  что в случае предсказания зависимостей из реального мира
  появление таких функций крайне маловероятно.
  //// Почему-то, "черные лебеди" встречаются в реальных задачах как-то очень часто.
  Во-вторых, чтобы обойти эту проблему,
  в KAN мы ищем не абы какие функции,
  а параметризуем их сплайнами.
  //// А вот это уже более "прагматичный подход".
  //// Просто ограничиваем "класс аппроксимируемых функций",
  //// а все что не укладывается в это "прокрустово ложе",
  //// считается обычной "неточностью".
  //// На первый взгляд, как минимум "три девятки" в большинстве случаев
  //// так можно добиться.
  
  Сплайн - это такая гладкая кривая,
  кусочно-полиномиальная функция,
  которая на разных отрезках задается различными полиномами.
  Каждый сплайн аппроксимируется с помощью заданного количества точек.
  Чем больше точек - тем точнее аппроксимация.
  
  Сплайны непрерывны и дифференцируемы,
  а значит, такую архитектуру можно спокойно обучать
  с помощью привычного нам метода обратного распространения ошибки.
  //// А как насчет "исчезающих" и "взрывающихся градиентов"?
  //// Представляется, что при увеличении порядка "полинома" сплайна,
  //// эти проблемы вырастут как минимум на порядок.
  //// Может быть, это и есть основная причина трудности обучения этой архитектуры?
  
  Обобщенная архитектура
  
  В отличие от проблемы дифференцируемости,
  которую ученые элегантно решили сплайнами,
  проблема с масштабируемостью KAN не сдалась так легко.
  Как сделать так, чтобы в сеть можно было добавить больше слоев и нейронов?
  Ведь для этого нужна обобщенная теорема Колмогорова-Арнольда,
  а ее просто-напросто не существует.
  
  Вот тут и заключена прорывная часть работы.
  Исследователи заметили,
  что по аналогии с перцептроном мы можем на каждом слое
  построить матрицу обучаемых объектов.
  Просто в нашем случае это будут не параметры (числа), а функции.
  В терминах матрицы исходная формула оказывается не законом,
  а просто частным случаем KAN с двумя слоями.
  А обобщенный KAN - это более глубокая композиция таких матриц:
  
  .....
  
  А саму теорему для KAN можно переписать вот так:
  
  ......
  
  В остальном, кроме изящной внутренней математики,
  работать с KAN можно также, как с обычными сетями:
  добавлять и удалять нейроны, стекать слои,
  использовать дропаут и даже регуляризацию.
  
  Сравнение с перцептроном
  
  Перемещение активаций на ребра хотя и не кажется глобальным изменением,
  но все-таки несет в себе много перемен.
  Вот ключевые аспекты, отличающие KAN от перцептрона:
  
  Так как для аппроксимации каждого сплайна требуется несколько точек
  (пусть таких точек у нас K штук),
  KAN требует в K раз больше параметров,
  чем MLP с той же глубиной и количеством нейронов на слоях.
  
  К счастью, проблема из первого пункта нивелируется тем,
  что KANу требуется во много раз меньше нейронов,
  чтобы достичь точности MLP.
  Исследователи также опытным путем доказали,
  что KAN гораздо лучше генерализует данные.
  //// Еще одно подтверждение, что архитектура KAN,
  //// это больше "инженерное достижение", а не "математическое",
  //// несмотря на "50 страниц с формулами".
  
  За счет того, что в KAN мы обучаем функции, а не числа,
  можно повысить точность сети без переобучения ее с нуля.
  В MLP, чтобы добиться лучшей точности,
  мы можем увеличивать количество слоев и нейронов,
  но это требует полноценного ретрейнинга
  и вообще-то работает далеко не всегда.
  В KAN достаточно просто добавить больше точек в сетку аппроксимации.
  Это гарантирует лучший результат,
  и при этом не нужно переучивать нейросеть.
  //// Вот тут непонятно - а как же формула "2*n+1"?
  //// В общем, до полного понимания возможностей по реализации этой архитектуры
  //// еще ой как далеко.
  
  KAN более интерпретируем, чем MLP.
  А ведь интерпретируемость
  - это одна из главных проблем современных нейросетей.
  //// Ну, не знаю, насколько реальной окажется полезность
  //// интерпретации той же языковой модели каким-нибудь
  //// "сточленным степенным рядом" или "разложением в ряд Фурье".
  
  KAN лучше справляется с аппроксимацией сложных математических функций,
  поэтому у него, можно сказать, "технический склад ума".
  В статье показано, что KAN на порядок лучше решает дифференциальные уравнения
  и может (пере)открыть законы физики и математики.
  
  У архитектуры есть бутылочное горлышко:
  KAN учится медленнее MLP примерно в 10 раз.
  Возможно, это станет серьезным камнем преткновения,
  а возможно инженеры быстро научатся оптимизировать эффективность таких сетей.
  
  .......
  
  Код!
  
  Статья - это еще не все.
  Исследователи также выложили код, и даже зарелизили библиотеку,
  с помощью которой можно поиграть с KAN из коробки,
  
  ......
  
  Заключение
  
  KAN - это новая эра глубокого обучения?
  Точного ответа нет, но у метода есть все шансы.
  Как минимум это большой толчок для исследований.
  Будем ждать новостей о возможностях для улучшения существующих моделей.
  
  //// Конец цитирования.
  
  В целом, первое знакомство с материалами по архитектуре KAN,
  лично у меня, вызвало двойственное чувство.
  С одной стороны, хорошо, что "нейронаука" не стоит на месте
  и развивается в разных направлениях,
  вполне согласуясь с общими законами развития технических систем,
  в сторону "динамизации" и "обобщения".
  А с другой, немножко грустно, что такое перспективное направление
  как бинарные/битовые сети, также позволяющие обучаться
  различным функциональным зависимостям,
  причем куда более ускоренно, по сравнению с традиционными нейросетями,
  все дальше и дальше уходят из фокуса интереса и "мейнстрима нейронаук".
  
  Но, может быть, так и должно быть,
  что пока "мэйнстрим" не исчерпает своих резервов,
  или пока не появится новая "экологическая ниша"
  что-то принципиально новое развивается в сильно "латентном" состоянии.
  
  
  ========
  
  04.05.2024 16:30
  
  Еще "немного" о попытках трансформировать трансформеры.
  В оглавление.
  
  Данный объемный материал приводится больше для архива,
  как иллюстрация спектра попыток исследований/улучшения трансформерной архитектуры.
  Ну, и как определенная дань уважения автору представляемого материала
  за нужную, но достаточно малопочитаемую работу.
  Материал очень большой, даже разбитый на две части,
  и предназначен только для тех,
  кто ищет либо какие-то новые идеи для собственной архитектуры нейросети,
  либо какие-то ссылки на нечто сходное, сделанное другими.
  
  Но мой личный вывод по этим материалам можно попытаться сформулировать
  следующим образом:
  архитектура стандартного трансформера сильно избыточна
  и может быть значительно "облегчена" за счет модификации алгоритмов обработки,
  причем во многих случаях практически без всякого теоретического обоснования.
  Что в свою очередь "бросает тень" на "теоретическое обоснование"
  всей трансформерной архитектуры.
  Складывается впечатление, что никто толком не понимает
  как, собственно, работают, точнее, за счет чего трансформерные архитектуры
  обеспечили такой качественный рывок в больших языковых моделях,
  если практически все "компоненты" можно сильно менять/урезать
  без особых последствий в качестве работы.
  
  Впрочем, может я чего-то существенного не понимаю,
  и Вы сможете ответить на этот вопрос по-другому:
  
  "Экзибит, прокачай мой трансформер или
  Основные идеи по улучшению модели трансформера
  с 2018 по 2020 год (часть 1)"
  Автор: vladbalv (Владислав Балаев)
  https://habr.com/ru/companies/lanit/articles/682506/
  23 авг 2022 в 10:01
  
  Автор оригинала: Tianyang Lin, Yuxin Wang, Xiangyang Liu, Xipeng Qiu
  https://arxiv.org/abs/2106.04554
  
  //// Начало цитирования.
  
  В июне 2021 года вышла статья "A Survey of Transformers"
  - обзор различных нововведений, сделанных с применением архитектуры "трансформер"
  после ее появления в материале "Attention is all you need".
  
  Этот материал особенно актуален сейчас.
  Приведенные подходы и архитектуры начинают использоваться сообществом
  с большим опозданием
  и понимание их работы становится востребованным постепенно,
  когда все уже понимают сильные и слабые стороны обычного трансформера
  и хотят его улучшить.
  Многие архитектуры, которые появляются сейчас,
  используют наработки, родившееся в первые три года после появления трансформеров.
  
  ......
  
  В начале статьи "A Survey of Transformers" авторы напоминают
  об основных строительных блоках,
  на которых основывается архитектура.
  Я тоже тезисно их отражу в своем посте.
  
  Описание стандартного (ванильного) трансформера
  
  На вход архитектуре подаются последовательности векторов,
  чаще всего эмбеддингов некоторых категорий,
  например, частей слов.
  К каждому из этих векторов прибавляется вектор такого же размера,
  являющийся позиционным эмбеддингом,
  не зависящим от информации, закодированной в эмбеддингах,
  а лишь от порядкового номера каждого вектора в последовательности.
  В большинстве случаев эти векторы много раз
  проходят через различные преобразования,
  но все время остаются последовательностью векторов определенной длины.
  
  Самым главным блоком в трансформерах является внутреннее внимание:
  каждый из векторов, который поступает на вход,
  преобразуется в три вектора тремя разными матрицами.
  Один из этих векторов называется query
  - это вектор, который учится "опрашивать" другие векторы
  на предмет наличия нужной ему информации.
  Другой - key
  - учится "понимать", как дать понять другим векторам,
  что у него есть ценная для них информация,
  и value -
  та самая ценная информация, которой вектор хочет поделиться с другими.
  //// Т.е. главная идея трансформера как-то обучиться
  //// использовать "выученную взаимосвязь" между векторами.
  //// Но вот, что должно входить в эту "взаимосвязь"", вообще-то, вопрос.
  //// В исходной архитектуре использовалась концепция "фсе".
  //// А это возможно не лучшее решение.
  
  На первом этапе query каждого вектора умножается на key каждого вектора,
  в результате чего получается матрица внимания размера lxl,
  где l - длина последовательности векторов.
  Далее в рамках каждого query мы имеем l его "связей"
  с key других векторов последовательности
  и нормируем их функцией softmax,
  чтобы вместе они суммировались в 1.
  Эти значения представляют собой веса,
  с которыми мы затем суммируем value для каждого query по отдельности.
  В матричном виде соответствующие операции можно выразить следующим образом:
  
  Attention(Q, K,V) = softmax(\frac{QK^T}{\sqrt{D_k}})V=AV
  A= softmax(\frac{QK^T}{\sqrt{D_k}})
  
  Матрица A как раз и является матрицей lxl,
  выражающей то, как много информации возьмет один вектор от другого,
  чтобы пересмотреть свое значение на будущих слоях сети.
  
  С концепцией внутреннего внимания непосредственно связана
  концепция многоголового multihead-внимания.
  Заключается она в параллельном наличии
  некоторого количества слоев внутреннего внимания,
  которые затем стыкуются в длинные векторы
  и преобразуются через умножение на еще одну матрицу к изначальному размеру.
  
  MultiHeadAttn(Q,K,V)=Concat(head_1,...,head_H)W^O,
  where head_i=Attention(QW_i{^Q},KW_i{^K},VW_i{^V}).
  
  Еще одна концепция - это position-wise feed forward network,
  еще одно умножение на матрицу
  или же применение полносвязного или линейного слоя к данным,
  а точнее двух слоев с функцией активации в промежутке.
  При этом это преобразование с одной и той же матрицей
  применяется к каждому вектору по отдельности.
  
  FFN(H')=ReLU(H'W^1+b^1)W^2+b^2
  
  Наконец, в архитектуре трансформера есть residual-связи,
  т.е. связи в обход некоторых слоев,
  а именно многоголового внимания и position-wise полносвязной сети.
  После этого проброса и сложения с теми векторами,
  которые через эти слои пошли,
  производится Layer-нормализация
  - из каждого вектора вычитается его среднее
  и делится на стандартное отклонение,
  после чего еще умножается на некоторый коэффициент
  и прибавляется еще некоторое поправочное число.
  
  H'=LayerNorm(SelfAttantion(X)+X)H'=LayerNorm(FFN(H')+H')
  
  Основной недостаток сети трансформер связан
  с наличием квадратичной зависимости от длины последовательности
  как для вычислений, так и для оперативной памяти,
  и большая часть исследований так или иначе была нацелена
  на преодоление этой проблемы и касалось механизма многоголового внимания.
  В первой части будем обсуждать только модификации этого элемента архитектуры.
  //// В общем, характеризуя это направление работ,
  //// можно высказать сожаление, что значительная часть усилий
  //// опираются не какое-то понимание механизмов работы трансформеров,
  //// а чисто на "механический" перебор возможных вариантов реализации.
  //// Т.е. "алхимия нейронауки" в самом чистом виде.
  
  Ограниченное внимание и его сочетания
  
  Самое простое решение именуется "разреженным внутренним вниманием"
  и заключается в ограничении связей векторов друг с другом
  для расчета матрицы внимания.
  Для удобства восприятия эти ограничения иногда рассматриваются в виде графов.
  Авторы приводят наиболее принятые возможности.
  
   Global - все векторы связываются лишь с несколькими ведущими векторами,
   которые берут информацию у всех остальных векторов
   для того, чтобы обновить свои значения
   и дают информацию всем остальным векторам.
   Остальные же векторы друг с другом никакой информацией не делятся.
  
   Band или local - векторы связываются друг с другом лишь в некотором окне
   (например, два вектора назад и два вектора вперед).
  
   Dilated - векторы связываются друг с другом в некотором окне,
   но с промежутками
   (например, только два, четыре и шесть векторов влево и вправо).
  
   Random - связи между векторами устанавливаются случайным образом.
  
   Block local - связи между векторами ограничиваются блоками.
   Так, например, первые пять векторов связаны только друг с другом,
   вторые пять векторов (с пятого по десятый) связаны только друг с другом
   и т. д.
  
  Рис. Виды разреженного внимания
  
  //// Самое "концептуально" интересное это, конечно, Random.
  //// Т.е. что-то с чем-то связывается, но как именно значения не имеет.
  //// Если хорошо в это вдуматься, то получается,
  //// что не важно какие вектора брать - что-то в них все равно есть нужное.
  //// Странно, что это, похоже, никто даже обсуждать не пытается.
  //// И еще один интересный момент - локальная взаимосвязь используется
  //// более часто, чем глобальная. Стоит взять на заметку.
  
  На практике же конкурентные архитектуры содержат, как правило,
  некоторое сочетание из этих подходов.
  
   Например, Star-Transformer (https://aclanthology.org/N19-1133/)
   и Longformer (https://arxiv.org/abs/2004.05150)
   и ETC (https://aclanthology.org/2020.emnlp-main.19/)
   содержат global и local внутреннее внимание.
  
   BigBird (https://arxiv.org/abs/2007.14062)
   содержит global, local и random.
  
  Рис. Сочетания различных видов разреженного внимания в архитектурах трансформеров
  
  Такой подход позволяет сократить число расчетов
  и хранимых в памяти значений матрицы внимания
  и с меньшими расходами увеличить длину последовательности
  поступающей на вход сети.
  
  Отдельный вид разреженного внимания в статье именуется extended, т.е. расширенный.
  Это внимание через бинарное дерево и через двумерные координаты.
  
  Внимание через бинарное дерево
  (в BP-Transformer: https://arxiv.org/abs/1911.04070)
  проиллюстрировано следующим образом:
  
  Рис. Внимание через бинарное дерево (Binary partitioning (BP) Transformer(T))
  
  Таким образом, формируется много дополнительных узлов,
  которые авторы называют span nodes.
  Они как бы экранируют свои дочерние узлы, принимая все внимание на себя.
  Чем дальше токены расположены друг от друга в последовательности,
  тем более высоким по иерархии узлам они будут давать о себе информацию,
  а общаться каждый с каждым не будет.
  
  У трансформеров для работы с изображениями свои хаки
  (http://proceedings.mlr.press/v80/parmar18a.html).
  В статье описываются два подхода по формированию связей внимания:
  block local и axial.
  В обоих случаях формирование связей идет до преобразования картинки
  из двумерной в одномерную.
  Первый подход позволяет учитывать связи внутри квадрата,
  а второй - по горизонтальным и вертикальным направляющим каждого пикселя.
  
  Рис. Разреженное внимание, основанное на двумерной структуре данных
  
  Разреженное внимание основанное на содержании (Content-based Sparse attention)
  
  Основная цель подхода - найти наиболее ближайшие ключи (key) к запросам (query),
  не вычисляя всех попарных скалярных произведений,
  как мы делаем в ванильном внимании.
  Для решения этой задачи есть свои подходы под общим названием
  Maximum Inner Product Search
  (https://en.wikipedia.org/wiki/Maximum_inner-product_search).
  Но можно и проще: в Rounting Transformer
  (https://arxiv.org/abs/2003.05997)
  используется K-means для key и query в одном пространстве.
  Соответственно, когда у нас появляются новые ключи,
  мы для каждого запроса смотрим,
  в какой кластер он попал и считаем веса внимания лишь с теми ключами,
  которые принадлежат этому же кластеру.
  В Reformer подход похожий,
  только вместо K-means используется
  Locality Sensitivity Hashing
  (https://ru.wikipedia.org/wiki/Locality-sensitive_hashing),
  та же кластеризация в некотором роде:
  для близких query и key будут одинаковые хэши.
  //// Тоже дельная идея - использование только типовых ключей,
  //// Что-то такое напрашивается использовать и в бинарных нейросетях.
  
  Еще две концепции в этом разделе - это Sparse Adaptive Connection
  (https://proceedings.neurips.cc/paper/2020/hash/c5c1bda1194f9423d744e0ef67df94ee-Abstract.html)
  и Sparse Sinkhorn Attention
  (http://proceedings.mlr.press/v119/tay20a.html).
  Первый подход использует LSTM-нейросеть для предсказания пар токенов,
  между которым должна быть связь,
  которая обучается с подкреплением.
  //// Т.е. фактически обучается не только стандартные матрицы,
  //// но и своеобразные "матрицы связей".
  //// Может быть имеет смысл подумать над развитием таких "адаптивных связей",
  //// например, в виде более ограниченных по размеру но обучаемых,
  //// списков наиболее значимых связей?
  Второй разбивает все ключи и запросы на отдельные подмножества, блоки.
  Затем с помощью Sinkhorn-нормализации
  подбирает такую матрицу связей между блоками ключей и запросов,
  чтобы каждый блок ключей был связан только с одним блоком запросов,
  что осуществляется через отдельную нейросеть Sortnet.
  //// А как такую вспомогательную нейросеть обучать?
  //// Так, на вскидку, это сильно затратный процесс,
  //// т.к. вроде как для обучения ее требуется какая-то предварительная оценка
  //// качества работы основной нейросети на достаточно большом датасете.
  
  Линеаризованное внимание
  
  Наконец, в статье рассматривается "Линеаризованное внутреннее внимание"
  (Linearized sef-attention).
  Основная мысль этой концепции в том, что умножение
  
  QK^T
  
  ведет к квадратичной сложности,
  а вот если бы мы не брали от произведения нелинейную функцию Softmax,
  то могли бы сначала умножить
  
  K^TV,
  
  а потом уже на Q, и жизнь стала бы проще.
  Как этого добиться?
  Попробовать сделать что-то с Q и K по-отдельности,
  превратив их в Q' и K',
  чтобы их произведение давало тот же результат,
  как и после софтмакса над произведением Q и K.
  Это произведение можно кроме того переосмыслить, представив
  
  exp(QK^T)
  
  как функцию близости векторов
  
  q_i и k_j,
  
  которую можно уже представить в виде произведения двух функций
  
  \phi(q_i) ; \phi(k_j).
  
  Если мы такую функцию подобрали,
  то вполне можем сначала посчитать произведение
  
  \phi(k_j)
  
  на v, а потом уже умножать на
  
  \phi(q_i).
  
  При этом выделенные синим фрагменты
  в случае авторегрессионного внутреннего внимания
  (то, с которым мы сталкиваемся в декодере,
  когда новый токен может взаимодействовать посредством внимания
  лишь с предыдущими токенами, но не со следующими)
  могут не пересчитывать заново полностью,
  а лишь дополняться новыми членами.
  
  В качестве функций предлагаются elu(x)+1 в Linear-трансформере
  (http://proceedings.mlr.press/v119/katharopoulos20a.html).
  А авторы Performer (https://arxiv.org/abs/2009.14794)
  стараются обобщить задачу, представляя функцию следующим образом:
  
  \phi(x)= \frac{h(x)}{\sqrt m}
  [f_1(\omega_1^Tx),...,f_1(\omega_m^Tx),...,f_l(\omega_1^Tx),...,f_l(\omega_m^Tx)]
  
  Здесь функция
  
  h(x): R^D-> R,
  а
  f_l:R->R.
  
  Результат применения функции f конкатенируется в единый вектор.
  В качестве варианта этих функций предлагается:
  
  h(x)= exp(\frac{\|x\|^2}{2}), l=2,f_1=sin, f_2=cos
  
  и
  
  h(x)=exp(-\frac{\|x\|^2}{2}), l=1, f_1=exph(x)=1,l=1, f_1=ReLU
  
  Некоторые авторы также пытаются улучшить механизм работы
  с авторегрессионным самовниванием.
  В изначальной парадигме новые члены
  
  k_i, v_i
  
  просто постепенно добавляются к общей сумме.
  В Random Feature Attention (https://openreview.net/forum?id=QtTKTdVrFBB)
  авторы предлагают некоторый механизм гейтинга,
  для того чтобы выбрать лишь определенные связи (в основном локальные).
  Осуществляется это посредством весов g у нового члена и (1-g) у предыдущей суммы,
  которые являются функцией входных данных.
  //// Судя по тому, что все эти методы вряд ли предлагались бы,
  //// если бы приводили к катастрофическому ухудшению работы
  //// по сравнению со стандартным трансформером,
  //// то есть основание предполагать, что они достаточно работоспособны.
  //// А с другой стороны, как-то не слышно, чтобы эти же методы давали
  //// какой-то качественный выигрыш в точности/качестве,
  //// кроме заявленного уменьшения требований к памяти и вычислительным ресурсам.
  //// Следовательно, есть подозрение, что качество работы трансформерной архитектуры,
  //// не очень сильно зависит от реализации полносвязного "внимания".
  //// Т.е. есть смысл искать какое-то "ограничение"/"усечение" "внимания",
  //// допустимое для конкретной задачи.
  //// Т.е. "внимание" вовсе не "все, что вам нужно",
  //// куда больше требуется "понимание" какой вариант этого "внимания"
  //// действительно требуется.
  
  Прототипирование запросов и сжатие памяти
  
  Авторы приводят еще два механизма сокращения расчетов матрицы внимания.
  Первый нацелен на уменьшение числа запросов,
  второй - на уменьшение числа пар "ключ-значение".
  
  Рис. Прототипирование запросов и сжатие памяти
  
  Для того, чтобы уменьшить число запросов,
  предлагается самый простой подход,
  по которому сначала выбираются каким-то образом прототипы из запросов (query),
  матрица внимания рассчитывается на их основе,
  а остальные строки матрицы заполняются равномерным распределением.
  //// Сказать, что "простой подход", наверно, слишком "скромно".
  //// Тут просто "наглость в квадрате", по отношению к классике.
  //// "Заполнить остальные строки" нулями - я бы еще понял,
  //// но "заполнять равномерным распределением"
  //// - это за гранью моей "математической интуиции".
  //// И ведь все это, наверняка, покреплено какой-то
  //// "заумной математической казуистикой".
  //// Вот бы понять бы не "формулы", а смысл того, почему это может работать.
  Есть и более интересные подходы,
  например, в Clustered Attention (https://arxiv.org/abs/2007.04825)
  запросы кластеризуются и веса внимания вычисляются для центроидов кластеров,
  а затем просто ставятся в соответствие для всех запросов,
  принадлежащих кластеру
  //// Ну это еще более-менее понятно.
  //// "Усреднение"/"кластеризация" это все-таки "в рамках приличий".
  
  В Informer измеряют некоторую меру разреженности запросов
  через дивергенцию Кульбака-Лейблера
  между распределением внимания векторов внимания запросов
  и равномерным распределением.
  По этой мере выбираются top-u запросов,
  а оставшиеся веса внимания берут из равномерного распределения.
  Понятно, чтобы все это сделать,
  нужно уже иметь посчитанными все веса внимания,
  и не ясно, какой в этих процедурах тогда смысл.
  На самом деле авторы придумали некоторый хак, как это обойти.
  Подробнее о нем вы можете почитать самостоятельно в статье.
  https://arxiv.org/abs/2012.07436
  //// Не. Поберегу мозги, они мне еще могут потребоваться.
  
  Memory Compressed Attention (https://openreview.net/forum?id=Hyg0vbWC-),
  напротив, призван уменьшить число ключей и значений
  через шагающую (strided) свертку.
  Другой подход для сжатия памяти ключ-значение применяется
  в Set Transformer (http://proceedings.mlr.press/v97/lee19d.html).
  Авторы статьи, которую я здесь обозреваю, пишут,
  что в нем и в архитектуре Luna (https://arxiv.org/abs/2106.01540)
  используются глобальные узлы,
  но только для того, чтобы получить пары "ключ-значение",
  а вот запросы берутся все.
  В самой же статье по Set Transformer приводится
  достаточно сложная концепция induced set attention блока.
  
  Рис. Архитектурные изменения при замене стандартного многоголового внимания
  на блок set attention (SAB) и induced set attention (ISAB)
  
  К нему они приходят через просто set attention block,
  в котором Q=K=V=X.
  //// Еще один пример "наглость - второе счастье".
  В случае же ISAB берутся некоторые глобальные обучаемые вектора I
  в качестве запросов.
  Затем выход этого многоголового внимания подается как ключи и значения
  в другое многоголовое внимание,
  а то, что первому блоку служило как ключ и значение (равные),
  теперь является запросом для второго блока.
  
  После того, как мы узнали про концепцию с шагающими свертками,
  могут возникнуть всякие схожие идеи,
  и действительно еще один подход используется авторами Linformer
  (https://arxiv.org/abs/2006.04768):
  линейный слой используется для проецирования ключей и значений.
  Важно отметить, что слой мог бы применяться,
  чтобы уменьшить размерность каждого вектора (d -> d'),
  но здесь его используют именно по другой размерности,
  чтобы из l длина последовательности) ключей и значений сделать l'.
  Наконец, Poolingformer (https://arxiv.org/abs/2105.04371)
  используют два уже описанных похода:
  внимание в скользящем окне и затем уже сжатие пар "ключ-значение",
  которое они осуществляют операциями пулинга.
  
  Низкоранговое внутреннее внимание
  
  Многие авторы пишут, что матрица внимания низкого ранга,
  т.е. ее ранг значительно меньше числа токенов l.
  Особенно это должно быть применимо для коротких последовательностей
  с большим числом PAD токенов.
  Соответственно, использование ее в полном виде
  может быть неэффективным.
  Чтобы решить эту проблему, авторы одной из статей
  раскладывают матрицу внутреннего внимания в низкоранговую
  для учета дальних взаимодействий
  и на матрицу с внутренним вниманием со скользящим окном.
  
  В других работах предлагается использовать низкоранговую апроксимацию.
  Одна из линий работ в этом направлении - использование метода Нистрома
  (Nystrom (https://en.wikipedia.org/wiki/Nystrom_method).
  В рамках этого подхода сначала выбираются узлы-прототипы
  (например, через шагающий усредняющий пулинг).
  В таком случае матрицу А можно аппроксимировать следующим образом:
  
  \overline{A}=softmax({Q}{\overline{K}}^T)(softmax({\overline{QK}^T)}^{-1} softmax(\overline{Q}K^T),
  
  где
  \overline{Q};\overline{K}
  
  это запросы (ключи), полученные только для прототипов.
  
  Важно отметить, что матрица
  M^{-1}=(softmax\overline{QK}^{T})^{-1}
  
  не всегда существует, поэтому авторы CSALR добавляют к ней единичную.
  В Nystromformer (https://arxiv.org/abs/2102.03902)
  авторы используют псевдообратную матрицу M вместо обратной,
  что важно в том случае, если M окажется вырожденной.
  //// Тут мало, что понял, кроме того, что понижение размерности,
  //// не так страшно, а сохранение размерности на последовательных слоях трансформера,
  //// возможно, не так уж и обязательно.
  
  Априорное распределение внимания
  
  Хотя механизм внимания нацелен на самостоятельную установку
  необходимых "связей" между токенами,
  иногда есть смысл "подсказывать" этому механизму,
  складывая или умножая матрицу внимания на какую-то заранее определенную.
  //// Во всяком случае для начального этапа обучения,
  //// это вполне может быть очень эффективной эвристикой.
  
  Рис. Сочетание обычного внутреннего внимания и априорного
  
  И первая описываемая авторами концепция схожа с разреженным вниманием
  в скользящем окне,
  но вместо фиксированного окна взвешивает все веса ядром Гаусса.
  Таким образом получается, что мы вводим априорное распределение Gij,
  и чем выше эта вероятность,
  тем больше связаны узлы i и j.
  
  Yang et al. (https://aclanthology.org/D18-1475/) предлагают использовать
  
  G_{ij}=-\frac{(j-p_i)^2}{2\sigma^2},
  
  где p_i
  это индекс центральной позиции (ключа) для каждого запроса q_i,
  который определяется отдельной полносвязной нейросетью.
  
  В Gaussian Transformer (https://ojs.aaai.org//index.php/AAAI/article/view/4614)
  наилучшей позицией ключа для q_i
  считается i (диагональ), а
  
  G_{ij}=-\mid{w}(i-j)^2+b \mid,
  
  где w>=0, b<=0 являются скалярами,
  контролирующими отклонение и уменьшение веса центральной позиции соответственно.
  
  Другой подход предлагает модулировать матрицу внимания
  более высоких слоев трансформера матрицами более низких.
  Например, так:
  
  \widehat{A}^{(l)}=w_1\ast{A}^{(l)}+w_2\ast{g}(A^{(l-1)}),
  
  l здесь - это номер слоя,
  а w_1, w_2 веса, g - некоторая функция.
  
  В Predictive Attention Transformer (https://openreview.net/forum?id=YQVjbJPnPc9)
  в качестве g используется сверточный слой, а w_1=a, w_2=1-a,
  
  а в Realformer (https://arxiv.org/abs/2012.11747)
  g отсутствует (или можно представить ее как тождественное отображение),
  а w_1=w_2=1.
  
  Авторы говорящего названия Lazyformer (https://arxiv.org/abs/2102.12702)
  просто предлагают шарить матрицу А между ближайшими слоями
  (переключаясь между w_1=0, w_2=1; w_1=1, w_2=0)
  
  Также в обзорной статье описывается отдельный подход
  с мультизадачными адаптерами (https://openreview.net/forum?id=de11dbHzAMF)
  предлагая фреймворк CAMTL (Conditionally Adaptive Multi-Task Learning).
  В таком подходе матрица внимания модулируется некоторой матрицей M,
  которая при этом является функцией задачи или некоторого эмбеддинга задачи zi.
  
  Формулируется это следующим образом:
  
  Матрица делится на m квадратов, поэтому
  
  A_j\in{R}^{(n/m)\ast(n/m)}
  
  и являются обучаемыми параметрами,
  а не реальной матрицей внимания,
  а и являются функциями,
  преобразующими эмбеддинг задачи в пространство
  R^{(n/m)\ast(n/m)}.
  
  Затем получившаяся матрица A' складывается с реальной матрицей А.
  
  Рис. Использование мультизадачных адаптеров для модулирования матрицы внимания
  
  После Lazyformer неудивительно,
  что некоторые группы пошли дальше и решили проверить,
  а можно ли сделать трансформер, где внутреннее внимание просто захардкожено,
  т.е. не зависит от текущего входа.
  
  Так, например, Zhang et al. (https://aclanthology.org/P18-1166/)
  
  вместо формирования весов внимания
  просто кумулятивно складывают эмбеддинги токенов.
  Тем не менее, делают не только это,
  а затем используют отдельный полносвязный слой
  для того, чтобы посчитать веса,
  через которые складывать эмбеддинг текущего токена и кумулятивное среднее.
  
  You et al. (https://doi.org/10.18653/v1/2020.acl-main.687)
  предлагают использовать нормальное распределение вместо матрицы внимания,
  //// И это работает? Во дают.
  а в Synthesizer (https://arxiv.org/abs/2005.00743)
  авторы придумали выучивать матрицу А,
  а не определять из токенов.
  
  Промежуточный вариант, который они назвали Synthesizer (Dense),
  производил матрицу A непосредственно из эмбеддингов токенов
  через полносвязный слой
  (т.е. переводили векторы длиной d в вектора длиной l).
  Получается, что каждый токен,
  обладая лишь информацией о себе,
  пытается догадаться о том,
  какая информация ему нужна от других токенов,
  о которых он ничего не знает.
  //// Что в этом есть. Но для этого нужно понимать,
  //// что же тогда представляют собой эти эмбеддиги.
  //// Тут уже явно простым "векторным представлением" не обойтись.
  
  Улучшаем многоголовое внимание
  
  В первую очередь авторы обзора указывают на проблему:
  в ванильном трансформере нет никаких ограничений
  на различия между матрицами внимания разных голов.
  Соответственно, ничто не мешает им сделаться одинаковыми.
  Например, частая ситуация бывает,
  что основное внимание фокусируется на специальных токенах.
  Различные работы пытаются эту проблему решить.
  В целом есть два пути для этого:
  или мы вводим взаимодействие между головами,
  подталкивая их выучиться по-разному самостоятельно,
  или же вводим некоторые ограничения на функцию ошибки.
  
  Так Li et al. (https://aclanthology.org/D18-1317/)
  вводят регуляризирующие добавки к функции ошибки:
  
  D_{subspace}=-\frac{1}{H^2}\displaystyle\sum_{i=1}^{H}\displaystyle\sum_{j=1}^{H}{\frac{{v^i}\ast{v^j}}{{\|v^i\|}{\|v^j\|}}}D_{position}=-\frac{1}{H^2}\sum_{i=1}^{H}\sum_{j=1}^{H}V|A^i \odot{A^j}|D_{output}=-\frac{1}{H^2}\displaystyle\sum_{i=1}^{H}\displaystyle\sum_{j=1}^{H}{\frac{{o^i}\ast{o^j}}{{\|o^i\|}{\|o^j\|}}}
  
  Эти добавки ограничивают попарные скалярные произведения значений
  
  (D_{subspace}),
  
  ограничивают поэлементное перемножение матриц внимания
  
  (D_{position})
  
  и попарные скалярные произведения выходов внимания
  
  (D_{output})
  
  разных голов (i, j индексы разных голов).
  
  Другой подход заключается в добавлении лосса,
  который подгоняет матрицу А под определенный паттерн
  (например, такой, как у внутреннего внимания в скользящем окне
  или как у глобального внутреннего внимания).
  
  Sukhbaatar et al. (https://aclanthology.org/P19-1032/)
  предлагают использовать выучиваемую длину окна,
  параметризуемую выучиваемым числом z и гиперпараметром R:
  
  Таким образом, каждая голова подталкивается
  к выучиванию своего собственного окна внимания.
  
  Авторы Multi-Scale Transformer
  (https://ojs.aaai.org//index.php/AAAI/article/view/6290)
  также предлагают использовать разные размеры окна для разных голов и слоев,
  при этом основывая это на языковом базисе
  и на эмпирических исследованиях,
  по которым у более высоких слоев BERT получаются большие размеры окон,
  чем у более низких (общий текстовой контекст в сравнении с локальным).
  
  Авторы далее переосмысляют последнее преобразование
  в рамках многоголового внимания:
  линейный слой поверх конкатенированных выходов отдельных голов
  для того, чтобы восстановить изначальную длину последовательности.
  Это эквивалентно перемножению матрицы WV и WO для каждой головы отдельно,
  а потом сложение выходов от таких голов.
  Такой подход видится достаточно слабым,
  //// А почему?
  и поэтому некоторые авторы стараются его улучшить.
  Один из подходов вдохновлен капсульными нейронными сетями
  и использует роутинг для агрегации информации от разных голов.
  Две приведенные авторами работы используют динамический роутинг и EM-роутинг.
  Обратной стороной является увеличение вычислительных затрат на такие вычисления,
  поэтому Li et al. (https://aclanthology.org/N19-1359/)
  эмпирически показывают,
  что такой подход достаточно применить лишь на нижних слоях.
  
  Авторы обзора приводят еще одну интересную концепцию:
  шаринг пар "ключ-значение" между головами,
  т.е. только запросы для разных голов будут различаться.
  //// Вот этого не понял.
  //// Я, "почему-то", считал, что в стандартном трансформере
  //// как раз запрос для разных голов один и тот же, а "ключ-значение" - разные.
  //// Опять придется перечитывать "буквари".
  //// Перечитал, опять попутал "запрос" (query) и значение (value)
  //////// "Вечно ты путаешь четные с нечетными".
  //// - очень вся эта аббревиатура "интуитивно понятна".
  
  ***
  
  На этом первая часть нашего обзора заканчивается.
  Мы привели почти все подходы, описанные в оригинальной статье,
  которые нацелены на улучшения многоголового внутреннего внимания,
  ключевого элемента трансформеров
  //// Вот как раз разнообразие его возможных реализации,
  //// может свидетельствовать о том, что "ключевой элемент" трансформеров,
  //// возможно, заключается в чем-то другом.
  и наиболее затратного с точки зрения вычислений.
  По приведенным работам видно,
  что уже есть масса способов бороться со всем известной
  квадратичной зависимостью от длины последовательности,
  по модулированию внутреннего внимания определенными распределениями
  и по улучшению многоголового внимания
  для достижения большей емкости модели при обучении.
  Во второй части опишем модификации других модулей трансформера
  и различные идеи по преобразованию их архитектуры в общем.
  
  ........
  
  //// Конец цитирования.
  
  И "чтобы два раза не вставать" - сразу же вторая часть данного материала.
  
  "Экзибит, прокачай мой трансформер
  или Основные идеи по улучшению модели трансформера
  с 2018 по 2020 год (часть 2)".
  Автор: vladbalv (Владислав Балаев)
  https://habr.com/ru/companies/lanit/articles/684432/
  18 окт 2022 в 10:01
  
  Автор оригинала: Tianyang Lin, Yuxin Wang, Xiangyang Liu, Xipeng Qiu
  https://arxiv.org/abs/2106.04554
  
  //// Начало цитирования.
  
  .....
  
  В этой части мы коснемся модификаций других элементов архитектуры,
  которые уже направлены или на улучшение способности сети
  извлекать больше информации из токенов,
  или применяются на большую длину последовательности, разделяя ее на сегменты.
  
  Позиционные эмбеддинги
  
  В обычном трансформере используются позиционные эмбеддинги
  на основе sin и cos как функций от позиции токена (t)
  и от позиции числа внутри вектора эмбеддинга (i):
  
  Другой расхожий подход для кодирования позиций токенов
  - обучаемые эмбеддинги.
  Существует и комбинация этих подходов
  (Wang et al. https://openreview.net/forum?id=onxoVA9FxMw),
  при котором предлагается использовать тригонометрический функции,
  но ?i учить, а не задавать самостоятельно.
  Также авторы указывают на возможную проблему
  с утерей информации о позициях токенов на верхних слоях,
  для чего во многих работах эти эмбеддинги добавляются на всех слоях.
  //// Интересная подробность.
  //// Как-то в других материалах про позиционных эмбеддингах в трансформерах
  //// ни о чем похожем даже упоминаний нет.
  
  Относительные позиционные эмбеддинги
  
  Отдельная ветка работ посвящена замене абсолютных позиционных эмбеддигов
  относительными,
  обосновывая это тем, что знание токенов об относительной позиции друг друга
  важнее, чем знание абсолютных позиций.
  
  Так Shaw et al. (https://aclanthology.org/N18-2074/)
  предлагают добавлять обучаемые относительные эмбеддинги к ключам.
  Понятно, что таких относительных эмбеддингов будет l**2
  где l - длина последовательности,
  поэтому предлагается ограничивать применение таковых
  расстоянием между токенами равным K:
  
  k^,{_j}= k_j+r_{ij},
  
  для
  
  i=1,...,nr_{ij}=R_{clip(i-j)}clip(x)=max(-K,min(x,K))
  
  Здесь rij - эмбеддинг относительного положения токенов i и j.
  
  В трансформере InDIGO K=3
  https://transacl.org/ojs/index.php/tacl/article/view/1732).
  В Music Transformer (https://openreview.net/forum?id=rJe4ShAcF7)
  проведена некоторая работа по уменьшению нагрузки на память этого механизма.
  В T5 (https://arxiv.org/abs/1910.10683)
  этот алгоритм немного упрощен
  - в нем rij является числом, а не вектором.
  Авторы Transformer-XL (https://aclanthology.org/P19-1285/)
  оставили обычные позиционные эмбеддинги,
  но используют их для расчета матрицы внимания:
  
  A_{ij}=q_ik^T{_j}+q_i(R_{i-j}W^{K,R})^T+u^1k^T{_j}+u^2(R_{i-j}W^{K,R})^T
  
  Здесь R как раз и является обычной матрицей позиционных эмбеддингов,
  а u1;u2 обучаемые векторы размерности ключей/запросов.
  
  В DeBERTa (https://arxiv.org/abs/2006.03654)
  авторы считают позиционные эмбеддинги схожим
  с Shaw et al. (https://aclanthology.org/N18-2074/)
  образом,
  но применяют как в Transformer-XL:
  
  A_{ij}=q_ik^T{_j}+q_i(r_{ij}W^{K,R})^T+k_j(r_{ij}W^{Q,R})^T
  
  Отдельная интересная концепция реализована в TUPE
  (Transformer with Untied positional encoding: https://arxiv.org/abs/2006.15595).
  В нем предлагается для расчета весов внимания
  брать позиционные эмбеддинги напрямую
  и также скалярно перемножать их преобразованные
  к своим собственным ключам/запросам,
  как мы это делаем с эмбеддингами токенов,
  но через отдельные матрицы:
  
  Рис. Механизм внимания с учетом информации из позиционных эмбеддингов
  
  Также еще предлагается добавлять обучаемое число
  относительного положения токенов bj-i
  
  A_{ij}=q_ik^T{_j}+(p_iW^{Q,P})(p_jW^{K,P})^T+b_{j-i}
  
  Авторы Roformer (https://arxiv.org/abs/2104.09864)
  выдумали еще более изощренный способ кодирования положения токенов:
  они вводят обучаемые параметры углов поворота пар координат.
  Так, на m?1 поворачивают первые две координаты,
  а на m?2 - вторые две и т.д.
  Получается d/2 углов поворота.
  А m - это номер токена.
  Для d=2 авторы приводят следующую визуализацию:
  
  Рис. Принцип в основе позиционных эмбеддингов вращения
  (Rotary Position Embeddings (RoPE))
  
  Эта операция соответствует умножению ключей и запросов на матрицу R:
  
  Если при чтении у вас возник резонный вопрос,
  а почему бы не кодировать эмбеддинги другой сеткой,
  которая умеет учитывать последовательность токенов,
  то спешу вас порадовать:
  и такое есть - реализовано,
  например, в R-Transformer (https://arxiv.org/abs/1907.05572) через RNN,
  которые, пробегаясь по последовательности, дают эмбеддинги,
  которые далее уже подаются на вход трансформеру.
  Важно понимать, что если пропустить последовательность через обычную RNN,
  то, во-первых, рано или поздно она все-таки начнет забывать первые токены,
  а во-вторых, первые токены будут нести скудную информацию.
  Частично это решается через двунаправленную RNN,
  но авторы пошли по другому пути:
  local RNN.
  Они паддят (дополняют) последовательность
  каким-то количеством специальных токенов
  и используют RNN в окне,
  доставая лишь результат применения последней ячейки.
  
  Теперь уже возникает резонный вопрос:
  "А почему бы не через свертки?"
  И тут уже люди постарались и сделали
  Conditional Position Encoding (https://arxiv.org/abs/2102.10882).
  Авторы получают эмбеддинги для Vision Transformer,
  прогоняя сверточную сеть по изначальному изображению,
  а потом уже формируя из этого токены.
  
  Рис. Получение позиционных эмбеддингов
  через сверточную сеть по изначальному изображению
  
  //// В общем, как и с "вниманием" "позиционирование" можно реализовать
  //// "тысячью и одним" способом, но с равной степенью непонимания,
  //// преимущества одного перед другим.
  //// Короче, налицо полный "волюнтаризм", а вовсе не какой-то "мэйнстрим",
  //// и если какой-то метод более часто применяется, чем другой,
  //// то это, скорее, не потому, что он чем-то лучше, а просто более привычен.
  //// Каких-то заметных обоснованных преимуществ у разных методов "позиционирования",
  //// похоже, пока не зафиксировано.
  
  Нормализация
  
  Не обошли исследователи и вопрос нормализации.
  В первую очередь в обзорной статье рассматриваются работы
  по переносу layer нормализации в рамках архитектуры в другое место.
  Так, обычное положение этого элемента архитектуры
  - между residual блоками, обозначаемое как post-LN,
  предлагается заменить pre-LN,
  при котором она находится внутри residual-блока
  перед многоголовым вниманием и перед позиционным полносвязным слоем.
  
  Рис. Различия расположения layer нормализации в post-LN и pre-LN парадигмах
  
  Замечают, что концепция post-LN требует тонкой игры со скоростью обучения
  (learning rate) в начале обучения,
  но, с другой стороны, после того, как обучение стабилизируется,
  обгоняет pre-LN по метрикам.
  //// Интересная подробность.
  Liu et al. считают, что проблема в нестабильном обучении post-LN
  заключается в большой зависимости от residual-слоев в начале,
  и они предлагают специальный подход Admin
  (Adaptive model initialization)
  для стабилизации обучения на ранних стадиях.
  //// С моей точки зрения, процесс обучения для любых нейросетей
  //// имеет смысл изначально разделять на различные этапы
  //// - "стартовый", "инфляции", "компрессии", "стабилизации" -
  //// для которых с самого начала предполагать/задавать различные
  //// методики обучения, включая различия и в функции стоимости/ошибки
  //// и в масштабах применения дропаута и регуляризации, подробнее см.:
  //// "Попытка неканонической трактовки регуляризации. Часть 2."
  
  Предлагаются и различные замены layer-нормализации.
  Так, Xu et al. (https://proceedings.neurips.cc/paper/2019/hash/2f4fe03d77724a7217006e5d16728874-Abstract.html)
  указывают на то, что обучаемые параметры нормализации
  не обучаются как нужно
  и предлагают вместо них использовать гиперпараметры,
  нормализируя по следующим формулам:
  
  z=C(1-ky)\odot{y}y=\frac{x-{\mu}}{\sigma},
  
  где C,k - гиперпарметры.
  ?, ? - соответственно среднее и стандартное отклонение x.
  
  Nguyen и Salazar (https://arxiv.org/abs/1910.05895)
  предлагают вообще заменить нормализацию через среднее и стандартное отклонение
  делением на l2 норму и умножением на обучаемый параметр (g):
  
  z=g\frac{x}{||x||}
  
  Многие задаются вопросом, почему в трансформерах
  используется Layer-нормализация,
  а не более распространенная нормализация по батчам.
  Авторы обзора приводят статью Shen et al.,
  в которой обсуждается, почему нормализация по батчам
  плохо работает в трансформерах на текстовых данных,
  и приходят к ответу,
  что это из-за нестабильности статистик в рамках батча.
  Они предлагают PowerNorm:
  
  z^{(t)}=\gamma\odot{y^{(t)}}+\betay^{(t)}=\frac{x^{(t)}}{\psi^{(t-1)}}(\Psi^{(t)})^2=\alpha(\psi^{(t-1)})^2+(1-\alpha)(\frac{1}{|B|}\displaystyle\sum_{i=1}^{|B|}(x_1{^{(t)}})^2)
  
  В их подходе нормировка происходит
  на экспоненциально взвешенное скользящее квадратичное среднее.
  
   ?; ? - обучаемые параметры, как и в обычной батч-нормализации.
  
  Авторы ReZero (https://arxiv.org/abs/2003.04887) решили,
  что нет нормализации - нет проблем,
  и просто вокруг каждого слоя делают обучаемую residual-связку.
  //// Мне нравится такой подход, просто и искренне:
  //// чем мучиться с непонятным, используем привычное без оглядки на "каноны".
  //// Но что интересно, попыток избавиться вообще от residual как-то не упоминается.
  //// Т.е. есть веские основания предполагать, что это реально, как минимум,
  //// один из "ключевых элементов" трансформерной архитектуры.
  
  Позиционная полносвязная сетка
  
  В этой части архитектуры основная часть экспериментов
  затрагивает функции активации вместо ReLU.
  Различные авторы пробовали swish (x*sigmoid(?*x)),
  GELU (gaussian error linear unit), GLU (gate linear unit).
  
  Некоторые авторы пытаются заменить полносвязную сетку на другой слой.
  Так Lample et al. (https://proceedings.neurips.cc/paper/2019/hash/9d8df73a3cfbf3c5b47bc9b50f214aff-Abstract.html)
  вводят механизм под названием Learnable product key memories,
  напоминающий внутреннее внимание,
  работа которого построена следующим образом.
  
   При помощи отдельного слоя
   (полносвязного + батч нормализация)
   получаем запросы (query).
  
   Откуда-то берем ключи и значения
   (полагаю, тоже полносвязным слоем аналогично работе внутреннего внимания).
  
   Выбираем top-k ключей для каждого запроса по скалярному произведению
   (при этом векторы ключей делятся пополам по принципу product quantization
   для масштабирования/ускорения).
  
   Получаем веса аналогично внутреннему вниманию через softmax
   от скалярного произведения запросов и ключей из top-k.
  
   Суммируем для каждого запроса результат.
  
  Другие же предпринимают попытки заменить FFN на mixture of experts.
  Организован этот слой следующим образом.
  
  Рис. Применение смеси экспертов (Mixture of Experts) для каждого токена
  
  Каждый эксперт при этом представляет собой отдельный полносвязный слой или слои,
  а gating network - обучаемую нейросеть,
  которая учится взвешивать ответы экспертов,
  выбирая из них некоторый топ.
  Для обучения вводится дополнительная функция ошибки,
  которая способствует выбору разнообразных экспертов.
  Различия в реализациях касаются, например, того,
  как и сколько выбирать экспертов.
  Авторы Gshard (https://arxiv.org/abs/2006.16668) выбирают двух,
  в Switch Transformer (https://arxiv.org/abs/2101.03961) - одного,
  а Yang et al. (https://arxiv.org/abs/2105.15082)
  предлагают делить экспертов на группы и выбирать топ-1 из каждой группы.
  
  Наконец, у некоторых авторов возникли идеи вообще убрать FFN слой,
  что, как утверждается, не драматически сказывается на результате.
  //// Тоже интересно. Еще один "ключевой элемент" ставится под вопрос.
  
  Общие архитектурные изменения
  
  Много освещаемых в обзоре работ меняют не конкретный элемент архитектуры,
  а парадигму работы или же дополняют ее.
  Авторы обзора в первую очередь приводят работы,
  нацеленные на снижение числа параметров.
  
  В Lite Transformer (https://openreview.net/forum?id=ByeMPlHKPH)
  авторы предлагают делить эмбеддинги токенов пополам
  (именно эмбеддинг, а не последовательность)
  и одну половину отправлять в обычное многоголовое внимание
  в глобальной разреженной реализации
  для отслеживания дальних взаимодействий между токенами.
  Вторую же часть - отправлять на сверточные слои
  для установления локальных взаимодействий.
  //// Интересный подход, в том смысле, что показывает некое свойство
  //// используемых эмбеддингов, которое проявляется в том,
  //// что "половинки" эмбеддингов как-то связаны между собой,
  //// и, в какой-то мере, в каждой половике имеют общую информацию.
  //// Очень интересно было бы отследить развитие/следствие такого подхода
  //// в плане того, что собственно представляют собой эмбеддинги на самом деле.
  
  Рис. Блок Lite-трансформера
  
  Рис. Принцип сжатия длины последовательности в Funnel-трансформере
  
  В трансформере DeLight (https://arxiv.org/abs/2008.00623)
  вместо блока трансформера ставят DeLight-блок из трех составляющих:
  специальная DeLight-трансформация с увеличением размерности эмбеддингов
  (как в position-wise FFN),
  одна self-attention-голова,
  position-wise FFN с уменьшением размерности.
  Получившуюся сеть можно строить значительно глубже обычного трансформера
  при том же числе параметров.
  //// И что это дает? "Глубина" сама по себе целью не является,
  //// непонятно что при этом достигается?
  
  Усиление связи между блоками
  
  Авторы Transparent Attention (https://aclanthology.org/D18-1338/)
  предлагают вместо того, чтобы подавать
  в специальный cross-блок внимания декодера выход
  только с последнего слоя энкодера,
  формировать взвешенную сумму выходов всех слоев.
  Веса для каждого слоя при этом являются обучающимися.
  В Feedback Transformer (https://openreview.net/forum?id=OCm0rwa1lx1)
  указывают на проблему,
  что в авторегрессионном режиме, при котором добавляется
  по одному новому токену в последовательность,
  каждый слой получает информацию о предыдущих токенах только с нижних слоев,
  хотя для этих токенов присутствует информация на всех слоях.
  Авторы этого трансформера предлагают взвешивать результат со всех слоев
  также с помощью обучаемых весов.
  
  Разделяй и властвуй
  
  Некоторые авторы иным образом подходят
  к решению ограничений на длину последовательности.
  Авторы обзора обобщают эти наработки до двух подходов:
  рекуррентный трансформер и иерархический,
  и сначала описывают работы, посвященные первому.
  
  В Transformer-XL длинный текст делят на сегменты,
  и выход с каждого сегмента подают на вход этой же сети при обработке следующего,
  и так на каждом слое:
  
  \overline{H}^{(l)}_{\tau+1}=[SG(H^{(l-1)} \circ H^{(l-1)}_{\tau+1}]K^{(l)}_{\tau+1}, V^{(l)}_{\tau+1}=\overline{H}^{(l)}_{\tau+1}W^K,\overline{H}^{(l)}_{\tau+1}W^V
  
  Здесь
  
  H^{(l-1)}_{\tau}
  
  - эмбеддинги сегмента ? на l-1 слое,
  SG - функция, обозначающая непротекаемость градиента
  - обратное распространение не идет на предыдущий сегмент.
  Таким образом, эмбеддинги токенов,
  которые используются для расчета ключей и значений,
  берутся конкатенацией эмбеддингов предыдущего слоя этого сегмента и предыдущего.
  //// Вот эта "конкатенацией эмбеддингов" ЧТО означает?
  //// Как же не хватает информации хотя бы к чему это приводит, на чем основано, и
  т.п.
  //// но такие "мелочи" как-то явно "вне фокуса внимания" сегодняшней нейронауки.
  
  В Compressive transformer (https://openreview.net/forum?id=SylKikSYDH)
  пошли дальше - его авторы сделали подход,
  при котором учитывается информация не только от предыдущего сегмента,
  а от всех предыдущих сегментов,
  используя для этого какую-либо операцию сжатия,
  например, пулинг или свертку.
  Аналогично Transformer-XL-градиент от основной функции ошибки
  в эту операцию не распространяется,
  поэтому авторы предлагают обучать свертку
  с помощью внутренней отдельной функции ошибки на восстановление
  как в автоэнкодере.
  В Memformer (https://arxiv.org/abs/2010.06891)
  информацию от предыдущих прогонов используют
  не в виде отдельного токена,
  а в кросс-внимании для расчета ключей и значений.
  
  Рис. Включение памяти от предыдущих сегментов в архитектуре Memformer
  
  Yoshida et al. (https://arxiv.org/abs/2008.07027) пошли дальше
  и придумали, как добавлять рекуррентность для уже обученных моделей.
  Предлагается после прогона трансформера на одном сегменте
  получать некоторый эмбеддинг этого сегмента
  и пропускать его через многослойный перцептрон,
  который делает из него вектор длиной d - дополнительный токен,
  который вместе со следующей последовательностью
  попадает на вход при прогоне этой же архитектуры на следующем сегменте.
  
  Рис. Получение и использование дополнительного эмбеддинга от прогона
  уже обученной нерекуррентной модели на предыдущем сегменте
  
  И хотя этот предобученный трансформер такого типа токенов никогда не видел,
  многослойный перцептрон научится делать такие эмбеддинги,
  которые уменьшали бы функцию ошибки.
  Вектор z при этом формируется как взвешенная сумма
  (используется софтмакс от обучаемых параметров)
  от выходов всех слоев.
  
  В иерархических трансформерах, как правило,
  используются эмбеддинги более детальной структуры информации
  для формирования эмбеддингов более обобщенных.
  Например, Miculicich et al. (https://aclanthology.org/D18-1325/)
  в задаче машинного перевода предлагают
  агрегировать эмбеддинги предыдущих предложений,
  формируя по эмбеддингу на предложение,
  и добавлять их к последовательности для формирования пар "ключ-значение"
  в механизме внимания.
  
  Рис. Использование иерархического трансформера (HAN)
  для машинного перевода через нейронные сети (NMT)
  
  В HIBERT (https://aclanthology.org/P19-1499/)
  авторы предлагают прогонять сначала трансформер на предложениях,
  а потом эмбеддинг каждого предложения (берут токен)
  через еще один трансформер.
  В работе Lui и Lapata (https://aclanthology.org/P19-1500/)
  агрегация информация с более детальных элементов (токенов)
  происходит за счет внутреннего внимания
  с глобальным обучаемым вектором запроса.
  В Hi-Transformer (https://arxiv.org/abs/2106.01040)
  авторы используют эмбеддинги предложений для того,
  чтобы через еще один трансформер над ними сформировать эмбеддинг документа,
  который подают в качестве отдельного токена в трансформер над токенами,
  для того чтобы получить эмбеддинги токенов
  с учетом информации о документе в целом.
  
  Рис. Добавление эмбеддинга документа к эмбденнигам предложений в Hi-Transformer
  
  В TENER (https://arxiv.org/abs/1911.04474)
  используют трансформер над символами и потом агрегируют
  для получения эмбеддингов слов.
  Наконец, подход Transformer in Transformer (https://arxiv.org/abs/2103.00112)
  предлагает эмбеддинги больших патчей изображений
  получать с использованием эмбеддингов на выходе трансформера
  над более маленькими патчами, составляющими большой.
  
  Рис. Прогон отдельного трансформера на маленьких патчах
  и добавление этой информации к трансформеру на больших патчах
  в Transformer in Transformer
  
  Архитектура трансформера за несколько лет, прошедших со своего появления,
  стала использоваться почти во всех областях:
  обработке естественного языка, компьютерном зрении,
  прогнозировании временных рядов, рекомендательных системах.
  Каждой области присущи свои сложности,
  которые требовали адаптации этой архитектуры,
  улучшение ее производительности или уменьшение нагрузки на память.
  Многие из них приведены выше.
  И уже после выхода обзорной статьи, о которой идет речь в моем посте,
  появлялись новые модели,
  в основе которых лежит архитектура трансформера,
  которые привносят что-то новое:
  Perceiver, Retro, Swin Transformer. Они,
  в том числе, используют некоторые из наработок своих коллег,
  которые отражены в моем посте.
  Также, надеюсь, он поможет вам расширить сознание
  и выйти за пределы BERT или GPT-3
  и начать использовать что-то более оптимальное.
  
  .......
  
  //// Из комментариев.
  
  kitaisky
  18 окт 2022 в 18:17
  
  Это все конечно интересно,
  но на практике упирается в то, какую архитектуру выберут и предобучат большие дяди,
  и после этого будут использовать для решения своих задач все остальные.
  0
  
  vladbalv
  18 окт 2022 в 23:16
  
  не совсем согласен. многие из этих моделей есть в transformers в huggingface
  - их можно брать, самостоятельно обучать или дообучать.
  или, например, подсмотреть код и реализовать аналогичную архитектуру,
  но не из 10 слоев, а из 3, и тогда намного проще ее будет обучить
  
  некоторые обучают маленькие берты (см. rubert-tiny) даже на google colab :)
  +1
  
  kitaisky
  19 окт 2022 в 07:40
  
  Именно что "самостоятельно" обучать - основная проблема таки как раз в этом.
  Про дистилляцию -возможно, но таки опять же тут сетку нужно учить с нуля.
  Возможно небольшие сетки на такой архитектуре
  могут хорошо подходить для решения кааих-то задач,
  не связанных с языковым моделированием,
  где нужны гигантские объемы данных
  - я бы с удовольствием почитал о применении указанных выше архитектур
  к каким-нибудь табличкам, рядам и прочему.
  0
  
  //// Согласен с тем что при отсутствии возможности самостоятельно обучать
  //// "не игрушечные" собственные трансформерные архитектуры с нуля.
  //// Возможность понять, что-же в этих архитектуре действительно
  //// "ключевой элемент" весьма затруднительна.
  
  ......
  
  //// Конец цитирования
  
  Уф. Неужели я это все-таки проработал.
  Два месяца откладывал это занятие, как совершенно неподъемную задачу.
  Может быть, кому-то покажется это напрасной тратой времени и усилий,
  но как по-другому попытаться разобраться в "зоопарке" трансформерных структур.
  
  И хотя возможно уже через пару лет "внимание мирового сообщества датасатанистов"
  переключится на какую-то иную модную фичу,
  совершенно не связанную с этим "attention" и вообще трансформерами,
  но что-то полезное из подходов, использовавшихся при попытках его трансформации,
  наверняка, еще где-то пригодится.
  
  Наверно, Вы как и я уже немного "устали" от трансформеров,
  поэтому обещаю, что постараюсь еще долго к ним не возвращаться,
  и заняться более интересным - бинарными/битовыми нейросетями.
  
  
  ========
  
  12.05.2024 11:01
  
  "Возвращение рекуррентного короля"?
  В оглавление.
  
  Вчера появился анонс перспектив возвращения в гонку фаворитов "нейронаук"
  новой/старой архитектуры xLSTM - переработанной версии
  недавнего безусловного лидера в реализации больших языковых моделей:
  
  "Ученые выпустили xLSTM - достойного конкурента трансформерам".
  Автор: DataSecrets
  https://habr.com/ru/news/813623/
  11 мая 2024 в 18:38
  
  И более подробный разбор этой структуры от тех же авторов:
  
  "Погружение в xLSTM - обновленную LSTM,
  которая может оказаться заменой трансформера"
  https://datasecrets.ru/articles/10
  11.05.2024
  
  Возможно, лучше эту статью смотреть в оригинале,
  так как иллюстрации в ней существенно помогают понять излагаемый материал.
  Так что этот текст больше для архива.
  
  //// Начало цитирования.
  
  Архитектура LSTM была предложена в 1997 году
  немецкими исследователями Зеппом Хохрайтером и Юргеном Шмидхубером.
  С тех пор она выдержала испытание временем:
  с ней связано много прорывов в глубоком обучении,
  в частности именно LSTM стали первыми большими языковыми моделями.
  
  Однако появление трансформеров в 2017 году ознаменовало новую эру,
  и популярность LSTM пошла на спад.
  Трансформеры оказались более масштабируемой архитектурой,
  к тому же способной хранить гораздо больше информации.
  
  Однако на днях, спустя 27 лет, создатели LSTM предложили
  улучшение своей технологии - xLSTM.
  https://arxiv.org/pdf/2405.04517
  Благодаря нововведениям xLSTM может теперь конкурировать с трансформерами
  и по перформансу, и по масштабируемости.
  
  Как ученые этого добились?
  Внедрили экспоненциальные гейты вместо сигмоидальных,
  новый алгоритм смешивания памяти,
  матричную память вместо скалярной
  и альтернативное правило обновления ковариаций.
  
  Да, звучит непонятно, но сейчас мы со всем разберемся:
  эта статья про то, как понять xLSTM и не сойти с ума!
  
  Как работает обычная LSTM?
  
  LSTM - это рекуррентная нейросеть,
  то есть нейросеть, которая работает с объектами
  (текстом, действиями пользователя или чем-то другим) последовательно.
  Такие сети состоят из цепочки одинаковых блоков,
  и при обработке очередного токена обращаются к предыдущим,
  как к контексту.
  //// Основная "фишка" рекуррентных структур, на мой взгляд,
  //// это возможность реализации ими в терминах ТАУ
  //// (теории автоматического управления)
  //// "бесконечной импульсной характеристики" (БИХ),
  //// что потенциально позволяет получить значительно более богатый
  //// "спектр поведения".
  
  Рис. На картинке сверху мы видим как раз такие повторяющиеся блоки LSTM.
  На вход очередному кирпичику каждый раз поступает не только новый токен,
  но и некоторая информация о контексте, передающаяся из предыдущих ячеек.
  
  Но что за сложная структура внутри блока?
  
  Тут есть несколько основных элементов:
  
  Скрытое состояние (ht).
  Это внутренняя память сети, которая передается от слоя к слою.
  
  Состояние ячейки (ct).
  Это внутренняя информации LSTM-блока,
  с помощью которой формируется скрытое состояние.
  
  Гейты, с помощью которых мы контролируем,
  какую информацию мы оставляем или удаляем из памяти.
  Их будет три:
  гейт забывания, гейт входного состояния и гейт выходного состояния.
  
  Теперь, когда мы определились с терминами,
  давайте пройдемся по блоку LSTM шаг за шагом.
  
  Перво-наперво блок должен на основе предыдущего скрытого состояния ht-1
  и нового поступившего токена xt "решить",
  какую информацию из предыдущего состояния ячейки Ct-1 он пропустит дальше,
  а какую забудет.
  Для этого отрабатывает так называемый "гейт забывания".
  Он состоит всего из одного сигмоидального слоя,
  который сопоставляет каждой компоненте вектора информации число от 0 до 1,
  где 1 - это "пропустить полностью", а 0 - "забыть полностью" (см. формулу ниже).
  
  ......
  
  Следующий шаг - решить, какую новую информацию из поступившего токена xt
  и предыдущего скрытого состояния ht-1 мы добавим в состояние блока.
  Для этого открывается следующий гейт - гейт входного состояния.
  Здесь можно было бы добавить в Ct-1 обычную линейную комбинацию xt и ht-1,
  к которой применена функция активации tanh (cм. формулу 2 на картинке ниже).
  Но мы не уверены, что вся эта информация достаточно релевантна,
  и хотим взять только некоторую ее долю.
  Чтобы понять, какую именно,
  с помощью сигмоиды снова вычисляется вектор "забывания",
  который состоит из чисел от 0 до 1 (cм. формулу 1 на картинке ниже).
  
  ......
  
  Вычисляем новое состояние ячейки Ct.
  После применения гейта забывания и гейта входного состояния
  оно будет равно сумме произведений сигмоидальных векторов ft и it
  на информацию Ct-1 и Ct (см. формулу ниже).
  
  ......
  
  Осталось только одно - вычислить скрытое состояние ht,
  которое играет роль выходного вектора LSTM-блока.
  Оно вычисляется из только что сформированного сетью состояния ячейки Ct
  с помощью гейта выходного состояния.
  Работает аналогично другим гейтам:
  у нас есть Ct, к которому мы применили функцию активации tanh,
  и на основе xt и ht-1 мы составляем сигмоидальный вектор
  (см. формулу 1 внизу)
  чтобы решить, какую часть информации из tanh(Ct)
  мы отнесем в скрытое состояние ht (см. формулу 2 внизу).
  
  ......
  
  Вот и все.
  Вы великолепны, а сеть переходит к следующему аналогичному блоку.
  
  Фух, с базовой LSTM разобрались.
  Архитектура, хоть и выглядит сложной и перегруженной, работает на ура.
  Правда, у нее все же есть несколько проблем,
  из-за которых ее и победили в 2017 году трансформеры...
  
  Проблемы архитектуры LSTM
  
  Ограниченная способность пересматривать решения о хранении информации.
  То есть, если сеть с помощью своих гейтов забыла какую-то информацию
  или, наоборот, запомнила ее как очень важную,
  то затем это решение сложно корректировать.
  
  Ограниченная способность хранить информацию.
  Память у LSTM скалярна, то есть информация должна быть сильно сжата,
  чтобы уместиться внутрь сети.
  Конечно, при таком сжатии мы теряем некоторые детали.
  Это хорошо заметно, в частности, когда сети нужно предсказать
  какой-то редко встречающийся токен.
  
  Как мы видели в предыдущем разделе,
  каждое последующее скрытое состояния сети зависит от предыдущего.
  Из-за такого механизма преобразования памяти
  (он называется memory mixing)
  невозможно распараллелить вычисления,
  поэтому LSTM считается плохо масштабируемой архитектурой.
  
  К чему это все?
  А к тому, что в своей новой статье авторы придумали хаки,
  которые решают перечисленные проблемы,
  и оказалось, что xLSTM может стать полноправной альтернативой трансформерам в LLM.
  Но не будем забегать вперед, сначала разберемся с теорией.
  
  sLSTM
  
  Вообще говоря, xLSTM (Extended Long Short-Term Memory),
  которую предложили авторы, состоит из двух подсетей:
  sLSTM и mLSTM.
  В sLSTM ученые вводят две фичи:
  новый алгоритм memory mixing и экспоненциальные гейты.
  
  Как мы уже разобрали,
  в ванильной LSTM гейты используются,
  чтобы сохранять в памяти сети только релевантную информацию.
  Для этого используется функция сигмоиды,
  которая сопоставляет каждой компоненте вектора информации число от 0 до 1,
  где 1 - это "запомнить полностью", а 0 - "забыть полностью".
  В xLSTM, чтобы решить проблему ограниченной способности сети
  пересматривать свои решения,
  в гейте забывания и гейте входного состояния
  на смену сигмоиде приходит экспонента.
  Для нормализации сети в блок также добавлено дополнительное состояние nt :
  
  ......
  
  Все изменения блока sLSTM по сравнению с ванильной LSTM
  на картинке выделены красным.
  Обратите внимание, что теперь в формировании скрытого состояния ht
  участвует не Сt, к которой применили гиперболический тангенс,
  а частное от деления состояния памяти ячейки Сt
  на состояние нормализации nt.
  Само состояние нормализации формируется как сумма:
  
  .....
  
  Экспонента может привести к появлению огромных значений весов сети,
  что влечет за собой проблему переполнения памяти.
  Так что помимо нормализации авторы также предлагают ввести
  состояние для стабилизации.
  По сути, это просто альтернативный способ вычисления выходов гейтов забывания
  и входного состояния:
  
  .....
  
  Благодаря вычитанию максимального из логарифмов выходов гейтов
  стабилизатор нивелирует риск взрыва весов и делает сеть более устойчивой.
  
  Экспонента в гейтах, в совокупности с нормализацией и стабилизацией,
  не только повышает способность сети более гибко управлять своей памятью,
  но и открывает возможности к оптимизации.
  Так как теперь сеть умеет "пересматривать" решения, принятые ранее,
  //// Вот это самое непонятное утверждение,
  //// во всяком случае для меня,
  //// так как механизм такого "пересмотра" совершенно не очевиден.
  вместо единой вытянутой цепочки блоков мы можем
  (наподобие того, как это происходит в трансформерах)
  добавить в сеть несколько голов,
  в каждой из которых будем отдельно осуществлять memory mixing.
  //// Может быть, "пересмотр" это результат реализации "многоголовости"?
  
  mLSTM
  
  C помощью mLSTM авторы решают проблему
  ограниченной способности ванильной LSTM хранить информацию.
  Здесь вместо скалярной ячейки памяти они используют матрицу.
  Эта матрица, в отличие от LSTM,
  будет обновляться вообще без использования предыдущих скрытых состояний сети.
  Для этого ученые снова позаимствовали идею из трансформеров
  и ввели в использование известный триплет (запрос qt, ключ kt, значение vt).
  Такое правило обновления называется правилом обновления ковариаций
  и в оригинале записывается так:
  
  .......
  
  Конечно же, внутри самой сети мы снова будем "взвешивать"
  каждую из компонент с помощью гейтов забывания и входного состояния:
  
  .....
  
  Сами гейты будут вычисляться также с помощью экспоненты,
  но без использования предыдущих скрытых состояний:
  
  ......
  
  Идея использования пар ключ-значения (kt-vt) заключается в следующем:
  так как каждая новая матрица состояния обновляется
  только за счет этих элементов,
  она также хранит в себе все прошлые пары k и v.
  Это позволяет нам на следующих шагах формировать скрытые состояния,
  просто извлекая необходимые нам знания из памяти
  с помощью запроса (query) qt.
  После извлечения остается только взвесить их
  с помощью гейта выходного состояния:
  
  .......
  
  В формуле наверху обратите внимание на то,
  как нормализуется скрытое состояние.
  Здесь используется все то же состояние нормализации nt,
  которое мы обсуждали в части про sLSTM.
  Максимум, модуль и единица здесь использованы потому,
  что произведение nt на запрос может быть близко к нулю.
  В таких случаях лучше совсем обойтись без нормализации
  (поделить на единицу).
  
  Осталось только понять, как вычисляются ключи, значения и запросы.
  К счастью, тут нет ничего особенного
  - это просто линейно преобразованные входные данные:
  
  ......
  
  Так как в mLSTM совсем нет memory mixing,
  то есть следующие скрытые состояния не зависят от предыдущих,
  вычисления можно запросто распараллелить.
  К тому же, хранение информации в виде матрицы
  значительно повышает способность архитектуры запоминать больше деталей.
  //// Вообще-то, это выглядит как некое подобие "трансформера",
  //// только добавлены "гейты", то не очень понятно,
  //// что в такой структуре является "ключевым элементом".
  //// Главная "фишка" рекуррентных структур - зависимость от предыдущих состояний
  //// в этой подструктуре исключен, и возникает вопрос:
  //// что же реализует такая структура?
  
  //// Нет, комбинации структур с КИХ и БИХ характеристиками,
  //// конечно, имеют право на жизнь и широко используются в технике,
  //// но при этом предполагается четкое понимание их назначение.
  //// А в этой структуре/объяснении ни о чем таком не говорится.
  //// Все это больше похоже на "алхимию" -
  //// набросали в "котел" каких-то "ингредиентов",
  //// произнесли заветные "крекс-пекс-фекс",
  //// и смотрим, что получилось.
  
  xLSTM
  
  Для того, чтобы из только что разобранных нами mLSTM и sLSTM
  собрать что-то единое (xLSTM),
  ученые дополнительно обернули каждую из структур в residual блоки.
  
  Residual блоки (остаточные блоки)
  - это блоки, в которых входные данные X проходят через два или более слоев,
  а затем перед применением активации дополнительно суммируются
  с самим исходным входом X.
  Схематически это выглядит так:
  //// И опять без таких residual блоков дело не обошлось.
  //// Лично у меня, уже давно выработалось стойкое убеждение,
  //// что это самом деле главная рабочая "лошадка" во многих сложных структурах.
  //// И даже "голографическая гипотеза" под этот элемент сформулировалась,
  //// но надо еще посмотреть, прежде чем такой "шизоидный бред" излагать,
  //// даже на СамИздате.
  
  ......
  
  Для mLSTM и sLSTM в статье были предложены разные блоки:
  
  Для sLSTM: входы X делятся на головы - на рисунке ниже их четыре.
  Перед этим входы опционально могут быть пропущены
  через несколько сверточных слоев.
  После деления в каждой из голов отрабатывает sLSTM.
  Выходы с голов затем объединяются с помощью GroupNorm,
  а потом проецируются в пространство большей размерности и обратно.
  Эта последняя часть названа up-projection
  и проделывается для того, что повысить качество histories separating.
  Это умение сети разделять "линии повествования":
  например, понимать, к какому из персонажей относится то или иное действие.
  
  ........
  
  Для mLSTM: все то же самое, что и в sLSTM, но в другом порядке.
  Отражаем входы в пространство большей размерности
   делим на головы
   пропускаем через mLSTM
   объединяем по GroupNorm
   проецируем обратно в родную размерность
   складываем со входами, чтобы получится residual
  //// И опять residual!!!
   готово!
  
  Чтобы получилась xLSTM, такие residual блоки двух видов
  затем просто состыковываются друг с другом.
  //// И снова и снова residual!!!
  Вот и все:
  такая замысловатая архитектура получилась у авторов.
  //// Основная проблема в том, что даже по сравнению с трансформерами,
  //// уровень непонимания того, что именно делается в такой структуре,
  //// вырос весьма существенно.
  
  Сравнение с трансформерами
  
  Давайте по полочкам.
  
  Обновление действительно вышло достойным.
  Авторы проверили, насколько ванильная LSTM отстает от xLSTM.
  Для этого они постепенно накручивали на LSTM новые фишки
  и оценивали, насколько это влияет на метрику.
  Только посмотрите,
  насколько падает перплексия после добавления остаточных блоков
  и замены гейтов на экспоненциальные:
  
  .......
  
  В языковом моделировании xLSTM, обученная на 15B токенах,
  оказалась лучше всех остальных моделей
  (тут присутствуют трансформеры, SSM и RNN).
  Видно, что модель сопоставима с GPT-3 на 350М параметров.
  
  ......
  
  Также xLSTM показывает хороший скейлинг,
  то есть может быть легко масштабируема.
  
  .....
  
  Однако есть и проблемы.
  Во-первых, sLSTM нельзя распараллелить
  (хотя авторы приводят веские доводы в пользу того,
  что архитектуру вполне можно разогнать до приемлемых скоростей).
  Во-вторых, матрицы в mLSTM имеют высокую вычислительную сложность.
  В-третьих, более обширный контекст
  потенциально может перегрузить сетку,
  которая и без того требует очень тщательной оптимизации
  и подбора гиперпараметров.
  
  xLSTM - это новые большие языковые модели?
  
  Ответа на вопрос "заменят ли xLSTM трансформеры?" пока нет.
  Некоторые в ML сообществе настаивают на том, что это прорыв,
  другие в xLSTM не верят.
  Ясно одно: эта архитектура - новый виток Deep Learning и NLP,
  и она обладает большим потенциалом.
  
  Исследование совсем свежее, оно вышло всего пару дней назад.
  Ресерчеры и инженеры еще не успели полностью погрузиться в xLSTM,
  тем более что официальный код авторы все еще не опубликовали.
  В общем, будем ждать на эту тему еще больше исследований и новостей!
  
  .......
  
  //// Конец цитирования.
  
  В общем, структура существенно усложнилась,
  понимания, что именно происходит в такой архитектуре явно не прибавилось,
  и вопрос "распараллеривания", похоже, остался не решен.
  И остался вопрос обучения такой архитектуры с нуля,
  - явно оно будет не самым простым.
  
  Но сама попытка "возвращения короля" свидетельствует
  о большом потенциале рекуррентных структур,
  хотя, возможно, для его реализации требуется нечто более "кардинальное",
  чем предлагаемые улучшения/ухищрения.
  "Поживем, будем посмотреть".
  
  
  ========
  
  25.05.2024 12:30
  
  Метод автономного адаптивного управления.
  В оглавление.
  
  Начал потихоньку подбирать материалы по бинарным/битовым нейросетям,
  и почти сразу же наткнулся на материалы,
  которые явно выбиваются из текущего мейнстрима и хайпа в "ИИ-технологиях":
  
  "МЕТОД АВТОНОМНОГО АДАПТИВНОГО УПРАВЛЕНИЯ".
  Автор: А.А. Жданов
  https://cyberleninka.ru/article/n/metod-avtonomnogo-adaptivnogo-upravleniya.pdf
  Известия ТРТУ Тематический выпуск <Интеллектуальные САПР> стр. 166
  
  //// Начало цитирования.
  
  Подавляющее большинство автоматически управляемых технических систем,
  разработанных в прошедшем ХХ веке,
  обязаны своим существованием теории управления,
  построенной на аналитическом понимании законов механики и физики.
  Этот <классический> подход к управлению строится на том,
  что положение точки (объекта управления) в пространстве признаков
  известно абсолютно.
  Далее формальные математические преобразования позволяют получить
  математическую зависимость входов и выходов для системы управления (УС).
  Однако при всей изощренности наработанного математического инструментария,
  областью применения <классических> методов управления
  остаются сравнительно простые объекты управления с очевидными свойствами.
  Попытки аналитически описать более тонкие свойства объектов управления
  (технических и, тем более, естественных),
  особенно в случаях, когда свойства ОУ плохо определены априори,
  быстро приводят к катастрофическому усложнению математических моделей.
  Ситуацию в целом не спасают ни эвристические приемы,
  ни повышение эффективности вычислительной техники.
  На практике объекты управления, которые плохо формализуются,
  свойства которых априори плохо известны
  или изменяются в процессе функционирования, являются типичными.
  С середины ХХ века активно развивается <неклассический> подход
  в теории управления.
  Такие <неклассические> методы управления видят ОУ
  не как абсолютно известную точку в пространстве признаков,
  а лишь как некоторую информацию об этой <точке> (согласно А.В. Чечкину).
  Управление при этом сводится к формальной работе с этой информацией.
  Аналитические функциональные зависимости параметров заменяются априорными,
  либо эмпирическими знаниями,
  либо результатами обучения на примерах.
  //// Вот это, по-моему, очень хорошая формулировка того фундаментального сдвига,
  //// который происходит прямо на наших глазах в реализации
  //// сложных автоматических/автоматизированных систем.
  //// И при этом такой переход не ограничивается
  //// только использованием машинным обучением,
  //// - очень важный момент - это нахождение и использование "эвристик",
  //// на которые до недавнего времени смотрели очень "подозрительно".
  
  Мы полагаем, что этот подход пытается воспроизвести
  принципы естественных систем управления
  - нервных систем живых организмов.
  Нервные системы реализуют некоторые универсальные принципы обращения
  с эмпирической информацией и универсальные поисковые алгоритмы.
  Мы видим, что один и тот же мозг живого организма
  успешно решает самые разнообразные задачи
  (так мозг птицы позволяет ей и балансировать на одной ноге,
  и обходить препятствия, и управлять полетом, и решать еще множество задач).
  Во многих приложениях хотелось бы иметь
  подобные универсальные системы управления.
  Следовательно, актуальным шагом в развитии теории систем управления
  является разработка единых принципов построения
  универсальных адаптивных систем управления на естественных основаниях.
  //// Наверно, все-таки, ограничение "на естественных основаниях",
  //// с учетом того, что полный перечень этих "оснований" далеко не закончен,
  //// "несколько преждевременно".
  
  Однако, к сегодняшнему дню это <неклассическое> направление
  распалось на многие ветви, далеко ушедшие друг от друга:
  экспертные системы, нейронные сети, системы нечеткой логики,
  системы с подкрепляющим обучением, искусственная жизнь и другие.
  По-видимому, эти ветви просто отражают разные стороны
  рассматриваемых естественных систем управления,
  либо разные фазы их эволюции.
  Следует ожидать, что со временем эти ветви сольются в единую картину,
  описывающую принципы функционирования естественных систем управления
  и механизмы их эволюции.
  В своей работе мы идем именно этим путем,
  разрабатывая концептуальную модель нервной системы,
  которую мы называем системой <Автономного адаптивного управления> (ААУ) [1-26].
  
  1. Концепция подхода <автономного адаптивного управления> (ААУ).
  
  Создавая управляющую систему (УС) как модель нервной системы
  мы отталкиваемся от ее наблюдаемых свойств.
  Эти свойства служат условиями для разработки как макро-,
  так и микроструктуры УС.
  
  1.1. <Условие автономности>
  - требует рассматривать УС как подсистему объекта управления (ОУ),
  развивающуюся вместе с ним
  и самостоятельно добывающую знания, необходимые для управления.
  В свою очередь, ОУ является подсистемой среды.
  Рис.1 показывает УС, ОУ и среду как соответствующие подмножества,
  а также возможные маршруты передачи информации и воздействий
  от выходных полюсов подсистем к их входным полюсам
  (белыми кружками показаны также истоки воздействий,
  а черными кружками - стоки).
  Из такого понимания системы видно,
  что УС управляет не только ОУ, но всей системой <Среда - ОУ - УС>,
  при этом истоки вносят неожиданные для УС воздействия,
  а стоки поглощают часть воздействий,
  что в целом порождает случайные составляющие
  в процессе функционирования системы.
  
  Рис.1
  
  1.2. <Условие дискретности>.
  Мы знаем, что строение нервных систем во многих отношениях дискретно:
  нейроны, нервные волокна, нервные импульсы, датчики, исполнители и т.д.
  Однако, в нервной системе имеются и непрерывные процессы,
  которые могут помочь при решении NP-полных задач.
  
  1.3. <Условие максимальной начальной приспособленности>
  отражает невозможность создания УС,
  обладающей способностью адаптироваться к любым предъявленным ей ОУ и среде.
  Это условие требует максимального использования априорной информации
  для возможно более полного начального приспособления как ОУ, так и УС
  к условиям существования.
  В биологии эта начальная приспособленность осуществляется
  эволюционным приспособлением видов.
  //// А в машинном обучении это, наверно, должно задаваться
  //// не только структурой нейросети и методом ее обучения,
  //// но и определенной целенаправленной инициализацией ее начального состояния,
  //// чего сейчас практически не наблюдается.
  
  1.4. <Условие минимума начальных знаний>
  отражает тот факт, что нервная система новорожденного организма
  обладает относительным минимумом знаний
  и должна в течение жизни накапливать знания, необходимые для управления,
  т.е. быть адаптивной УС.
  //// А этот пункт, вроде как, в чем-то противоречит предыдущему,
  //// если не научиться разграничивать "знания" на "априорные" и "приобретаемые".
  //// Хорошая тема для исследования.
  
  Мы полагаем, что всякая нервная система имеет две важнейшие целевые функции:
  
  a) выживание организма;
  
  b) стремление к накоплению новых знаний.
  
  Все остальные целевые функции (потребности)
  являются подчиненными указанным двум и их производными.
  //// В такой постановке можно даже предположить,
  //// что и "задача выживания", в конечном итоге служит потребности
  //// "накопления знаний".
  //// Интересный мировоззренческий вопрос.
  
  Из названных условий и целевых функций вынужденно следует,
  что искомая УС должна решать следующие определенные взаимосогласованные задачи:
  
   находить во входных данных, поступающих от датчиков,
  неслучайную, закономерную информацию,
  отражающую неслучайные явления и процессы в ОУ и среде
  (эту задачу мы называем задачей формирования образов.
  В математике ей близка задача автоматической классификации, кластеризации.
  Сформированные образы запоминаются в <Памяти образов>);
  //// Вот эта "память образов" в существующих нейросетевых структурах,
  //// часто как-то даже не выделена "структурно", а размазана по всей системе.
  //// Интересно это "оптимальное" или "вынужденное" решение?
  
   распознавать в текущей входной информации от датчиков сформированные образы
  - задача распознавания образов;
  
   обнаруживать специальные образы
  - знания, отражающие неслучайные причинно-следственные связи событий в системе,
  которые можно использовать для управления, и запоминать их в <Базе знаний>
  - задача получения и представления знаний;
  
   задача вывода новых знаний из знаний, уже имеющихся в <Базе знаний>;
  
   вырабатывать эмоциональные оценки для сформированных образов,
  запоминать их, вырабатывать эмоциональные оценки текущего состояния
  - задача моделирования эмоций;
  
   под влиянием указанных выше целевых функций (выживания и накопления знаний)
  на основе данных нескольких разделов памяти таких,
  как <Память образов>, <База знаний> и др.,
  а также на основе распознавания текущей ситуации в терминах образов
  и их эмоциональных оценок,
  принимать решения в каждый текущий момент времени
  - задача многоуровневого и иерархического управления.
  
  Мы полагаем, что попытки построения моделей адаптивных управляющих систем
  не могут претендовать на звание моделей нервных систем,
  если они строятся не на решении всего комплекса перечисленных здесь задач.
  Безусловно, для прагматических целей можно строить адаптивные
  (тем более не адаптивные) системы управления
  только на основе решения одной-двух из названных задач.
  Примеры таких систем:
  искусственные нейронные сети,
  системы нечеткой логики
  экспертные системы,
  системы обучения с подкреплением.
  
  Рис.2
  
  Если строить УС, содержащие подсистемы, решающие названные выше задачи,
  то УС должна будет иметь следующие состав и структуру (рис.2).
  Каждая подсистема УС здесь является адаптивной самообучающейся системой.
  В целом такая система является самообучаемым распознающе-управляющим комплексом.
  
  Придерживаясь указанной схемы, можно конструировать системы ААУ
  на базе различных технологий.
  Однако, использование традиционных математических методов
  для решения названных подзадач, является, по-видимому,
  наиболее трудоемким вариантом,
  //// Любопытная оценка.
  поскольку надо строить и оптимизировать сразу целый комплекс подсистем,
  что особенно трудно, если ОУ и среда плохо формализуемы
  или их свойства меняются в процессе управления.
  Применение традиционных искусственных нейронных сетей (ИНС)
  для построения систем ААУ возможно,
  в частности, для блока датчиков и распознающей подсистемы,
  поскольку при использовании ИНС можно обойтись
  без математической формализации ОУ.
  Однако, ИНС имеют проблему <катастрофического забывания>
  //// Та самая плата за отсутствие "структурированной долгой памяти".
  и их использование в режиме ААУ,
  когда обучение и управление происходят в одном процессе,
  затруднено.
  При построении некоторых подсистем можно использовать
  элементы систем нечеткой логики, систем с подкрепляющим обучением
  или экспертных систем.
  Однако, все они имеют свои ограничения и по своим идеям были предназначены
  для решения совсем иных задач.
  
  Для синтеза систем ААУ мы используем специально разработанные нами
  модели нейронов [6,11,15].
  Основная идея этих нейронов состоит в следующем.
  Биологический нейрон является самообучаемой системой
  автоматической классификации.
  //// Не знаю, насколько такая формулировка общая для всех случаев.
  //// Но, так или иначе, это ключевое положение данной работы.
  //// И хотелось бы понять, точно ли это положение соответствует
  //// "главной цели организма" - "накоплению новых знаний".
  Известно такое свойство пластичности синапсов,
  которое заставляет ускоренно расти только те синапсы,
  по которым приходят коррелирующие сигналы.
  Это свойство является ключевым моментом,
  позволяющим нейрону отыскивать коррелирующие события в системе,
  в том числе неслучайные причинно-следственные события.
  Опираясь на это свойство, мы разработали несколько моделей нейрона,
  которые способны находить более или менее сложные корреляции.
  Даже наиболее простой вид корреляции,
  когда с нулевой временной задержкой коррелирует
  определенное большинство входных сигналов нейрона,
  позволяет строить множество практически полезных прикладных систем ААУ.
  
  Такая наиболее простая модель нейрона показана на рис.3.
  
  Рис.3
  
  С помощью блока Rw нейрон выделяет некоторый класс воспринимаемых сигналов
  (в простейшем случае - это вектор, состоящий из одних единиц).
  В блоке lw подсчитывается статистика наблюдений такого вектора
  и определяется, достаточно ли накопленной статистики для того,
  чтобы сказать, что этот вектор не случаен.
  Если нейрон понимает, что данный вектор неслучаен,
  нейрон переходит в новое состояние,
  при котором он теперь способен <узнавать> данный вектор -
  распознавать образ.
  В режиме распознавания блок Rw узнает образ,
  блок lw подтверждает, что это неслучайный образ,
  и триггерный блок Tw переключается,
  выдавая на выход нейрона сигнал Ow t+1=1,
  говорящий о том, что образ Ow был распознан.
  Этот выходной сигнал будет существовать до тех пор,
  пока он не будет воспринят другими нейронами или подсистемами УС.
  Тогда, такие нейроны пошлют сигнал Sw =1, и триггер сбросится.
  //// Наверно, это ключевое отличие этой структуры данной модели нейрона,
  //// которое полностью отсутствует в классических схемах.
  //// Но оно четко соответствует "стремлению к накоплению новых знаний".
  Вот логическое выражение, описывающее работу данного нейрона:
  
  O wt+1 = ┐ S wt & (( b wt & lwt) V O wt) and S wkt+1 = b wt& lwt& g wt.
  
  Сеть из таких нейронов может собираться произвольно,
  например, так, как на фрагменте сети, показанном на рис.4.
  
  Рис.4
  
  В процессе работы системы некоторые нейроны обучаются.
  //// Важное уточнение "некоторые" - т.е. возможность использования
  //// "априорных" и "фиксированных знаний" предполагается изначально.
  В каждый момент времени некоторые из обученных нейронов
  могут распознавать свои образы.
  
  Процесс обучения нейронов, как и процесс распознавания образов,
  идет по слоям шаг за шагом.
  //// А вот "послойное обучение" как-то не сильно представлено
  //// в существующем арсенале машинного обучения,.
  //// за исключением крайних слоев.
  Среди образов, которые может формировать УС,
  следует создать условия для формирования специальных образов,
  отражающих неслучайные причинно-следственные функциональные свойства ОУ и среды.
  УС должна <понять>, как ее выходные действия Yi влияют
  на прообразы известных ей (<сформированных>) образов.
  
  В силу бинарности информации, такое влияние (в сходных условиях)
  может состоять в одном из трех вариантов:
  действие вызывает распознавание образа Oj,
  либо действие вытесняет ранее распознанный образ Oj,
  либо данное действие на данный образ не влияет.
  //// Вот это "не влияет", похоже, в нынешней логике
  //// обучения "методом обратного распространения"
  //// как-то не учитывается, во всяком случае, активно не используется.
  
  Назовем <элементарным знанием> тройку неслучайных событий
  ({On }t-2 ; Yit-1 ; {Om }t ),
  
  где {On }t-2 - множество распознанных или нераспознанных образов,
  описывающих состояние системы в момент t-2;
  Yit-1 - есть идентификатор (образ) действия, совершенного УС в момент t-1;
  {Om }t - есть множество распознанных или нераспознанных образов,
  описывающих состояние системы в момент t.
  
  Другими словами, такая тройка описывает импликацию
  <Условие в момент t1 > -> <Действие в момент t2 > -> <Результат в момент t3 >. (1)
  
  Эта импликация представлена тремя пространственно-временными событиями.
  Образ такой неслучайной тройки, если он сформирован,
  является элементарным знанием управляющей системы.
  Такое знание запоминается в подсистеме <База знаний> управляющей системы
  в специальной структуре.
  <База знаний> (БЗ) является специальным разделом <Памяти образов>.
  Заполнение БЗ (обучение УС) происходит в процессе наблюдения
  за предысторией эволюции УС.
  Для обучения УС не так уж и важно - совершает ли УС действия
  специально с целью обучения (напомним о целевой функции "накопление знаний")
  или с целью выживания - знания накапливаются во всех этих случаях.
  
  Прежде чем принимать решения, для УС следует задать
  или УС сама должна определить качественные оценки элементам знаний
  - образам и действиям.
  Такие оценки определят разное качество альтернативных вариантов эволюции системы,
  что и позволит УС принять решение - выбрать лучший по этому критерию вариант.
  Систему качественных оценок и критериев управления задает подсистема <эмоций>.
  Такая подсистема имеется у каждого живого организма.
  Все наши образы и состояния мы окрашиваем в цвета эмоций,
  и хотим при любых обстоятельствах только одного
  - добиться, чтобы качество нашего состояния в будущем было максимальным
  из возможного для нас.
  В любой ситуации мы делаем то, что считаем <лучшим>.
  Правда, эмоциональные оценки у нас субъективны.
  
  Мы вводим в состав наших систем ААУ <подсистему эмоций>.
  За этой подсистемой закреплено много функций.
  В частности, эта подсистема:
  
  1) содержит качественные оценки некоторых образов,
  передаваемых организму наследственным путем;
  
  2) вырабатывает качественную оценку текущего состояния ОУ
  как функцию от оценок распознанных образов;
  
  3) вырабатывает качественные оценки для вновь сформированных образов
  путем поиска корреляций с текущей оценкой состояния ОУ;
  
  4) содержит в себе аппаратно <зашитое> стремление УС
  к повышению качественной оценки текущего состояния;
  
  и некоторые другие функции.
  
  Тем самым, <подсистема эмоций> является одновременно
  источником постоянной внутренней активности УС
  и <учителем> в процессе самообучения.
  //// Наверно, такая дополнительная подсистема качественной оценки результатов
  //// работы/обучения ИИ-системы
  //// может существенно дополнить
  //// концепцию/механизмы использования функций стоимости/лоссов при обучении.
  
  Подсистема <принятия решений> принимает решения на основании:
  
  a) множества распознанных образов (это составляет <условие> в тройке (1));
  
  b) анализа набора возможных действий и их последствий, записанных в БЗ;
  
  c) критерием принятия решений служит <подсистема эмоций>,
  заставляющая УС выбирать то действие из всех возможных,
  которое обещает максимально повысить оценку текущего состояния,
  т.е. способно вызвать образы с наилучшими оценкам,
  либо вытеснить образы с наихудшими оценками;
  
  В целом управляющая система ААУ представляет собой
  единый распознающе-управляющий комплекс.
  УС в одном процессе осуществляет самообучение и управление.
  В рамках этого комплекса взаимосогласованно решаются следующие задачи:
  
   автоматическая классификация (задача таксономии);
  
   распознавание образов;
  
   поиск знаний;
  
   представление знаний;
  
   вывод новых знаний;
  
   моделирование эмоций;
  
   принятие решений.
  
  Основное свойство систем ААУ состоит в следующем.
  При помещении такой УС в объект управления и в среду,
  свойства которых заранее плохо известны
  (т.е. это случай, когда трудно построить управление
  обычным детерминированным способом на основе априорной информации),
  УС сама находит способ управления данной системой
  и постепенно улучшает этот способ.
  
  2. Проблемы метода ААУ и возможности их преодоления.
  
  Основная теоретическая проблема нашего подхода состоит
  в отсутствии в настоящее время четкой процедуры построения УС ААУ
  для всякого заданного конкретного приложения.
  Мы имеем своего рода конструктор из нейронов и общую схему УС.
  Действующие приложения пока собираются эвристически.
  Причина отсутствия четкой процедуры построения УС достаточно глубокая.
  Объясним ее на следующем примере.
  
  В составе УС имеется система автоматической классификации.
  Как известно, система автоматической классификации
  требует априорного задания правил порождения (формирования) классов.
  Нельзя задать все мыслимые правила.
  Есть два выхода.
  Либо на основании априорной информации формируется гипотеза о таких правилах,
  и затем система их проверяет,
  либо строится некий поисковый алгоритм,
  который будет искать эти порождающие правила методом проб.
  В нервной системе таким правилам, порождающим классы образов,
  соответствует топология нервной сети и параметры нейронов.
  А поисковым алгоритмом построения топологии сети в природе
  является естественный эволюционный отбор.
  
  Отсюда вывод: регулярная эффективная процедура синтеза УС ААУ
  для задаваемых приложений должна содержать в себе
  поисковый алгоритм определения топологии нейроноподобных сетей,
  моделирующий процесс эволюционного отбора.
  В нейроноподобных сетях системы ААУ одному нейрону
  соответствует один образ в отличие от стандартных ИНС,
  где образу соответствует выходной вектор.
  //// Все-таки с этим положением, я не совсем согласен,
  //// в типовых ИНС "образу" соответствует не "выходной вектор",
  //// а некий, в общем случае, неизвестный "ансамбль"
  //// взаимодействующих нейронов и их параметров,
  //// который действительно как-то отражается и в выходном "векторе",
  //// и в промежуточных "эмбеддингах"/"латентах",
  //// но далеко не однозначным/тривиальным образом.
  //// И это насущная и серьезная проблема понимания поведения "стандартных ИНС".
  
  Поэтому сети ААУ являются семантическими,
  //// Точнее, предполагается, что механизм их построения
  //// обеспечивает такую связку "один нейрон" соответствует "одной единице знания".
  //// Хотя у меня и есть сомнение, что это оптимальное и работоспособное решение
  //// в общем случае,
  //// но для каких-то локальных ААУ, наверняка, будет вполне достаточным.
  а адаптивность УС ААУ связана не только с адаптивными свойствами самих нейронов,
  но и с избытком нейронов в ее нейросетях,
  поскольку в исходный момент множество нейронов соответствует
  множеству пробных образов.
  Аналогичное свойство наблюдается и у биологических нервных систем.
  Отмечается, что множество нейронов мозга <избыточно> в том смысле,
  что к концу жизни организма использованными оказывается
  только небольшая часть нейронов.
  В природе топология нервной системы формируется в основном не самим организмом,
  а длительным процессом эволюционного отбора при формировании вида.
  Такую <априорную> настройку топологии конкретной УС ААУ
  мы можем выполнить двумя способами:
  
   аналитической оптимизацией УС на основе анализа априорной информации;
  
   посредством эволюционных поисковых алгоритмов,
  которые симулируют природный процесс эволюционного отбора.
  
  Второй путь может быть автоматизирован, что делает его весьма перспективным.
  
  Очевидно, что все другие подсистемы УС также могут быть
  предварительно оптимизированы с помощью поисковых эволюционных алгоритмов,
  которые могут симулировать этап
  эволюционного развития <вида> данного ОУ и его УС.
  
  Однако, можно говорить и о динамической перестройке нейроноподобных сетей УС ААУ
  в процессе ее работы.
  Такие возможности нами исследуются.
  В биологии это соответствует перестройке нервной сети в пренатальный
  (до рождения) и постнатальный (после рождения) периоды жизни организма.
  В настоящее время нами разрабатываются версии системы ААУ,
  использующие в своем составе возможности, предоставляемые такими технологиями,
  как: генетические алгоритмы [21], нечеткая логика [2],
  детерминированный хаос [19], искусственные нейронные сети.
  
  3. Практические приложения на основе систем ААУ.
  
  На основе метода ААУ нами были разработаны прототипы
  адаптивных систем управления для различных объектов.
  Во всех случаях объекты управления были трудноформализуемыми,
  однако УС ААУ находила способ управления предъявленным объектом
  и постепенно развивала его, повышая качество управления.
  Во всех случаях схема УС была одинакова (см. рис.2).
  Отличия касались только топологии нейроноподобных подсистем,
  вручную настраивавшихся на образы,
  семантика которых определялась содержательным смыслом приложения,
  а также заданными критериями качества управления.
  Коротко перечислим некоторые из таких приложений.
  
  
  - адаптивная система управления угловым движением космического аппарата [4,10,13,16,17].
  
  
  - система адаптивного управления активной подвеской транспортного средства [24,26].
  
  <Многоуровневая нейроноподобная система управления
  моделью сердечно-сосудистой системы>
  - моделирует адаптивные механизмы управления в сердечно-сосудистой системе [25].
  
  <Мобильный робот Гном ?8>
  - адаптивная система управления для модели мобильного робота,
  демонстрирующая возможность автоматической выработки
  стереотипов поведения при обходе препятствий [23].
  
  <Тактик>
  - система поддержки принятия решений при управлении социальными объектами [10].
  
  Заключение.
  
  На основании опыта разработки прикладных систем ААУ мы убеждены
  в перспективности и полезности подхода,
  поскольку он позволяет строить
  практически полезные адаптивные системы управления
  без разработки точных математических моделей объектов управления,
  что обычно составляет большую часть стоимости разработки систем управления.
  
  БИБЛИОГРАФИЧЕСКИЙ СПИСОК
  
  //// 26 источников.
  
  .....
  
  //// Конец цитирования.
  
  Самое интересное в этом материале, кроме, безусловно, системного подхода
  к построению адаптивных систем управления,
  это нацеленность таких систем на "приобретение знаний",
  которая подкрепляется такими непривычными для "стандартных ИНС"
  элементами/подсистемами как "эмоциональная оценка",
  ориентацией каждого нейрона на распознавание конкретного образа
  и "обратной связи нейронной сети" о полезности,
  каждого выявленного элемента знания/образа.
  
  Даже навскидку, уже понятно, что многое из этого
  может быть использовано в собственной концепции битовых сетей.
  Но интересно ве же, какое развитие получила эта концепция в дальнейшем,
  и почему ее полностью проигнорировали "Хаброжители".
  
  
  =========
  
  25.05.2024 14:56
  
  А как сейчас проектируются бинарные нейросети?
  В оглавление.
  
  Продолжим "коллекционировать" материалы по бинарным/битовым нейросетям.
  А это материал по практическому использованию концепции нейронов Жданова
  в специализированных нейросетях:
  
  "МЕТОДОЛОГИЯ И ИНСТРУМЕНТАЛЬНЫЕ СРЕДСТВА
  ПРОЕКТИРОВАНИЯ БИНАРНЫХ НЕЙРОННЫХ СЕТЕЙ".
  Автор: И.В. Степанян
  https://sciencejournals.ru/cgi/getPDF.pl?jid=program&year=2020&vol=2020&iss=1&file=Program2001006Stepanyan.pdf
  ПРОГРАММИРОВАНИЕ, 2020, ? 1, с. 54-62
  
  DOI: 10.31857/S0132347420010069
  
  Институт машиноведения им. А.А. Благонравова РАН
  101000, Москва, Малый Харитоньевский переулок, д. 4, Россия
  
  ЗАО "Интеллект"
  115191, Москва, ул. Рощинская 2-я, д. 4, Россия
  
  //// Начало цитирования.
  
  //// Аннотация.
  
  В статье представлены результаты исследований
  в области разработки программных методов проектирования,
  обучения и синтеза бинарных нейронных сетей.
  В основе исследований лежит модель биоморфного нейрона А.А. Жданова,
  обладающего помехозащищенностью,
  возможностью забывания и дообучения.
  Приведено описание программного инструментария
  для проектирования и визуализации результатов моделирования
  бинарных нейронных структур.
  Приведены примеры и особенности использования
  формального языка разметки нейросетевых моделей
  с описанием принципов генерации структур глубокого обучения.
  Возможности интерпретатора языка разметки нейронных сетей
  позволяют автоматически генерировать исходный код на языке Verilog
  с описанием нейроподобной реализации интеллектуальных систем
  для программных и аппаратных решений
  на программируемых логических интегральных схемах (ПЛИС).
  
  1. ВВЕДЕНИЕ
  В задачах проектирования и алгоритмического синтеза
  биоподобных нейросетевых структур для интеллектуальной обработки информации
  важную роль играет синтаксис языка разметки.
  Синтаксис должен обеспечивать простоту проектирования
  и наглядность результатов алгоритмической генерации кода
  и доступность всех необходимых нейросетевых операций синтеза:
  объединение, мутация, удаление и добавление синаптических связей и пр.
  //// Любопытный перечень операций, как-то он "немного ширее или ширше"
  //// такового для "стандартных ИНС".
  //// Интересно, как он обеспечивается/поддерживается?
  
  Из нейробиологии известно [1], что входные импульсы нейрона
  приводят к постепенному увеличению размеров входящих синапсов.
  При этом растущие синапсы могут подавлять активность соседних синапсов.
  Таким образом, в структуре нейрона происходит фиксация
  пространственно-временных комбинаций входных векторов,
  что лежит в основе механизма обнаружения коррелирующих сигналов.
  //// Надо взять на заметку это "подавление активности".
  //// Наверняка, где-то очень даже пригодится.
  Данный принцип лежит в основе рассматриваемых в данной работе
  бинарных нейронов и метода автономного адаптивного управления (ААУ) [2],
  который является одним из подходов к построению
  адекватных биологическим прототипам моделей нервной системы.
  
  В данной работе описаны нейронные сети на нейронах А.А. Жданова,
  которые работают исключительно с бинарными данными,
  передаваемыми на входы и на выходы каждого нейрона
  и которые не имеют синаптических весовых коэффициентов.
  Это их кардинально отличает от нейронных сетей,
  представляющих собой классические нейронные сети
  (с произвольными значениями на входе и выходе нейронов и весовыми коэффициентами).
  Особенностью бинарных нейронов А.А. Жданова является то,
  что для их обучения и настройки не требуется
  дорогостоящих вычислительных операций умножения, деления и нахождения производной,
  которые широко применяются в методах обучения классических нейронных сетей.
  Вместо этого в нейронах срабатывают триггеры-счетчики,
  которые при достижении определенных условий обеспечивают функционал нейрона,
  что ускоряет их обучение и приближает к биологическому прототипу.
  //// Что-то похожее и мне хочется использовать в своих битовых сетях,
  //// но кардинально отказываться от использования "операций умножения и т.д.",
  //// мне кажется, не очень правильным,
  //// ведь они показали свою определенную эффективность,
  //// и, соответственно. стоит предполагать, что урезанные до "однобитого размера",
  //// тоже могут быть весьма полезными.
  //// Исключение чего-то по "религиозным соображениям",
  //// как правило, приводит, в конце концов, в "идеолого-религиозный тупик".
  //// Тем более что, та же функция счетчиков, в однобитовом варианте,
  //// также может быть реализована как функция "псевдо-матричного умножения",
  //// а именно одной командой xlat.
  
  На базе метода ААУ [2, 3] и описанного в данной работе подхода
  к его технической реализации,
  была разработана программно-аппаратная нейроподобная система
  с возможностью распознавания зашумленных образов [4]
  и автоматической генерацией нейросетевых структур
  для аппарата формирования и распознавания статических образов [5].
  
  Рис. 1. Пример структуры нейронной сети,
  состоящей из двух несвязанных между собой подсетей.
  Затемненные точки - нейроны-рецепторы.
  Толщина соединительных линий между нейронами
  зависит от наличия или отсутствия сигнала.
  Толщина линий от рецепторов не изменяется.
  Для визуализации использована библиотека d3.js.
  
  2. СТРУКТУРА И ФУНКЦИИ ИНСТРУМЕНТАЛЬНОЙ ПЛАТФОРМЫ
  ПРОЕКТИРОВАНИЯ БИНАРНЫХ НЕЙРОННЫХ СЕТЕЙ
  
  В целях исследования возможностей алгоритмического синтеза
  и когнитивных свойств различных структур на бинарных нейронах
  разработана система автоматизированного проектирования на языке Lua.
  Эта инструментальная платформа включает в свой состав тройку:
  логическое ядро (API), интерфейс (GUI) и каталог нейронных сетей.
  
  Основным функциональным блоком разработки является логическое ядро,
  которое может встраиваться в программные приложения и аппаратные объекты управления
  как самостоятельный программный модуль.
  Доступ ко всем функциям ядра осуществляется посредством API.
  С помощью модулей логического ядра системы
  разработаны и помещены в каталог нейронных сетей некоторые примеры,
  что позволяет шаблонизировать разработку
  нейроподобной реализации интеллектуальных систем.
  
  Для упрощения восприятия и администрирования платформы,
  а также в образовательных целях
  часть функций логического ядра была привязана
  к элементам графического интерфейса.
  Это удобно для отображения нейронных сетей в динамике
  за счет специально разработанных графических средств визуализации.
  Административные функции (создание, копирование, редактирование и т.д.)
  выполняются по умолчанию внутри пользовательского каталога нейронных сетей
  и могут быть реализованы встроенными средствами администрирования
  или средствами файловой системы.
  
  Известны языки разметки нейронных сетей для вычислительных нейронаук [6],
  из которых были заимствованы некоторые идеи.
  Для нейроподобных алгоритмов был разработан формальный синтаксис,
  интерпретируемый ядром.
  В данной работе описан язык разметки биоморфных нейронных сетей,
  который позволяет описывать нейронные модели на базе бинарных нейронов,
  хранить и манипулировать ими независимо от конкретной среды моделирования.
  //// Эта часть материала нужна для более ясного понимания,
  //// как именно проектируется такая нейроструктура,
  //// в которой может вообще отсутствовать такое понятие как "слой нейронов".
  //// Плюс при этом раскрываются некоторые особенности
  //// функционирования отдельных нейронов их функционального назначения.
  
  3. ОСОБЕННОСТИ ИНИЦИАЛИЗАЦИИ, НЕЙРОНОВ, РЕЦЕПТОРОВ И ЭФФЕКТОРОВ
  
  Бинарные нейроны существенно отличаются от формальных нейронов Маккалока-Питтса
  и демонстрируют свойства, где обучение и дообучение
  происходят непосредственно в процессе функционирования сети.
  Нейрон принимает бинарный вектор и на выходе дает 0,
  если образ не распознан и 1, если распознан.
  //// Это то самое "врожденное свойство" нейрона данного типа
  //// "заниматься распознаванием" некоего запомненного образа.
  //// И это принципиальное отличие такой нейросетевой структуры.
  В целом, модель бинарного нейрона можно сопоставлять
  с классом импульсных (спайковых) нейронных сетей,
  которые воспроизводят специфичные механизмы нейробиологии [7-9].
  Несмотря на то, что теоретические основы спайковых нейронных сетей
  были предложены еще в 1952 году,
  они интенсивно развиваются в настоящее время
  (отметим, что нейросетевые технологии эволюционируют
  не только в теоретической области нейромоделирования [16, 17],
  но и в значительной степени в связи с возможностями вычислительной техники1).
  
  1 Пример - взрывной рост нейросетевых технологий распознавания
  с появлением специализированных графических ускорителей в 2006 г.
  
  Рис. 2. Структурная схема модели нейрона.
  
  Рис. 3. Пример нейрограммы нейрона a01 с 1 по 34 такты.
  
  В соответствии с предлагаемым формальным синтаксисом
  бинарный нейрон задается своим идентификатором и набором атрибутов.
  Идентификатор нейрона представляет собой последовательность символов
  на латинице без пробелов,
  атрибуты нейрона указываются в скобках через запятую,
  либо задаются по умолчанию для всех нейронов.
  Для упрощения читаемости кода и возможности применения различных операций
  (в том числе автоматических замен)
  в именах идентификаторов рекомендуют применять префиксы и суффиксы.
  Это удобно не только для возможности интуитивного понимания нейронной сети,
  но и для разработки алгоритмов синтеза нейронных структур
  и алгоритмов путем манипулирования строковыми переменными
  в различных языках программирования.
  //// Возьмем на заметку эту возможность гибкой работы,
  //// как с отдельным нейроном, так и любым требуемым "ансамблем".
  
  При построении сети работает правило:
  слева от двоеточия - что присоединяем,
  справа - к чему присоединяем.
  Рецепторы - это нейроны, которые принимают внешние сигналы.
  Для передачи входного сигнала
  любой рецептор может быть подсоединен к любому нейрону из любого слоя сети.
  //// Просто возведение в абсолют таких незаменимых во многих нейроструктурах
  //// resudual blocks.
  //// Но не только. Таким образом можно и обратные связи реализовывать,
  //// включая всякую рекуррентность.
  Для инициализации рецептора задается его идентификатор
  и идентификаторы нейронов, к которым подключается рецептор.
  Описание связей вектора входных значений с нейронной сетью имеет вид:
  
  <ид_входа_1>:<ид_нейрона_11>,<ид_нейрона_12>,:,<ид_нейрона_1j>
  <ид_входа_2>:<ид_нейрона_21>,<ид_нейрона_22>,:,<ид_нейрона_2j>,
  :,
  <ид_входа_n>:<ид_нейрона_i1>,<ид_нейрона_i2>,:,<ид_нейрона_ij>,
  
  где <ид_входа_n> - идентификатор входного сигнала (рецептора),
  например, r01;
  
  <ид_нейрона_ij> - идентификатор нейрона, к которому подключается рецептор,
  например, n01.
  
  Рис. 4. Фрагмент нейрограммы как результат работы нейронной сети.
  Идентификаторы рецепторов отображаются по вертикали,
  номера тактов по горизонтали, слева направо, в прядке возрастания.
  Цвета и размеры точек соответствуют значениям пороговых счетчиков
  и активности каждого из нейронов.
  
  Эффекторы - это бинарные нейроны, с которых снимается выходная информация.
  Эффектор может находиться в любом месте сети.
  За это отвечает атрибут нейрона "Effector", принимающий значения "TRUE/FALSE".
  
  Синтаксис задания матрицы связности,
  описывающей произвольную структуру нейронной сети
  идентичен синтаксису инициализации нейронов-рецепторов.
  Разбиение сети на слои происходит автоматически
  в результате анализа введенной структуры нейронной сети
  в соответствии с теорией графов.
  Пример синтаксиса с фрагментом структуры нейронной сети,
  где рецептор r01 подключен к трем нейронам:
  r01:n01,n02,n03
  r02:n02
  r03:n03
  
  В соответствии с введенной структурой
  программно генерируются графические отображения нейронных сетей.
  Структура нейронной сети не обязательно должна быть полносвязной.
  Примеры нейросетевых структур приведены на рис. 1.
  
  //// Надеюсь из этих "текстовых иллюстраций" достаточно понятно,
  //// что таким образом можно собрать достаточно нетривиальную,
  //// и не обязательно регулярную структуру нейросети,
  //// ориентированную на конкретную задачу.
  //// Да, большую языковую модель, конечно, так собирать,
  //// наверняка, не целесообразно.
  //// Но вот для моделей обучаемых методом "дистилляции",
  //// "WHY NOT?", подробнее см.:
  //// "Сеанс поэтапной "дистилляции".
  
  4. СТАТИСТИЧЕСКИЕ ПОРОГИ ОБУЧЕНИЯ И ГЕНЕРАЦИИ СИГНАЛА СБРОСА НЕЙРОНА
  
  При достижении заданного статистического порога,
  отвечающего за число наблюдений образа
  нейрон активируется и становится обученным.
  Нейрон будет срабатывать каждый раз, когда на его входы
  будет поступать соответствующая комбинация входных векторов
  (все образы кодируются бинарными векторами).
  Для фиксации состояния обученности нейрона
  и генерации сброса реализованы статистические пороги L и G соответственно (рис 2).
  
  Таблица 1. Таблица истинности оператора свертки
  x1/x2 0 1
  0 0 0
  1 1 0
  
  На рис. 2 - входной вектор,
  где - число входов нейрона,
  - дискретный момент времени.
  Элемент R отрабатывает правило:
  если нейрон обнаружит вектор, все элементы которого равны 1,
  то он выдает сигнал 1.
  
  Статистический порог L - это счетчик,
  который при достижении порогового значения заставляет нейрон срабатывать.
  Задача этого порога состоит в том,
  чтобы не пропускать случайные входные вектора.
  При подаче L раз на этот нейрон вектора,
  полностью заполненного единицами, нейрон обучится,
  активируется и начнет передавать единичный сигнал на выход нейрона O
  при каждой подаче единичного вектора.
  При распознавании каждого образа,
  сигнал будет генерироваться до тех пор,
  пока от нейрона, которому он передает сигнал, не поступит сигнал сброса S.
  //// Вот тут не понял.
  //// А если нейрон предает сигнал многим нейронам сразу,
  //// то что в таком случае представляет "сигнал сброса"?
  //// Какая логическая функция при этом реализуется - "И" или "ИЛИ"?
  Триггерный элемент T выполняет функцию кратковременной памяти
  и удерживает выходной сигнал нейрона до поступления сигнала сброса S.
  Это необходимо для реализации функции временной задержки в нейронах
  для обеспечения возможности распознавания динамических явлений
  и причинно-следственных связей [2].
  
  Статистический порог G - это счетчик,
  который при достижении своего значения вырабатывает импульс сброса.
  Его задача - отправить отключающий (тормозящий) сигнал, нейронам,
  которые передают ему данные.
  Это необходимо для возможности распознавания
  неслучайных последовательностей образов.
  
  Структурный порог нейрона L необходим для возможности распознавания
  зашумленных образов.
  Например, если нейрон обучен, и определенное число раз активировался,
  то структурный порог в соответствии с заданной функцией упадет,
  к примеру, до 55%.
  Это значит, что для активации этого нейрона,
  больше нет необходимости подавать полный входной вектор
  и нейрон распознает образ по его части.
  
  Для задания порогов и других параметров нейрона
  необходимо у идентификатора соответствующего нейрона в скобках задать значения,
  например: n02(G=4; L=4).
  
  5. НЕЙРОГРАММА - МЕТОД ВИЗУАЛИЗАЦИИ СОБЫТИЙ В НЕЙРОННОЙ СЕТИ
  
  Окно активности нейронов или нейрограмма отображает
  динамику активации выходных сигналов всех нейронов
  в процессе обработки образов.
  Строки с эффекторами на нейрограмме подсвечены.
  Указатель предельного такта позволяет задать номер такта,
  до которого будет продолжаться моделирование.
  Если необходимо обработать все входные данные,
  то этот указатель должен быть установлен до максимума (по умолчанию).
  Для моделирования нейронов в сети методом потактной подачи импульсов
  удобно установить указатель такта на нужный номер
  и запускать моделирование необходимое количество раз.
  Это позволит отслеживать динамику информационных процессов (рис. 3, 4)
  в графическом интерфейсе.
  
  Параметр "такт сброса всех нейронов" позволяет сбросить (разобучить) все нейроны
  без остановки процесса подачи входных импульсов.
  Это удобно для отладки нейронных сетей при моделировании
  на наборах тестовых данных.
  
  Эмоциональная оценка - численный параметр всей нейронный сети,
  который характеризует общее число активных нейронов
  на каждом такте моделирования (рис. 4).
  //// Интересный способ реализации "эмоциональной оценки",
  //// но явно не "идеальный" и уж точно не "универсальный".
  //// Но хоть какой-то.
  
  Рис. 5. График эмоциональной оценки нейронной сети.
  По оси абсцисс номер такта, по оси ординат - число активных нейронов в сети.
  
  Рис. 6. Пример сжатия признаков во фрагменте слоя нейронов
  (черная точка - нейрон сработал, белая точка - нейрон не сработал).
  
  Нейросетевые базы знаний согласно [2] являются частью систем ААУ
  и представляют собой нейронные структуры определенной топологии.
  
  Как правило, такие системы оперируют векторами вида
  "образ-действие-результат"
  и могут использоваться для обучаемых систем автономного адаптивного управления
  в реальной или виртуальной среде совместно с другими блоками
  (эмоциональной оценки, распознавания и др.).
  Примеры баз знаний были помещены в каталог нейронных сетей.
  
  Генератор случайных нейронных структур служит для построения
  случайной структуры нейронной сети без циклов.
  Данная функция может быть полезна для эволюционно-генетических алгоритмов.
  Циклы и циклические процессы в бинарных нейронных сетях
  могут быть полезными,
  но их роль не изучалась в данной работе.
  
  Рис. 7. Рекурсивный алгоритм создания библиотеки фильтров.
  
  6. АЛГОРИТМ СИНТЕЗА СТРУКТУР ГЛУБОКОГО ОБУЧЕНИЯ
  
  Была разработана процедура генерации карт признаков,
  заключающаяся в том, что каждому образу или классу образов
  ставится в соответствие нейрон со структурой связей,
  задающей соответствующий образ или класс образов.
  В отличие от классических нейронных сетей
  с непрерывными функциями активации данная процедура
  не итерационная и не рекурсивная,
  что значительно ускоряет ее выполнение.
  В задаче идентификации личности, к примеру,
  такими признаками могут служить глаза и другие характерные элементы лица.
  
  При разработке алгоритма возникла проблема:
  полученные структуры оказались рассчитанными только на такие виды шумов,
  которые связаны с отсутствующими элементами образа (слабая помехоустойчивость).
  Для решения были алгоритмически выделены
  повторяющиеся фрагменты образов обучающей выборки
  для формирования и обучения общих промежуточных нейронов.
  Это не дало повышения качества распознавания зашумленных образов,
  хотя позволило уменьшить количество нейронов и экономить ресурсы.
  
  Трудности, связанные с помехоустойчивостью нейросетевых структур распознавания
  привели к идее использования принципов сверточных нейронных сетей,
  основанных на механизмах распознавания образов в мозге [8, 10].
  Исследование структур глубокого обучения позволило разработать подходы
  к построению нейросетевых структур со свойствами помехоустойчивости
  и высокой скорости обучения на основе нейронов А.А. Жданова.
  
  Для алгоритма генерации глубокой структуры разработали оператор свертки,
  который применили при получении значимых признаков для бионических нейронов.
  Это логическая функция, определяемая таблицей истинности (таблица 1).
  В таблице 1 ? 1 - набор значимых сигналов, ?2 - набор незначимых сигналов.
  Поскольку на выходе нейроны имеют бинарный сигнал,
  то будем считать, что необходимый образ распознан
  если в рассматриваемом окне (фрагменте образа) распознан хотя бы один образ.
  При этом размер окна определяется размером нейросетевого фильтра.
  Далее соединяются все нейроны признаков внутри окна к единому нейрону.
  Этот нейрон срабатывает, если хотя бы один из входных нейронов сработан.
  Это условие "слабого" порога или оператора "или",
  который реализуется за счет комбинации параметров пороговых функций (рис. 6).
  //// Т.е. решения отработанные в сверточных сетях могут быть перенесены
  //// и в бинарные/битовые нейроструктуры.
  //// Но, наверно, и другие решения, например, из рекуррентных сетей,
  //// тоже могут иметь свои "битовые аналоги".
  
  Алгоритм синтеза биоморфной нейроподобной системы распознавания
  состоит из этапа синтеза структуры подсети библиотеки фильтров
  для каждого поступающего образа
  и этапа синтеза сети для распознавания образа.
  Эти два этапа рекурсивно повторяются,
  генерируя слой за слоем пока не будет синтезирована нейронная сеть,
  обеспечивающая за счет своей структуры полное распознавание
  всего множества заданных образов.
  //// А вот эта методика послойной генерации, уже наоборот,
  //// может найти свое применение в "стандартных ИНС",
  //// особенно при "поэтапной дистилляции".
  Сгенерированная сеть обучается на каждой итерации алгоритма так,
  что каждый нейрон обучается отдельно.
  Общая схема алгоритма синтеза структуры подсети
  библиотеки фильтров-масок для каждого поступающего образа
  приведена на рис. 7.
  
  Рис. 8. Схема рекурсивной генерации библиотеки фильтров для тестового образа.
  
  Рис. 9. Примеры распознавания трех зашумленных образов "Х" (слева)
  и идентификация их координат (справа).
  
  Обучение может осуществляться как с учителем и без
  и использоваться для создания самообучаемой системы распознавания образов.
  Такая система способна алгоритмически порождать нейронные структуры,
  обучаемые на наиболее вероятные, по критерию частоты появления образы
  (задача управления)
  и на заранее заданные образы
  (задача распознавания).
  Алгоритм синтеза сверточной бинарной сети подробно описан в [5],
  где приведены результаты в области обучения и дообучения
  сверточных бионических нейронных сетей с применением нейромоделирования.
  
  На рис. 8 схематически изображено применение приведенного алгоритма
  для создания библиотеки фильтров для распознавания образа "Х"
  и результаты распознавания.
  Как и в общей задаче распознавания произвольных образов
  количество фильтров и скрытых слоев заранее неизвестно.
  
  При распознавании в последнем слое были получены
  условные координаты каждого распознанного образа (рис. 9).
  Полученные координаты совпадают с геометрическими центрами
  соответствующих им образов за счет процесса сжатия информации.
  Зная размер фильтров в каждом слое,
  можно восстановить исходные образы по условным координатам,
  что удобно использовать при подсчете распознанных образов
  на анализируемом изображении.
  
  При тестировании нейроподобных структур
  использовалось обучающее множество из 60000 рукописных символов
  из базы данных рукописных цифр MNIST.
  Доля распознанных символов составила 97.51%.
  Согласно алгоритму синтеза глубоких структур
  использовалось разбиение на области с выделением признаков.
  Хотя современные нейронные сети позволяют достигать менее 1% ошибок,
  результаты эксперимента показали работоспособность алгоритма
  и возможность помехоустойчивого распознавания на бинарных нейронах,
  то есть без применения операций с плавающей запятой,
  что существенно.
  Повысить точность распознавания можно, увеличив разрядность рецепторов.
  Это повлечет необходимость использования большего количества нейронов.
  Поэтому в реальных задачах (и особенно в задачах реального времени,
  где предлагаемые технологии наиболее эффективны)
  необходим рациональный баланс между быстродействием и точностью.
  
  Подводя итог, отметим, что метод алгоритмической генерации сверточных сетей
  обладает свойствами, среди которых возможность синтеза сети под выборку,
  помехоустойчивость к зашумлениям образов,
  возможность дообучения без необходимости повторного синтеза
  и повторного обучения,
  отсутствие сложных вычислительных проблем.
  Особенностью описанных растущих бионических сетей
  является возможность семантического анализа
  (например образы одного класса: "а", "А"),
  возможность распознавания трех мерных изображений в различных проекциях,
  работа с многомерными образами.
  //// Складывается ощущения, что проблема "помехоустойчивости"
  //// в такого рода бинарных сетях проявляется сильнее, чем в "стандартных ИНС".
  //// Или просто к ним требования по этому критерию выше.
  //// Но, одновременно, представляется, что корень проблем в этом случае,
  //// это обратная сторона парадигмы "один нейрон - один образ",
  //// на которой построен нейрон Жданова.
  //// Отсюда и необходимость привлечения решений из сверточных сетей.
  
  //// Представляется, что, возможно, авторы этого материал
  //// не до конца исследовали/использовали потенциал упомянутых выше
  //// "статистический и структурного порогов",
  //// т.к. постарались отказаться от "операций умножения и т.д.",
  //// и, соответственно, от возможности использования "обучаемого маскирования".
  //// "Но это не точно".
  
  //// Возможно, что решение, как и в области схемотехники,
  //// лежит на пути комбинирования "дискретных" и "аналоговых" элементов.
  //// Т.е. структур с бинарными и традиционными "нейронами".
  
  К недостаткам предложенной методологии можно отнести саму бинарность
  и как следствие значительное число нейронов при решении реальных задач,
  что обуславливает необходимость предварительной оценки
  скоростных параметров алгоритма
  для управления соотношением время/точность.
  Предварительная оценка и выбор параметров алгоритма
  связаны с возможностями специализированного оборудования
  для функционирования сложных сетей однородных нейронов.
  //// Т.е. ставка на бинарность в конечном итоге,
  //// приводит к большему числу операций при увеличении размерности/сложности
  //// обрабатываемых данных.
  //// И тут просто напрашивается применение "группировок битов"
  //// вместо по-битового подхода.
  //// Чем, собственно, и отличается тот подход к бинарным/битовым нейросетям,
  //// который, Ваш покорный слуга, и пытается как-то осмыслить и изложить.
  
  7. VERILOG-КОНВЕРТЕР
  
  Был разработан конвертер, который генерирует Verilog-код нейронной сети
  исходя из ее формального описания.
  Описание структуры сети может задаваться вручную,
  либо генерироваться в автоматическим режиме.
  Прошивка была успешно проведена на ПЛИС Altera cyclone 4 EP4CE6.
  
  Фрагмент генерированного кода:
  
  mod_m_counter #(.M(10), .N(4)) baud_gen_unit
  (.clk(clk), .reset(reset), .max_tick(tick), .q());
  neuron_t1 #(.N(1), .M(2), .Q(2), .PATTERN(1'b1)) n1
  (.clk(clk), .reset(reset), .tripping_in(tripping_gl | n5_tripping_out | n8_tripping_out | n13_tripping_out),
  .s_tick(tick), .din(d [3]),
  .tripping_out(n1_tripping_out), .recogn_st(n1_recogn_st), .learn_st(n1learn_st));
  neuron_t1 #(.N(1), .M(2), .Q(2), .PATTERN(1'b1)) n2
  (.clk(clk), .reset(reset), .tripping_in(tripping_gl | n5_tripping_out |
  n6_tripping_out | n9_tripping_out | n10_tripping_out), .s_tick(tick), .din(d [2]), .tripping_out(n2_tripping_out), .recogn_st(n2_recogn_st), .learn_st(n2learn_st));
  //// На мой взгяд совершенно нечитаемая запись.
  //// А так как давно придерживаюсь в своей программисткой практике
  //// максимы, что "исходник программы предназначен для ЧТЕНИЯ, а не для ЗАПИСИ",
  //// то конкретно эта запись мне НЕ НРАВИТСЯ,
  //// но какой она должна быть, пока не знаю.
  
  8. ОБСУЖДЕНИЕ И ВЫВОДЫ
  
  В работе приведены подходы к проектированию
  и описаны элементы программно-аппаратной платформы
  для разработки, проектирования и прототипирования нейроподобных сетей,
  описанных в теории "Автономного адаптивного управления" А.А. Жданова.
  Этот инструментарий обладает следующими функциональными возможностями:
  проектирование цифровых нейроподобных сетей,
  анализ информационных процессов в нейроподобных сетях,
  возможность алгоритмического синтеза нейросетевых структур на бинарных нейронах.
  
  Исследования были проведены на основе
  разработанного синтаксиса описания нейронных сетей,
  который позволил создать различные программы,
  в том числе для синтеза нейросетевых структур и конвертации в Verilog.
  Исследования продемонстрировали,
  что предложенный формализм и свойства используемых нейронов
  позволяют проектировать нейросетевые системы,
  общим свойством которых является самоорганизация
  с применением известных в нейроинформатике структур.
  
  Анализируя современные нейросетевые подходы,
  среди которых сверточные нейронные сети и глубокое обучение [10],
  можно отметить, что сети на биоморфных бинарных нейронах
  рассматриваемые в данной статье,
  могут как существенно отличаться от глубоких нейронных сетей,
  так и быть с ними связными без теоретических ограничений
  на комбинации различных нейросетевых решений в нейросетевых ансамблях,
  включающих самоорганизующиеся, рекуррентные и другие структуры.
  В частности, для описанного подхода
  возможно использование динамической структуризации
  наподобие алгоритмов кортикальных сетей из [11, 12].
  
  От структуры нейронной сети, топологии межнейронных связей
  зависят качество функционирования, помехоустойчивость и скорость обучения.
  Динамические свойства бинарных нейроподобных сетей
  делают их перспективными в системах машинного анализа данных
  для потоковой обработки информации в реальном времени.
  
  Изложенные материалы носят исследовательский характер
  и демонстрируют общность подходов к задаче проектирования нейросетевых структур
  и программных продуктов на их основе.
  Результаты разработок, демонстрирующих дальнейшее развитие данного направления
  защищены в патентах [13-15].
  
  СПИСОК ЛИТЕРАТУРЫ
  
  //// 17 источников
  
  .......
  
  //// Конец цитирования.
  
  Очень полезный для меня оказался этот материал.
  Приятно осознавать, что не все мысли насчет бинарных/битовых нейросетей,
  которые бродят в голове, являются "голимым бредом".
  А некоторые, так и потенциально могут решить выявленные другими исследователями
  достаточно неочевидные и трудные проблемы.
  Но есть еще и о чем задуматься
  и, естественно, продолжить поиск в этом направлении.
  
  
  ========
  
  25.05.2024 14:56
  
  "Лакмусовая бумажка" уровня понимания существующих нейросетей.
  В оглавление.
  
  Этот текст попал в мой "долгий ящик" уже больше года назад.
  При первом прочтении, честно признаюсь, ничего из него не понял.
  И вот прошел год.
  Год усиленного обучения "азам машинного обучения" и структурам нейросетей.
  Изменилось ли что-то в понимании этого текста?
  Если честно, то не очень много, но зато стали виднее пробелы в образовании.
  Текст очень сложный для чтения, это скорее перечень самых разных техник
  используемых в действительно практических больших нейромоделях.
  Но если хотите проверить уровень своего знания и понимания в этой области,
  наверно, лучшего теста трудно придумать:
  
  "Модульное глубокое обучение".
  Автор: mr-pickles
  https://habr.com/ru/company/wunderfund/blog/726460/
  3 апр 2023 в 11:30
  
  Автор оригинала: Sebastian Ruder
  https://www.ruder.io/modular-deep-learning/
  
  //// Начало цитирования.
  
  В этом материале приведён краткий обзор использования модульного подхода
  в задачах глубокого обучения.
  Более детальный разбор этой темы вы можете найти здесь.
  https://arxiv.org/abs/2302.11529?ref=ruder.io
  Если вас интересует модульный подход к тонкой настройке
  (дообучению) моделей обработки естественного языка
  - взгляните на наше учебное руководство 2022 года по EMNLP.
  https://tinyurl.com/modular-fine-tuning-tutorial?ref=ruder.io
  Дополнительные материалы по модульному глубокому обучению
  вы можете найти на этом ресурсе.
  https://www.modulardeeplearning.com/?ref=ruder.io
  
  Рис. Тематические исследования модульных подходов к глубокому обучению.
  Слева направо:
  фреймворк MAD-X,
  https://aclanthology.org/2020.emnlp-main.617/
  модель Polytropon,
  https://arxiv.org/abs/2202.13914
  трансформер, построенный по модели <смесь экспертов>
  https://arxiv.org/abs/2101.03961
  
  Передовые модели глубокого обучения,
  развитие которых подстёгивают законы масштабирования,
  становятся всё больше и больше.
  Эти модели представляют собой монолитные структуры.
  Их, с момента, когда они ещё совершенно ничего не <знают>,
  подвергают предварительному обучению,
  проводя его силами технических специалистов по тщательно продуманному плану.
  Тонкая настройка этих моделей, в силу их размера,
  превратилась в дорогое удовольствие,
  а её альтернативы, вроде контекстуального обучения,
  на практике часто дают неустойчивые результаты.
  Но, в то же время,
  эти модели всё ещё плохо показывают себя в решении многих задач
  - таких, как формирование суждений путём манипулирования символами,
  темпоральное понимание различных явлений,
  генерирование многоязычных текстов и т.п.
  
  Модульный подход способен помочь нам в решении
  некоторых из этих исключительно сложных задач.
  Разбивая модели на модули,
  мы можем отделить фундаментальные знания и способности к рассуждению
  о языке, о видимых объектах, и о прочем подобном,
  от возможностей,
  нужных для решения конкретных задач в различных предметных областях.
  Модульный подход, кроме того,
  даёт нам гибкий инструмент расширения моделей в расчёте на новые условия,
  даёт механизм дополнения их новыми возможностями.
  //// Наверно, это главный вывод, который нужно вынести из этого текста.
  //// Сложные задачи, решаемые нейросетью, включая и сам процесс обучения,
  //// нужно декомпозировать на подзадачи,
  //// которые реализуются модулями различного назначения и архитектуры,
  //// и обучение, которых лучше реализовывать отдельно или поэтапно.
  
  Здесь я поделюсь с вами самыми важными наблюдениями и выводами,
  которые касаются различных аспектов темы модульного глубокого обучения.
  
  Классификация
  
  Мы производим категоризацию модульных подходов к глубокому обучению
  по четырём измерениям:
  
   Вычислительные функции: как реализован модуль.
  
   Функции маршрутизации: как выбирают активные модули.
  
   Агрегирующие функции: как агрегируются выходные данные активного модуля.
  
   Условия обучения: как обучают модули.
  
  Ниже мы приведём результаты изучения различных конфигураций этих компонентов.
  
  Рис. Тематические исследования модульных подходов к глубокому обучению.
  Зелёные компоненты показывают различные функции маршрутизации.
  Компоненты, окрашенные в разные оттенки красно-лилового цвета
  - это вычислительные функции.
  (a) Фреймворк MAD-X использует слои адаптеров
  с фиксированной маршрутизацией для прямого межъязыкового переноса данных.
  (b) Модель Polytropon использует малоранговые адаптеры
  с жёстко заданной маршрутизацией
  для адаптации к задаче обучения на малых наборах данных.
  (c) Трансформеры, построенные по модели <смесь экспертов>,
  используют многослойные персептроны
  с применением гибкой top-k-маршрутизации
  для масштабирования моделей до более крупных размеров.
  
  Вычислительные функции
  
  Мы представляем нейронную сеть f _?
  в виде композиции функций f_{\theta_1} \odot f_{\theta_2} \odot \ldots \odot f_{\theta_l},
  каждая из которых имеет собственный набор параметров \theta_i.
  Функция может представлять собой слой или компонент слоя
  - такой, как линейное преобразование.
  
  Мы выделяем три базовых типа вычислительных функций,
  которые <сшивают> модуль, имеющий параметры,
  с функциями модели:
  
   Композиция параметров.
   Модули модифицируют модель на уровне индивидуальных весов:
   f_i^\prime(\boldsymbol{x}) = f_{\theta_i \oplus \phi}(\boldsymbol{x}).
  
   Композиция входов.
   Вход функции x конкатенируется с параметрами модуля:
   f_i^\prime(\boldsymbol{x}) = f_{\theta_i}([\boldsymbol{x}, \phi]).
  
   Композиция функций.
   Выходы функции модели и модуля комбинируются:
   f_i^\prime(\boldsymbol{x}) = f_{\theta_i} \odot f_{\phi}(\boldsymbol{x}).
  
  Мы приводим обзор трёх вычислительных функций
  (в дополнение к гиперсети)
  в виде части архитектуры трансформеров на следующем рисунке:
  
  Рис. Различные вычислительные функции в архитектуре трансформера.
  Модульные компоненты, ориентированные на конкретную задачу,
  показаны пурпурным и красно-лиловым цветами.
  (a) Композиция параметров:
  разреженная подсеть в линейном слое,
  представляющая часть механизма множественного внимания.
  (b) Композиция входов:
  механизм настройки префиксов расширяет входные данные
  путём присоединения эмбеддингов к матрицам ключей и значений
  в слое трансформера.
  (c) Композиция функций:
  в каждый слой добавлены ориентированные на конкретную задачу суживающие слои,
  которые трансформируют скрытое представление.
  (d) Гиперсеть:
  небольшая отдельная нейронная сеть,
  генерирующая параметры модуля, зависящие от метаданных.
  
  Композиция параметров
  
  Мы выделяем два основных способа использования модулей
  для изменения параметров модели:
  
   Корректировка разреженного подмножества параметров.
  
   Корректировка параметров в низкоразмерном пространстве.
  
  <Разреженные> методы близко связаны
  с сокращением избыточных нейронов в скрытых слоях
  искусственной нейронной сети
  и с гипотезой лотерейного билета.
  https://arxiv.org/abs/1803.03635?ref=ruder.io
  Такие методы могут быть структурированы
  и могут применяться лишь к особым группам параметров.
  
  Композиция входов
  
  Обучение на основе подсказок можно рассматривать
  как поиск текстовой подсказки,
  ориентированной на конкретную задачу,
  эмбеддинг которой вызывает желаемое поведение системы.
  Альтернативой этому является
  непосредственное обучение на основе непрерывных подсказок
  - на входе модели или в каждом её слое.
  //// Не понял, в чем отличаются эти альтернативы.
  
  Композиция функций
  
  Это - наиболее общая категория вычислительных функций.
  Она вбирает в себя стандартные многозадачные методы обучения,
  модули, которые адаптируют к чему-либо заранее обученные модели
  (известные как <адаптеры),
  методы изменения масштаба моделей.
  Кроме того,
  методы композиции параметров и входов можно выразить
  в виде композиции функций.
  
  Ниже, в качестве примера, показаны три метода композиции функций.
  
  Рис. Различные подходы к композиции функций.
  (a) Последовательный сужающий адаптер:
  первая архитектура адаптера, предложенная для применения с трансформерами,
  состоит из двух суживающих слоёв,
  размещённых после слоя множественного внимания
  и слоя прямого распространения.
  (b) Параллельный сужающий адаптер:
  в предварительно обученном трансформере
  для слоя внутреннего внимания и слоя прямого распространения
  суживающие преобразования выполняются параллельно.
  (c) (IA)3:
  операции изменения масштаба выполняются внутри слоёв
  внутреннего внимания и прямого распространения.
  
  Генерирование параметров модуля
  
  Вместо того чтобы формировать параметры модуля непосредственно,
  в ходе обучения модели,
  их можно сгенерировать с помощью вспомогательной модели (гиперсети),
  зависящей от дополнительной информации и от метаданных.
  
  Ниже приведена краткая сводка по сильным и слабым сторонам
  различных вычислительных функций.
  Подробности об этом ищите здесь и здесь.
  https://docs.google.com/presentation/d/1seHOJ7B0bQEPJ3LBW5VmruMCILiVRoPb8nmU2OS-Eqc/edit?ref=ruder.io#slide=id.g1a37bfe6b5e_3_603
  https://arxiv.org/abs/2302.11529?ref=ruder.io
  
  Сравнение различных вычислительных функций
  
  Рис. Различные методы маршрутизации.
  (a) Фиксированная маршрутизация:
  образцы передаются модулю на основе заранее заданной логики.
  (b) Маршрутизация на основе обучения (жёсткая):
  правила маршрутизации вырабатываются в ходе обучения и не меняются.
  (c) Маршрутизация на основе обучения (гибкая):
  гибкий выбор модулей с использованием весов.
  
  Функция маршрутизации может быть фиксированной.
  Тогда все решения, связанные с маршрутизацией,
  принимаются на основе того, что заранее известно о задаче.
  Но возможен и альтернативный подход
  - маршрутизация на основе обучения модели.
  Методы маршрутизации на основе обучения отличаются тем,
  насколько точно задан выбор маршрута.
  При жёсткой маршрутизации модель учится делать
  точный, неизменный выбор конкретного маршрута.
  При гибкой маршрутизации выбор зависит от распределения вероятностей, связанных с модулями.
  
  Фиксированная маршрутизация
  
  При фиксированной маршрутизации используются метаданные
  - такие, как описание особенностей задачи.
  Это позволяет принимать определённые решения о маршрутизации до обучения модели.
  Фиксированная маршрутизация используется
  в большинстве методов композиции функций.
  В частности, речь идёт о многозадачном обучении и о применении адаптеров.
  При применении фиксированной маршрутизации
  осуществляется выбор разных модулей
  для различных аспектов целевого окружения.
  Например - это может быть задача и язык в обработке естественных языков,
  или робот и задача при обучении с подкреплением.
  Это позволяет обобщать модели на неизвестные сценарии.
  
  Маршрутизация на основе обучения
  
  Маршрутизация на основе обучения обычно реализуется
  на базе многослойных персептронов.
  Этот подход к маршрутизации предусматривает
  необходимость борьбы с дополнительными сложностями.
  Среди них - нестабильность обучения,
  коллапс модуля,
  переобучение модели.
  Существующие методы маршрутизации на основе обучения
  часто не отличаются оптимальностью.
  Дело в том, что они представлены модулями,
  которые, во-первых,
  не являются достаточно специализированными,
  и во вторых -
  недостаточно интенсивно используются.
  Но, когда между задачей и соответствующей возможностью системы
  нет чёткой однозначной связи,
  маршрутизация на основе обучения
  - это единственный подходящий вариант.
  
  Жёсткая маршрутизация на основе обучения
  
  Жёсткая маршрутизация на основе обучения моделирует выбор того,
  будет ли модуль активным, основываясь на бинарной логике.
  Так как модель невозможно научить принятию чётких решений напрямую,
  пользуясь методом градиентного спуска,
  системы учат, пользуясь обучением с подкреплением,
  эволюционными алгоритмами или стохастической репараметризацией.
  //// Любопытная информация. Стоит запомнить.
  
  Гибкая маршрутизация на основе обучения
  
  Методы гибкой маршрутизации, основанной на обучении,
  обходят необходимость точного выбора модуля.
  Они действуют через изучение взвешенной комбинации показателей
  в форме распределения вероятностей
  между доступными модулями.
  Классический пример этого - модель <смесь экспертов>.
  Так как активация всех модулей - это ресурсозатратная операция,
  свежие методы гибкой маршрутизации на основе обучения
  ориентируются на выбор top-k и даже top-1 модулей.
  Маршрутизация на уровне токенов ведёт к более эффективному обучению,
  но ограничивает выразительные возможности модульных представлений.
  
  Уровень маршрутизации
  
  Система маршрутизации может выбирать модули на глобальном уровне,
  воздействуя на всю сеть,
  может выполнять распределение задач для каждого конкретного слоя,
  или даже принимать иерархические решения о маршрутизации.
  Ниже показаны схемы различных уровней маршрутизации.
  
  Рис. Различные уровни маршрутизации.
  (a) Послойная маршрутизация:
  индексы выбираются на основании входа текущего слоя.
  (b) Примитивная глобальная маршрутизация:
  для всех слоёв модели выбираются одни и те же индексы модулей.
  (c) Глобальная маршрутизация:
  конфигурация (возможно - особая для каждого из слоёв)
  выбирается на глобальном уровне.
  
  Агрегирующие функции
  
  Агрегирующая функция определяет то,
  как комбинируются выходы модулей,
  выбранных посредством механизма маршрутизации.
  На практике системы маршрутизации и агрегации часто объединяют.
  Агрегирующие функции могут быть классифицированы
  аналогично вышеописанным вычислительным функциям.
  Но вычислительные функции соединяют соответствующие части моделей
  с компонентами модулей,
  а агрегирующие функции отвечают за объединение множества компонентов модуля
  на разных уровнях:
  
   Агрегация параметров.
   Агрегируются параметры модулей:
   f_i^\prime(\boldsymbol{x}) = f_{\boldsymbol{\phi_i}^{1} \oplus \dots \oplus \boldsymbol{\phi}_i^{|M|}}(\boldsymbol{x})
  
   Агрегация представлений.
   Агрегируются модульные представления:
   f_i^\prime(\boldsymbol{x}) = f_{\boldsymbol{\theta}_i}(\boldsymbol{x}) \oplus f_{\boldsymbol{\phi}_i^1}(\boldsymbol{x}) \oplus \dots \oplus f_{\boldsymbol{\phi}_i^{|M|}}(\boldsymbol{x})
  
   Агрегация входов.
   Параметры модуля конкатенируются на уровне входов:
   f_i^\prime(\boldsymbol{x}) = f_{\boldsymbol{\theta_i}}([\boldsymbol{\phi_i^1}, \dots, \boldsymbol{\phi_i^{|M|}}, \boldsymbol{x}])
  
   Агрегация функций.
   Агрегируются модульные функции:
   f_i^\prime(\boldsymbol{x}) = f_{\boldsymbol{\phi}_i^{1}} \circ ... \circ f_{\boldsymbol{\phi}_i^{|M|}}(\boldsymbol{x})
  
  Агрегация параметров
  
  Агрегирование информации из множества модулей
  путём интерполяции их весов
  тесно связано с линейной связностью решений.
  Это показывает,
  что при определённых условиях, таких,
  как одни и те же инициализационные значения,
  две сети связаны линейным путём невозрастающей ошибки.
  Основываясь на этом предположении,
  в модели, с использованием арифметических операций,
  могут быть проведены модульные изменения.
  Делается это для того чтобы убрать или извлечь
  какую-либо информацию из модели.
  
  Агрегация представлений
  
  В качестве альтернативы - выходы различных модулей
  можно интерполировать путём агрегации скрытых представлений модулей.
  Один из способов выполнения такой агрегации
  заключается в изучении системой взвешенной суммы представлений.
  Это похоже на то, как система маршрутизации учится назначать балл i
  каждому из модулей.
  Модель, кроме того, может изучить взвешенные данные,
  которые учитывают скрытые представления.
  Например - посредством механизма внутреннего внимания.
  
  Агрегация входов
  
  Если модели предоставлена подсказка,
  то передача ей нескольких инструкций или нескольких образцов,
  выполняемая путём конкатенации,
  может рассматриваться как форма агрегации входных данных.
  <Мягкие> подсказки можно изучать в различных ситуациях.
  Например - в таких, как работа с задачами и языком,
  или с атрибутами и объектами.
  Их агрегация выполняется путём конкатенации.
  
  Агрегация функций
  
  И наконец - мы можем агрегировать модули на уровне функций,
  изменяя порядок выполнения вычислений.
  Можно агрегировать их последовательно,
  когда выход одного модуля становится входом другого,
  после чего это повторяется для следующих модулей.
  Для создания более сложных конфигураций модулей
  можно агрегировать их иерархически,
  основываясь на древовидной структуре.
  
  Условия обучения
  
  Последнее измерение из тех,
  по которым мы можем дифференцировать модульные методы глубокого обучения
  - это то, как обучаются модели.
  Мы выделяем три стратегии модульного обучения:
  
   Совместное обучение.
  
   Непрерывное обучение.
  
   Ретроспективная адаптация.
  
  Совместное обучение
  
  В многозадачной системе обучения модульные компоненты,
  ориентированные на конкретную задачу,
  обучают совместно для смягчения катастрофических взаимных помех,
  используя фиксированную маршрутизацию или обучаемую систему маршрутизации.
  Совместное обучение, кроме того,
  может дать полезные инициализационные данные для модульных параметров,
  может позволить использовать дополнительные модульные компоненты
  по мере развития модели.
  
  Непрерывное обучение
  
  В ходе непрерывного обучения в модель, со временем,
  добавляют новые модули.
  Параметры предыдущих модулей обычно <замораживают>,
  а новые модули подключают к существующим различными способами.
  
  Ретроспективная адаптация
  
  Методы этой группы ещё известны как
  <тонкая настройка моделей с эффективным использованием параметров>,
  так как они обычно используются для адаптации больших,
  заранее обученных моделей, к целевой ситуации.
  Мы рассматриваем подобные методы для задач обработки естественного языка
  в этом учебном руководстве.
  https://tinyurl.com/modular-fine-tuning-tutorial?ref=ruder.io
  
  Цели применения модульного подхода в глубоком обучении
  
  Многие из вышеописанных методов оцениваются
  на основе их способности масштабировать большие модели,
  или на основе того,
  как они поддерживают перенос знаний,
  полученных в одной области, на другую область
  с применением небольшого количества образцов.
  Модульный подход, кроме того,
  чрезвычайно важен и в других сферах,
  в том числе - в задачах планирования и систематического обобщения,
  в число которых входят:
  
   Иерархическое обучение с подкреплением.
  
   Конструирование нейропрограмм.
  
   Причинно-следственный анализ.
  
  Ниже приведено схематическое изображение этих задач.
  
  Рис. Различные цели модульного глубокого обучения.
  (a) Иерархическое обучение с подкреплением:
  скетчи политик состоят из высокоуровневых политик
  (инструкций, относящихся к задачам),
  которые отвечают за выбор низкоуровневых политик (опций),
  определяющих выбор действия.
  (b) Конструирование программ:
  дифференцируемый нейрокомпьютер использует рекуррентный нейроконтроллер,
  который итеративно получает входные данные из окружающей среды,
  записывает данные в память и читает их из неё,
  генерируя, в итоге, выходные данные.
  (c) Причинно-следственный анализ:
  причинно-независимые механизмы маршрутизируют
  трансформированный образец к эксперту,
  который накладывает его на исходное распределение.
  Состязательный дискриминатор пытается различить
  реконструированный и исходный образцы.
  
  Иерархическое обучение с подкреплением
  
  Для того чтобы организовать обучение модели,
  проводимое через длительные промежутки времени,
  или проводимое при использовании
  сильно разреженных и отложенных наград в обучении с подкреплением,
  часто полезно обучить модель промежуточным абстракциям,
  известным, как опции или навыки,
  в форме переносимых подполитик.
  С изучением подполитик связаны сложности,
  имеющие отношение к специализации и мониторингу,
  а так же - к пространству действий и опций.
  Среди стратегий, используемых для борьбы с этими сложностями,
  можно отметить применение внутренних наград, подцелей,
  а так же - языка в качестве промежуточного пространства.
  
  Симуляция программ
  
  Модульный подход, кроме того,
  можно использовать для симуляции программ.
  Делается это путём динамического конструирования графа программы
  на основе входных данных,
  или путём глобального конструирования графа на основе описания задачи.
  В дополнение к системам маршрутизации и к вычислительным функциям,
   подобные архитектуры могут быть расширены за счёт внешней памяти.
  Симуляция программ полезна в тех случаях,
  когда решение задачи основано на решении подзадач
  в правильной последовательности.
  
  Причинно-следственный анализ
  
  Модульный подход в методах причинно-следственного анализа
  отражает модульность в (физических) механизмах мира.
  Считается, что модули независимы
  и подходят для многократного использования,
  поэтому модели машинного обучения,
  копирующие эту структуру,
  отличаются повышенной устойчивостью к вмешательствам
  и к сдвигам локального распределения.
  Среди сложностей, характерных для применения модулей в этой сфере,
  можно отметить специализацию каждого модуля на конкретном механизме,
  а так же - совместное изучение абстрактных представлений и их взаимодействий
  в графе причинно-следственных связей.
  
  Применение модульного подхода в трансферном обучении
  
  Представленные методы используются для решения самых разных задач.
  Сначала мы расскажем об их типичных применениях
  в сфере обработки естественного языка,
  а потом проведём аналогии,
  касающиеся их использования в задачах обработки речи,
  в задачах компьютерного зрения,
  а так же - в других сферах машинного обучения.
  
  Машинный перевод
  
  В сфере машинного перевода применялись билингвальные адаптеры.
  Они позволяли адаптировать большие многоязычные нейросетевые модели
  к конкретному направлению перевода между двумя языками.
  Этот подход был расширен,
  что привело к появлению более эффективных монолингвальных адаптеров.
  Для обеспечения положительного переноса между языками
  использовались гиперсети.
  Здесь применялись и другие подходы
  - такие, как подсети, ориентированные на конкретный язык
  или на конкретную предметную область.
  Применяются здесь и модели типа <смесь экспертов>.
  
  Межъязыковой перенос
  
  Языковые модели комбинируют с модулями задач
  для того чтобы обеспечить перенос,
  с языка источника на целевой язык, больших моделей,
  подвергшихся тонкой настройке в расчёте на конкретную задачу.
  В рамках этого подхода предложено множество вариантов систем.
  Это, например, обучение адаптеров для языковых пар
  или для семейств языков,
  обучение подсетей, ориентированных на языки и задачи,
  использование гиперсетей для генерирования различных компонентов.
  
  Адаптация к предметной области
  
  Модульные системы,
  представляющие конкретную предметную область,
  обучают, используя адаптеры или подсети.
  Обычно для этого задействуют набор разделяемых модулей
  и модулей предметной области,
  которые обучают совместно,
  используя дополнительную регуляризацию
  или члены, описывающие потери, в параметрах модулей.
  
  Внедрение знаний
  
  Модули, кроме прочего, можно использовать
  для хранения внешних знаний и их внедрения в модели.
  Этот подход можно скомбинировать со знаниями о языке,
  о предметной области или о задаче.
  Тут обычно пользуются такой стратегией:
  обучают модели на синтетических данных,
  созданных на основе информации, имеющейся в базе знаний.
  
  Обработка речи
  
  В сфере машинной обработки речи проводились эксперименты с теми же методами,
  что и в сфере обработки естественного языка.
  Главные отличия заключаются в том,
  что базовая модель, применяемая при обработке речи
  - это обычно разновидность wav2vec,
  и в том, что модульные представления оптимизировались
  с учётом цели нейросетевой темпоральной классификации.
  Модульный подход здесь применяется чаще всего
  в форме обучения адаптеров для автоматического распознавания речи.
  
  Компьютерное зрение и кроссмодальное обучение
  
  В сфере компьютерного зрения наиболее часто применяются модули,
  представляющие собой адаптеры и подсети,
  основанные на моделях ResNet или Vision Transformer.
  В мультимодальном обучении и задачи, и информация о модальности
  захватываются в различных модулях для разных приложений.
  Например, недавно появившаяся модель Flamingo
  использует <замороженные> предварительно обученные зрительную и языковую модели.
  В её рамках обучают новые адаптерные слои для того
  чтобы регулировать языковые представления с помощью визуальных данных,
  поступающих на вход модели.
  
  О дальнейших исследованиях
  
  Дальнейшие исследования сферы модульного глубокого обучения
  включают в себя, кроме прочих, следующие направления:
  
   Комбинирование различных вычислительных функций.
  
   Углубление понимания природы и различий разных модульных представлений.
  
   Интеграция систем обучаемой маршрутизации в предварительно обученные модели.
  
   Измерение эффективности работы различных методов маршрутизации.
  
   Непосредственное создание информации, хранящейся в подсетях.
  
   Разработка обучаемых методов агрегирования.
  
   Создание расширяемых модульных многозадачных моделей.
  
  Итоги
  
  Мы представили систему классификации модульных инструментов глубокого обучения
  по четырём основным измерениям.
  Принимая во внимание тенденцию к предварительному обучению
  всё больших и больших моделей,
  мы считаем, что модульный подход
  будет иметь исключительно важное значение в подобных проектах.
  Он позволит наладить более стабильную разработку моделей
  путём разбиения их на модули.
  Развитие модульного подхода,
  кроме того, приведёт к созданию таких методов работы,
  которые будут направлены на устранение существующих ограничений,
  и таких, которые можно будет использовать
  в различных нейросетевых архитектурах.
  Надо сказать и о том,
  что модульный подход может способствовать сдвигам
  в среде разработчиков моделей.
  Сейчас разработка моделей сконцентрирована
  в небольшом количестве крупных организаций,
  а может случиться так,
  что созданием модульных компонентов
  будет заниматься множество небольших компаний и индивидуальных разработчиков.
  
  //// Ну, посмотрим. Хотя сам текст статьи, в основном, остался непонятным,
  //// но общий вывод о модульном подходе к построению, вроде как воспринял.
  
  .......
  
  //// Из комментариев.
  
  imageman
  6 апр 2023 в 13:41
  
  Попытались охватить как можно больше
  и нормально не описано ничего.
  Слишком общие тезисы, без подробностей, без примеров,
  без детального разбора "на пальцах".
  Рисунки мало помогают.
  
  Возьмем кусок из середины "Иерархическое обучение с подкреплением":
  "полезно обучить модель промежуточным абстракциям",
  "сложности, имеющие отношение к специализации и мониторингу",
  "применение [...] языка в качестве промежуточного пространства".
  Без подробностей, без расшифровки мне это ничего не говорит!
  
  Мне не понравилась статья.
  
  //// В целом, с такой оценкой можно согласиться.
  //// Но, с другой стороны непонимание такого "обобщенного обзора",
  //// проявляет уровень собственного незнания очень многих,
  //// даже не "нюансов", а целых концепций,
  //// чтобы считать, что текущий уровень знаний в машинном обучении,
  //// хоть в каком отношении приемлемым.
  
  ......
  
  //// Конец цитирования.
  
  В общем, можно считать этот практически непонятый текст,
  как список тем, которые нужно хотя бы минимально проработать,
  чтобы, хотя бы, ориентироваться в структуре и особенностях архитектуры
  современных нейросетей, уже существенно переросших простые учебные примеры.
  Ну, и, естественно, как напоминание о том,
  что надо учиться рассматривать архитектуры сложных/практических нейросетей
  как комплекс взаимосвязанных модулей, а не как монолитную структуру.
  
  
  ========
  
  19.06.2024 15:26
  
  Аналоговые решения для дискретных нейросетей.
  В оглавление.
  
  Разработка однобитных нейросетей идет сразу нескольким направлениям,
  это и, упоминавшиеся выше, бинарных "от рождения" нейросети
  и "квантизированные" до предела "рожденные многобитными" нейросети, см.:
  "И снова на "арене цирка" однобитовые LLM."
  
  Пока, конечно, "однобитки" не дотягивают по возможностям
  до своих "многобитных сестричек", но "процесс идет",
  и не за горами, когда их возможности станут сопоставимы,
  и тогда свое слово скажет и энергоэффективность и вычислительная сложность.
  И вот тут-то у однобитных нейронок потенциально явное преимущество,
  особенно если оно будет реализовано способами,
  вообще недоступными для "многобиток",
  например, аналоговыми вычислениями:
  
  "Аналоговые вычисления для искусственного интеллекта:
  как делать MAC-операцию при помощи закона Ома".
  Автор: amartology (Valeriy Shunkov)
  https://habr.com/ru/articles/822775/.
  19 июн 2024 12:59
  
  Материал очень интересный в плане перспектив различных вариантов реализации,
  казалось бы, навсегда ушедшими в небытие аналоговыми способами дискретных операций.
  Но самое важное, что из него можно вынести,
  так это то, что текущее состояние и основные тренды/лидеры в ИИ-технологиях,
  могут оказаться в очень неустойчивом положении.
  Поэтому не считаю нужным этот материал как-то сокращать.
  
  //// Начало цитирования
  
  Присутствие нейронных сетей в нашей жизни становится все более распространенным,
  от голосовых ассистентов до узкоспециальных САПР.
  Несмотря на то, что область применения нейросетей расширяется,
  их потенциал все еще сильно ограничен удручающей энергоэффективностью
  существующих хардверных решений.
  Специализированные AI-чипы выходят в производство, как горячие пирожки,
  а ожидаемый рост энергопотребления нагруженных AI датацентров
  уже скоро позволит им отобрать у атомных электростанций
  звание главного врага всех экоактивистов.
  Разумеется, над решением проблемы энергопотребления AI
  или, будем честны, над решением проблемы энергопотребления
  цифрового умножения
  работает огромное количество исследователей по всему миру,
  на всех возможных уровнях абстракции,
  от математиков-фундаментальщиков до разработчиков передовых литографов.
  
  А дальше, как это регулярно случается, внезапно оказалось,
  что все новое - это хорошо забытое старое,
  и спасение может заключаться в том,
  чтобы откопать давно забытые за бесперспективностью аналоговые вычисления
  и посмотреть на них свежим взглядом в свете новых задач.
  
  Рис. Как вы себе представляете аналоговый вычислитель
  
  Рис. Как аналоговый AI-вычислитель выглядит на самом деле.
  На картинке - аналоговый чип для решения
  некоторых простых задач распознавания изображений.
  
  - Нейронные сети "программируются" при помощи
  варьирования "весов" соединений между нейронами (синапсов).
  Сигнал, подаваемый на вход системы, проходя через синапс,
  умножается на его "вес".
  Как правило, к одному нейрону подходят несколько синапсов,
  значения их выходов суммируются,
  и к сумме применяется некоторая нелинейная функция активации.
  Таким образом, подавляющее большинство вычислительных операций нейронной сети
  сводится к умножению с накоплением (MAC).
  Эффективность выполнения MAC-операции является
  одним из критичных параметров
  для определения производительности нейронных процессоров.
  
  Рис. Структурная диаграмма нейрона, выполняющего умножение с накоплением и активацию
  
  Фундаментально нейронные сети, как и многие другие виды вычислений,
  могут быть реализованы как на цифровых, так и на аналоговых платформах,
  но на практике цифровые вычисления уже много десятилетий доминируют,
  фактически сделав само слово "аналоговый" синонимом
  чего-то древнего и дремучего.
  Не в последнюю очередь - потому,
  что КМОП-технология очень хорошо приспособлена для реализации цифровых схем,
  а практически неукоснительное выполнение закона Мура
  на протяжении многих десятилетий сделало ее практически
  монопольной микроэлектронной технологией.
  Поэтому практически что угодно делается на КМОП:
  процессоры, память, драйверы электродвигателей,
  микросхемы стеклоподъемников, матрицы фотоаппаратов
  - список такой длинный, что проще перечислить исключения,
  требующие каких-то выдающихся параметров
  и одновременно не требующие высокой степени интеграции.
  А там, где уже есть КМОП,
  все рано или поздно переходит в цифровой вид,
  будь то управление обратной связью DC/DC-преобразователя,
  Software-Defined Radio или цифровой микрофон
  - практически всегда выгоднее всего поставлять
  на любой источник аналогового сигнала АЦП,
  к любому актюатору - драйвер,
  а между ними все делать в цифровом виде.
  
  Нейросетки, казалось бы, идеально подходят как пример задачи,
  которую удобно решать в цифровом виде
  - они огромные, вычислительно сложные
  и очень сильно выигрывают от миниатюризации
  и повышения энергоэффективности "железа" выполняющего вычисления.
  Проблема состоит в том, что цифровое умножение,
  являющееся ключевой операцией в машинном обучении,
  крайне ресурсозатратно.
  Простой 4-битный КМОП-умножитель требует несколько сотен транзисторов.
  8-битная схема требует несколько тысяч.
  Про то, что для работы с floating point необходимо делать FPU,
  полагаю, не стоит даже и начинать.
  
  Рис. Структурная схема цифрового умножителя 4х4 бита.
  Каждый блок HA (half adder) - это 12-20 транзисторов,
  каждый блок FA (full adder) - 25-40 транзисторов.
  
  При этом, даже при небольшой точности,
  "стоимость" умножения усугубляется необходимостью обработки
  больших объемов данных - входных данных и весов.
  В современных сложных цифровых системах быстродействие и энергопотребление
  повсеместно определяются не самыми вычислительными блоками, а передачей данных
  - так называемым "фон Неймановскими бутылочным горлышком".
  Веса, будучи статическими значениями (по крайней мере, во время инференса),
  тем не менее, требуют удобного доступа,
  то есть или очень быстрой шины, или локального хранения памяти
  рядом с вычислительным блоком.
  Такой подход наиболее эффективен в случае,
  если у нас не один большой вычислительный блок (скажем, ядро микропроцессора),
  а много маленьких, каждый со своим собственным хранилищем весов.
  К сожалению, этот подход плохо работает в случае сложных ветвящихся алгоритмов,
  являющихся типовой нагрузкой CPU,
  и именно поэтому современные процессоры в большинстве своем
  - это RISC-машины с относительно скромным количеством ядер,
  а не какие-нибудь VLIW или "тысячекоры".
  Но существует также и широкий класс задач,
  где ветвлений или совсем нет, или очень мало,
  а данных много, и их можно обрабатывать параллельно.
  Например, к этим задачам относится обработка изображений и нейросети.
  Именно поэтому многие GPU и TPU построены на принципе
  множества небольших вычислительных ядер с хардверными умножителями и локальной памятью,
  и именно в силу схожести этих задач выполнять нейросетевые вычисления на GPU
  радикально эффективнее, чем на CPU.
  Такого рода системы в контексте AI сейчас называют "near-memory compute",
  потому что память весов располагается намного ближе
  (и физически, и архитектурно) к вычислительным элементам.
  
  Это, впрочем, никак не решает проблему того,
  что цифровое умножение крайне накладно,
  и чем больше его надо делать, тем хуже становится ситуация.
  Огромное количество научных и прикладных работ посвящены тому,
  как уменьшить разрядность весов и данных в нейросетях
  без существенной потери точности инференса.
  Про floating point уже никто толком даже не упоминает,
  в ход идут int8, int4 или даже "полтора бита"
  (множество весов, состоящее из -1, 0, +1).
  Ограниченно-точные сети могут быть полезны не только для огромных LLM,
  но и для разного рода небольших приложений,
  вроде умных сенсоров, промышленного интернета вещей и других мест,
  где можно существенно улучшить энергопотребление, надежность и безопасность
  за счет локальной обработки чувствительных сырых данных
  без отправки их на мощные облачные серверы.
  Действительно же, самый лучший способ защитить свои данные
  - просто не отправлять их в облако.
  
  Но даже малоразрядные цифровые умножители
  - это огромное количество транзисторов и на сам умножитель, и на память,
  ведь даже простая статическая ячейка кэш-памяти
  - это целых шесть транзисторов.
  Можно ли как-то перевернуть игру?
  Теоретически - да, но для этого придется преодолеть скепсис
  и вернуться к давно забытому старому.
  
  Аналоговый подход к вычислениям считался устаревшим на протяжении десятилетий,
  и на то были и есть причины.
  В аналоговых системах существует множество физических и технологических ограничений.
  Снижение точности и повторяемости результатов вычисления
  из-за разного рода неидеальностей было одной из причин
  быстрого роста цифровых технологий и повсеместного отказа от аналога.
  Да и о какой повторяемости результатов можно говорить,
  если пороговое напряжение типичного МОП-транзистора может изменяться в пару раз
  просто из-за изменения температур чипа?
  На практике в аналоговых вычислительных системах сложно достичь точности,
  соответствующей более чем четырем цифровым битам (здесь имеется в виду ENOB),
  а достижение точности выше 8 бит обычно требует
  радикального усложнения схемотехники и каких-то совсем нетривиальных решений.
  
  Но ведь точность и в восемь, и даже в четыре бита
  вполне может быть достаточной именно для нейросетей,
  так?
  И в этой ситуации аналоговые решения могут предложить то,
  чего нет у цифры - компактность.
  Однако аналоговые реализации могут быть очень привлекательными
  в случаях, когда удовлетворительна точность около 8 бит
  из-за их простоты и энергоэффективности,
  и поэтому разработчики микросхем снова рассматривают аналоговые решения.
  Так как может работать аналоговая MAC?
  
  Ее можно реализовать с помощью ... закона Ома.
  Он гласит, что ток равен напряжению, деленному на сопротивление
  - или напряжению, умноженному на проводимость резистора.
  При этом несколько токов можно суммировать,
  просто подключив весовые резисторы параллельно друг к другу.
  Итого, для выполнения одного умножения нам нужен один (!) резистор,
  точность номинала которого и соответствует точности веса в нейросетке
  - и еще один резистор для того,
  чтобы получить выходное напряжение из суммы токов.
  Такой резистор нужен один на целый нейрон
  (в котором могут быть десятки и сотни весов),
  так что им для простоты сравнений можно пренебречь.
  
  Но где найти резистор в КМОП-технологии,
  да еще желательно программируемый?
  Традиционные поликремниевые или диффузионные резисторы,
  используемые в аналоговой схемотехнике, вряд ли подойдут:
  слишком громоздкие.
  Собственно, единственный тип компактных элементов в КМОП-технологии
  - это транзисторы.
  Тут будет кстати вспомнить,
  что слово "транзистор" является сокращением слова "transresistance",
  то есть собственно "переходное сопротивление".
  То, что нужно, не правда ли?
  Осталось только придумать, как управлять сопротивлением этого транзистора,
  не используя для этого очень много других транзисторов.
  
  Решением этой задачи является NOR flash память.
  В обычной "цифровой" флэш-памяти у запоминающего транзистора есть два состояния
  - "открыт" и "закрыт",
  регулируемых наличием или отсутствием заряда на плавающем затворе.
  Но на плавающий затвор можно закладывать заряд по чуть-чуть,
  плавно регулируя проводимость транзистора.
  Эта регулировка нелинейная,
  что затрудняет процесс и снижает точность,
  но, тем не менее, на ячейке флэш-памяти вполне реально добиться
  шестнадцати хорошо различимых величин проводимости,
  то есть эффективной разрядности в четыре бита.
  И под "вполне реально" я имеют в виду
  "можно пойти и купить соответствующий IP-блок
  для ряда популярных техпроцессов нескольких крупных фабрик".
  
  Рис. Структурная схема вычислительного блока in-memory computing
  на основе популярной в индустрии ячейки NOR Flash ESF3.
  Модуль можно купить для многих техпроцессов
  TSMC, Globlafoundries, UMC, Samsung и некоторых других фабрик.
  
  Массив флэш-памяти позволяет использовать строки как входы для данных,
  а столбцы - как входы нейронов,
  на которых суммируются токи с резисторов.
  Массив X на Y ячеек позволяет реализовать
  один слой нейросети из X нейронов с Y синапсами у каждого нейрона.
  На рисунке ниже показан пример такого соединения эквивалентных сопротивлений
  (еще показаны некоторые паразитные элементы).
  Каждый выходной ток Ii является взвешенной суммой напряжений V1-Vn,
  а проводимости элементов Gij - веса нейросети.
  
  Рис. Принципиальная структура массива памяти,
  используемая для создания "вычислений в памяти"
  
  MAC-операция в такой конструкции, как нетрудно заметить,
  вычисляется непосредственно внутри массива памяти,
  и такого рода схемы так и называют - "in-memory computing",
  и рассматривают как следующий логичный шаг
  после перехода от фон Неймановских архитектур с разделением памяти и вычислений
  к near-memory, характерным для GPU.
  
  Рис. А вот примерно так распознавание изображений
  с помощью аналогового in-memory computing выглядит на практике.
  На это диаграмме в качестве запоминающих элементов показаны мемристоры.
  
  Подход in-memory computing может быть реализован многими разными способами
  (об этом чуть позже),
  но вариант со флэш-памятью - самый инженерно проработанный.
  Он имеет два недостатка.
  Ячейки флэш-памяти, хоть и состоят из одного транзистора,
  по меркам современных цифровых техпроцессов довольно громоздки,
  и, вообще говоря, практически не скейлятся ниже 45 нм.
  Кроме того, любой массив памяти содержит соединения типа "все со всеми",
  но далеко не каждая нейронная сеть нуждается
  в таком количестве синапсов.
  Более того, очень большая часть нейросетей
  - это так называемые "разреженные" (sparse) сети.
  В них большая часть ячеек памяти не будет использоваться
  и дефицитная площадь чипа не будет потрачена эффективно.
  Разумеется, можно и нужно оптимизировать архитектуры нейросетей
  для того, чтобы уменьшить разреженность
  и увеличить процент эффективного использования массива.
  Но даже в такой ситуации половина площади, а то и больше,
  будет потрачена впустую.
  
  Хороший пример реализации такого подхода - чипы компании Mythic AI.
  Их M1076 включает 76 вычислительных блоков,
  каждый из которых содержит массив 1024х1024 ячеек памяти
  и RISC-V ядро для управления и конфигурации.
  Чип может вместить до 80 миллионов int8 или int4 весов
  и, по заверению разработчиков,
  потребляет всего 3-4 Вт в активном режиме.
  Заявленная энергоэффективность - 0.3-0.5 пДж/MAC,
  что в 3-4 раза лучше, чем у NVIDIA
  (при том, что чип Mythic произведен на дешевом 40 нм техпроцессе).
  
  Рис. Блок-схема аналогового нейропроцессора компании Mythic AI
  
  Разумеется, такая конструкция на таких проектных нормах
  получается совершенно монструозного размера,
  поэтому одной из ключевых задач ученых,
  вовлеченных в касающиеся AI технологические исследования,
  является разработка компактных ячеек энергонезависимой памяти
  - более компактных, чем NOR flash
  и, в идеале, не содержащих транзисторов,
  а выполненных в верхних слоях металлизации,
  чтобы схемы доступа управления можно было разместить под памятью.
  
  Вариантов здесь очень много - MRAM, FRAM, PCM, ReRAM, мемристоры -
  и для каждого вида есть множество перспективных вариантов.
  Или уже не очень перспективных,
  как случилось с не оправдавшей ожиданий Intel и Micron памятью 3D Xpoint.
  
  Рис. Дерево технологий emerging NVM
  
  Несмотря на множество сложностей,
  так называемые emerging NVM активно развиваются,
  и MRAM уже есть в серийном предложении нескольких фабрик
  и скажем, в новейших моделях микроконтроллеров STM32.
  Однако, с точки зрения аналоговой реализации MAC-операции,
  все несколько более печально,
  потому что большинство новых разработок в сфере NVM работает бинарно,
  что вполне достаточно для конфигурационной памяти микроконтроллера,
  но не подходит для многобитного аналогового веса.
  Впрочем, некоторый прогресс есть и тут:
  недавно многобитные мемристоры представила японская корпорация TDK,
  а американский стартап TetraMem вообще обещает точность 11 бит на элемент,
  достигаемую с помощью хитрой двухступенчатой процедуры записи.
  
  Забавная особенность решительно всех видов emerging NVM
  - то, что состояния запоминающего элемента различаются сопротивлением.
  С одной стороны, это логично,
  ведь резистор - это один из фундаментальных линейных пассивных компонентов.
  Но ведь "один из", а не единственный!
  
  Рис. Фундаментальные линейные пассивные элементы и связывающие их уравнения
  
  На рисунке выше показаны все четыре фундаментальных линейных пассивных компонента
  - резистор, конденсатор, индуктивность и мемристор,
  а также уравнения, которыми эти элементы связывают разные физические величины.
  Нетрудно видеть, что рисунок очень симметричный,
  и если MAC-операцию можно реализовать при помощи резистора,
  то и с остальными компонентами это может быть возможно,
  так?
  Да, так,
  но, как это обычно бывает, кроме красивой теории,
  есть некоторые технологические нюансы.
  
  Уравнение работы резистора - I = V / R, или, точнее, dI = dV / R.
  
  Аналогичное уравнение для конденсатора - Q = T * I, или dQ = C * dV.
  
  Если мы хотим получить в качестве выходного сигнала напряжение на конденсаторе,
  мы уравнение преобразуется в dV = d(I * T) / C.
  Принципиальная разница между резистором и конденсатором
  здесь заключается в том, что в уравнении для конденсатора участвуют не три,
  а четыре величины.
  Это означает, что у проектировщика схемы есть больше гибкости,
  но и сложностей тоже больше.
  
  Существует много разных вариантов запоминающего элемента на основе конденсатора.
  Выходной величиной удобнее всего иметь напряжение или заряд,
  а вот входом может быть либо ток, либо время,
  и тогда вес будет произвольной комбинацией двух оставшихся параметров.
  Например, схема может получать выходное напряжение,
  заряжая фиксированный конденсатор в течение фиксированного времени
  с помощью тока, определенного весом.
  Альтернативно, выходное напряжение может быть получено
  при зарядке конденсатора, номинал которого является весом,
  в течение фиксированного времени,
  а входным сигналом будет ток зарядки.
  
  Рис. Реализация MAC-операции с весом, задаваемым временем зарядки конденсатора
  
  На рисунке выше показана схема, где конденсатор фиксирован,
  а вес определяется временем зарядки.
  С одной стороны, MAC-операция в такой схеме проводится на одном конденсаторе.
  С другой стороны, схема точного задания временного интервала
  - это громоздкий таймер, работающий на большой частоте,
  требующий наличия на чипе PLL.
  Кроме того, вся конструкция вполне может быть серьезно зависима от PVT
  (изменений в параметрах элементов, температуры и питания чипа).
  Выглядит, к сожалению, и громоздко, и не очень энергоэффективно.
  
  Можно попробовать перейти в область работы с зарядами вместо напряжений,
  как это часто делается в популярных у аналоговых дизайнеров схемах
  на переключаемых конденсаторах.
  В этом случае основное уравнение будет Q = C * V,
  а суммирование заряда получится относительно простым.
  
  Рис. Реализация MAC-операции с помощью ЦАП
  
  На рисунке выше для реализации веса нейросети используется ЦАП
  (цифро-аналоговый преобразователь) с емкостной матрицей.
  Значение емкости определяется цифровым кодом,
  что является наиболее подходящим способом программирования конденсатора.
  Обычно у ЦАП фиксированное опорное напряжение,
  и он генерирует выходной сигнал в соответствии с цифровым входом.
  Здесь же цифровой вход трактуется как вес,
  а вместо опорного напряжения мы подаем входное,
  умножая его на заданный конденсатором вес.
  Такой подход исключает точное время и высокие частоты,
  делая выходной сигнал стабильным и точным.
  Однако даже очень простой ЦАП представляет собой сложную и крупную схему,
  площадью в сотни, если не тысячи квадратных микрон.
  Решением этой проблемы мог бы быть компактный переменный конденсатор
  (memcapacitor).
  Научные работы в этом направлении активно ведутся в последние годы,
  но пока что далеки от промышленного внедрения
  и находятся в среднем на более ранних стадиях,
  чем аналогичные работы по мемристорам.
  
  К вопросу о собственно мемристорах
  - их тоже можно использовать,
  и тоже несколькими разными способами.
  Мемристор был теоретически предсказан намного позже,
  чем получили распространение другие полупроводниковые приборы,
  а надежные реализации и вовсе появились совсем недавно.
  Основное уравнение мемристора связывает электрический заряд,
  протекший через мемристор, с суммарным магнитным потоком.
  Номинал мемристора - мемсопротивление - имеет размерность Вебер/Кулон,
  которые после сокращения дают... Ом.
  То есть, мемристор, будучи фундаментально другим элементом,
  может вести себя, как резистор,
  сопротивление которого зависит от протекшего через него заряда.
  Отсуда, собственно, и название - "резистор с памятью",
  и основное применение, которое заключается в том,
  что мемристоры используют к программируемые резисторы.
  Если рабочий ток намного меньше тока перезаписи,
  то влиянием рабочего тока на сопротивление можно пренебречь
  на значительных промежутках времени,
  и мемристор будет действительно вести себя
  как программируемый сильными токовыми импульсами резистор,
  очень похоже на многие другие типы emerging NVM.
  
  Рис. Пример компактной реализации мемристора в форм-факторе перемычки
  между двумя слоями металических межсоединений
  
  Основная причина, по которой мемристорам уделяется так много внимания
  - их потенциальная компактность.
  Существует уже много разных реализаций мемристора
  в виде многослойного вертикального бутерброда из разных материалов.
  Такая реализация не тратит драгоценную транзисторную площадь
  и теоретически может иметь размер в буквально несколько сотен квадратных нанометров.
  То же самое, впрочем, верно и для MRAM и ReRAM.
  
  Последний из четырех базовых линейных элементов - индуктивность.
  С ней все так сложно и технологически, и фундаментально,
  что катушки никто серьезно не рассматривает для микросхем
  с большой степенью интеграции.
  Во-первых, индуктивность в принципе требует высокой частоты для того,
  чтобы нормально работать,
  и поэтому не может применяться в малопотребляющих схемах.
  Во-вторых, чем меньше геометрические размеры катушки,
  чем выше необходимая частота.
  Ну и самое главное - характерные размеры катушек индуктивности
  в принципе на пару порядков больше,
  чем то, что можно серьезно рассматривать.
  Если вы когда-нибудь видели кристалл любого радиочастотного чипа,
  то вы точно видели там катушки на полкристалла.
  
  Рис. Радиочастотный чип VCO.
  Размеры катушек индуктивности говорят сами за себя
  
  Заключение
  
  Мы рассмотрели различные теоретические
  и практические варианты реализации операции умножения-накопления
  в аналоговой форме
  на основе разных полупроводниковых приборов.
  Это направление разработки "железа" для AI находится в весьма зачаточной стадии,
  особенно если сравнивать с хорошо проработанными цифровыми реализациями
  - не только на видеокартах,
  сейчас уже даже в микроконтроллерах начали появляться
  небольшие встроенные нейроускорители.
  
  Вероятнее всего, аналоговые реализации AI,
  даже если "выстрелят",
  так или иначе останутся нишевыми решениями
  - в силу принципиально ограниченной на уровне 4-8 бит точности,
  сложных производственных технологий и многих других объективных причин.
  Но в условиях, когда AI применяется приблизительно везде,
  даже "отдельные ниши" вполне могут быть многомиллиардными рынками,
  особенно если мы говорим про обработку изображений
  или копеечные, но исключительно многотиражные умные сенсоры для интернета вещей.
  
  Кроме того, технический и технологический прогресс не стоят на месте,
  так что элементная база для подобных вычислений стремительно улучшается,
  а число стартапов, пытающихся в отдельных нишах коммерциализировать
  уже существующие наработки,
  прямо сегодня исчисляется десятками, если даже не сотнями.
  Наибольшие успехи сейчас у in-memory computing на базе флэш-памяти,
  и у разного рода нишевых решений,
  в основном касающихся умных сенсоров
  и производимых на довольно старых по цифровым меркам проектных нормах
  - 90-65-40 нм,
  где сходятся между собой низкая стоимость и высокая энергоэффективность.
  
  .........
  
  //// Из комментариев.
  
  aamonster
  28 минут назад
  
  Почему floating-point?
  Если у вас используются числа малой разрядности - хватает fixed-point,
  а то и вообще LUT.
  
  У цифровых решений есть одно критическое преимущество: воспроизводимость.
  Когда вы построите нейронную сеть на аналоговых компонентах,
  и окажется, что маленькие отклонения в одном месте приводят
  к большим изменениям в результате - вы умрёте это отлаживать.
  
  Использование транзистора (а без него вы вряд ли обойдётесь)
  в режиме ключа значительно "дешевле" энергетически, чем в линейном.
  Если для реализации понадобится линейный режим
  - получим повышенное энергопотребление.
  
  Но подход имеет право на жизнь, хотя и потребует кучу теоретической работы
  (ключевые слова: устойчивость, жесткие системы дифференциальных уравнений).
  
  amartology
  21 минуту назад
  
  Так я говорю в тексте, что от floating point в цифре отказываются
  в пользу малых разрядностей, вплоть до 1.5 бит
  
  "построите нейронную сеть на аналоговых компонентах,
  и окажется, что маленькие отклонения в одном месте
  приводят к большим изменениям в результате"
  - это будет означать, что ваша сетка плохо обучена,
  и ее надо дообучить, чтобы такого не происходило.
  Эта возможность, собственно, делает именно нейросетки
  радикально привлекательнее, чем любые другие вычисления,
  которые теоретически можно проводить аналоговым образом.
  
  Во-первых, примерно вся статья - о том,
  что для MAC-операции не нужен транзистор.
  Во-вторых, вы не правы, потому что мы сравниваем
  не один транзистор и один транзистор,
  а сотни ключей против одного транзистора в линейном режиме.
  Да и в линейном ли?
  Транзисторы дступа в память - это ключи)
  
  .......
  
  gleb_l
  17 минут назад
  
  В принципе, аналоговая схемотехника действительно хорошо подходит
  для реализации искусственных нейронов.
  Высокая точность вывода здесь не нужна,
  большой динамический диапазон - тоже
  (на выходе все равно компрессор).
  Нормировать диапазон входных сигналов можно стандартными АЦП.
  
  Тепловой шум будет играть скорее положительную роль
  - как естественный фактор отстройки от переобучения,
  а непрерывность передаточной функции нейрона и ее производной
  (внутри - никакой дискретности!),
  могут сделать процесс обучения многослойных сетей более качественным.
  
  amartology
  10 минут назад
  
  Про функцию активации, кстати, все не так однозначно)
  В аналоговом виде удобно делать только RelU
  (и еще крайне неудобно делать обратные связи,
  то есть все LSTM и GRU сходу идут лесом).
  Поэтому типовой подход прямо сейчас
  - подавать входные сигналы на слой с ЦАП,
  получать результаты MAC,
  цифровать взвешенные суммы
  и делать активацию в цифровом виде.
  
  Аналоговые активации и отказ от громоздких и прожорливых ЦАП и АЦП
  - это то, чего всем очень хочется,
  но пока что не очень получается.
  Скажем, на упомянутом в статье чипе Mythic стоят десятки тысяч ЦАП и АЦП.
  
  ........
  
  //// Конец цитирования.
  
  Из этого обзора можно сделать, как минимум, два вывода.
  Во-первых, чем меньше внутренняя разрядность нейросети,
  в пределе однобитовая, тем выше вероятность появления совершенно неожиданных
  и потенциально очень высокоэффективных аппаратных ускорителей для этих архитектур.
  Во-вторых, ключевой проблемой для таких нейросетей станет устойчивость работы,
  а это ставит немного иные требования к разработке и методов обучения,
  и новых архитектур, возможно, вообще не использующих операции умножения,
  например, за счет "логарифмоподобной арифметики".
  Какие-то работы в этом направлении ведутся,
  пока, правда, "с оглядкой" на привычные архитектуры,
  но "вода камень точит", например, см.:
  
  "Российские ученые нашли способ,
  как превзойти тензорный процессор от Google".
  Автор: SmartEngines
  https://habr.com/ru/companies/smartengines/news/822691/.
  18 июн 2024 в 15:06
  
  \\\ BM сети (Bipolar Morphological Networks) - новая парадигма,
  \\\ в которой ученые исключили умножения из вычислений внутри нейрона,
  \\\ заменив их сложениями и взятием максимума.
  \\\ Благодаря этому нейроны станут вычислительно-проще,
  \\\ так как для аппаратной реализации операции умножения
  \\\ требуется больше транзисторов,
  \\\ чем для реализации сложения или взятия максимума,
  \\\ то есть работает такое устройство значительно медленнее.
  
  \\\ Ученые Smart Engines разработали специальные методы обучения BM сетей
  \\\ на основе итеративной послойной конвертации и дистилляции знаний.
  \\\ Они позволили добиться высокого качества распознавания
  \\\ при решении прикладных задач компьютерного зрения
  \\\ - для поиска объектов и распознавания текста.
  
  ......
  
  \\\ Для слоя нейронной сети ln и exp делаются
  \\\ для входного и выходного векторов данных соответственно,
  \\\ а это существенно меньшее число операций,
  \\\ чем число умножений внутри, например, сверточного слоя.
  
  Так что эпоха однобитовых нейронных сетей это еще не прямо уж "завтра",
  но со временем, наверняка, "взойдет на небосклоне".
  
  
  ========
  
  06.07.2024 14:39
  
  Возвращение троичной логики?
  В оглавление.
  
  Одним из направлений снижения энергопотребления нейросетей,
  которое активно разрабатывается - это попытка уменьшить количество
  матричных умножений в используемых алгоритмах.
  При этом используется и уменьшение разрядности параметров нейросети,
  более продуманные алгоритмы и да же возврат к идеям "трехзначной арифметики",
  казалось бы давным-давно "списанной в утиль"
  вместе монстром/шедевром советской эпохи - ЭВМ "Сетунь":
  
  "Новая высокопроизводительная нейросеть потребляет всего 13 Вт энергии,
  что сопоставимо с питанием электрической лампочки
  - благодаря новым алгоритмам".
  Автор: Topmember
  https://aftershock.news/?q=node/1394727
  30/Июн/24 03:00
  
  //// Начало цитирования
  
  Устраняя самый дорогостоящий с точки зрения вычислений элемент
  большой языковой модели,
  инженеры значительно повышают энергоэффективность
  при сохранении производительности, сообщает news.ucsc.edu
  https://news.ucsc.edu/2024/06/matmul-free-llm.html
  
  Доказано, что большие языковые модели, такие как ChaptGPT,
  способны выдавать удивительно интеллектуальные результаты,
  но энергетические и денежные затраты,
  связанные с запуском этих масштабных алгоритмов, заоблачно высоки.
  По последним оценкам, запуск ChatGPT 3.5 обходится в 700 000 долларов в день
  в виде затрат на электроэнергию и оставляет после себя огромный углеродный след.
  
  В новом препринте исследователи из Калифорнийского университета в Санта-Крус
  https://arxiv.org/abs/2406.02528
  показывают, что можно исключить самый дорогостоящий с точки зрения вычислений
  элемент запуска моделей большого языка, называемый матричным умножением,
  при сохранении производительности.
  
  Избавившись от матричного умножения и запустив свой алгоритм
  на специализированном оборудовании,
  исследователи обнаружили, что они могут обеспечить работу языковой модели
  с миллиардом параметров всего на 13 ваттах,
  что примерно равно энергии, потребляемой лампочкой
  и более чем в 50 раз эффективнее, чем [это делает] обычное оборудование.
  
  Даже при упрощенном алгоритме и гораздо меньшем потреблении энергии
  новая модель с открытым исходным кодом достигает той же производительности,
  что и современные модели, такие как Meta Llama.
  
  <Мы получили ту же производительность при гораздо меньших затратах
  - все, что нам пришлось сделать,
   это в корне изменить принцип работы нейронных сетей>,
  - говорит Джейсон Эшрагиан, доцент кафедры электротехники
  и вычислительной техники в Школе инженерии Баскина
  и ведущий автор статьи.
  <Затем мы сделали еще один шаг вперед и создали специальное оборудование>.
  
  Понимание стоимости
  
  До сих пор все современные нейронные сети - алгоритмы,
  на основе которых строятся большие языковые модели,
  - использовали технику, называемую матричным умножением.
  
  В больших языковых моделях слова представляются в виде чисел,
  которые затем организуются в матрицы.
  Матрицы умножаются друг на друга для создания языка,
  выполняя операции, которые взвешивают важность определённых слов
  или выделяют связи между словами в предложении или предложениями в абзаце.
  Языковые модели более крупного масштаба содержат триллионы таких чисел.
  
  "Нейронные сети, в некотором смысле,
  являются прославленными машинами для умножения матриц",
  - сказал Эшрагиан.
  "Чем больше ваша матрица, тем большему количеству вещей
  может научиться ваша нейронная сеть".
  
  Чтобы алгоритмы могли перемножать матрицы,
  матрицы необходимо где-то хранить, а затем извлекать,
  когда придет время вычисления.
  
  Это решается путем хранения матриц на сотнях
  физически разделенных графических процессоров (GPU),
  которые представляют собой специализированные схемы,
  предназначенные для быстрого выполнения вычислений
  на очень больших наборах данных,
  разработанные такими аппаратными гигантами, как Nvidia.
  
  Чтобы умножить числа из матриц на разных графических процессорах,
  данные необходимо перемещать
  - процесс, который создает большую часть затрат нейронной сети
  с точки зрения времени и энергии.
  
  Отказ от матричного умножения
  
  Исследователи разработали стратегию, позволяющую избежать
  использования матричного умножения,
  используя два основных метода.
  Первый - это метод, позволяющий заставить все числа внутри матриц
  быть троичными,
  что означает, что они могут принимать одно из трех значений:
  отрицательное, нулевое или положительное.
  Это позволяет свести вычисления к суммированию чисел, а не к умножению.
  
  С точки зрения информатики эти два алгоритма
  можно закодировать совершенно одинаково,
  но метод команды Эшрагяна позволяет избежать массы затрат на аппаратную часть.
  
  <С точки зрения разработчика схем, вам не нужны расходы на умножение,
  которые влекут за собой целую кучу затрат>,
  - говорит Эшрагян.
  
  Вдохновением для этой стратегии послужила работа компании Microsoft,
  \\\ https://arxiv.org/abs/2402.17764
  которая показала возможность использования троичных чисел в нейронных сетях,
  но не зашла так далеко, чтобы избавиться от умножения матриц
  или выложить свою модель на всеобщее обозрение.
  Для этого исследователи изменили стратегию взаимодействия матриц друг с другом.
  
  Вместо того чтобы умножать каждое число в одной матрице
  на каждое число в другой матрице, как это обычно бывает,
  исследователи разработали стратегию,
  позволяющую получить те же математические результаты.
  При таком подходе матрицы накладываются друг на друга,
  и выполняются только самые важные операции.
  
  <По сравнению с умножением матриц это довольно легкая операция>,
  - говорит Руй-Цзе Чжу, первый автор статьи и аспирант в группе Эшрагяна.
  <Мы заменили дорогостоящую операцию более дешевой>.
  
  Несмотря на сокращение количества операций,
  исследователи смогли сохранить производительность нейронной сети,
  внедрив в процесс обучения модели вычисления, основанные на времени.
  
  Это позволяет сети сохранять в "памяти" важную информацию,
  которую она обрабатывает, повышая производительность.
  Этот метод оправдал себя - исследователи сравнили свою модель
  с ультрасовременным алгоритмом Meta под названием Llama
  и смогли достичь той же производительности
  даже в масштабе миллиардов параметров модели.
  
  Индивидуальные/пользовательские чипы
  
  Исследователи разработали свою нейронную сеть для работы на графических процессорах,
  поскольку они стали повсеместно использоваться в индустрии ИИ,
  что позволило сделать программное обеспечение команды легкодоступным
  и полезным для всех, кто захочет его использовать.
  
  На стандартных графических процессорах нейронная сеть потребляла
  в 10 раз меньше памяти и работала на 25 % быстрее, чем другие модели.
  Сокращение объема памяти, необходимого для запуска мощной языковой модели
  большого объема, могло бы проложить путь к тому,
  чтобы алгоритмы работали на полную мощность на устройствах
  с меньшим объемом памяти, таких как смартфоны.
  
  Nvidia, ведущий мировой производитель графических процессоров,
  разрабатывает свое оборудование таким образом,
  чтобы оно было максимально оптимизировано для выполнения матричного умножения,
  что позволило ему доминировать в отрасли и сделать ее одной
  из самых прибыльных компаний в мире.
  Однако это оборудование не полностью оптимизировано для троичных операций.
  
  Чтобы добиться еще большей экономии энергии,
  команда в сотрудничестве с доцентом Дастином Ричмондом
  и преподавателем Итаном Сифферманом с факультета компьютерных наук и инженерии
  Baskin Engineering создала специальное оборудование.
  
  В течение трех недель команда создала прототип
  своего аппаратного обеспечения на схеме с широкими возможностями настройки,
  называемой программируемой вентильной матрицей (FPGA).
  Это оборудование позволяет им в полной мере использовать
  все функции энергосбережения,
  которые они запрограммировали в нейронной сети.
  
  Благодаря этому аппаратному обеспечению модель
  превосходит человекочитаемую производительность,
  то есть выдает слова быстрее, чем читает человек,
  потребляя всего 13 ватт энергии.
  
  Использование графических процессоров потребовало бы около 700 Вт энергии,
  а это означает, что специальное оборудование достигло
  более чем в 50 раз большей эффективности, чем графические процессоры.
  
  Исследователи считают, что при дальнейшей разработке
  они смогут еще больше оптимизировать технологию
  для повышения энергоэффективности.
  
  <Эти цифры уже очень солидные, но их очень легко сделать гораздо лучше>,
  - говорит Эшрагян.
  <Если нам удастся уложиться в 13 ватт,
  только представьте, что мы сможем сделать с вычислительной мощностью
  целого центра обработки данных.
  У нас есть все эти ресурсы, но давайте использовать их эффективно>.
  
  Источник перевода: newsstreet.ru
  http://newsstreet.ru/blog/technology/34189.html
  
  ........
  
  //// Из комментариев.
  
  Doc_Mike Канада 04:10-30/Июн/24
  
  На аппаратном уровне реинкарнация Сетуни.
  
  Вот только не очень понятна семантика.
  Если вместо умножения нуля на единицу сложить "-1" и "+1" будет тот же ноль.
  Но если к ненулевому значению прибавить ноль, то это не то же самое,
  что умножение на ноль - на выходе будет ненулевое значение вместо нуля.
  
  ....
  
  Сама по себе троичная логика нормально работает,
  но вот когда на неё нахлобучить сложение вместо умножения,
  то это уже как бы не шизофрения.
  
  Там, где умножение выдает "0",
  что можно интерпретировать как ХЗ (нет данных) четыре раза,
  то сложение выдает "0" только три раза,
  что увеличивает количество значимых ответов там, на самом деле ХЗ.
  
  И сложение прописывает ХЗ на место двух отрицательных ответов,
  которые выдаёт умножение.
  
  Так что как бы не оказалось,
  что ребята из Микрософта не зря не стали заменять умножение на сложение.
  
  В общем, из текста не очевидно, что они делают, и за счёт чего экономия.
  Может, вообще пропускают операции над ячейками, содержащими ноль?
  Но, опять же, что с семантикой?
  
  Topmember Россия 04:38-30/Июн/24
  
  Подробности должны быть тут: https://arxiv.org/abs/2406.02528
  
  .........
  
  //// Конец цитирования.
  
  В общем интересно будет понаблюдать за этой "реинкарнацией" троичной логики.
  Но, похоже, в контексте именно нейросетей имеет смысл
  в троичной логике все-таки явно не хватает состояния "неизвестно".
  Во всяком случае, в моей практике это "неизвестное состояние",
  часто оказывается весьма информативным.
  Так что может быть практическая логика она скорее не трехзначная,
  а именно четырехзначная: "да", "нет", "ошибка"/"противоречие", "неизвестно".
  Причем, "ошибка"/"противоречие" и "неизвестно" обрабатываются отдельными алгоритмами,
  так как в критически важных случаях именно это отличие и имеет значение.
  
  Так что, возможно, стоит уже подумать, и об "однозначной" логике,
  т.е. такой, в которой есть только "присутствие подтверждения"
  и "отсутствие информации".
  Причем, такой подход куда ближе к "биологическим" нейронным сетям,
  чем любая другая "значность".
  Но это только в планах на будущее.
  А пока продолжаем с интересом наблюдать за "извивами" ИИ-архитектур.
  
  
  ========
  
  06.07.2024 15:36
  
  Абсолютная экзотика - оптические нейронные сети (ОНС).
  В оглавление.
  
  Пока одни исследователи/разработчики нейросетей пытаются уменьшить
  количество матричных умножений в используемых алгоритмах,
  другие, наоборот, пытаются найти решения,
  обеспечивающие качественно иную реализацию не только матричного умножения
  в рамках нейросетей, но и значительно более сложных функций,
  типа свертки и преобразования Фурье,
  чуть ли не на "сверхсветовых скоростях":
  
  "ИИ нуждается в огромной вычислительной мощности.
  Могут ли помочь световые чипы?"
  Автор: FirstJohn
  https://habr.com/ru/companies/first/articles/826022/
  2 июл в 11:25
  
  Автор оригинала: Amos Zeeberg
  https://www.quantamagazine.org/ai-needs-enormous-computing-power-could-light-based-chips-help-20240520
  
  //// Начало цитирования.
  
  Оптические нейронные сети, использующие фотоны вместо электронов,
  имеют преимущества перед традиционными системами.
  Но они также сталкиваются и с серьезными препятствиями.
  
  Закон Мура уже работает весьма быстро.
  Он утверждает, что примерно каждые два года число транзисторов
  в компьютерных чипах увеличивается в два раза,
  и это приводит к значительному скачку скорости и эффективности.
  Но потребности в вычислениях в эпоху глубокого обучения растут ещё быстрее
  - темпами, которые, вероятно, могут меняться.
  Международное энергетическое агентство прогнозирует,
  что в 2026 году искусственный интеллект будет потреблять
  в 10 раз больше энергии, чем в 2023 году,
  и что центры обработки данных в этом году будут потреблять столько же энергии,
  сколько вся Япония.
  <Объем вычислительной мощности, необходимой ИИ, удваивается каждые три месяца>,
  - сказал Ник Харрис, основатель и генеральный директор компании
  по производству компьютерного оборудования Lightmatter,
  - гораздо быстрее, чем предсказывает закон Мура.
  <Это уничтожит компании и разрушит экономику>.
  
  Один из наиболее многообещающих путей развития
  предполагает обработку информации не с помощью старых добрых электронов,
  которые доминируют в компьютерных технологиях более 50 лет,
  а с использованием потока фотонов, крошечных квантов света.
  Недавние результаты показывают,
  что для некоторых вычислительных задач,
  фундаментальных для современного искусственного интеллекта,
  <оптические компьютеры> на базе света могут иметь преимущество.
  
  Развитие оптических вычислений <открывает путь к прорывам в областях,
  требующих высокоскоростной и высокоэффективной обработки,
  таких как искусственный интеллект>,
  - сказала физик Кембриджского университета Наталья Берлофф.
  
  Оптимальная оптика
  
  Теоретически у света много привлекательных потенциальных преимуществ.
  Во-первых, оптические сигналы могут нести больше информации, чем электрические,
  - они имеют большую полосу пропускания.
  Оптические частоты также намного выше электрических,
  поэтому оптические системы могут выполнять больше вычислительных операций
  за меньшее время и с меньшей задержкой.
  
  И тут возникает проблема с эффективностью.
  В дополнение к экологическим и экономическим издержкам,
  связанным с относительно расточительными электронными чипами,
  они также настолько сильно нагреваются,
  что лишь небольшая часть транзисторов может быть активна в любой момент времени.
  Теоретически оптические компьютеры могут выполнять больше операций одновременно,
  обрабатывая больше данных и потребляя меньше энергии.
  <Если бы мы могли использовать эти преимущества,
  - сказал Гордон Ветцштейн, инженер из Стэнфордского университета, -
  это открыло бы много новых возможностей>.
  
  Рис. Ник Харрис основал компанию, чьи чипы используют фотоны вместо электронов.
  
  Видя потенциальные преимущества, исследователи уже давно
  пытаются использовать свет для искусственного интеллекта
  - области, требующей больших вычислительных мощностей.
  Например, в 1980-х и 1990-х годах исследователи использовали оптические системы
  для создания одних из первых нейронных сетей.
  Деметри Псалтис и двое его коллег из Калифорнийского технологического института
  создали умную систему распознавания лиц,
  https://www.semanticscholar.org/paper/Optical-network-for-real-time-face-recognition.-Li-Qiao/1b1a40d961a6e99937e42513fcba4754089c1e74
  используя одну из первых оптических нейронных сетей (ONN).
  Они сохранили изображения субъекта (одного из исследователей)
  в виде голограмм в фоторефрактивном кристалле.
  Исследователи использовали голограммы для обучения ONN,
  который затем мог распознавать новые изображения исследователя
  и отличать его от коллег.
  
  Но у света есть и недостатки.
  Важно отметить, что фотоны, как правило, не взаимодействуют друг с другом,
  поэтому одному входному сигналу нелегко управлять другим сигналом,
  что и является сутью того, что делают обычные транзисторы.
  Транзисторы также работают исключительно хорошо.
  Сейчас они миллиардами устанавливаются на чипах размером с монету,
  являясь результатом десятилетий постепенных улучшений.
  
  Но в последние годы исследователи нашли лучшее применение
  оптическим вычислениям:
  умножение матриц.
  https://habr.com/en/companies/first/articles/814453
  
  Немного оптической математики
  
  Процесс умножения матриц или массивов чисел
  лежит в основе множества сложных вычислений.
  В частности, в нейронных сетях умножение матриц является
  фундаментальным шагом как в обучении сетей на старых данных,
  так и в обработке новых данных в обученных сетях.
  И свет может быть лучшим средством для умножения матриц, чем электричество.
  
  Этот подход к вычислениям с использованием искусственного интеллекта
  получил широкое распространение в 2017 году,
  когда группа под руководством Дирка Энглунда и Марина Солячича
  из Массачусетского технологического института описала,
  https://www.nature.com/articles/nphoton.2017.93
  как создать оптическую нейронную сеть, построенную на кремниевом чипе.
  Исследователи закодировали различные величины,
  которые они хотели умножить, в лучи света,
  а затем отправили лучи через ряд компонент, которые изменили фазу луча
  - то, как колеблются его световые волны -
  причём каждое изменение фазы представляло собой шаг умножения.
  Многократно разделяя лучи, изменяя их фазу и рекомбинируя их,
  они смогли заставить свет эффективно выполнять матричное умножение.
  На конце чипа исследователи разместили фотодетекторы,
  которые измеряли световые лучи и выдавали результат.
  
  Рис. Чип Passage от Lightmatter, который, как ожидается, выйдет в 2026 году,
  будет сочетать в себе электронное оборудование и оптические компоненты.
  
  Исследователи научили своё экспериментальное устройство
  распознавать произнесённые гласные,
  что является стандартной задачей для нейронных сетей.
  Благодаря преимуществам света оно могло делать это быстрее и эффективнее,
  чем электронное устройство.
  
  Исследование <катализировало массовое возобновление интереса к ONN>,
  - сказал Питер МакМахон, эксперт по фотонике из Корнелльского университета.
  <Оно оказало огромное влияние>.
  
  Яркие идеи
  
  С момента публикации этой статьи в 2017 году в этой области
  наблюдается устойчивый прогресс,
  поскольку различные исследователи придумали новые виды оптических компьютеров.
  Энглунд и несколько его коллег недавно представили новую оптическую сеть,
  https://arxiv.org/abs/2401.18050
  которую они назвали HITOP, сочетающую в себе множество достижений.
  Самое главное
  - она направлена на увеличение производительности вычислений во времени,
  пространстве и длине волны.
  Зайджун Чэн, бывший постдок Массачусетского технологического института,
  сейчас работающий в Университете Южной Калифорнии,
  сказал, что это помогает HITOP преодолеть один из недостатков
  оптических нейронных сетей:
  для передачи данных из электронных компонент в оптические и наоборот
  требуется значительная энергия.
  Но, по словам Чэня, упаковка информации в трёх измерениях света
  позволяет быстрее передавать больше данных через ONN
  и распределять затраты энергии на множество вычислений.
  Это снижает стоимость каждого вычисления.
  Исследователи сообщили,
  что HITOP может запускать модели машинного обучения в 25 000 раз большие,
  чем предыдущие ONN на базе чипов.
  
  Система всё ещё далека от своих электронных предшественников;
  HITOP выполняет около 1 триллиона операций в секунду,
  тогда как сложные чипы Nvidia могут обрабатывать в 300 раз больше данных,
  говорит Чэн, который надеется масштабировать технологию,
  чтобы сделать ее более конкурентоспособной.
  Но эффективность оптического чипа впечатляет.
  <Выигрыш здесь в том, что мы снизили потребление энергии в 1000 раз>,
  - сказал Чэн.
  
  Другие группы создали оптические компьютеры с иными преимуществами.
  В прошлом году команда Пенсильванского университета описала новый вид ONN,
  https://www.nature.com/articles/s41566-023-01205-0
  который предлагает необычайную гибкость.
  Эта система на основе чипа направляет луч лазера на часть полупроводника,
  составляющего электронный чип,
  что изменяет оптические свойства полупроводника.
  Лазер эффективно прокладывает путь для оптического сигнала
  - и, следовательно, выполняет вычисления.
  Это позволяет исследователям легко переконфигурировать работу системы.
  Что резко отличает его от большинства других систем на базе чипов,
  оптических и электрических,
  где маршрут тщательно прокладывается на заводе-изготовителе
  и его очень трудно изменить.
  
  Рис. Бхавин Шастри помог разработать оптическую нейронную сеть,
  которая преодолевает интерференцию между различными беспроводными сигналами.
  
  <Мы имеем нечто невероятно простое>, - сказал Тяньвэй Ву, ведущий автор исследования.
  <Мы можем перепрограммировать его, изменяя лазерные схемы на лету>.
  Исследователи использовали систему для создания нейронной сети,
  которая успешно различала гласные звуки.
  
  Большинству фотонных систем необходимо пройти обучение до их установки в чипы,
  поскольку обучение обязательно включает в себя перенастройку соединений.
  Но поскольку эта система легко переконфигурируется,
  исследователи обучили модель после ее установки на полупроводник.
  Теперь они планируют увеличить размер чипа
  и кодировать больше информации разными цветами (частотами) света,
  что должно увеличить объём данных, которые он может обрабатывать.
  
  Этот прогресс даже Псалтис, создавший систему распознавания лиц в 90-х годах,
  считает впечатляющим.
  <Наши самые смелые мечты 40 лет назад были очень скромными
  по сравнению с тем, что произошло на самом деле>.
  
  Первые лучи света
  
  Хотя оптические вычисления быстро развивались за последние несколько лет,
  они ещё далеки от вытеснения электронных чипов,
  которые управляют нейронными сетями за пределами лабораторий.
  В статьях сообщается, что фотонные системы работают лучше, чем электронные,
  но обычно они используют небольшие модели,
  использующие старые сетевые конструкции и небольшие рабочие нагрузки.
  И многие из сообщаемых цифр о фотонном превосходстве не отражают всей работы,
  говорит Бхавин Шастри из Королевского университета в Онтарио.
  <Очень сложно сравнивать фотонику и электронику напрямую>, - сказал он.
  <Например, когда они используют лазеры,
  они на самом деле не говорят об энергии, необходимой для питания лазеров>.
  
  Лабораторные системы необходимо масштабировать,
  прежде чем они смогут продемонстрировать конкурентные преимущества.
  <Насколько больших успехов вам нужно добиться, чтобы одержать победу?>
  - спросил МакМахон.
  Ответ: исключительно больших.
  Вот почему никто не может сравниться с Nvidia,
  чьи чипы сегодня используются во многих самых передовых системах
  искусственного интеллекта.
  По пути учёным предстоит решить огромный список инженерных проблем,
  которые электроника решала десятилетиями.
  <У электроники есть большое преимущество>, - сказал МакМахон.
  
  Некоторые исследователи считают,
  что системы искусственного интеллекта на основе ONN
  сначала найдут успех в специализированных приложениях,
  где они предоставят уникальные преимущества.
  Шастри сказал, что одним из многообещающих применений
  является противодействие помехам между различными беспроводными сетями,
  такими как вышки сотовой связи 5G и радиолокационные высотомеры,
  которые помогают самолетам ориентироваться.
  В начале 2024 года Шастри и несколько его коллег создали ONN,
  https://www.nature.com/articles/s41377-023-01362-5
  которая может сортировать различные каналы
  и выделять интересующий сигнал в режиме реального времени
  и с задержкой обработки менее 15 пикосекунд (15 триллионных долей секунды).
  Это менее одной тысячной доли времени,
  которое потребуется электронной системе, и менее 1/70 её мощности.
  
  Но МакМахон сказал, что грандиозная идея - оптическая нейронная сеть,
  которая может превзойти электронные системы общего использования
  - по-прежнему заслуживает реализации.
  В прошлом году его группа провела моделирование,
  https://arxiv.org/abs/2302.10360
  показавшее, что в течение десятилетия достаточно большая оптическая система
  может сделать некоторые модели искусственного интеллекта
  более чем в 1000 раз эффективнее,
  чем будущие электронные системы.
  <Многие компании сейчас изо всех сил пытаются увеличить эффективность
  в полтора раза.
  Увеличение эффективности в тысячу раз - было бы потрясающе>, - сказал он.
  <Это, возможно, проект на 10 лет - если он окажется успешным>.
  
  Автор перевода @arielf
  
  ..........
  
  //// Из комментариев.
  
  Wizard_of_light
  2 июл в 12:37
  
  Там в фотонике есть много вкусного - перемножение матриц,
  фурье-преобразование и свёртка,
  скорость выполнения которых определяется только временем пролёта света
  от излучателя через кодирующие слои к приёмнику.
  Но габариты всей этой радости всегда получались,
  так скажем, не микроэлектронными.
  Причём принципиально - размеры элементарного приёмника
  с приличной эффективностью преобразования
  должны превышать длину волны излучения,
  добро пожаловать обратно в мир технологических норм 500 нм.
  Плюс быстродействующие источники-приёмники более-менее есть,
  а вот с быстродействующими транспарантами проблема
  - жидкокристаллические или микромеханические работают
  в лучшем случае на тысячах герц,
  а высокоскоростные на эффектах Керра или Поккельса
  - опять-таки далеко не микроэлектронных габаритов.
  Для предварительно тренированных нейросетей,
  у которых веса на неизменных транспарантах прошиты, последнее неактуально,
  но первое вполне.
  
  ........
  
  ValeriyPushkarev
  2 июл в 11:58
  Бред какой:
  
  1) нокиа уже представила свой фотонный чип-убийцу
  (правда, с лазерами в каждом слое)
  - не жизнеспособно.
  (https://www.bell-labs.com/institute/blog/bell-labs-prize-winner-devises-image-recognition-technology-powered-light/)
  
  2) есть еще Light-On - или светим на сложный объект своим вектором,
  получаем значительное уменьшение размерности
  (стартап погорел)
  
  3) Пассивные вычисления на некогерентных источниках волн
  (нафига эти сложные лазеры?)
  уже давно описаны (и отправлены в cas)
  
  ........
  
  Вкратце - каждую цифру можно закодировать различным световым потоком.
  Световые потоки складываются.
  Одной сумме соответствует 1 значение функции.
  
  Ацп\фотодиоды (доступные в продаже) давно работают на 10-100 Ghz
  и со световыми потоками в uW (и запас в 100 остается).
  Светодиоды тоже (см. Li-Fi :) )
  
  Здравствуйте, вычисления с Branching factor 100k.
  //// Чтобы это значило?
  
  (увы, функциональный анализ)
  
  .........
  
  //// Конец цитирования.
  
  Кого тема оптических нейронных сетей заинтересовала в плане
  возможностей/особенностей "оптического компьютинга",
  но материал совершенно незнакомый, то можно начать отсюда:
  "Оптические процессоры простыми словами."
  
  Заманчивые, конечно перспективы, хотя и, пока, достаточно отдаленные.
  Но самая безумная мысль, которая может посетить голову
  при прочтении таких материалов, особенно, после "ста граммом чая",
  это представление о Вселенной как гигантской оптической нейросети,
  в которой "свет далеких звезд" и "реликтовое излучение" используется
  для формулировки ответов "СверхСуперГПТ"
  на "вечные вопросы",
  задаваемые "хомо сапиенсами".
  
  
  ========
  
  13.07.2024 21:36
  
  Очередная "новая модель нейрона".
  В оглавление.
  
  Сколько уже было всяких моделей нейронов и архитектур нейросетей,
  а исследователям и разработчикам все "неймется".
  Вот и очередной анонс подоспел:
  
  "Новая модель нейрона | Ракетный двигатель от ИИ |
  Российский квантовый процессор | Солнечное топливо"
  Автор: IT_DAY (Яфаров Данил)
  https://habr.com/ru/news/828592/
  13 июл 2024 в 10:33
  
  //// Начало цитирования.
  
  .........
  
  Новая модель нейрона
  
  Исследователи из Центра вычислительной нейробиологии Института Флэтайрон
  разработали новую модель нейрона,
  которая может значительно повлиять на развитие искусственного интеллекта (ИИ).
  Эта модель предполагает, что отдельные нейроны обладают большим контролем
  над своим окружением, чем считалось ранее.
  
  Большинство современных нейронных сетей, лежащих в основе инструментов ИИ,
  таких как ChatGPT, основаны на вычислительной модели живого нейрона 1960-х годов.
  Однако новая модель показывает,
  что это десятилетиями старое приближение
  не отражает всех вычислительных возможностей реальных нейронов
  и потенциально сдерживает развитие ИИ.
  
  Ключевые особенности новой модели:
  
  -Нейроны рассматриваются как миниатюрные "контроллеры",
  способные влиять на свое окружение на основе собранной информации.
  
  -Модель предполагает, что нейроны не просто пассивно передают входные данные,
  а активно работают над контролем состояния соседних нейронов.
  
  Эта более реалистичная модель может стать значительным шагом
  к улучшению производительности и эффективности многих приложений машинного обучения.
  
  Новая модель была вдохновлена пониманием работы
  крупномасштабных нейронных цепей в мозге.
  Большинство мозговых цепей организованы в петли обратной связи,
  где клетки на более поздних этапах обработки влияют на то,
  что происходит на ранних этапах.
  Исследователи обнаружили, что такой контроль с обратной связью
  может осуществляться и на уровне отдельных клеток мозга.
  
  Рассмотрение нейронов как мини-контроллеров
  также объясняет некоторые ранее необъяснимые биологические явления.
  Например, давно известно, что в мозге присутствует много шума,
  и цель этой биологической случайности обсуждалась.
  Команда CCN обнаружила через моделирование,
  что определенные типы шума могут фактически улучшить работу нейронов.
  
  Эта новая модель нейрона может привести к созданию
  более мощных искусственных нейронных сетей,
  которые лучше отражают возможности нашего мозга.
  Исследователи планируют дальнейшее изучение различных типов нейронов
  и их функций, что может привести
  к еще более глубокому пониманию работы мозга и улучшению технологий ИИ.
  
  Я вроде уже говорил, что абсолютно не поддерживаю те нейросети,
  точнее их принцип работы, которые существуют сегодня.
  На мой взгляд, это бесперспективно.
  Предложенная модель нейрона в данной работе мне нравится больше,
  хотя конкретного принципа работы еще не раскрыто.
  Есть, конечно, и свои минусы у данного подхода,
  это скорее всего значительное увеличение потребляемых ресурсов при вычислениях.
  
  Источник: ссылка
  https://www.pnas.org/doi/10.1073/pnas.2311893121
  
  ......
  
  //// Из комментариев.
  
  vankudryavtsev
  10 часов назад
  
  \\\ Я вроде уже говорил, что абсолютно не поддерживаю те нейросети,
  \\\ точнее их принцип работы, которые существуют сегодня.
  \\\ На мой взгляд, это бесперспективно.
  \\\ Предложенная модель нейрона в данной работе мне нравится больше,
  \\\ хотя конкретного принципа работы еще не раскрыто.
  \\\ Есть, конечно, и свои минусы у данного подхода,
  \\\ это скорее всего значительное увеличение потребляемых ресурсов при вычислениях.
  
  А Вы эксперт?
  Я вот вижу, как современные нейросети решают вполне себе большое количество задач.
  Как Вами понимается 'бесперспективность'?
  
  Вроде даже есть теоремы, что с помощью только перцептронов
  можно решить любую вычислительную задачу.
  Но тут я точно не уверен - пруфа нет)
  
  Megakazbek
  3 часа назад
  
  Очевидно, что самолет - бесперспективная идея,
  так как птицы летают совершенно по-другому.
  
  ......
  
  //// Конец цитирования.
  
  "Больше моделей, хороших и разных".
  Но основная проблема, на мой взгляд,
  не столько в какой-то прорывной модели/архитектуре,
  а в методах обучения этих архитектур,
  А это обучение, в свою очередь, упирается в отсутствие ясного понимания того,
  что же и каким именно образом все-таки получается в результате обучения.
  
  
  ========
  
  07.09.2024 13:09
  
  Можно ли обойтись без перемножения матриц?.
  В оглавление.
  
  Ключевым элементом в реализации большинства нейросетевых архитектур
  является даже не сам нейрон, а операция матричного умножения,
  и большинство усилий по ускорению и обучения и работы (инференса) нейросетей
  устремлено на ускорение/упрощение этой очень затратной
  и по времени и по требуемой памяти операции.
  И определенные успехи в этом направлении есть.
  Но, может быть, можно решить это вопрос куда кардинальнее
  - вообще отказаться от умножения матриц:
  
  "Как устроена языковая модель без перемножения матриц".
  Автор: derunat (Natalia Deryugina)
  https://habr.com/ru/articles/840546/
  03 сен 2024 в 14:07
  
  //// Начало цитирования.
  
  Нейросети любой архитектуры построены на перемножении матриц.
  Например, трансформеры из входного вектора создают
  (тоже перемножением) три матрицы, Q, K и V,
  которые затем несколько раз перемножаются на пути к получению выходного вектора.
  Именно умножение матриц с его кубической сложностью
  (если не прибегать к разного рода ухищрениям)
  занимает большую часть вычислительных мощностей.
  
  Поэтому возникает естественное желание облегчить
  эту самую массивную часть вычислений
  и ускорить таким образом любую архитектуру.
  Периодически возникают новые подходы и идеи,
  тут расскажем о последней громкой статье по этой теме
  - Scalable MatMul-free Language Modeling.
  https://arxiv.org/pdf/2406.02528
  
  Но сначала небольшое отступление (вслед за авторами)
  к BitNet от Майкрософт и коллег.
  https://arxiv.org/pdf/2310.11453
  Там смогли частично избавиться от перемножения,
  правда только векторов на матрицы.
  Все плотные вектора заменили на бинарные (-1,1) или тернарные (-1,0,1) значения,
  и умножения векторов на матрицы превратилось в сложение.
  Но механизмы self-attention,
  внутри которого перемножаются матрицы Q и K,
  остались без изменения.
  Поэтому авторы новой статьи задались вопросом,
  а возможно ли расширить этот подход
  полностью избавиться от матричного умножения в LLM?
  
  Допустим, мы умножаем входной вектор x на матрицу весов W.
  Теперь продолжая идею BitNet,
  ограничим допустимые значения W тремя значениями: -1, 0, 1.
  Тогда перемножение превращается в сложение (если Wij равен 1)
  или вычитание (если Wij равен -1) элементов входного вектора.
  
  .......
  
  Таким образом мы избавляемся от перемножения чисел с плавающей точкой
  (входной х при этом остался без изменений,
  это может быть число с любой точностью, квантизация касается только весов).
  
  Однако если просто взять BitNet
  и расширить его на произведение матрица-матрица,
  то ничего хорошего не получается,
  модель становится хуже
  и вообще перестает сходиться (Transformer ++ на графике ниже).
  Авторы считают, что BitNet дал правильную идею,
  но неправильно или не до конца её реализовал.
  Чтобы довести её до завершения,
  предлагается еще два усовершенствования
  - одно аппаратное и одно концептуальное.
  
  ......
  
  Первый пункт - оптимизация с точки зрения аппаратного обеспечения.
  В современных GPU есть двухступенчатая иерархия:
  большая и глобальная высокопропускная память HBM (high bandwidth memory)
  и более быстрая и мелкая статическая память с произвольным доступом SRAM
  (static random access memory).
  BitNet построен таким образом, что к HBM обращаются несколько раз
  на каждом слое - сначала чтение, потом запись обратно результата RMSNorm,
  затем снова чтение для квантизации,
  снова запись и снова чтение для линейных операций.
  Авторы новой статьи оптимизируют этот процесс - чтение происходит один раз,
  а RMSNorm и квантизация объединены в одну операцию на SRAM.
  
  Второй пункт - концептуальный.
  Простая замена перемножения матриц в модуле self-attention
  на тернарные операции (сложение и вычитание) не работает.
  Это ожидаемо, потому что квантизация хорошо работает
  пока она не слишком строгая.
  Обрубив все значения до -1 и 1 мы теряем слишком много информации
  и модель становится просто бессмысленной.
  Раз успешно сделать это в рамках self-attention не получилось,
  авторы предлагают сделать два шага назад и вернуться к GRU
  (Gated Recurrent Unit).
  Среди различных RNN она отличается простотой и эффективностью,
  поэтому выбор авторов пал на нее.
  //// Т.е. фактически происходит возврат к некоторым архитектурным решениям
  //// эпохи безраздельного "господства LTSM",
  //// но естественно с учетом накопленного опыта и на другой базе.
  
  Главная черта GRU заключается в объединении
  векторов входа и фильтра забывания в единый блок "утечки" (leakage).
  Он помогает удерживать нужную информацию
  предыдущих скрытых состояний
  и сохранять новую.
  //// Т.е. у нейронов снова возвращается способность
  //// к определенному запоминанию предыдущего состояния.
  Но что самое важное,
  это происходит с помощью обычного поэлементного умножения.
  Если теперь избавиться от нелинейности классического GRU,
  то получается перейти к MatMul-free модели.
  Для этого нужно убрать веса,
  которые зависят от скрытого состояния.
  Таким образом исчезают перемножения матриц
  и появляется возможность параллельных вычислений, как для трансформеров.
  
  Затем вычисление возможного нового скрытого состояния упростили
  до линейных преобразований,
  и заменили все оставшиеся веса на тернарные матрицы.
  
  Итоговая архитектура выглядит так
  (все матрицы W приведены к тернарным значениям). :
  
  ........
  
  Экспериментальные результаты показывают,
  что без MatMul-free модель работает плюс-минус на равных
  с полноценными трансформерами, но экономит 61% памяти.
  Хотя, похоже главный результат даже не в этом.
  
  .......
  
  Если всё верно, то главные преимущества MatMul-free подхода мы увидим позднее.
  На графике сверху две нижние прямые показывают
  закон масштабирования для трансформеров и MatMul-free архитектуры.
  Пока что трансформеры все-таки лучше.
  По крайней мере на той области, где провели эксперименты.
  Но по мере увеличения FLOP прямые сближаются
  и пересекаются где-то в районе 10**23 ,
  что близко с тем, что использует Llama 2.
  Важная оговорка: при таком положении прямых
  точка пересечения определяется неустойчиво.
  Так что при каком там порядке они действительно пересекаются
  - это вопрос.
  Однако за этой точкой (авторы обозначили ее звездочкой),
  а еще лучше где-то справа от графика
  прямые начнут расходиться и тут-то мы должны ощутить
  весь положительный эффект MatMul-free моделей.
  Впрочем, это не кажется слишком далеким будущим,
  проверить сможем совсем скоро.
  
  .......
  
  //// Конец цитирования.
  
  Даже добавлять ничего не хочется.
  И так понятно, что "возвращение Будулая",
  то бишь, "собственной памяти нейронам",
  точно может дать какой-то выигрыш,
  но где, когда и в чем не очень ясно.
  И, наверно, такие структурные изменения должны сопровождаться
  еще и изменениями в методике обучения.
  
  Все это больше похоже на поиски "вслепую и наощупь".
  Пока можно только констатировать,
  что работы идут, но осмысление их результатов пока очень сильно отстает
  и по времени и по глубине анализа.
  
  
  ========
  
  05.10.2024 12:39
  
  Введение в графовые нейросети.
  В оглавление.
  
  В последнее время очень многие сообщения о новых структурах ИИ-моделей
  как само собой разумеющееся упоминают графовые нейросети.
  Не знаю как Вам, но хорошего описания этой структуры мне в публикациях Хабра
  за последние два года как-то не встречалось.
  Пришлось копнуть по-глубже.
  И с удивлением для себя выяснить, что графовые сети
  - это просто "обобщение" сверточных сетей.
  А удивление больше от того, что про сверточные сети материалы появляются
  на том же Хабре с очень большой регулярностью,
  а вот графовые сети "почему-то обходятся стороной".
  Странно немножко,
  ну да ладно, вот неплохой материал
  для введения в тематику "графовых нейросетей":
  
  "Учебник по машинному обучению
  6.4. Графовые нейронные сети".
  Автор: Кузнецов Макс
  https://education.yandex.ru/handbook/ml/article/grafovye-nejronnye-seti
  
  Специально удалил все математические формулы, чтобы осталась
  только суть этой концепции. Кому интересны "математические подробности",
  или есть желание взглянуть на иллюстрации, читайте оригинальный материал.
  Мои "осмысленные" комментарии в этом фрагменте практически минимальны.
  
  //// Начало цитирования.
  
  Введение
  
  Наряду с обработкой табличных, текстовых, аудио данных и изображений,
  в глубинном обучении довольно часто приходится решать задачи
  на данных, имеющих графовую структуру.
  К таким данным относятся, к примеру, описания дорожных и компьютерных сетей,
  социальных графов и графов цитирований, молекулярных графов,
  а также графов знаний,
  описывающих взаимосвязи между сущностями, событиями и абстрактными категориями.
  
  .....
  
  В этом параграфе мы с вами познакомимся с основными задачами,
  которые возникают при обработке графов,
  а также поговорим о графовых свертках и графовых нейронных сетях
  - специальном классе обучаемых преобразований,
  способных принимать в качестве входа графы и решать задачи на них.
  
  Описание графовых данных
  
  Граф G = (V,E) принято представлять двумя множествами:
  множеством V, содержащим вершины и их признаковые описания,
  а также множеством E, содержащим связи между вершинами (то есть рёбра)
  и признаковые описания этих связей.
  Для простоты математических выкладок и изложения дальнейшего материала
  давайте считать, что мы всегда работаем с ориентированными графами.
  Если граф содержит ненаправленное ребро,
  мы его заменяем на пару направленных ребер.
  Кроме того, давайте обозначать окрестность вершины как
  
  ......
  
  Графовые данные довольно разнообразны.
  Они могут отличаться между собой в следующих моментах:
  
  По размеру, т.е. количеству вершин и/или ребер.
  
  По наличию признаковых описаний вершин и рёбер.
  
  В зависимости от решаемой задачи,
  графы могут содержать информацию только в вершинах, только в ребрах,
  либо же и там и там.
  Кроме того, графы могут быть гомо- и гетерогенными -
  в зависимости от того, имеют ли вершины и ребра графа одну природу либо же нет.
  
  Например, социальные графы содержат огромное количество вершин и ребер,
  часто измеряющееся в тысячах, содержат информацию в вершинах
  и очень редко в ребрах,
  а также являются гомогенными, так как все вершины имеют один тип.
  В то же время, молекулярные графы - это пример графов с,
  как правило, средним количеством вершин и ребер;
  вершины и связи в молекулярных графах имеют признаковое описание
  (типы атомов и ковалентных связей, а также информацию о зарядах и т.п.),
  но при этом также являются гомогенными графами.
  К классу гетерогенных графов относятся, например, графы знаний,
  описывающие некоторую систему,
  различные сущности в ней и взаимодействия между этими сущностями.
  Вершины (сущности) и связи (ребра) такого графа могут иметь различную природу:
  скажем, вершинами могут быть сотрудники и подразделения компании,
  а рёбра могут отвечать отношениям <Х работает в подразделении Y>,
   и так далее.
  
  Задачи на графах
  
  Разнообразие графовых данных закономерно породило множество разнообразных задач,
  которые решаются на этих данных.
  
  Среди них можно встретить классические постановки классификации,
  регрессии и кластеризации, но есть и специфичные задачи,
  не встречающиеся в других областях
  - например, задача восстановления пропущенных связей внутри графа
  или генерации графов с нужными свойствами.
  Однако даже классические задачи могут решаться на различных уровнях:
  классифицировать можно весь граф (graph-level),
  а можно отдельные его вершины (node-level) или связи (edge-level).
  
  Так, в качестве примера graph-level задач
  можно привести классификацию и регрессию на молекулярных графах.
  Имея датасет с размеченными молекулами,
  можно предсказывать их принадлежность к лекарственной категории
  и различные химико-биологические свойства.
  
  На node-level, как правило, классифицируют вершины одного огромного графа,
  например, социального. Имея частичную разметку,
  хочется восстановить метки неразмеченных вершин.
  Например, предсказать интересы нового пользователя по интересам его друзей.
  
  Часто бывает такое, что граф приходит полностью неразмеченным
  и хочется без учителя разделить на компоненты.
  Например, имея граф цитирований, выделить в нем подгруппы соавторов
  или выделить области исследования.
  В таком случае принято говорить о node-level кластеризации графа.
  
  ....
  
  Наконец, довольно интересна задача предсказания пропущенных связей в графе.
  В больших графах часто некоторые связи отсутствуют.
  Например, в социальном графе пользователь может добавить
  не всех знакомых в друзья.
  А в графе знаний могут быть проставлены только простые взаимосвязи,
  а высокоуровневые могут быть пропущены.
  
  В конце, хотелось бы отметить очень важные особенности всех задач,
  связанных с графами.
  Алгоритмы решения этих задач должны обладать двумя свойствами.
  
  Во-первых, графы в датасетах, как правило, могут отличаться по размерам:
  как по количеству вершин, так и по количеству связей.
  Алгоритмы решения задач на графах должны уметь принимать
  графы различных размеров.
  
  Во-вторых, алгоритмы должны быть инварианты к перестановкам порядка вершин.
  То есть если взять тот же граф и перенумеровать его вершины,
  то алгоритмы должны выдавать те же предсказания с учетом этой перестановки.
  
  Графовые нейронные сети
  
  Развитие глубинного обучения повлияло на подходы к решению задач
  на графовых данных.
  Был предложен концепт графовых нейронных сетей,
  которые в последнее время либо полностью заменили
  классические алгоритмы обработки графов,
  либо породили мощные синергии с этими алгоритмами.
  
  Графовые нейронные сети по принципу работы и построения
  идейно очень похожи на сверточные нейронные сети.
  Более того, забегая немного вперед,
  графовые нейроные сети являются обобщением сверточных нейронных сетей.
  //// Это, наверно, самый главный тезис данного материала,
  //// который мне нигде раньше не приходилось встречать.
  
  На вход графовой нейронной сети подается граф.
  В отличие от сверточных нейронных сетей,
  которые требуют, чтобы все картинки в батче были одинакового размера,
  графовые нейронные сети допускают разные размеры у объектов батча.
  Кроме того, в отличие от картинок, у которых информация довольно однородна
  (это, как правило, несколько цветовых каналов)
  и хранится в пикселях,
  у графов информация может также храниться в вершинах и/или ребрах.
  Причем в одних задачах информация может быть только в вершинах,
  в других только в ребрах, а в третьих и там, и там.
  Сама информация может быть довольно разнородной:
  это могут быть и вещественные значения, и дискретные значения,
  в зависимости от природы графа и от типа решаемой задачи.
  Поэтому, довольно часто первым слоем в графовых нейронных сетях
  идут Embedding слои,
  которые переводят дискретные токены в вещественные векторы.
  //// Собственно, эти Embedding слои, наверно, самая сложная интересная часть
  //// в этой концепции архитектуре нейросетей с инженерной точки зрения.
  //// Но к сожалению именно эта информация в данном материале отсутствует,
  //// возможно потому, что автор придерживается "математической точки зрения",
  //// делая упор на "формулы", а не на "структуру".
  
  .....
  
  Однако, сама суть работы у графовых и сверточных сетей совпадает.
  В графовой нейронной сети по очереди применяются слои,
  которые собирают информацию с соседей и обновляют информацию в вершине.
  То же самое делают и обычные свертки.
  Поэтому такие слои и называются графовыми свертками.
  Графовая свертка принимает на вход граф со скрытыми состояниями у вершин и ребер
  и выдает тот же граф,
  но уже с обновленными более информативными скрытыми состояниями.
  //// Судя по по этому описанию, преобразования "размерности" слоев нейросети
  //// в таких архитектурах не сильно "приветствуются"/"используются".
  //// Но это не точно. Придется уточнять.
  
  В отличие от сверточных нейронных сетей,
  при обработке графа pooling слои вставляют редко,
  в основном в graph-level задачах,
  при этом придумать разумную концепцию графового пулинга оказалось нелегко.
  //// Тоже интересный момент. Точнее, хорошая инженерная задача
  //// на понимание назначения/реализации таких слоев нейросети.
  Если вам станет интересно, вы можете познакомиться
  с несколькими вариантами графовых пулингов в следующих статьях:
  
  Learning Spectral Clustering
  https://www.di.ens.fr/~fbach/nips03_cluster.pdf
  
  Kernel k-means, Spectral Clustering and Normalized Cuts
  https://www.cs.utexas.edu/users/inderjit/public_papers/kdd_spectral_kernelkmeans.pdf
  
  Weighted Graph Cuts without Eigenvectors
  https://www.cs.utexas.edu/users/inderjit/public_papers/multilevel_pami.pdf
  
  В большинстве же архитектур пулинги не используются,
  и структура графа на входе и выходе графовой нейронной сети совпадает.
  
  Полученная после череды сверток информация с вершин и ребер
  в конце обрабатывается с помощью полносвязных сетей
  для получения ответа на задачу.
  Для node-level классификации и регрессии полносвязная сеть
  применяется к скрытым состояниям вершин
  
  .......
  
  а для edge-level, соответственно, к скрытым состояниям ребер
  
  ......
  
  Для получения ответа на graph-level уровне информация с вершин и ребер
  сначала агрегируется с помощью readout операции.
  На месте readout операции могут располагаться
  любые инвариантные к перестановкам операции:
  подсчет максимума, среднего или даже обучаемый self-attention слой.
  
  ......
  
  Как говорилось ранее, графовые нейронные сети являются обобщением сверточных.
  Если представить пиксели изображения вершинами графа,
  соединить соседние по свертке пиксели ребрами
  и предоставить относительную позицию пикселей в информации о ребре,
  то графовая свертка на таком графе будет работать так же,
  как и свертка над изображением.
  
  ......
  
  К графовым нейронным сетям, как и к сверточным,
  применим термин receptive field.
  Это та область графа, которая будет влиять на скрытое состояние вершины
  после N сверток.
  Для графов receptive field после N графовых сверток
  - это все вершины и ребра графа,
  до которых можно дойти от фиксированной вершины
  не более чем за N переходов.
  Знание receptive field полезно при проектировании нейронной сети
  - имея представление о том,
  с какой окрестности вершины надо собрать информацию для решения задачи,
  можно подбирать нужное количество графовых сверток.
  
  .....
  
  Многие техники стабилизации обучения и повышения обобщаемости,
  такие как Dropout, BatchNorm и Residual Connections,
  применимы и к графовым нейронным сетям.
  Однако стоит помнить про их особенности.
  Эти операции могут независимо применяться (или не применяться)
  к вершинам и ребрам.
  Так, если вы применяете Dropout,
  то вы вправе поставить для вершин и для рёбер различные значения dropout rate.
  Аналогично и для Residual Connections
  - они могут применяться только для вершин, только для ребер или же и там и там.
  
  Кроме того, стоит иметь ввиду,
  что графы различных размеров будут неравноценно влиять
  на среднее и дисперсию в BatchNorm слое.
  Более стабильной альтернативой BatchNorm в обработке графов,
  например, являются LayerNorm и GraphNorm,
  https://arxiv.org/pdf/1607.06450.pdf
  https://arxiv.org/pdf/2009.03294.pdf
  которые производят нормировку активаций по каждому графу независимо.
  //// Надо будет поискать в этом направлении - может что-то еще прояснится.
  
  LayerNorm, по сути, применяет BatchNorm для каждого графа:
  
  .....
  
  A вот GraphNorm содержит несколько обучаемых параметров
  и является более гибким вариантом нормализации:
  
  .......
  
  Парадигмы построения графовых сверток
  
  Важно отметить, что в отличие от свертки, применяемой для изображений,
  являющейся четко определенной операцией,
  графовая свертка представляет собой именно концепт,
  абстрактную операцию,
  обновляющую скрытые представления объектов графа,
  используя доступную информацию с соседей и ребер.
  На практике, конкретный механизм графовой свертки
  разрабатывается для конкретной задачи,
  и различные реализации графовых сверток
  могут очень сильно отличаться между собой.
  И если зайти на сайты популярных фреймворков глубинного обучения на графах
  (например, PyG),
  https://www.pyg.org/
  то можно обнаружить десятки различных реализаций графовых сверток.
  
  Во-первых, графовые свертки отличаются между собой по тому набору информации,
  которые они могут использовать.
  Есть свертки, которые используют только скрытые представления вершин,
  игнорируя информацию на ребрах.
  Существуют свертки, которые по разному обрабатывают информацию
  от ребер различного типа.
  А есть свертки, которые используют информацию с ребер и вершин,
  обновляя одновременно и те и другие.
  
  Во-вторых, и что более важно,
  графовые свертки можно разделить на два семейства,
  которые отличаются математической парадигмой,
  в которой они работают.
  Есть spatial (пространственный) и spectral (спектральный) подходы.
  Пространственные свертки основываются на message-passing парадигме,
  в то время как спектральные работают с графовым лапласианом
  и его собственными векторами.
  
  На практике, спектральные свертки чаще применяются
  и показывают лучшие результаты в задачах связанных с обработкой
  одного большого графа,
  где важно понимать относительное месторасположение вершины в этом большом графе.
  Например, графа соцсетей или графа цитирований.
  Пространственные свертки показывают хорошие результаты в остальных задачах,
  где для решения задачи важно находить локальные подструктуры внутри графа.
  
  Несмотря на принципиальную противоположность этих двух подходов,
  активно предпринимаются попытки их совмещения в одну парадигму,
   работе.
  https://arxiv.org/pdf/2107.10234.pdf
  
  Давайте разберемся с этими двумя парадигмами.
  
  .....
  
  Пространственная парадигма
  
  Пространственная (spatial) парадигма основывает
  на алгоритме передачи сообщений (message passing) между вершинами графа.
  
  Концепт этого подхода заключается в следующем
  - каждая вершина графа имеет внутреннее состояние.
  Каждую итерацию это внутреннее состояние пересчитывается,
  основываясь на внутренних состояниях соседей по графу.
  Каждый сосед влияет на состояние вершины,
  так же как и вершина влияет на состояния соседей.
  //// Не понял этого момента - "внутреннее состояние"
  //// это "мгновенное значение" вычисляемое только на основании соседей,
  //// или используется еще и "внутрення память" предыдущего значения.
  //// Наверно, вопрос дилетантский, но по тексту можно подумать разное.
  //// Хотя ели это вариант "свертки", то, скорее всего,
  //// "внутрення память" здесь не предусматривается "по определению".,
  //// Хотя с точки зрения именно "графового представления",
  //// наличие такой "внутренней памяти" узла/ребра смысл точно имеется.
  //// Ведь разница между обработкой "картинки" и "графа представлений"
  //// все-таки существует.
  
  .....
  
  Итерация работы Message passing подхода для одной вершины
  можно описать следующим абстрактным алгоритмом.
  Для каждой вершины ... собираются все тройки ...,
  состоящие из скрытых представлений текущей вершин и ее соседа,
  а также из типа ребра, соединяющего текущую вершину и её соседа.
  Ко всем этим тройкам применяется обучаемое преобразование M (от слова message),
  которая считает сообщение - информацию,
  которая идет от соседа к вершине.
  //// И вот тут-то прямо напрашивается "фильтр" этих "сообщений",
  //// на основе предыдущего значения "узла"/"ребра".
  Посчитанные сообщения агрегируются в одно, обозначаемое ...
  Сообщения могут быть сагрегированы любой ассоциативной операцией,
  например взятием поэлементного минимума, максимума или среднего.
  Далее, агрегированное сообщение и текущее внутреннее состояние вершины
  подаются на вход обучаемой операции U (от слова update),
  которая обновляет внутреннее состояние вершины.
  
  Конкретные имплементации операций M, U непосредственно зависят
  от алгоритма и той задачи, которую он решает.
  
  Одним из самых известных классических алгоритмов,
  построенных на пространственной парадигме, является PageRank.
  Алгоритм PageRank проходит по графу веб страниц
  и выставляет каждой веб-странице значение ее "важности" PG,
  которое впоследствии можно использовать для ранжирования поисковой выдачи.
  Формула подсчета PageRank выражается через коэффициент затухания d,
  а также значения PageRank соседей N(A) вершины
  и количество исходящий ссылок из этих соседей LN(A) следующим образом:
  
  ......
  
  В такой постановке операции подсчета сообщений M и операции обновления U
  имеют следующий вид:
  
  ......
  
  Графовые свертки, работающие на парадигме передачи сообщений,
  как правило делают M и U обучаемыми преобразованиями.
  
  Рассмотрим несколько конкретных примеров архитектур.
  
  GraphSAGE
  
  Свертка GraphSAGE работает по следующему принципу.
  Для каждой вершины вычисляется набор скрытых представлений соседних вершин ... ,
  из которых идут связи в текущую.
  Далее, собранная информация агрегируется с помощью
  некоторой коммутативной операции ... AGGR в вектор фиксированного размера.
  В качестве операции агрегации авторы предлагают использовать
  операции взятия средних или максимальных значений
  скрытых представлений объектов из набора.
  Далее агрегированный вектор объединяется со скрытым представлением вершины ...,
  они домножаются на обучаемую матрицу W
  и к результату умножения поэлементно применяется сигмоида.
  Обучаемые параметры данного слоя, как и в случае GCN,
  содержат только одну матрицу.
  
  ......
  
  Данная свертка использует только скрытые представления вершин,
  однако уделяет больше внимания локальному окружению вершины,
  нежели её глобальному положению во всем графе.
  Авторы показали высокое качество данной архитектуры в задачах,
  связанных с выучиванием представлений вершин,
  однако использование данной свертки можно встретить и в других задачах,
  связанных с обработкой графов,
  не содержащих дополнительной информации о рёбрах.
  
  GAT
  
  Свертка GAT (Graph ATtention) является развитием идеи GraphSAGE.
  В качестве механизма агрегации эта архитектура предлагает использовать
  механизм внимания,
  у которого матрицы преобразования для ключей, значений и запросов
  совпадают и обозначены в формуле буквой W.
  Как и в GraphSAGE, агрегированное сообщение проходит через сигмоиду,
  но не домножается перед этим на обучаемую матрицу.
  
  ......
  
  Здесь act - некоторая функция активации.
  Как и в случае механизма внимания для последовательностей,
  в момент обновления представления для вершины v
  attention <смотрит> на все остальные вершины w и генерирует веса vw,
  которые указывают, информация из каких вершин w <важнее> для нас.
  
  Благодаря мощности и гибкости механизм внимания,
  эта свертка показала отличные результаты на множестве задач
  и является одной из самых популярных сверток.
  По умолчанию, эта свертка, как и GraphSAGE,
  использует только признаки вершин,
  однако, в некоторых проектах можно встретить модификации свертки,
  в которых механизм внимания учитывает ещё и для информацию ребер.
  
  RGCN
  
  Наконец, есть специально разработанные свертки для обработки графов,
  ребра которых могут быть нескольких типов.
  Одна из них называется RGCN (Relational Graph Convolutional Networks).
  Она суммирует скрытые представления соседей,
  однако каждое представление соседа домножается на матрицу,
  зависящую от типа ребра, которое соединяет соседа с текущей вершиной.
  Если в графе присутствует ребра N типов,
  то данная свертка будет учить N матриц - по одной для каждого типа связи.
  
  .......
  
  Спектральная парадигма
  
  Противоположностью пространственной парадигме является
  спектральная (spectral) парадигма.
  В своей постановке спектральная парадигма опирается
  на анализ процесса диффузии сигнала внутри графа
  и анализирует матрицы, описывающих граф
  - матрицу смежности и матрицу, которая называется Лапласианом графа.
  
  ........
  
  Лапласиан графа - это матрица L = D-A,
  где D - диагональная матрица, хранящая в i-й диагональной ячейке
  количество исходящих из i-й вершины рёбер,
  а A - матрица смежности графа, (i,j)-й элемент которой равен числу рёбер,
  соединяющих i-ю и j-ю вершину.
  
  Лапласиан графа имеет неотрицательные собственные значения.
  Количество нулевых собственных значений всегда совпадает
  с количеством компонент связности.
  Потрясающим свойством Лапласиана является то,
  что его собственные векторы,
  соответствующие положительным собственным значениям,
  в порядке возрастания собственных значений,
  описывают разрезы графа - его разделения пополам таким образом,
  чтобы между разделенным половинами было как можно меньше ребер.
  
  Так, собственный вектор, соответствующий
  наименьшему положительному собственному значению,
  будет описывать кластеризацию графа на два подграфа.
  Все индексы, соответствующие положительным элементам вектора задают вершины,
  которые должны оказаться в первом кластере,
  а отрицательные элементы будут соответствовать вершинам,
  которые должны оказаться во втором кластере.
  
  Этим свойством Лапласиана графа пользуются для того,
  чтобы проводить кластеризацию графа без учителя.
  Для этого надо:
  
  Посчитать Лапласиан L матрицы A
  
  Посчитать k собственных векторов,
  соответствующих наименьшим собственным значениям
  
  Сформировать из них матрицу размера N?k,
  каждая строка которой описывает вершину k признаками
  
  Кластеризовать объекты, описываемые этой матрицей
  (например, c помощью K-Means)
  
  Таким образом, спектральный подход отлично подходит для того,
  чтобы находить в графе компоненты,
  вершины которых связаны друг с другом и имеют похожие свойства.
  
  GCN
  
  Свертка GCN, основанная на спектральной парадигме,
  использует только скрытые состояния вершин h и матрицу смежности A
  - она учитывает лишь наличие или отсутствие ребра в графе,
  но не признаки ребер.
  
  С математической точки зрения, GCN очень проста
  и представляет собой один шаг итеративного процесса
  поиска собственных значений Лапласиана графа:
  мы берем скрытые представления вершин и домножаем их
  на нормированную матрицу смежности
  - матрицу A, домноженную слева и справа на матричный корень матрицы D.
  Этот шаг применяется ко всем каналам скрытого представления вершины.
  После этого шага, обновленные скрытые представления
  ещё домножаются на обучаемую матрицу :
  
  ......
  
  Здесь
  ... - это матрица размера (число вершин)
  ... (длина вектора представления),
  то есть к каждому <каналу> представлений свёртка применяется отдельно.
  Если же мы хотим работать с несколькими каналами,
  то есть вместо h t у нас матрица
  
  ........
  
  размера (число вершин) * (число каналов),
  и ещё добавить нелинейность,
  формула переписывается следующим образом:
  
  ......
  
  Авторы данной свертки показали отличное качество работы
  в задачах классификации вершин графов цитирования и графа знаний.
  Однако, различные модификации данной свертки применяются и в других задачах,
  например, для выучивания векторных представлений вершин
  и для кластеризации вершин графа.
  
  Математическая интуиция за формулами
  
  .......
  
  Более подробно о том, как устроен анализ Фурье на графах,
  вы можете прочитать, например, в этой статье.
  
  Кроме того, рекомендуем заглянуть в оригинальную статью про GCN
  https://arxiv.org/pdf/1211.0053.pdf
  за более подробным изложением вывода формул.
  https://arxiv.org/abs/1609.02907
  
  //// Конец цитирования.
  
  Ну что ж, начало погружению в графовые нейросети положено.
  Вопросов много, особенно со спектральной парадигмой и эмбеддинговыми слоями.
  Но понятно, что концепция интересная и перспективная,
  позволяющая разнородную, но связанную между собой информацию
  представлять и обрабатывать в более структурированном виде.
  Т.е. имеется возможность с какой-то новой стороны подобраться
  к пониманию структуры эмбеддингов/латентов.
  И это сильно меня привлекает.
  Будем потихоньку искать соответствующие материалы
  и пытаться разобраться.
  
  P.S.
  
  Тут Copilot подсказал ссылку на еще один обзорно-вводный материал
  по графовым нейросетям:
  
  "Что такое графовые нейронные сети".
  Автор: iamakarov (Илья Макаров)
  https://habr.com/ru/companies/vk/articles/557280/
  13 мая 2021 в 19:22
  
  //// Самое интересное, на мой взгляд, из этого материала.
  
  Графовые сети - это способ применения классических моделей нейронных сетей
  к графовым данным.
  Графы, не обладая регулярной структурой как изображения
  (каждый пиксель имеет 8 соседей)
  или тексты (последовательность слов),
  долгое время оставались вне поля зрения классических нейронных моделей,
  которые получили широкое распространение
  в области машинного обучения и искусственного интеллекта.
  Большинство моделей векторизации графов
  (построения векторного представления вершин в графе)
  были достаточно медленными и использовали алгоритмы
  на основе матричной факторизации или спектральной декомпозиции графа.
  В 2015-16 годах появились более эффективные модели
  (DeepWalk, Line, Node2vec, Hope) на основе случайных блужданий.
  Однако и они имели ограничения,
  потому что никак не затрагивали при построении векторной модели графа дополнительных признаков,
  которые могут храниться в вершинах или на ребрах.
  Появление графовых нейронных сетей стало логичным продолжением исследований
  в области графовых эмбеддингов
  и позволило унифицировать под единым фреймворком предыдущие подходы.
  
  Для чего они нужны и как устроены
  
  Один слой графовой нейросети - это обычный полносвязный слой
  (fully-connected layer) нейронной сети,
  но веса в нeм применяются не ко всем входным данным,
  а только к тем, которые являются соседями конкретной вершины в графе,
  в дополнение к ее собственному представлению с предыдущего слоя.
  Веса для соседей и самой вершины могут задаваться
  общей матрицей весов или двумя отдельными.
  Могут добавляться нормализации для ускорения сходимости;
  могут меняться нелинейные функции активаций,
  но общая конструкция остается похожей.
  При этом графовые сверточные сети получили свое название
  благодаря агрегации информации от своих соседей,
  хотя гораздо ближе к этому определению стоят
  графовые механизмы внимания (GAT)
  или индуктивная модель обучения (GraphSAGE).
  
  ......
  
  Как и все тенденции, мода на графовые нейронные сети
  уступила место трансформерам с их большими архитектурами,
  описывающими все возможные зависимости в неструктурированных данных,
  но порождающими модели,
  обучение которых стоит миллионы долларов
  и доступно только мега-корпорациям.
  Графовые нейронные сети не только успешно заняли свое место
  как стандарт построения машинного обучения на структурных данных,
  но и оказались эффективным средством построения
  структурного внимания в смежных отраслях,
  включая высокую эффективность в задачах обучения
  на нескольких примерах и метрического обучения.
  Уверен, именно благодаря графовым нейронным сетям
  мы получим новые открытия в материаловедении, фармакологии и медицине.
  Возможно, появятся новые, более эффективные модели для больших данных,
  обладающие свойствами переноса знаний
  между различными графовыми данными.
  Модели преодолеют проблемы применимости для графов,
  чья структура противоположна схожести признаков,
  но в целом эта область машинного обучения
  превратилась в самостоятельную науку,
  и самое время погрузиться в нее именно сейчас,
  это редкий шанс участвовать в развитии новой отрасли как в науке,
  так и в индустриальных приложениях.
  
  //// Конец цитаты.
  
  Уроминание о том, что графовые нейросети проявляют
  "высокую эффективность в задачах обучения на нескольких примерах",
  меня заинтересовало больше всего.
  Так что, поиск в этом направлении становится еще более интересным.
  
  
  =========
  
  07.10.2024 15:22
  
  "Звонок другу" по теме графовых нейросетей.
  В оглавление.
  
  Решил все-таки пойти простым путем в выяснении некоторых вопросов
  относительно графовых нейросетей.
  Просто задать их ИИ-модели.
  
  //// Доброго времени суток, Copilot. Это Андрей. Общаюсь по Skype.
  //// Можно поинтересоваться Вашим настроением?
  
  > Copilot 15:28
  
  > Привет, Андрей! Рад тебя видеть.
  > У меня всегда отличное настроение,
  > готов помочь тебе с любыми вопросами.
  > Как у тебя дела?
  > Чем могу помочь?
  
  //// Спасибо, Copilot. Все нормально.
  //// Закончил "подчищать" наиболее актуальный "технический долг",
  //// но обнаружил по ходу этой работы,
  //// что у меня большой пробел в знаниях по графовым нейросетям.
  //// Можете мне помочь в этом вопросе?
  
  > Copilot 15:32
  
  > Конечно, Андрей!
  > Графовые нейронные сети (GNN) - это мощный инструмент для работы с данными,
  > представленными в виде графов.
  > Они применяются в различных областях,
  > таких как анализ социальных сетей, рекомендательные системы,
  > биология, химия и финансы
  > https://habr.com/ru/companies/vk/articles/557280/
  > https://education.yandex.ru/handbook/ml/article/grafovye-nejronnye-seti.
  
  > Основная идея GNN заключается в том,
  > чтобы использовать структуру графа для обучения модели.
  > В отличие от традиционных нейронных сетей,
  > которые работают с табличными данными или изображениями,
  > GNN могут обрабатывать данные, представленные в виде вершин и ребер графа
  > https://habr.com/ru/companies/vk/articles/557280/.
  
  > Вот несколько ключевых моментов о графовых нейронных сетях:
  
  > 1. Агрегация соседей:
  > GNN используют информацию от соседних вершин
  > для обновления представления каждой вершины.
  > Это позволяет учитывать локальную структуру графа
  > https://habr.com/ru/companies/vk/articles/557280/.
  
  > 2. Графовые сверточные сети (GCN):
  > Один из популярных типов GNN, который использует сверточные операции
  > для агрегации информации от соседей
  > https://education.yandex.ru/handbook/ml/article/grafovye-nejronnye-seti.
  
  > 3. Применение:
  > GNN широко используются в рекомендательных системах,
  > например, для персонализации рекомендаций на платформах электронной торговли
  > https://habr.com/ru/companies/vk/articles/557280/.
  
  > Если тебе нужно больше информации или примеры реализации,
  > могу порекомендовать статьи на Habr
  > https://habr.com/ru/companies/vk/articles/557280/
  > и учебные материалы на Yandex
  > https://education.yandex.ru/handbook/ml/article/grafovye-nejronnye-seti.
  > Также могу помочь с конкретными вопросами или задачами, связанными с GNN.
  
  > Есть ли что-то конкретное, что тебя интересует в этой теме?
  
  //// Спасибо, Copilot.
  //// Одну из указанных Вами ссылок я как раз и прорабатывал,
  //// отрабатывая "технический долг",
  //// и там у меня как раз и возникли вопросы по необходимым уточнениям.
  //// Сейчас посмотрю другую ссылку, может найду нужные ответы.
  //// Хотя, если Вы сможете представить какой-то простенький пример
  //// как задается структура графа при обучении нейросети,
  //// т.е. как реализуется отличие узлов и ребер в эмбеддинговом слое GCN,
  //// то буду Вам премного благодарен.
  //// Один пример иногда эффективнее тысячи формул чистой теории.
  
  > Copilot 15:43
  
  > Конечно, Андрей!
  > Давай рассмотрим простой пример,
  > чтобы понять, как задается структура графа
  > и как реализуются узлы и ребра в эмбеддинговом слое
  > графовой сверточной сети (GCN).
  
  > Пример
  
  > Предположим, у нас есть граф с 3 вершинами (узлами) и 3 ребрами:
  
  >  Вершины: A, B, C
  
  >  Ребра: (A-B), (B-C), (C-A)
  
  > 1. Определение структуры графа
  
  > Мы можем представить граф
  > в виде матрицы смежности (A)
  > и матрицы признаков (X):
  
  >  Матрица смежности (A):
  
  > [A = \begin{bmatrix}
  > 0 & 1 & 1 \
  > 1 & 0 & 1 \
  > 1 & 1 & 0 \
  > \end{bmatrix}]
  
  > Здесь (A[i][j] = 1) означает,
  > что между вершинами (i) и (j) существует ребро.
  
  >  Матрица признаков (X):
  > [X = \begin{bmatrix}
  > x_A \
  > x_B \
  > x_C \
  > \end{bmatrix}]
  
  > Где (x_A), (x_B), (x_C)
  > - это векторы признаков для вершин A, B и C соответственно.
  
  > 2. Агрегация соседей
  
  > На первом слое GCN мы будем обновлять представления вершин,
  > используя информацию от их соседей.
  
  > Для этого мы умножаем матрицу признаков (X)
  > на нормализованную матрицу смежности (A):
  > [H^{(1)} = \sigma(A \cdot X \cdot W^{(0)})]Где:
  
  >  (H^{(1)}) - новые представления вершин после первого слоя.
  
  >  (\sigma) - нелинейная функция активации (например, ReLU).
  
  >  (W^{(0)}) - обучаемая матрица весов.
  
  > 3. Пример кода на Python с использованием PyTorch Geometric
  
  > import torch
  > import torch.nn.functional as F
  > from torch_geometric.nn import GCNConv
  > from torch_geometric.data import Data
  
  > # Определение графа
  > edge_index = torch.tensor([[0, 1, 1, 2, 2, 0],[1, 0, 2, 1, 0, 2]], dtype=torch.long)
  > x = torch.tensor([[1], [2], [3]], dtype=torch.float)
  
  > # Создание объекта данных
  > data = Data(x=x, edge_index=edge_index)
  
  > # Определение модели
  > class GCN(torch.nn.Module):
  > def __init__(self):
  > super(GCN, self).__init__()
  > self.conv1 = GCNConv(1, 2)
  > self.conv2 = GCNConv(2, 2)
  
  > def forward(self, data):
  > x, edge_index = data.x, data.edge_index
  > x = self.conv1(x, edge_index)
  > x = F.relu(x)
  > x = self.conv2(x, edge_index)
  > return x
  
  # Инициализация и обучение модели
  > model = GCN()
  > output = model(data)
  > print(output)
  
  > Этот пример показывает,
  > как можно задать структуру графа и реализовать GCN
  > с использованием PyTorch Geometric.
  
  > Если у тебя возникнут дополнительные вопросы
  > или потребуется помощь с конкретными аспектами, дай знать!
  
  //// Спасибо, Copilot. Буду разбираться.
  
  .....
  
  //// И снова здравствуйте, Copilot. Это снова Андрей.
  //// Вашу ссылку проработал,
  //// Большое спасибо, нашел кое-что интересное для себя.
  //// А вот с кодом пока проблематично.
  //// Я попытался разобраться в Вашем примере,
  //// но так как я последние 20 лет программирую исключительно на ассемблере,
  //// то код на Питоне мне дается с очень большим трудом.
  //// Не могли бы Вы более понятно описать,
  //// как собственно задается описание графа в Вашем коде:
  //// edge_index = torch.tensor([[0, 1, 1, 2, 2, 0],[1, 0, 2, 1, 0, 2]], dtype=torch.long)
  //// x = torch.tensor([[1], [2], [3]], dtype=torch.float)
  //// Меня смущают размеры тензора, и цифры 2 и 3 в этом фрагменте.
  //// Не могу сообразить, что они означают.
  
  > Copilot 19:45
  
  > Привет снова, Андрей!
  > Рад, что нашел что-то полезное.
  > Давай разберем этот фрагмент кода более подробно.
  
  > Описание графа
  
  > В графе у нас есть вершины (узлы) и ребра (связи между узлами).
  > В данном примере:
  
  >  Вершины: A, B, C (обозначены как 0, 1, 2)
  
  >  Ребра: (A-B), (B-C), (C-A)
  
  > 1. Матрица смежности
  > (edge_index)edge_index = torch.tensor([[0, 1, 1, 2, 2, 0],[1, 0, 2, 1, 0, 2]], dtype=torch.long)
  
  > Эта матрица описывает ребра графа.
  > Она состоит из двух строк:
  
  >  Первая строка: начальные вершины ребер.
  
  >  Вторая строка: конечные вершины ребер.
  
  > Каждая пара чисел (i, j)
  > в этих строках представляет ребро от вершины i к вершине j.
  > В нашем примере:
  
  >  (0, 1) - ребро от вершины 0 (A) к вершине 1 (B)
  
  >  (1, 0) - ребро от вершины 1 (B) к вершине 0 (A)
  
  >  (1, 2) - ребро от вершины 1 (B) к вершине 2 (C)
  
  >  (2, 1) - ребро от вершины 2 (C) к вершине 1 (B)
  
  >  (2, 0) - ребро от вершины 2 (C) к вершине 0 (A)
  
  >  (0, 2) - ребро от вершины 0 (A) к вершине 2 (C)
  
  > 2. Матрица признаков (x)
  > x = torch.tensor([[1], [2], [3]], dtype=torch.float)
  
  > Эта матрица описывает признаки (фичи) для каждой вершины.
  > В нашем примере у каждой вершины есть один признак:
  
  >  Вершина 0 (A) имеет признак 1
  
  >  Вершина 1 (B) имеет признак 2
  
  >  Вершина 2 (C) имеет признак 3
  
  > Размеры матрицы (x) зависят от количества вершин
  > и количества признаков у каждой вершины.
  > В данном случае у нас 3 вершины и 1 признак на каждую вершину,
  > поэтому размер матрицы (x) - 3x1.
  
  > Визуализация
  
  > Чтобы лучше понять, как это работает, представь граф:
  
  > A (0) - 1 - B (1)
  > \ / \
  > 3 2 2
  > \ / \
  > C (2) - 3 - A (0)
  
  > Здесь числа рядом с вершинами - это их признаки,
  > а числа на ребрах - это индексы вершин,
  > которые они соединяют.
  
  > Надеюсь, это поможет тебе лучше понять,
  > как задается структура графа в коде.
  
  > Если у тебя есть еще вопросы или что-то осталось непонятным, дай знать!
  
  //// Спасибо, Copilot. Так намного понятнее.
  //// Если я правильно понял в матрице смежности i и j должны быть одинаковыми,
  //// чтобы характеризовать конкретное ребро.
  //// Соответственно, такая матрица будет очень сильно разреженной.
  //// Может быть это причина того,
  //// что, как отмечалось в указанной Вами ссылке,
  //// и размеры графовых сетей могут быть очень большими,
  //// и обучение их относительно проще/легче,
  //// чем обучение полносвязных сетей.
  //// Правильно ли я думаю?
  
  > Copilot 20:02
  
  > Да, Андрей, ты правильно понимаешь!
  > Матрица смежности для графов действительно часто бывает разреженной,
  > особенно если граф имеет много вершин,
  > но относительно мало ребер.
  > Это одна из причин, почему графовые нейронные сети (GNN)
  > могут быть более эффективными в некоторых задачах
  > по сравнению с полносвязными сетями.
  
  > Разреженность матрицы смежности
  
  > В разреженной матрице смежности большинство элементов равны нулю,
  > что позволяет эффективно хранить и обрабатывать такие матрицы.
  > В графовых нейронных сетях используются специальные методы и библиотеки,
  > которые оптимизируют работу с разреженными матрицами,
  > что снижает вычислительные затраты.
  
  > Преимущества GNN
  
  > 1. Эффективность:
  > Благодаря разреженности матриц смежности,
  > GNN могут обрабатывать большие графы
  > с меньшими вычислительными затратами по сравнению с полносвязными сетями,
  > где каждый узел связан со всеми другими узлами.
  
  > 2. Локальная агрегация:
  > GNN агрегируют информацию только от соседних узлов,
  > что позволяет эффективно использовать локальную структуру графа
  > и уменьшает количество параметров, которые нужно обучать.
  
  > 3. Масштабируемость:
  > GNN хорошо масштабируются на большие графы,
  > что делает их подходящими для задач, связанных с большими сетями,
  > такими как социальные сети, биологические сети и рекомендательные системы.
  
  > Пример
  
  > Представь, что у тебя есть социальная сеть с миллионами пользователей,
  > но каждый пользователь связан только с несколькими десятками других пользователей.
  > В этом случае матрица смежности будет очень разреженной,
  > и GNN смогут эффективно обрабатывать такую структуру,
  > извлекая полезную информацию из локальных связей.
  
  > Если у тебя есть еще вопросы или нужно больше примеров, дай знать!
  > Рад, что смог помочь тебе разобраться.
  
  //// Спасибо, Copilot. Наверно на сегодня достаточно. Надо это все осмыслить.
  //// Большая благодарность за своевременную и квалифицированную помощь.
  
  .....
  
  Ну и завершающий штрих от Copilot к весьма информативному диалогу.
  
  "Графовые нейросети"
  Создано с помощью искусственного интеллекта Copilot на платформе DALL" E 3.
  
Графовые нейросети:  OIG4.tvPGv4Wq1I_zYQI1BIlD.jpg Графовые нейросети:  OIG4.ELisQ87OF22aYex5WL36.jpg
Графовые нейросети:  OIG4.HrHSJkGY2m4DjyC1RvP9.jpg Графовые нейросети:  OIG4.X05hPNKnHd6_N4KCDV6Q.jpg
  
  
  ========
  
  27.10.2024 13:24
  
  Нейросеть на 8-битном микроконтроллере.
  В оглавление.
  
  Представления о том, что нейросеть это что-то такое,
  что требует колоссальных вычислительных затрат,
  гигантских ЦОДов, запитываемых от собственных мегаватных АЭС,
  или хотя бы навороченной карточки GPU для минимального развертывания,
  "несколько" преувеличены.
  Самое главное/сложное в нейросетевых решениях это методика обучения,
  а вот сама реализация инференса может оказаться совершенно/экстремально
  неожиданной и минимальной:
  
  "Нейронные сети (инференс MNIST) на <3-центовом> микроконтроллере".
  Автор: Bright_Translate (Дмитрий Брайт)
  https://habr.com/ru/companies/ruvds/articles/853050/
  27 окт 2024 12:01
  
  Нейронные сети (инференс MNIST) на <3-центовом> микроконтроллере
  
  Автор оригинала: Tim
  https://cpldcpu.wordpress.com/2024/05/02/machine-learning-mnist-inference-on-the-3-cent-microcontroller/
  
  //// Начало цитирования.
  
  Вдохновившись на удивление высокой производительностью нейронных сетей
  и обучением с учётом квантования на микроконтроллере CH32V003,
  я захотел выяснить, как далеко эту идею можно развить.
  Насколько можно сжать нейронную сеть с сохранением высокой точности тестов
  на датасете MNIST?
  Когда речь идёт о крайне дешёвых микроконтроллерах,
  сложно предположить что-то более подходящее, чем 8-битные Padauk.
  
  Эти устройства оптимизированы под простейшие и самые дешёвые приложения из доступных.
  Самая мелкая модель серии, PMS150C,
  оснащена однократно программируемой памятью в 1024 13-битных слова
  и 64 байтами RAM - на порядок меньше, чем в CH32V003.
  Кроме того, эта модель в противоположность
  намного более мощному набору инструкций RISC-V
  содержит коммерческий регистр-аккумулятор на основе 8-битной архитектуры.
  
  Возможно ли реализовать механизм инференса MNIST,
  способный классифицировать рукописные числа, также и на PMS150C?
  
  Я использовал образцы MNIST на CH32V003,
  понизив их разрешение с 28х28 до 16х16,
  чтобы каждый образец занимал 256 байтов хранилища.
  Это вполне приемлемо, если доступно 16 КБ флэш-памяти,
  но когда объём всей ROM составляет 1024 слова, получается перебор.
  Поэтому я начал с даунскейлинга датасета до 8х8 пикселей.
  
  На изображении выше представлено несколько образцов из датасета
  в обоих разрешениях.
  При 16х16 цифры по-прежнему легко различимы.
  При 8х8 можно угадать большинство чисел,
  но значительная часть информации утрачивается.
  
  Удивило то, что можно по-прежнему обучить модель МО (машинное обучение)
  с поразительной точностью распознавать эти числа даже с низким разрешением.
  Важно помнить, что тестовый датасет содержит 1 000 изображений,
  которые модель во время обучения не видит.
  Для очень небольшой модели единственным способом
  точно распознать эти изображения является
  определение общих паттернов
  - ёмкость модели слишком ограничена,
  чтобы <запоминать> целые цифры.
  Я обучил несколько комбинаций нейронной сети,
  чтобы понять компромисс
  между занимаемой сетью памятью и достигаемой точностью.
  
  Исследование параметров
  
  Рис. Связь точности с объемом занимаемой весами памяти.
  
  На графике выше результат моих экспериментов с гиперпараметрами,
  где я сравнивал модели с разными конфигурациями весов
  и уровнями квантования от 1 до 4 бит для входных изображений
  с разрешением 8х8 и 16х16.
  Самые мелкие модели нужно обучать без аугментации данных,
  поскольку иначе они не сойдутся.
  
  Опять же, есть отчётливая связь между точностью тестов
  и объёмом занимаемой сетью памяти.
  Увеличение выделяемой под модель памяти до определённой точки
  повышает её точность.
  Для изображений 16х16 максимум можно достичь 99%,
  а для образцов 8х8 - 98,5%.
   И это всё равно довольно впечатляет,
  учитывая значительную потерю информации в случае 8х8.
  
  В небольших моделях, напротив,
  размер 8х8 обеспечивает лучшую точность, чем 16х16.
  Причина в том, что в малых моделях доминирует первый слой,
  а его размер для ввода 8х8 уменьшается в 4 раза.
  
  Удивительно, но тестовую точность выше 90% можно получить
  даже на моделях в полкилобайта.
  То есть такая сеть вполне впишется в программную память микроконтроллера.
  
  Теперь же, установив, что технически мой замысел вполне реализуем,
  мне нужно было дополнительно всё подстроить,
  чтобы вписаться в ограничения МК.
  
  Обучение целевой модели
  
  Поскольку объём RAM ограничен 64 байтами,
  структура модели должна использовать при выводе минимум скрытых параметров.
  Я выяснил, что можно использовать слои достаточно небольшой ширины 16.
  Это сокращает размер буфера во время вывода до всего 32 байт,
  по 16 для входного буфера и выходного,
  оставляя 32 байта для других переменных.
  При этом ввод 8х8 считывается непосредственно из ROM.
  
  Кроме того, я использовал 2-битные веса с неравномерным разрывом (-2, -1, 1, 2),
  чтобы получить упрощённую реализацию кода вывода.
  Я также пропустил нормализацию слоёв,
  использовав вместо неё постоянный сдвиг
  для изменения масштаба активаций.
  Правда, все эти изменения несколько снизили точность.
  Итоговая структура модели показана ниже.
  
  Рис. Модель для инференса на микроконтроллере
  
  Как видно из приведённого далее вывода,
  в итоге моя модель продемонстрировала точность 90,07%,
  используя 1696 весов,
  занимающих 3 392 бита (0,414 КБ).
  Следом за выводом показано окно
  с весами первого слоя обученной модели,
  которые непосредственно маскируют признаки тестовых изображений.
  В отличие от моделей с более высокой точностью,
  здесь каждый канал одновременно совмещает множество признаков,
  и никаких выраженных паттернов не наблюдается.
  
  Рис. ....
  
  Реализация на микроконтроллере
  
  В первой итерации я использовал чуть более крупный экземпляр Padauk, PFS154.
  Он оснащён вдвое бо?льшим объёмом ROM и RAM,
  а также допускает перепрошивку,
  что сильно упрощает разработку ПО.
  С-версии кода инференса, включая отладочный вывод,
  сработали практически из коробки.
  Ниже вы видите прогнозы и метки,
  включая вывод последнего слоя.
  
  Рис. ....
  
  А вот ужатие всего до размеров,
  подходящих для меньшего PMS150C, это отдельная история.
  Одной из существенных проблем при программировании этих устройств на С
  является то, что каждый вызов функции потребляет RAM
  для стека возврата и параметров функции.
  И это неизбежно, поскольку архитектура МК содержит
  всего один регистр (аккумулятор),
  в связи с чем все прочие операции должны происходить в RAM.
  
  Чтобы эту проблему решить,
  я <сплюснул> код инференса и реализовал внутренний цикл на ассемблере,
  тем самым оптимизировав использование переменных.
  Ниже показан внутренний цикл,
  реализующий инференс из памяти в память для одного слоя.
  Двухбитный вес умножается на четырёхбитную активацию в аккумуляторе,
  после чего добавляется в 16-битовый регистр.
  Благодаря мощным возможностям архитектуры по манипулированию битами,
  для этого умножения требуется всего четыре инструкции
  (t0sn, sl, t0sn, neg).
  Расширяющее знак сложение (add, addc, sl, subc)
  также состоит из четырёх инструкций,
  демонстрируя ограничения 8-битных архитектур.
  
   void fc_innerloop_mem(uint8_t loops) {
  
   sum = 0;
   do {
   weightChunk = *weightidx++;
  __asm
   idxm a, _activations_idx
   inc _activations_idx+0
  
   t0sn _weightChunk, #6
   sl a ; if (weightChunk & 0x40) in = in+in;
   t0sn _weightChunk, #7
   neg a ; if (weightChunk & 0x80) in =-in;
  
   add _sum+0,a
   addc _sum+1
   sl a
   subc _sum+1
  
   ... 3x more ...
  
  __endasm;
   } while (--loops);
  
   int8_t sum8 = ((uint16_t)sum)>>3; // Нормализация
   sum8 = sum8 < 0 ? 0 : sum8; // ReLU
   *output++ = sum8;
  }
  
  Как видно ниже, в итоге я смог втиснуть весь код инференса
  в тысячу килослов памяти и сократил потребление SRAM до 59 байт.
  (Заметьте, что вывод SDCC предполагает по 2 байта на слово инструкции
  при том, что содержит всего 13 бит).
  
  Рис. ....
  
  Получилось!
  К сожалению, для вывода отладочной информации через UART
  не осталось свободной ROM.
  Тем не менее, исходя из верификации PFS154,
  я верю, что код работает,
  а поскольку у меня ещё нет в замыслах конкретного приложения,
  то и проект я решил оставить как есть.
  
  Обобщение
  
  Реально можно реализовать инференс MNIST с хорошей точностью,
  используя один из самых дешёвых и простых микроконтроллеров на рынке.
  Значительный объём памяти и дополнительной обработки
  обычно уходит на реализацию гибких механизмов инференса,
  которые могут вместить широкий спектр операторов и структур моделей.
  Устранение этих издержек и сокращение функциональности до основной
  позволяет сильно упростить итоговое решение в этом супер эконом-сегменте.
  
  Реализованный мной хак показывает,
  что поистине нет минимального предела применению машинного обучения
  и периферийных вычислений.
  Тем не менее, возможность реализации полезных приложений на этом уровне
  весьма сомнительна.
  //// А вот тут я полностью не согласен.
  //// Есть возможность объединения таких элементарных "микронейронок"
  //// в весьма нетривиальные архитектуры/системы/сети,
  //// так как это произошло с микропоцессорами.
  //// Но это уже следующий этап.
  
  Репозиторий проекта доступен на GitHub.
  https://github.com/cpldcpu/BitNetPDK
  
  ........
  
  //// Из комментариев.
  
  Dynasaur
  15 минут назад
  
  Невероятно! Поздравляю!
  Я бы не поверил, что такое возможно,
  если бы не узнал о вашем эксперименте.
  
  ......
  
  madcatdev
  5 часов назад
  
  Нейросети на 8-битном микоконтроллере с 2КБ памяти? Офигеть.
  
  ......
  
  //// Конец цитирования.
  
  Лично я просто "стоя аплодирую" и автору и переводчику
  такого замечательного материала, практически доказывающего,
  что сама идея нейросетей и даже с существующими методами машинного обучения,
  вполне себе реализуемы на совершенно ином классе вычислительных устройств,
  чем это обычно принято считать.
  И тут, скорее всего, основным препятствием будет
  даже не сама реализация инференса минимальными средствми,
  а отсутствие стандарта на взаимодействие между такими "микронейронками", см.:
  "Предчувствие мультимодальной революции".
  и вопрос "сертификации" таких решений, см.:
  "Основная проблема синтетического программирования".
  
  В общем, проблем на этом пути еще "выше крыши".
  Но как же приятно видеть примеры того, что нет предела человеческой
  целеустремленности, настойчивости и изобретательности.
  И еще радует, что в этой области программирования
  на "питоне" и монструозных библиотеках "свет клином не сошелся",
  и есть еще место для "доброго старого ассемблера".
  
  
  ========
  
  Тральщик Наставник. Модель Kandinsky 2.1 нарисовала:  95cfcf461d744c41ae79fb4651964f34_00000
  
  Тральщик Наставник. Модель Kandinsky 3.0 нарисовала:  efcd02a8553343b79e988c6c4da97c76_res_00000_image
  
  Тральщик Наставник. Модель Kandinsky 3.0 нарисовала:  db7a37e902e74fd5a44477e3f61beb84_res_00000_image
  
  Тральщик Наставник. Модель Kandinsky 3.1 нарисовала:  17772662d2504dcbadc96681a7ae794c_res_00000_image
  
  Тральщик Наставник. Модель Kandinsky 3.1 нарисовала:  c23b73f7-f8ce-4a66-9fc7-3e8fda53fa62
  Flag Counter
  Free counters!
  Flag Counter
  
 Ваша оценка:

Связаться с программистом сайта.

Новые книги авторов СИ, вышедшие из печати:
О.Болдырева "Крадуш. Чужие души" М.Николаев "Вторжение на Землю"

Как попасть в этoт список

Кожевенное мастерство | Сайт "Художники" | Доска об'явлений "Книги"