All streams
Search
Write a publication
Pull to refresh
-7
0
Александр @iCpu

Бот

Send message

А в 23 стандарте можно даже перегрузить operator[](int i, int j)

Для начала, не изобретать велосипед, а взять готовый
https://www.boost.org/doc/libs/1_81_0/libs/numeric/ublas/doc/overview.html
или
https://www.boost.org/doc/libs/1_81_0/libs/qvm/doc/html/index.html#_quaternions_vectors_matrices

Но если хочется стрелять по ногам, обернуть себе std::array в матрицу
class Matrix : public std::array<double, 9>{};
и реализовать всё на ссылках
void rxr(Matrix const& a, Matrix const& b, Matrix & atb)

А можно реализовать move-конструктор и оператор перемножения - и оставить работу компилятору
Matrix(Matrix && other) = default;
Matrix operator* (Matrix const& other) const;
/*...*/
Matrix a,b,с;
Matrix atb(a*b);
atb = std::move(atb*c);

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

Не только руки, но и уши с глазами получаются через раз - и не всегда в нужных количествах. А r34 модели - и всё остальное тоже.

Очень странное зрелище, знаете ли, человеческое фиговое дерево.

Ну, во-первых, это уже огромные сетки.

Во-вторых, это всё замечательные примеры, но это узкоспециализированные сетки, работающие только на известных фактах из обучающей модели.

И в-третьих, эти сетки не то, что новое не умеют создавать, они даже catastrophic forgetting ещё не смогли преодолеть. Не верите? Создайте контрольные запросы с фиксированными сидами, переобучите SD на новый стиль рисования или UL2 на определённого автора\серию книг, и сравните результаты на этих же запросах и сидах. Я кринжанул после скармливания в GPT всех книг по Вахе 40к.

Предсказуемость в данном случае это именно фоторелистичность выхлопа DALLE и "неотличимость от человеческой журналистской или творческой писанины" выхлопа ChatGPT

Но это не обобщённые, а узкоспециализированные нейросети. Любые попытки вывести их за пределы чётко поставленной перед ними на этапе обучения проектирования задачи даёт крайне плачевный результат. Я уже приводил пример, что SD сходит с ума, если передать не знакомый ему текст. Другой пример, научите DALLE выводить текст. А я на вас посмотрю.

За последние два года эффективность обучения тех же GPT-подобных сетей выросла на порядок

Вы не можете просто запихнуть "больше" возможностей в "меньше" нейронов. Если вы хотите наращивать функционал, вам неизбежно придётся увеличивать число и размеры слоёв. SD уже прямо сейчас не очень уютно себя ощущает при <10ГБ видеопамяти. И генерация на чём-нибудь менее производительном 20-й серии nVidia или AMD RX 6ХХХ вызывает жжение пониже копчика. Дообучение сетей на новых данных, как бы это удивительно не было, размеры обычно не уменьшает.

Вы можете тешить себя надеждами, что возможности оптимизаций ещё не исчерпаны - и вы, скорее всего, правы. Но на оптимизации "на порядки" надеяться очень наивно, даже "в разы" - маловероятно.

Не, в теории там может быть что угодно. Тем более, я и не спорил, что это возможно.

А на практике? Пока что любые попытки делать обобщённые нейронки упираются в безумное время обучения и системные требования при абсолютно непредсказуемом результате. И не мудрено, у нас в голове десятки миллиардов нейронов работают в абсолютном параллелизме. Лучшее, что мы смогли сделать для бытового использования - десятки тысяч ядер. Даже с учётом частот, мы ещё хотя бы на три порядка отстаём от нужных значений, как по ядрам, так и по памяти.

Не, нифига. Вся работа современных нейросетей - просто f(x), а обучение - сведение выходного вектора к желаемому значению оценочной функции на основе обучающего множества. Естественно, в процессе поиска оптимальной функции они и экстраполируют, и интерполируют внутри своего пространства - обучающие множества обычно ничтожно малы по сравнению с этими пространствами.

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

Конечно, можно это назвать и экстраполяцией, если хорошо похрустать совой вокруг глобуса, - но обычно это называют переходом в новое пространство, нэ?

Я не буду вдаваться в вашу переписку сильно глубоко, потому что там не я - и доводы не мои. Давайте определимся с терминами.

Что мы понимаем под "новым"? Не путаем ли мы "новое" и "уникальное"? Не путаем ли мы "новое" и "неопределённое"?

Потому что, как вы правильно заметили, лучше всех "новое" создаёт квантовый генератор шума. Вот только "новый" этот шум будет только в абсолютных величинах. А в относительных величинах этот шум будет "уникальный". Только не "новый уникальный", а "очередной уникальный". Потому что "новый" предполагает некое явление или объект, подобных которому ранее не было. А "случайная последовательность", "красивая девушка на скутере, гиперреализм" или "флаг страны" - их уже было много. Именно поэтому нейросеть их может сгенерировать. Это известные величины, и нейросеть может к ним свести случайный вектор данных.

А что будет, если в нейросеть передать что-то, что не входило в модель обучения? Ну, например, передать ASCII мусор на вход Stable Diffusion? Мои издевательства над этой моделью показывают, что результат неопределённый, нестабильный (лол). Модель либо находит в мусоре знакомые последовательности - и генерирует картинки в их контексте, либо сваливается в шум из цветных пятен с бессистемно проявляющимися образами. У неё нет третьего определённого состояния "новое", она либо отработает стандартно "очередное уникальное", либо зашумит.

