Изучение возможностей GAN в финансах

Представьте, что вы специалист по данным, который проводит исследования в банке и собираетесь опубликовать новую научную статью. Давайте возьмем данные из банка, алгоритм и результаты и начнем писать статью, легко, верно?

Ну нет! Сразу останавливаемся на части «давайте возьмем данные из банка». Большинство банков не желают выдавать свои данные для каких-либо публикаций, так как они слишком конфиденциальны.

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

Одно из возможных решений: генеративно-состязательные сети — GAN

Генеративно-состязательные сети (GAN) — это новый тип модели глубокого обучения, фокусирующийся на том, что еще может «генерировать» что-то, как уже упоминалось в их названии.

GAN — горячая тема, особенно в сфере финансов, когда речь идет о предотвращении или обнаружении мошеннического поведения или при проведении исследований в сотрудничестве с университетами.

Ответ:

В финансах трудно публиковать какую-либо внутреннюю информацию, поскольку она содержит слишком много конфиденциальных данных. Следовательно, вы не сможете легко найти какие-либо реальные транзакции или данные о клиентах в Интернете, которые не были бы полностью подделаны. Таким образом, GAN открывают здесь новую дверь возможностей: Генерация синтетических данных на основе реальных данных, которые обычно можно публиковать…

Прежде чем банк позволит вам публиковать синтетические данные, основанные на их реальных данных, вам нужно доказать, что эти данные не имеют отношения ни к одному из их клиентов, и, возможно, они все же скажут вам не упоминать институт, но я думаю, что это возможно, верно. ? Чтобы вам было еще проще, загляните сюда: https://www.sciencedirect.com/science/article/pii/S0893608022002374.

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

Генератор и дискриминатор GAN

Сети GAN состоят из двух основных компонентов: генератора и дискриминатора.

С одной стороны, «Генератор» отвечает за создание новых данных, что очевидно, верно? Таким образом, дискриминатор должен решить, являются ли данные поддельными или реальными, верно?

Точно! "Дискриминатор" на другой стороне отвечает за определение того, являются ли синтетические данные реальными или поддельными.

Таким образом, две нейронные сети работают вместе, чтобы оптимизировать свои результаты.

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

Ботанический будильник!

Ранее мы узнали, что такое GAN, что в основном это две части, работающие вместе, но в основном друг против друга, чтобы создать что-то великое.

Звучит как жена и муж, в результате чего ребенок xD

Позвольте мне вернуться к делу. Сети GAN особенно полезны в тех случаях, когда реальные данные трудно получить, они конфиденциальны или слишком дороги.

Создавая синтетические данные, финансовые учреждения могут обучать и тестировать свои модели ИИ, не беспокоясь о конфиденциальности или доступности данных. Помните исследовательскую задачу и заявку на конференцию «сливки»? ДА, теперь это снова возможно благодаря GAN.

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

Позвольте мне представить вам очень общий код GAN, я называю его "GAN для начинающих"

import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt

# Define the generator model
def generator_model():
    model = tf.keras.Sequential()
    model.add(tf.keras.layers.Dense(256, input_dim=100, activation='relu'))
    model.add(tf.keras.layers.BatchNormalization())
    model.add(tf.keras.layers.Dense(512, activation='relu'))
    model.add(tf.keras.layers.BatchNormalization())
    model.add(tf.keras.layers.Dense(1024, activation='relu'))
    model.add(tf.keras.layers.BatchNormalization())
    model.add(tf.keras.layers.Dense(np.prod(X_train.shape[1:]), activation='sigmoid'))
    model.add(tf.keras.layers.Reshape(X_train.shape[1:]))
    model.compile(loss='binary_crossentropy', optimizer='adam')
    return model

# Define the discriminator model
def discriminator_model():
    model = tf.keras.Sequential()
    model.add(tf.keras.layers.Flatten(input_shape=X_train.shape[1:]))
    model.add(tf.keras.layers.Dense(1024, activation='relu'))
    model.add(tf.keras.layers.Dense(512, activation='relu'))
    model.add(tf.keras.layers.Dense(256, activation='relu'))
    model.add(tf.keras.layers.Dense(1, activation='sigmoid'))
    model.compile(loss='binary_crossentropy', optimizer='adam')
    return model

# Define the combined model
def gan(generator, discriminator):
    model = tf.keras.Sequential()
    model.add(generator)
    discriminator.trainable = False
    model.add(discriminator)
    model.compile(loss='binary_crossentropy', optimizer='adam')
    return model

