Умножая монохромные картинки как матрицы
Feb. 2nd, 2021 01:58 amУмножение матриц - штука крайне интересная. Один из необычных способов смотреть на это дело - интерпретировать монохромные картинки как матрицы, и умножать их друг на друга матричным умножением. Я не видел, чтобы кто-то так делал, хотя было бы странно, если бы до сих пор никто такое не пробовал.
Получается весьма забавное абстрактное искусство, особенно если нормализовать строчки левой матрицы и столбцы правой матрицы, так чтобы элементы в них суммировались к единице. Например, получается такое

или такое

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

или такое

Пояснения в комментариях.
no subject
Date: 2021-02-02 07:24 am (UTC)https://nbviewer.jupyter.org/github/anhinga/github-tests/blob/main/Untitled.ipynb
детали вычислений (Jupyter Notebook, Julia programming language):
5: монохромная обезьяна (мандрил)
8: транспонированная обезьяна
* 43: транспонированная обезьяна умножить на обезьяну
51: самолёт
* 52: самолёт умножить на обезьяну
79: нормализовать строчки (горизонтальные линии) самолёта софтмаксом
80: нормализовать столбцы (вертикальные линии) обезьяны софтмаксом
81: транспонировать нормализованную обезьяну (т.е. у транспонированной
обезьяны нормализованы строки - горизонтальные линии)
*** 82: матрица 80 умножить на 81 (без нормализации, см. картинку 43)
*** 83: матрица 79 умножить на 81 (без нормализации, см. картинку 52)
no subject
Date: 2021-02-02 05:37 pm (UTC)no subject
Date: 2021-02-02 08:50 pm (UTC)Вообще, я это делаю в порядке поиска новых плодотворных матричных neural operators...
Это довольно длинная история, надо попробовать её записать, а то она у меня вся существует в виде клочков и обрывков (такой побочный эффект, когда нет начальства, и необязательно кому-то объяснять, на что тратишь время; в более стандартной ситуации уже давно бы надо было сделать нормальную презентацию на эту тему; а так оно всё существует в разнообразных обрывках; впрочем, важнее добиться успеха, чем делать презентацию на тему о том, почему стоит копать в этом направлении; но основные мотивы наверное можно собрать вместе).
no subject
Date: 2021-02-02 09:00 pm (UTC)Но одно дело говорить, а другое - на самом деле сделать. Вот, за последние пару лет классные энергичные люди это сделали на самом деле, и получилось очень здорово, теперь это - одно из модных направлений:
https://vsitzmann.github.io/siren/
Вот, хочется добиться успеха примерно в таком духе, как добились эти люди...
no subject
Date: 2021-02-02 09:43 pm (UTC)Пару лет назад я осознал, что та операция, которая в обычных нейронных сетях со скалярными потоками данных является умножением матрицы на вектор, в моих сетях с векторными потоками является умножением матриц. Тем самым, фундаментальная асимметрия между весами сети и преобразованными данными, которые текут по сети, исчезает. Я решил, что это любопытно, написал на эту тему небольшую неформальную заметку, и, в частности, написал там, что "это на будущее, когда-нибудь мы к этому вернёмся, а сейчас, как кажется, это слишком далеко от непосредственных нужд и приоритетов".
В прошлом году, после успехов GPT-3 стало невозможно и дальше игнорировать Transformers, и пришлось заняться подробным рассмотрением того, как они устроены внутри. Оказалось, что умножение матриц там играет вполне фундаментальную роль, и, вообще, что связи между Transformers и Dataflow matrix machines вполне глубокие.
Вот, из этого обстоятельства выросла некоторая последовательность заметок и текстов. В частности, последний из этих текстов говорит, "давайте вдохновимся примером синуса, как активационной фунцкции, и тем, насколько плодотворно этот самый синус (как функция трёх аргументов, sin(a*x+y)) используется в digital audio synthesis, и попробуем сделать что-то в этом роде в матричной форме":
https://github.com/anhinga/2020-notes/blob/master/attention-based-models/matrix-mult-machines.md
no subject
Date: 2021-02-02 10:13 pm (UTC)https://github.com/anhinga/2020-notes/tree/master/attention-based-models
а также уже чуть-чуть устаревшая секция 10 августовской версии https://www.cs.brandeis.edu/~bukatin/dmm-collaborative-research-agenda.pdf
и ряд заметок в этом блоге, но более важный вопрос, что со всем этим делать...
Вот, я думаю, что надо воспользоваться новым трендом делать "смешанные модели", который становится всё более популярным.
Сначала люди стали вставлять нейронные сети в качестве аппроксиматоров фунции в свои системы дифференциальных уравнений, в те места, про которые они были не особо уверены, как они в точности должны выглядеть, и это получалось очень здорово, в плане прикладных результатов.
Потом начался весь этот тренд перехода к "дифференциальному программированию", когда фрагменты моделей вставляются прямо в компьютерный код, и получающаяся программа и является моделью. Этот тренд популярен как в Джулии, так и в новой Питоновской machine learning framework, JAX, на которую полностью перешёл DeepMind в последнее время.
Это замечательные гибкие системы, они умеют считать градиенты по параметрам для функций, выраженных "почти любыми разумными программами" (реально, с некоторыми ограничениями, но не очень страшными).
Вот, я думаю, что правильный подход - не пытаться делать какую-то альтернативную "высокопринципиальную чистую систему", а просто придумывать новые "матричные" neural operators и модели, сделанные с их использованием, которые плодотворно было бы вставлять в дифференциальные программы.
***
(От "высокопринципиальных чистых вариантов" в этом смысле тоже есть кое-какой толк, но это - отдельный разговор; на эту тему у меня есть некоторая новая "ретро-заметка" про то, нельзя ли всё же это вставить в наш старинный PyTorch или ещё более старинный TensorFlow, и там объясняется, как это можно было бы сделать и зачем, и, в частности, там приходится говорить о пользе "высокопринципиальных чистых вариантов". Но, на самом деле, конечно, надо просто переползать на JAX (Python) или на Julia Flux, и не заморачиваться с PyTorch и всяким таким, ну разве что будет заказчик на это дело: если кому-то специально очень захочется, чтобы это было в чём-то таком старинном, как PyTorch или TensorFlow, и этот кто-то готов вложить в это дело ресурсы, то можно и заморочиться на эту тему.)
no subject
Date: 2021-02-03 06:35 am (UTC)https://towardsdatascience.com/a-quick-introduction-to-neural-arithmetic-logic-units-288da7e259d7
https://github.com/AndreasMadsen/stable-nalu
Если взять их реализацию за пример, то сделать любую свою функцию активации - очень просто.
А вообще интересно) Спасибо за наводку, надо будет почитать про JAX.
Интересно, можно ли сделать условную функцию активации? В последних работах гугла было что-то подобное.
no subject
Date: 2021-02-03 09:32 am (UTC)https://en.wikipedia.org/wiki/Activation_function
но в нём много не хватает; во-первых, нет многих популярных функций от двух аргументов, например, умножения (умножение на ноль как раз даёт неэффективный но действующий вариант условной активации)...
во-вторых, они все работают на скалярных потоках - можно их применять к элементам тензоров поэлементно, но бывает множество интересных преобразований тензоров (например, матриц), которые не сводятся к применению поэлементной активационной функции.
например, для создания вот этой анимации
https://youtu.be/fEWcg_A5UZc
я, в частности, использую вот такую функцию активации (она "immutable переставляет" индексы в матрице):
https://github.com/anhinga/fluid/blob/master/may_9_15_experiment/custom_wave_transform.pde
no subject
Date: 2021-02-03 09:37 am (UTC)no subject
Date: 2021-02-03 09:57 am (UTC)Но синтетическое :-)