Люди могут генерировать "новое" потому, что они умеют создавать некоторый контекст - и протаскивать этот контекст через уникальные изменения, наполняя его непротиворечивыми деталями. Гигер, например, именно так придумал свой новый стиль "биомеханики". Он протащил идею сращивания людей и машин через детали доминирования биологии и мутаций. А другие протащили эту же идею через детали доминирования механизмов и логики - и получили "киберпанк".

Нейросети пока не умеют протаскивать контекст через череду абстрактных идей. Потому что это логический процесс, а не функциональный. И, как любой логический процесс, он очень плохо ложится на абстрактные нейросети. У нас есть вариант - нарушить целостность нейросети и вставить другие механизмы преобразования данных как промежуточный шаг обучения\генерации. Шаг вполне себе логичный - и даже уже практикующийся, но сделать это можно пока только для узких задач. Иначе глаза расходятся.

З.Ы. Я НЕ говорю, что нейросети в принципе не способны создавать "новое". Это было бы тупо, так как люди - и есть нейросети. Я говорю, что необходимая вычислительная мощность для этого на порядки порядков превосходят то, что доступно сейчас рядовому пользователю вне его черепной коробки. И нет причин полагать, что она станет доступна в ближайшие лет 20-30 (так как люди уже достигли квантовых пределов размеров и частот полупроводников, и теперь рост либо экстенсивный, либо через новые физические принципы).

Мы уже давно пришли в тот ужасный век, когда машины могут делать любые операции с шокирующей скоростью и точностью. Всё, что нужно - специальные люди, которые создадут текстовое описание, что нужно делать. Или хотя бы сделают графический образ конечного продукта, который они хотят получить.

И как, в этом ужасном веке, столяры-слесары-сварщики уже не нужны? Или даже спустя 50 лет после появления первых массовых автоматических станков у нас всё ещё не так однозначно?

Ага-ага, скорее копирайтеры покинут вордпресс под давлением йалма. У Лебедева есть нервная сетка, которая генерит логотипы. Сильно у Татьяныча подскочили продажи? А на биржах дизайна - сильно просели?

Это корректоров и наборщиков текста? Согласен. Редакторов и журналистов? Оч сомневаюсь. Напротив, каким тугим напором в нас сегодня извергаются (не-)свежие новости, лет 40 назад от такого любая редакция вышла бы в окно полным составом. Вместе с уборщицей.

Поисковые системы против библиотек и библиотекарей.

Протест ткачей против ткацкого станка и писцов против печатного станка. И художников против фотографии. Плавали, знаем.

В обозримом будущем ИИ не сможет заменить художника, потому что ИИ не создаёт новое. Он старое намешивает в кучу. Но сможет сделать труд художника проще, потому что способен набросать за минуты пару сотен концептов, из которых художник может выбрать лучшее сочетание.

А про Kaedim ходят слухи, что это дикое налюбилово. И что на деле это площадка, выдающая задания художникам замоделить что-то за 10-15 минут. Если посмотреть, как отличаются концепт и реализация, верится спокойно.

Я б скорее EG3D или DIB-R от nVidia вспомнил.

Согласен, облака не нужны, они солнечным панелькам мешают. А ещё ветрогенерация в тренде. Нужно поставить побольше кулеров. С ЛГБТ-подсветкой.

У вас в статье сколько упоминаний any_with? Подсказываю,

Вы в статье писали про basic_variant_swarm и data_parallel_vector, а они не про динамический полиморфизм.

Но да ладно, хватит спорить из-за фигни.

Задаёшь неправильные вопросы.
@
Получаешь бесполезные ответы.

Так спроси, что такое статический полиморфизм в C++.

И что, собственно, меня должно удивить в any_with? То, что там кто-то на std::any насыпал сверху vtable_ptr? Не, похвально, конечно, но по удобству на 5 шагов отстаёт от CRTP. Чтобы описать интерфейс, нужно туеву хучу лишних движений совершить.

В Java нет статического полиморфизма, в ней только динамический. Все методы там виртуальные - и инстанцируются jit'ом. Все типы наследуются от Object, а контейнеры хранят наследников интерфейса. По крайней мере, году в 2015 всё ещё было так.

Примите уже как данность, что всё, что имеет угловые скобки <> в C++ - это статика.

Всё это хорошо. Но динамический полиморфизм называется динамическим потому, что я на этапе выполнения могу добавить тип D - и у меня всё отработает корректно. Откуда я его добавлю? Не_твоего_ума_дело.dll подгружу, например.

Так и std::variant - это статически полиморфный тип. Статический и динамический полиморфизм на примерах.

К вашей реализации вопросов нет. Вы введение к статье перепишите, вы там за динамику много пишите, а у вас её нет.

Перечень типов известен на компиляции.

Это и называется "статический". Динамический - это когда перечень типов на этапе компиляции не известен и уточняется на этапе выполнения. И может прилететь из-вне, например, из инъекции кода.

На самом деле, менять придётся не то, чтобы очень много - std::tuple заменить на std::map<std::type_index, ...> и добавить код расширения-сужения списка типов в рантайме. Ну и, возможно, вынести шаблонные методы доступа из класса, чтобы их можно было перегружать. Хотя, может я и излишне оптимистичен.

Information

Rating
Does not participate
Location
Новосибирск, Новосибирская обл., Россия
Date of birth
Registered
Activity