def load_real_data():
    # Generate 1000 data points
    data_points = np.random.normal(0, 1, (1000, 100))

    # Normalize the data to [0, 1]
    data_points = (data_points - np.min(data_points)) / (np.max(data_points) - np.min(data_points))
    return data_points


# Load your real data
X_train = load_real_data()

# Train the GAN
batch_size = 128
num_epochs = 1000
latent_dim = 100
discriminator = discriminator_model()
generator = generator_model()
gan = gan(generator, discriminator)
steps_per_epoch = X_train.shape[0] // batch_size

# Define the number of epochs
epochs = 200
noise_dim = 100

# Train the GAN for the specified number of epochs
for epoch in range(epochs):
  
  # Define the number of steps per epoch
  steps_per_epoch = X_train.shape[0] // batch_size
  
  # Train the discriminator
  for step in range(steps_per_epoch):
    
    # Select a batch of real data points from X_train
    real_data = X_train[step * batch_size:(step + 1) * batch_size]
    
    real_labels = np.ones((batch_size, 1))
    fake_labels = np.zeros((batch_size, 1))
    
    # Generate a batch of fake data points
    noise = np.random.normal(0, 1, (batch_size, noise_dim))
    fake_data = generator.predict(noise)
    
    # Train the discriminator on the real data
    real_loss = discriminator.train_on_batch(real_data, real_labels)
    
    # Train the discriminator on the fake data
    fake_loss = discriminator.train_on_batch(fake_data, fake_labels)
    
    # Compute the average loss for this step
    discriminator_loss = 0.5 * (real_loss + fake_loss)
  
  # Train the generator
  noise = np.random.normal(0, 1, (batch_size, noise_dim))
  generator_loss = gan.train_on_batch(noise, real_labels)
  
  # Print the losses for every 20 epochs
  if epoch % 20 == 0:
    print("Epoch {}/{} - Discriminator Loss: {:.4f} - Generator Loss: {:.4f}".format(
      epoch + 1, epochs, discriminator_loss, generator_loss))

Позвольте мне внести ясность в неразбериху с кодом…

Код определяет и обучает генеративно-состязательную сеть (GAN) в TensorFlow 2.0.

Ранее мы узнали, что GAN состоит из двух частей: сети генератора и сети дискриминатора.

Сеть генератора генерирует синтетические образцы, которые пытаются имитировать заданный обучающий набор;
в то время как сеть дискриминатор принимает как реальные образцы из обучающего набора, так и сгенерированные образцы, и пытается провести различие между ними.

Две сети обучаются вместе состязательным образом, при этом генератор пытается сгенерировать выборки, которые обманывают дискриминатор, а дискриминатор пытается правильно идентифицировать настоящие выборки. (Режим детектива включен!🕵️)

Во-первых, у нас есть функция generator_model(), которая содержит многоуровневую полностью подключенную нейронную сеть, использующую Sequential API из модуля tf.keras TensorFlow для создания «Сети генератора».
→ Сеть имеет различные конфигурации, начиная с входного слоя, состоящего из 100 единиц, и полностью подключенного к скрытому слою из 256 единиц, который затем нормализуется в пакетном режиме и подключается к другому скрытому слою из 512 единиц, который снова пакетно-нормализованный и подключенный к другому скрытому слою из 1024 единиц.
→ Наконец, выходной слой имеет то же количество единиц, что и обучающие данные, и использует сигмовидную функцию активации для создания двоичного вывода. Модель скомпилирована с бинарной кросс-энтропийной потерей и оптимизатором Адама.

Во-вторых, у нас есть еще одна функция под названием discriminator_model(), которая также состоит из многослойной полностью связанной нейронной сети.
→ Входной слой принимает форму обучающих данных и сглаживает их в одномерный массив, а затем полностью соединяется со скрытым слоем из 1024 единиц, который затем соединяется с другим скрытым слоем из 512 единиц, который затем подключается к другому скрытому слою из 256 единиц. Наконец, выходной слой имеет 1 единицу и использует сигмовидную функцию активации для создания двоичного вывода, указывающего, является ли ввод реальным образцом или поддельным образцом.

Модель также скомпилирована с бинарной кросс-энтропийной потерей и оптимизатором Адама.

Комбинированная модель GAN определяется в функции gan() и состоит из моделей генератора и дискриминатора, наложенных друг на друга. Генератор обучается на вводе шума и реальных метках, а дискриминатор устанавливается необучаемым, поэтому во время обучения обновляется только генератор. Комбинированная модель скомпилирована с бинарной кросс-энтропийной потерей и оптимизатором Адама.

