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

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

3 июля 2025 г.

Может ли ваша модель учиться быстрее, адаптироваться лучше и пропустить измельчение данных? С помощью переноса обучения и адаптации домены - да, это может.

Если вы тренировали модели глубокого обучения с нуля, вы знаете боль:

  • Долгие тренировочные циклы
  • Огромные маркированные наборы данных
  • Модели, которые разбиваются и сжигают в дикой природе

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

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

В этом руководстве:

  • Что на самом деле означают адаптацию обучения передачи и домены
  • Когда (и почему) они сияют
  • Практические прохождения Pytorch для обоих
  • Реальные сценарии, которые делают их незаменимыми

Давайте погрузимся.

Передача обучения: подключите к предварительному интеллекту

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

Прохождение Pytorch: Resnet тонкая настройка для пользовательской классификации

импортировать факел импортировать Torch.nn как nn Из моделей импорта Torchvision, преобразования, наборов данных от torch.utils.data import dataLoader

Transform = Transforms.compot ([[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[ Transforms.Resize ((224, 224)), Transforms.totensor (), преобразования. Нормализуются ([0,485, 0,456, 0,406], [0,229, 0,224, 0,225]), ])

train_data = datasets.imagefolder (root = 'data/train', transform = transform) val_data = dataSets.imageFolder (root = 'data/val', transform = transform) train_loader = dataLoader (train_data, batch_size = 32, shuffle = true) val_loader = dataLoader (val_data, batch_size = 32)

model = models.resnet50 (pretrined = true) Для Param in model.parameters (): Param.Requires_Grad = false model.fc = nn.linear (model.fc.in_features, 2) model.cuda ()

Criterion = nn.crossentropyloss () Optimizer = torch.optim.adam (model.fc.parameters (), lr = 1e-3)

Для эпохи в диапазоне (5): Для IMGS, этикетки в Train_Loader: imgs, labels = imgs.cuda (), labels.cuda () Optimizer.zero_Grad () Потеря = критерий (модель (IMGS), метки) потеря.backward () Optimizer.step () print (f "epoch {epoch+1}: потеря = {loss.item () :. 4f}")

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

Адаптация домена: когда данные сдвигаются, не паникуйте

Иногда задача одинакова, но ваши данные живут в совершенно другой вселенной. Думать:

  • Смоделированные и реальные изображения
  • Студийно-качественные звуки против шумных телефонных записей
  • Формальные обзоры продуктов по сравнению с повседневными твитами

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

Прожектор техники: адаптация состязательной области (стиль Данна)

Вот упрощенная версия, используя функцию Extractor + Discinator Duo:

импортировать Torch.nn как nn Импорт Torchvision.Models как модели

класс featureExtractor (nn.module): def __init __ (self): super () .__ init __ () base = models.resnet50 (pretrinated = true) base.fc = nn.identity () self.backbone = base

def forward(self, x):
    return self.backbone(x)

класс дискриминатор (NN.Module): def __init __ (self): super () .__ init __ () self.net = nn.sextential ( nn.linear (2048, 512), nn.relu (), nn.linear (512, 1), nn.sigmoid () )

def forward(self, x):
    return self.net(x)

Теперь мы тренируем систему, чтобы согласовать распределения функций по доменам:

feat_extractor = fastryExtractor (). cuda () discinator = discinator (). cuda () Criterion = nn.bceloss () opt_feat = torch.optim.adam (feat_extractor.parameters (), lr = 1e-4) opt_disc = torch.optim.adam (discinator.parameters (), lr = 1e-4)

Для эпохи в диапазоне (10): for (src_x, _), (tgt_x, _) в zip (train_loader, target_loader): src_x, tgt_x = src_x.cuda (), tgt_x.cuda ()

    # Train discriminator
    feat\_extractor.eval()
    src\_feat = feat\_extractor(src\_x).detach()
    tgt\_feat = feat\_extractor(tgt\_x).detach()
    
    src\_pred = discriminator(src\_feat)
    tgt\_pred = discriminator(tgt\_feat)
    loss\_disc = criterion(src\_pred, torch.ones\_like(src\_pred)) + \\
                criterion(tgt\_pred, torch.zeros\_like(tgt\_pred))
    opt\_disc.zero\_grad()
    loss\_disc.backward()
    opt\_disc.step()

    # Train feature extractor
    feat\_extractor.train()
    tgt\_feat = feat\_extractor(tgt\_x)
    fool\_pred = discriminator(tgt\_feat)
    loss\_feat = criterion(fool\_pred, torch.ones\_like(fool\_pred))

    opt\_feat.zero\_grad()
    loss\_feat.backward()
    opt\_feat.step()

print(f"Epoch {epoch+1} | Disc Loss: {loss\_disc.item():.4f} | Feat Loss: {loss\_feat.item():.4f}")

Сейчас вы выравниваете функции по доменам - никогда не касаясь меток с целевой стороны.

Когда вы должны их использовать?

Ситуация

Лучший подход

Небольшой набор данных, аналогичный настрой

Передача обучения

Немеченые целевой домен, большой сдвиг домена

Доменная адаптация

Стиль кросс-языка/текст

Самоподобный + адаптировать

Развертывание с рисунком

Адверслярный / MMD на основе

Ключевой вынос

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

Используйте их хорошо, и ваша модель не будет просто работать - это обобщает.


Оригинал
PREVIOUS ARTICLE
NEXT ARTICLE