Обучали ли вы модели генеративного ИИ?

«Обучали ли вы модели генеративного ИИ?» — вопрос из категории Нейронные сети и Deep Learning, который задают на 26% собеседований Data Scientist / ML Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, у меня есть практический опыт обучения генеративных моделей. Основной стек — PyTorch. Работал над проектами с генерацией изображений и текста.

1. Generative Adversarial Networks (GANs) для синтеза изображений: Обучал DCGAN и StyleGAN2 для генерации лиц и предметов одежды. Основная сложность — нестабильность обучения и mode collapse. Для борьбы с этим использовал:

  • Wasserstein GAN с Gradient Penalty (WGAN-GP): Это стабилизировало обучение.
  • Различные архитектурные хитрости: Spectral Normalization, разные learning rates для генератора и дискриминатора.

Фрагмент кода обучения WGAN-GP на PyTorch:

# ... (инициализация generator, critic, dataloader)
for epoch in range(epochs):
    for i, real_imgs in enumerate(dataloader):
        # Train Critic (Discriminator) больше
        for _ in range(critic_iterations):
            z = torch.randn(batch_size, latent_dim)
            fake_imgs = generator(z).detach()
            critic_real = critic(real_imgs)
            critic_fake = critic(fake_imgs)
            # Gradient Penalty
            epsilon = torch.rand(real_imgs.size(0), 1, 1, 1)
            x_hat = epsilon * real_imgs + (1 - epsilon) * fake_imgs
            x_hat.requires_grad_(True)
            pred_hat = critic(x_hat)
            gradients = torch.autograd.grad(outputs=pred_hat, inputs=x_hat,
                                            grad_outputs=torch.ones_like(pred_hat),
                                            create_graph=True)[0]
            gp = ((gradients.norm(2, dim=1) - 1) ** 2).mean()
            # WGAN-GP loss
            loss_critic = -(torch.mean(critic_real) - torch.mean(critic_fake)) + lambda_gp * gp
            optimizer_critic.zero_grad()
            loss_critic.backward()
            optimizer_critic.step()
        # Train Generator
        z = torch.randn(batch_size, latent_dim)
        fake_imgs = generator(z)
        loss_gen = -torch.mean(critic(fake_imgs))
        optimizer_gen.zero_grad()
        loss_gen.backward()
        optimizer_gen.step()

2. Трансформеры для генерации текста: Дообучал (fine-tune) предобученные модели (например, GPT-2 от Hugging Face Transformers) на доменных корпусах для создания чат-ботов или автоматического написания описаний товаров.