Наконец, функция load_real_data() генерирует 1000 точек данных из нормального распределения и нормализует данные в диапазоне [0, 1]. Затем модели генератора и дискриминатора обучаются вместе с использованием реальных данных в переменной X_train для 200 эпох по 128 выборок на партию. Потери как для генератора, так и для дискриминатора печатаются каждые 20 эпох.

→ Я знаю много китайского 難, 难Позвольте мне попытаться описать это очень простыми словами (Не судите меня за это объяснение!)

Во-первых, существует программа, которая создает что-то под названием «Сеть генераторов», используя сложные математические операции. Эта сеть имеет разные слои, каждый из которых состоит из множества маленьких частей, называемых «единицами». Программа соединяет все эти блоки вместе и обеспечивает их правильную совместную работу. Генераторная сеть принимает случайный ввод и выдает результат, который выглядит как реальные обучающие данные.

Затем есть еще одна программа, которая называется «Сеть дискриминатора». Она похожа на детектива, который просматривает выходные данные сети генераторов и решает, настоящие они или фальшивые. Эта программа также имеет различные уровни и блоки, которые работают вместе для принятия решений. Сеть дискриминатора обучается с использованием реальных данных, поэтому она знает, как должны выглядеть реальные данные.

Затем две программы объединяются в одну программу под названием «ГАН». GAN похож на команду Сети Генератора и Сети Дискриминатора, работающих вместе. Сеть Генератора пытается обмануть Сеть Дискриминатора, делая вывод, который выглядит реальным, а Сеть Дискриминатора пытается поймать поддельный вывод.

Наконец, программа создает некоторые поддельные данные и некоторые реальные данные и использует их для обучения GAN. GAN узнает, как сделать вывод, который выглядит реальным, работая вместе с сетью дискриминатора. После завершения обучения программа проверяет, насколько хорошо работала GAN, просматривая свои «потери» или допущенные ошибки, и распечатывает их.

Оставьте мне несколько комментариев ниже, чтобы сказать мне, что вы думаете об этом объяснении!

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

…прежде чем вы вернетесь к другой моей статье.

GAN можно использовать для генерации синтетических данных для:

  • Оценка кредитных рисков для улучшения их практики кредитования;
  • Алгоритмическая торговля для разработки более сложных и эффективных торговых стратегий;
  • Прогнозирование рынка для принятия более обоснованных инвестиционных решений и снижения их подверженности риску;
  • Обнаружение мошенничества, чтобы лучше выявлять мошеннические действия и сокращать убытки финансовых институтов.

Темная сторона GAN

После того, как мы узнали, насколько фантастичны GAN, я хочу вернуть вас на землю, прежде чем вы посетите Нептун.

  1. Нестабильность обучения:сложно обучать, генератор выдает только несколько видов выходных данных, а генератор/дискриминатор застревает в цикле, пытаясь превзойти друг друга.
  2. Чувствительность к гиперпараметрам.Точная настройка может быть сложной и трудоемкой, и даже малейшее изменение может оказать существенное влияние на качество генерируемых данных.
  3. Предвзятый вывод:GAN потенциально могут воспроизводить и усиливать любые искажения, присутствующие в данных обучения, например: если данные обучения предвзято относятся к определенной расе или полу, сгенерированные данные также могут выявить это предубеждение.
  4. Ресурсоемкие: им требуются большие объемы данных и вычислительных ресурсов, а их обучение может занять много времени.

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

Как всегда, есть проблемы и ограничения, но их можно преодолеть при тщательном планировании и сосредоточении внимания на высококачественных данных.

Если вам понравилось это читать, посмотрите следующее видео, в котором объясняется, как «GAN используются для генерации табличных синтетических данных».

Вам понравилось? Следуй за мной: Кристоф Аттен

Вы можете найти меня на Medium, Twitter и LinkedIn. Давайте вместе наслаждаться наукой о данных, машинным обучением и инновациями!

P.S. Если вы нажмете кнопку «Мне нравится» или оставите комментарий, мое сердце, занимающееся наукой о данных, сделает удар или два, если вы нажмете его дважды ;)

Подпишитесь на DDIntel Здесь.

Посетите наш сайт здесь: https://www.datadriveninvestor.com

Присоединяйтесь к нашей сети здесь: https://datadriveninvestor.com/collaborate