Не оставайтесь в стороне в эпоху генеративного ИИ. Укрепите свой фундамент с помощью первой революционной модели искусственного интеллекта, изменившей все.
Наша история начинается с проблемы безопасности, с которой столкнулся Звездный Флот: подделка значков. Командные значки — это строго регламентированные технологии, потому что их можно использовать для доступа к секретным военным системам. Разведка сообщила, что ромуланцы и клингоны заключили союз, чтобы подделывать значки для высокопоставленных офицеров. Одна попытка даже увенчалась успехом на первом шаге, но застряла на втором. Вот как Звездный Флот получил сигнал.
Чтобы разобраться в этом, Звездный Флот решил использовать преступный ум, чтобы сделать свою систему безопасности более надежной. Для этого доктора Г. вызвали со Звездной базы 47 в засекреченное учреждение Секции 31. Она была идеальным кандидатом для этого, потому что ее вырастили агенты ромуланского подполья после того, как ее нашли среди обломков разбившегося космического корабля, в котором погибли оба ее настоящих родителя (люди). Но она была позором для своей новой семьи, где ее братья-ромуланцы имели послужной список крупных мошенничеств, так как им было всего 6 лет. Позже она сбежала обратно в Федерацию, потому что ей не нравились подделки и другие незаконные вещи ее новые семья была в.
В секретном учреждении Секции 31 доктор Г. работал в паре с другим выдающимся ученым, доктором Д. Их полные имена не могут быть раскрыты из-за характера проекта (я, автор, раскрою их имена, как только эта история будет опубликована). над). Правила этого исследовательского проекта просты:
- Доктору Джи поручено создать поддельные значки с помощью самого сложного из существующих репликаторов.
- Доктору D поручено правильно определить, является ли значок настоящим или поддельным, из пула значков, в котором есть как настоящие значки, так и поддельные значки доктора Г.
- Если доктор D правильно идентифицирует поддельный значок как подделку, доктор G учится на своей ошибке и в следующий раз пытается сделать подделку лучше.
- Если доктор Д. неправильно идентифицирует поддельный или настоящий бейдж, доктор Д. учится на своей ошибке и пытается лучше идентифицировать бейджи.
В некотором смысле и доктор Г., и доктор Д. находятся в состоянии войны. С точки зрения теории игр, они являются противниками в игре обмана и обнаружения. Это также игра с нулевой суммой, в которой выигрыш одного является проигрышем другого. Это похоже на гонку ядерных вооружений. Эта игра может закончиться только тогда, когда будет достигнуто равновесие Нэша, в котором никто не может ничего выиграть по сравнению с другим. В этот момент навыки идентификации значков доктора Д. будут настолько сложными, что только доктор Г. сможет противостоять ему. Таким образом, он может разрабатывать системы безопасности, которые не могут взломать никакие враги Звездного Флота. Вот и вся цель этого проекта.
Доктор Г. и доктор Д. много лет работали вместе, и, наконец, этот момент настал. Никто не мог получить ничего по сравнению с другим.
Внезапно доктор Г. сделал что-то неожиданное. Она рассудила, что если доктор Д. сможет обнаружить все подделки значков, сделанные не ею, она также сможет создать идеальные поддельные значки, которые только один человек сможет распознать как подделку. И этот человек стоял прямо перед ней. Она немедленно создала фазовращатель с помощью своего усовершенствованного репликатора и тут же испарила доктора Д. Затем она стала звонить своим ромуланским родителям через подпространство: «Папа, ты будешь очень гордиться мной».
Именно так работает генеративно-состязательная сеть (GAN). Когда его статья была впервые опубликована в 2014 году, все изменилось. Впервые ИИ смог продемонстрировать совершенную креативность. Оригинал исследовательской работы:
GAN состоит из двух нейронных сетей, каждая из которых представлена доктором G и доктором D. Здесь доктор G — это генератор, а доктор D — дискриминатор. Их имена не случайны. Название Generator происходит от Generative AI, а Discriminator происходит от Discriminative AI (все нетворческие модели AI, которые выполняют классификацию и т. д., являются Discriminative AI).
Генератор начинает со случайных выходных данных и учится на обратной связи Дискриминатора (когда Дискриминатор правильно идентифицирует подделку как подделку). Дискриминатор — это обычный классификатор, который подвергается воздействию обучающих данных (настоящих копий), а также поддельных копий, созданных Генератором. Он учится, когда ему не удается правильно классифицировать настоящий или поддельный.
Когда достигается равновесие Нэша, Дискриминатор отбрасывается, и остается идеальная машина для подделки документов. Он может создавать новые элементы, относящиеся к классу обучающих данных. Творчество. Очевидно, что при неправильном использовании, как у доктора Джи, это может иметь катастрофические последствия (например, создание идеальных фейковых новостей или идеального фальшивого видео с политиком), но этот подлог все равно будет называться творчеством.
Достаточно теории. Давайте создадим настоящий генератор изображений. Эта демонстрация не преобразует текстовое описание в изображение, такое как Midjourney или DALL·E. Эти инструменты также используют LLM (большие языковые модели) для понимания подсказок пользователя, что выходит за рамки этой статьи.
Архитектура
Генераторы и дискриминаторы могут быть нейронной сетью любого типа в зависимости от поставленной задачи. Поскольку здесь задействованы изображения, мы можем использовать здесь CNN (сверточные нейронные сети). Такие GAN называются DCGAN (глубокие сверточные генеративно-состязательные сети). Они работают одинаково.
Архитектура Генератора и Дискриминатора одинакова, но наоборот.
Тренировочные данные
Мы будем использовать стандартный набор данных Fashion MNSIT в качестве обучающих данных. Набор данных включает 60000 изображений, каждое с разрешением 28x28.
Единственная причина, по которой я не выбрал полноцветный набор данных изображений с высоким разрешением, заключается в том, что это было бы дорого в вычислительном отношении (это проблема даже с быстрыми графическими процессорами, поскольку GAN не могут лучше использовать параллелизм). Модели ProGAN (Progressively Growing GAN) — это разные варианты GAN, которые используются для обучения на таких изображениях. В любом случае, процесс построения и обучения GAN практически одинаков.
Генератор зданий
Генератор принимает случайный вектор шума в качестве входных данных, использует инвертированные/транспонированные сверточные слои для восстановления изученных функций и выдает изображения 28x28 в качестве выходных данных.
latent_dim = 100 def build_generator(latent_dim): model = Sequential() n_nodes = 128 * 7 * 7 model.add(Dense(n_nodes, input_dim=latent_dim)) model.add(LeakyReLU(alpha=0.2)) model.add(Reshape((7, 7, 128))) model.add(Conv2DTranspose(128, (3,3), strides=(2,2), padding='same')) model.add(LeakyReLU(alpha=0.2)) model.add(Conv2DTranspose(128, (3,3), strides=(2,2), padding='same')) model.add(LeakyReLU(alpha=0.2)) model.add(Conv2D(1, (7,7), activation='sigmoid', padding='same')) return model generator = build_generator(latent_dim) generator.summary()
Здесь входом в нейронную сеть Генератора является 100-мерный случайный вектор. Первый слой сети имеет 128 узлов патчей 7x7. Эти патчи подаются на первый слой Conv2DTranspose и преобразуются в патчи 14x14, а затем в другой слой транспонирования, который преобразует выходные данные в изображения 28x28.
Эта архитектура дает 934913 обучаемых параметров.
Строительный дискриминатор
Дискриминатор — это обычный классификатор, который принимает на вход изображения размером 28x28 и классифицирует их как настоящие или поддельные.
def build_discriminator(in_shape=(28,28,1)): model = Sequential() model.add(Conv2D(64, (3,3), strides=(2, 2), padding='same', input_shape=in_shape)) model.add(LeakyReLU(alpha=0.2)) model.add(Dropout(0.4)) model.add(MaxPooling2D()) model.add(Conv2D(64, (3,3), strides=(2, 2), padding='same')) model.add(LeakyReLU(alpha=0.2)) model.add(Dropout(0.4)) model.add(Flatten()) model.add(Dense(1, activation='sigmoid')) opt = Adam(learning_rate=0.0002, beta_1=0.5) model.compile(loss='binary_crossentropy', optimizer=opt, metrics=['accuracy']) return model discriminator = build_discriminator() discriminator.summary()
Здесь вход в нейронную сеть «Дискриминатор» — это вектор 28x28x1 (есть один канал, так как это изображение в оттенках серого). Это подается в сверточный слой. После этого результаты объединяются с помощью функции MaxPooling2D. Эта функция собирает похожие функции и уменьшает размерность ввода. Оттуда используется другой слой Conv2D для извлечения дополнительных функций. Выпадающие слои использовались для предотвращения переобучения.
Эта архитектура дает 38593 обучаемых параметра.
Здание DCGAN
Создать DCGAN несложно. Мы подключаем Генератор и Дискриминатор последовательно, чтобы обратное распространение решения Дискриминатора могло обновить веса и смещения Генератора.
def build_gan(g_model, d_model): d_model.trainable = False model = Sequential() model.add(g_model) model.add(d_model) opt = Adam(learning_rate=0.0002, beta_1=0.5) model.compile(loss='binary_crossentropy', optimizer=opt) return model gan = build_gan(generator, discriminator) gan.summary()
Используя d_model.trainable = False, мы зафиксировали веса и смещения дискриминатора. Вы можете видеть в сводке DCGAN, что только параметры генератора могут быть обучены. Это важно, потому что нам нужно одновременно обучать Генератор или Дискриминатор.
Это также означает, что нам нужно обучать Дискриминатор отдельно.
Обучение DCGAN
Обучение DCGAN может быть сложным из-за зависимости Генератора и Дискриминатора друг от друга.
batch_size = 16 epochs = 10 bat_per_epo = int(dataset.shape[0] / batch_size) half_batch = int(batch_size / 2) for i in range(epochs): for j in range(bat_per_epo): X_real, y_real = generate_real_samples(dataset, half_batch) X_fake, y_fake = generate_fake_samples(generator, latent_dim, half_batch) X, y = np.vstack((X_real, X_fake)), np.vstack((y_real, y_fake)) d_loss, _ = discriminator.train_on_batch(X, y) X_gan = generate_latent_vector(latent_dim, batch_size) y_gan = np.ones((batch_size, 1)) g_loss = gan.train_on_batch(X_gan, y_gan) summarize_performance(i, generator, discriminator, dataset, latent_dim)
Этот код работает с двумя циклами: один для количества эпох, а другой для циклического перебора пакетов изображений в каждую эпоху. Для каждой партии мы извлекаем образцы реальных изображений и генерируем набор поддельных изображений. Мы складываем эти наборы данных и передаем их дискриминатору для обучения. После этого мы генерируем скрытые случайные векторы и передаем их в качестве входных данных в DCGAN.
В конце 1-й эпохи это результат:
В конце 5-й эпохи это результат:
Вы можете увидеть детали, формирующиеся на изображениях.
Это окончательный результат после 10-й эпохи:
Эти изображения являются оригиналами, которых нет в обучающем наборе данных, но они принадлежат к тому же классу. Модель можно обучать на большее количество эпох для улучшения качества.
На этом статья заканчивается. Хотя сейчас разработаны лучшие генеративные модели, такие как Stable Diffusion, GAN продолжают оставаться важными генеративными моделями.
Коды этой статьи можно найти здесь.