Форум
Форум
FAQ
Поиск
Пользователи
Группы
Награды
Регистрация
Профиль
Судоку
Войти и проверить личные сообщения
Вход
Список форумов Форум
->
Наука и технологии
Ответить
Имя
Тема
Сообщение
Смайлики
Дополнительные смайлики
Цвет шрифта:
По умолчанию
Тёмно-красный
Красный
Оранжевый
Коричневый
Жёлтый
Зелёный
Оливковый
Голубой
Синий
Тёмно-синий
Индиго
Фиолетовый
Белый
Чёрный
Размер шрифта:
Размер шрифта
Очень маленький
Маленький
Обычный
Большой
Огромный
Закрыть теги
Настройки
HTML
ВЫКЛЮЧЕН
BBCode
ВКЛЮЧЕН
Смайлики
ВКЛЮЧЕНЫ
Отключить в этом сообщении BBCode
Отключить в этом сообщении смайлики
Часовой пояс: GMT
Перейти:
Выберите форум
Информационно-аналитический раздел
----------------
Политика
Религия
Спорт
Разное
----------------
Культура
Мысли вслух
Кабинет Психолога
Сновидения
Кулинария
Сад-огород
Цифровые технологии
----------------
Игры
Наука и технологии
Служебный раздел
----------------
Форум
Database Maintenance
Обзор темы
Автор
Сообщение
Rasty
Добавлено: Сб Мар 27, 2021 10:27 am
Заголовок сообщения:
в трех измерениях (каждый кадр - срез по оси Z):
Эт один из возможных 18014398509481984 клеточных автоматов, Конвеевского типа. Если считать вообще все возможные автоматы - их около 2^134217728.
Добавлено: Пт Мар 26, 2021 3:53 pm
Заголовок сообщения:
у меня рубашка такая когда-то была
Rasty
Добавлено: Чт Мар 25, 2021 1:13 pm
Заголовок сообщения:
Интересно, почему никто до сих пор не догадался использовать клеточные автоматы вместо свертки
Эти две операции (свертка и клеточный автомат) очень сильно похожи. Только вот клеточный автомат можно очень неплохо так оптимизировать - там же по сути только побитовые сдвиги, в свертке же умножение, что более ресурсозатратно. Кроме оптимизации есть еще один плюс - в клеточном автомате не нужна функция активации. Там на выходе бинарные значения. В свертке же на выходе пропускают все выходные сигналы через функцию активации, чтобы значения не улетели в +- бесконечность. Есть, правда и недостаток - не очевидно (вероятно не только не очевидно, но и не возможно), как посчитать производную, чтобы обучить сеть обратным распространением ошибки. Но есть другие способы оптимизации. Генетический алгоритм тот же.
Картиночки сгенерированы тем же способом, что и выше, только с использованием клеточных автоматов вместо свертки:
Spoiler:
3D еще попробую сделать и буду пытаться слепить GAN (generative adversarial network) из этой xуйни. Лишь бы памяти хватило
Slav
Добавлено: Пт Авг 14, 2020 11:36 am
Заголовок сообщения:
xуй его знает как оно вот так вот у тебя получилось, но да, красиво смотриться)
Rasty
Добавлено: Пт Авг 14, 2020 10:05 am
Заголовок сообщения:
Весьма забавная xуйня получается
Короче свёртка, всего одно ядро. На поверхности тора, естессно, как в клеточных автоматах - пиксели за левой границей берем на границе справа (для остальных границ - соответственно). Берем картиночку 2х2 пикселя. Делаем свертку. Дальше увеличиваем картиночку до 4х4 пикселей - делаем копию пикселя 4 раза в квадратике 2х2 вокруг пикселя. После нескольких итераций очень быстро уёбует в +-бесконечность, поэтому ставим ограничение (от балды) 16 сверху и -16 снизу.
Получаются вот такие зверушки:
Свертку делали с граничными условиями, поэтому зверушка находится на поверхности тора:
Крупным планом:
Если в ядре заменить один элемент на случайный:
Или на другой случайный:
Охуенно то, что таким же xуем можно сделать свертку в 3-х измерениях и третье использовать как время - тогда зверушки начинают двигаться. Пока хорошую зверушку в трех измерениях не нашел - гифку не из чего лепить. Можно туда генетический алгоритм прикручивать для поиска.
Spoiler:
3d нормально так выедает
Rasty
Добавлено: Вс Янв 12, 2020 11:37 am
Заголовок сообщения:
Матрицу развертки пока не посчитал. Чтобы ее посчитать - надо очень много травы скурить. Но чисто поиграться - можно и без нее. Короч, схемка та же:
Admin писал(а):
В обратную сторону можно сделать, например так:
Взяли четыре слоя, смешали, получили один слой, четыре раза развернули, получили четыре слоя, нашли среднее значение для каждого элемента, получили один слой (не исходный, конечно, из-за проебанной в процессе пулинга информации, но с
признаками
, которые нейросеть обучилась выделять).
Вместо развертки сделал со сверткой. На входе массив состоящий из 16384 значений (4 в седьмой степени). Элементы массива групируются по 4, делается unpooling, дальше четыре свертки через 4 сверточных ядра (для всей системы всего 4 ядра используется, сгенерированных рандомно в самом начале, значения от -16 до 16, целые числа). Дальше средние значения. Все это циклически повторяется 7 раз.
Для входного массива [1, 0, 0, 0, 0, 0, ...] - первый элемент 1, остальные нули:
Черные пиксели - отрицательные значения, белые - положительные.
Для входного массива [1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0 ...] - чередуются 1, 0, 0, 0:
Slav
Добавлено: Пт Янв 10, 2020 3:13 pm
Заголовок сообщения:
Это не для среднего ума, жесть.
Rasty
Добавлено: Пт Янв 10, 2020 1:47 pm
Заголовок сообщения:
Ебусь
Короч, сча попробую сформулировать задачу, над которой уже вторую неделю мучаюсь
В обычной нейросети (персептроне), каждый нейрон связан со всеми входами через свои весовые коэффициенты (которые определяются во время обучения нейросети). Картиночку выше рисовал с одним нейроном:
Admin писал(а):
По затратам времени на вычисления, штука эта весьма прожорливая. Например, если на входе у нас картинка размером 100х100 пикселей, и в скрытом слое 100 нейронов - нам надо определить 100х100х100=1000000 весовых коэффициентов. И это только для одного слоя нейросети.
Существует более крутая штука, чем персептрон - сверточная нейронная сеть. Фактически, это сейчас самый ТОПчик - AlphaGo реализован с помощью сверточной нейронной сети. Deepfake, который сейчас весьма популярен, реализован с помощью сверточной нейронной сети.
В сверточной нейронной сети есть две ключевые операции - свертка (convolution) и субдискретизация (subsampling, pooling).
Свертка:
В сверточной сети у нас есть ядро свертки (kernel) - это фактически матрица с весовыми коэффициентами, которую мы определяем во время обучения сети.
Что мы с этим ядром делаем? Берем входной слой (изображение, например). Во входном слое берем каждый элемент с координатами x и y. Вокруг элемента выделяем область с тем же размером, что и ядро свертки. Далее умножаем каждый элемент входного слоя на соответствующий элемент ядра свертки. Суммируем. Сумму записываем в те же координаты (x и y) в выходном слое. (С граничными условиями пока не ясно - я так понял, с ними никто особо не заморачивается).
Свертка позволяет выделить в исходной картинке некоторые
признаки
. Какие конкретно - тайна покрытая мраком. Сеть сама их для себя определяет в процессе обучения, настраивая ядро свертки.
На примере того же котяры. Оригинальный котяра сверху. Внизу 12 котяр свернутых рандомными свертками (размер ядра 5х5):
Для одного входного слоя делается сразу несколько сверток с разными ядрами, для того, чтобы можно было выделить несколько признаков на входном слое. Нет четкого понимания, сколько сверток надо делать для входного слоя и какой размер должен быть у ядра свертки. Числа эти берут от балды. Например, ядро свертки размером 3х3, два раза сворачиваем входной слой.
Вторая ключевая операция - субдискретизация (pooling). Эта операция сжимает картинку. Была картинка 100х100, стала 50х50. Есть два вида:
Разбиваем картинку на непересекающиеся квадратики 2х2. Далее на выбор: или берем максимальное значение в пределах каждого квадратика, или считаем среднее арифметическое. Чаще всего используют первый вариант (максимальное значение).
Обе операции максимум примитивные. В сверточной нейронной сети, кроме эти двух операций больше нихуя нет
Схема сверточной нейронной сети:
Берем исходную картинку. Свернули. Получили несколько слоев. Слои сжали. Дальше слои свернули, сжали, свернули, сжали... получили однопиксельные картинки или массив чисел (
скаляров
). Этот массив на вход в персептрон, который занимается классификацией или еще какой полезной ерундой.
В чем самый кайф сверточных нейронных сетей?
Входной слой, для удобства, можно рассматривать в виде вектора. То есть, берем исходную картинку пиксели записываем в виде строки (на самом деле столбца, если говорить о векторах). Например, картинка 5х5, пиксели пронумеровал, записал в виде строки:
(то, что на выходе получим, точно так же из строки в картинку преобразуем)
Умножение этого вектора на ядро свертки можно записать в менее наглядном, но в более понятном (в терминах линейной алгебры) виде. Например, чтобы получить первый элемент
выходного
вектора, умножение (с учетом периодических граничных условий) будет выглядеть так:
Берем первый элемент
входного
вектора, умножаем на элемент E ядра свертки, к нему прибавляем элемент 2 умноженный на F, элемент 3 умноженный на 0, элемент 4 умноженный на 0, элемент 5 умноженный на D и т.д.
Для остальных элементов выходного вектора:
Получили матрицу. Умножаем эту матрицу на входной вектор - получаем выходной вектор.
Операция умножения матрицы на вектор обратима. Это система линейных уравнений. Линейные уравнения научились решать еще древние китайцы династии Чжоу (X век до н.э. — III век до н.э.). Система линейных уравнений имеет одно решение, если определитель (детерминант) матрицы (которую я выше нарисовал) не равен нулю и множество решений - если определитель равен нулю.
То есть, решив систему линейных уравнений, можно найти для
выходного
вектора
входной
вектор.
Или проще: картинку можно свернуть и можно развернуть обратно.
Со сверткой разобрались - она обратима. Вторая операция, субдискретизация - необратима из-за того, что мы проебуем часть информации (которую считаем несущественной). Для max pooling мы проебуем 3 значения и проебуем позицию, где находилось максимальное значение. В принципе, тут довольно широкая область для экспериментов - как заебошить хороший анпулинг и как тот или иной анпулинг будет влиять на конечный результат.
Короч. Взяли сверточную нейросеть. Обучаем ее отличать кошек от собак. Даем сетке картинку, на выходе персептрон с двумя нейронами. Один говорит, что это на 99% кошка, второй говорит, что это на 5% собака. Погрешность в пределах нормы - сеть обучилась.
Ебошим в обратную сторону. Говорим нейросети: нарисуй нам на 50% кошку и на 50% собаку. На выход персептрона кидаем эти значения. Пробежались по весовым коэффициентам на вход перспетрона. Получили массив чисел (
скаляров
) - таких же, которые получаем в процессе сверток и пулинга. Для каждого числа делаем анпулинг каким-нить выбранным способом. Дальше разворачиваем через ядра свертки, которые получили в процессе обучения. Дальше опять анпулинг, развертка, анпулинг, развертка, ... Получаем на 50% кошку, на 50% собаку.
Чисто навскидку. В одну сторону процесс выглядит так:
Взяли исходный слой, четыре раза свернули, получили четыре слоя, каждый сжали.
В обратную сторону можно сделать, например так:
Взяли четыре слоя, смешали, получили один слой, четыре раза развернули, получили четыре слоя, нашли среднее значение для каждого элемента, получили один слой (не исходный, конечно, из-за проебанной в процессе пулинга информации, но с
признаками
, которые нейросеть обучилась выделять).
Осталось придумать, как решить систему линейных уравнений, чтобы сделать развертку. Над этой задачкой ебусь вторую неделю.
Умею пользоваться тремя методами - матричным методом и методами Крамера и Гаусса.
Метод Крамера исключительно муторный - для каждого значения в выходном векторе надо считать детерминант матрицы (вот той сверточной матрицы, которая выше - E,F,0,0,D,H,I,...). Причем, если слой размером 100х100, выходные и входные вектора тогда размером 10000, размер сверточной матрицы тогда будет 10000х10000 и посчитать детерминант такой не детской матрицы (в универе мы 3х3 матрицы считали) придется 10001 раз. 1 раз - детерминант сверточной матрицы и 10000 раз детерминант, заменяя в сверточной матрице соответствующий столбец выходным вектором. Не реально.
Метод Гаусса тоже весьма прожорливый, но самый простой (до Гаусса им те самые древние китайцы пользовались). Метод реализуется в два этапа. Первый этап - преобразовываем сверточную матрицу так, чтобы получить ниже главной диагонали нули. Получили решение для последнего элемента входного вектора. Подставляем значение, получили решение для предпоследнего элемента входного вектора и т.д.
Матричный метод - самый шустрый. Суть:
Есть у нас входной вектор x, выходной вектор y и матрица A. Умножение (матричное) матрицы на вектор запишем так:
Существует обратная матрица - такая, умножение которой на матрицу A даст единичную матрицу E:
Единичная матрица - это матрица, в которой везде нули, кроме главной диагонали, на которой единицы. Умножив единичную матрицу на вектор получим тот же вектор:
Умножаем правую и левую часть на обратную матрицу:
В левой части получили вектор входных значений, в правой - обратная матрица умноженная на вектор выходных значений:
Чтобы посчитать вектор входных значений - надо найти обратную матрицу и умножить ее на вектор выходных значений.
Один из способов нахождения обратной матрицы - делим единицу на определитель матрицы и умножаем на транспонированную матрицу составленную из алгебраических дополнений. Алгебраические дополнения, в свою очередь, тоже считаются через определители (причем определители матрицы размерность n-1). Считать это все дело можно рекурсивно (пока не придумал, как).
Самое главное преимущество матричного метода в том, что нам один раз надо найти обратную матрицу: обучили сеть, получили ядра свертки, для каждого ядра свертки один раз нашли матрицу развертки. Дальше умножаем любой выходной вектор на матрицу развертки и получаем входной вектор. Операция умножения матрицы на вектора - такая же шустрая, как и операция свертки. В методах же Крамера и Гаусса, нам каждый раз надо пересчитывать всю матрицу.
В матричном методе есть и недостаток. Если детерминант матрицы равен нулю - этот метод не работает.
Как же ту рекурсию сделать-то
В принципе, можно убрать граничные условия (нахуя нам тот тор), чтобы было меньше заебов:
Тяжело. Пойду лучше бутерброд слопаю.
Slav
Добавлено: Пт Янв 03, 2020 11:59 am
Заголовок сообщения:
Rasty
Добавлено: Пт Янв 03, 2020 10:17 am
Заголовок сообщения:
Сидел после Нового Года от травы отходил, читал Википедию и ВНЕЗАПНО понял, как работают сверточные нейронные сети
Экспериментального котяру посворачивал:
Rasty
Добавлено: Вс Дек 29, 2019 7:40 pm
Заголовок сообщения:
В данном случае, обучается выживать в некоторых заданных условиях.
Смотри, что вообще за хуита эти "нейросети".
Spoiler:
Цитата:
"Многослойный перцептрон - это просто математическая функция, отображающая множество входных значений на множество выходных."
Самый простой нейрон - это сумма множества "входные сигналов" умноженных на соответствующие им "весовые коэффициенты".
Входными сигналами могут быть, например, цвета пикселей на картинке. Черный пиксель - 0 на вход, белый пиксель - 1 на вход. Весовые коэффициенты - константы, которые мы редактируем в процессе обучения, чтобы научить нейрон активироваться (выдавать нужное число на выходе) только когда на входы поступают "правильные" сигналы. Сигнал на выходе считается максимум просто:
y=x1*w1+x2*w2+...+xn*wn
Например, обучаем нейрон распознавать цифру 3 на картинке. Пиксели на картинке - xn. Устанавливаем весовые коэффициенты wn таким образом, чтобы сумма была максимальной, если на входе тройка, и минимальной, если на входе другая цифра. Следующий нейрон обучаем распознавать девятку. Для него тоже устанавливаем соответствующие весовые коэффициенты. Для каждого нейрона свои весовые коэффициенты, которые никак не зависят от весовых коэффициентов других нейронов. Два нейрона, например:
Циферки размером 3х5 пикселей такая нейронка распознает без проблем (в самом начале этой темы ссылка и исходник на PHP), но если сделать картинки побольше - нейронка начинает тупить. Не только картинку побольше - перевернешь картинку вверх ногами и нейросеть ее больше не распознает. Решается это добавлением "скрытый слоев" в нейронку. Выходы нейронов в каждом скрытом слое являются входами для нейронов в следующем слое. На картинке пример с двумя слоями:
Скрытые слои не распознают картинку, а учатся выделять некоторые свойства картинки. Например, кружочки или палочки на картинках, если пытаемся обучить сеть распознавать цифры. Слой на выходе уже не напрямую с пикселями работает, а с кружочками и палочками из скрытого слоя.
Все нейросетки делаются по вышеописанному принципу, с некоторыми модификациями. Сложность нейросети не в архитектуре, а в способе обучения. Много разных способов напридумывали, как обучить нейросеть. Самый кайф той системы, что я тут на днях напридумывал в том, что нейросеть вполне можно обучить генетическим алгоритмом. Даже не так. Самый кафй в том, что обучение нейросети - одна из тех задач, которые решаются генетическим алгоритмом.
Каждая особь ("генотип" каждой особи) в генетическом алгоритме - это массив с весовыми коэффициентами, которые нам надо подобрать (подобрать коэффициенты = обучить сеть). В начальной популяции, состоящей из некоторого числа особей, эти коэффициенты заполняются случайным образом. Каждая особь в популяции пытается решить определенную задачу - берем коэффициенты из массива (генотипа) особи, подставляем в нейросеть, смотрим, что нейросеть дает на выходе. Далее считаем количество ошибок сделанных каждой особью. Те особи, которые чаще всего ошибаются - уничтожаются. Те, которые реже ошибаются - размножаются. Размножение - берем две лучшие особи, смешиваем их генотипы (массивы с весовыми коэффициентами), добавляем мутаций (несколько рандомных чисел записываем в массив), получаем две особи, которыми заменяем двух уничтоженных особей. Если повторять это многократно (решение задачи -> генетический алгоритм -> решение задачи -> генетический алгоритм ->) - в популяции будут оставаться особи, которые делают все меньше и меньше ошибок.
Задача, которую пытаются решить нейросети (в той модели, которую я тут напрограммировал) - необычная. Кайф в том, что они решают ее не по отдельности, а совместно. То есть, нейросеть, кроме всего прочего должна понимать, что рядом с ней может находится плохо обученная нейросеть, которая делает ошибки и, тем самым, мешает решить задачу.
В том виде, в котором сейчас это дело у меня во вкладке запущено, задача выглядит следующим образом. Есть поле 200х200 клеток. На поле 200 красных точек, 200 зеленых и 200 синих. Красные точки - это особи-нейросетки, синие и зеленые - боты, которые не двигаются. Красные спавнятся в верхней части поля, зеленые - в центральной, синие - в нижней. У каждой точки есть параметр hp (у ботов тоже). Когда особь добавляется на поле (при первом запуске или после скрещивания, когда плохие особи убираются с поля и вместо них добавляются новые), ей устанавливается значение hp равное 10000. За один цикл (один цикл - каждая сетка смотрит, что находится вокруг нее и делает ход в одном из 9-ти направлений) особь теряет 1 hp. Красные едят зеленых, синие едят красных (зеленые едят синих, но это не происходит, томущо они спавнятся в разных областях и не двигаются). Как едят? Если красная становится в клетку, где находится зеленая - hp красной увеличивается на 100 за один цикл, hp зеленой уменьшается на 100. Если красная становится в клетку, где находится синяя - у красной уменьшается hp, у синей - увеличивается. Чем больше стартовое hp - тем дольше живет особь и тем тщательней происходит отбор (тщательней собирается статистика для отбора).
После инициализации, все точки заспавнились в своих областях:
6000 циклов. Красные равномерно заполняют поле:
30000 циклов. Большая часть красных занимает область, где спавнятся зеленые и старается не лезть в область с синими:
85000 циклов:
400000 циклов:
523000 циклов:
Вот здесь реализация:
http://xcont.com/n/rgb/
Как это реализовано. Фактически, здесь три поля, вместо одного. Одно поле - на котором размещаются красные точки, второе - зеленые, третье - синие. Каждая особь видит вокруг область 11х11=121 пикселей вокруг своих координат (клетки, где она находится). 121 на красном поле, 121 на зеленом и 121 на синем. Итого 363 входа. В скрытом слое находится 121 нейрон (число взято от балды - предположительно, чем больше нейронов в скрытом слое - тем умнее сеть). В выходном слое 9 нейронов, отвечающих за изменение координат особи.
Вот так это безобразие выглядит в динамике после 7-ми часов обучения:
[youtube]http://youtube.com/watch?v=XIbkmkw-8PA[/youtube]
Slav
Добавлено: Вс Дек 29, 2019 6:07 am
Заголовок сообщения:
Нейронка
Rasty
Добавлено: Сб Дек 28, 2019 11:05 pm
Заголовок сообщения:
Кто?
Slav
Добавлено: Сб Дек 28, 2019 5:40 pm
Заголовок сообщения:
а шо она делает?
Rasty
Добавлено: Сб Дек 28, 2019 12:12 pm
Заголовок сообщения:
[youtube]http://youtube.com/watch?v=Tf0f28pmz7Y[/youtube]
Powered by phpBB © 2001, 2005 phpBB Group
Русская поддержка phpBB