
Как обучение передачи и адаптация домены позволяет создавать более умный ИИ (без большего количества данных)
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 на основе
Ключевой вынос
Трансферное обучение и адаптация доменов больше не являются передовыми-они являются предметами первой необходимости. Если вы хорошо настраиваете модели зрения или адаптируете между языками и средами, эти методы могут сделать ваш ИИумнее, быстрее, дешевлеПолем
Используйте их хорошо, и ваша модель не будет просто работать - это обобщает.
Оригинал