Data Science DL

Transfer Learning (перенос обучения, трансферное обучение)

Transfer Learning – это метод машинного и глубокого обучения, при котором модель, обученная для решения одной задачи, используется для решения другой (часто подобной) задачи.

Transfer Learning — это стратегия, при которой модель сначала обучают на большом и общем датасете (например, на миллионах текстов), а потом переносят полученные знания на решение другой, более узкой и специфичной задачи.

Использование уже обученной модели позволяет экономить время и вычислительные ресурсы.

Основная идея Transfer Learning

В качестве обученной модели часто используют большие модели типа ResNet, BERT и т.д. Они могут быть использованы для извлечения признаков (Feature Extraction).

Или же такая большая модель дообучается (Fine Tuning) на более узкой задаче.

Что такое Fine-tuning?

Fine-tuning — это второй этап transfer learning. Как это выглядит на практике:

  • Взять уже обученную модель (например, DistilBERT, ResNet и др.),
  • добавить свой “головной” слой (например, классификатор),
  • и дообучить всю модель или её часть на своем датасете (например, астрофизические статьи).

Fine-tuning может быть:

  1. Полным — обновляются веса всей модели (включая слои трансформера).
  2. Частичным — “замораживаются” базовые слои, а обучается только классификатор (head).

Представим, что есть опытный переводчик, знающий 10 языков (предобученная модель). Мы обучаем его жаргону астрофизиков — это и есть fine-tuning.

Что дает Transfer Learning

  • Требуется меньше данных для обучения.
  • Обучение происходит значительно быстрее.
  • Повышается точность в задачах, для которых мало данных.

Полезные аналогии

Быть учеником, который уже окончил школу, и теперь осваивает новую специальность, используя старые знания.

Мы не обучаем большую модель с нуля. Модель уже знает, как устроен язык. Мы просто учим её распознавать конкретную эмоцию в тексте — позитив или негатив. Это и есть перенос обучения.

Примеры

Пример из компьютерного зрения

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

Вместо того чтобы обучать CNN с нуля:

  1. Используем предобученную модель ResNet, обученную на ImageNet (где миллионы изображений).
  2. Удаляем последний слой (классификатор на 1000 классов).
  3. Добавляем новый слой, например, на 10 классов растений.
  4. Дообучаем (fine-tune) модель на своих 500 изображениях.

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

Пример из NLP

Допустим, необходимо классифицировать научные тексты по темам (например, философия, физика, биология), но у нас мало примеров.

  1. Используем предобученную модель BERT, обученную на огромных корпусах текста (Wikipedia + книги).
  2. Добавляем сверху классификационный слой.
  3. Дообучаем на своей задаче (topic classification по коротким фрагментам текста).

Пример кода с использованием Transfer Learning для классификации астрофизических текстов

from transformers import DistilBertTokenizerFast, DistilBertForSequenceClassification, Trainer, TrainingArguments
from sklearn.model_selection import train_test_split
from datasets import Dataset
import torch

# Пример астрофизических текстов и меток
texts = [
    "The Hubble Space Telescope observed gravitational waves from merging black holes.",
    "Scientists found new exoplanets orbiting nearby stars.",
    "The asteroid belt lies between Mars and Jupiter.",
    "Quasars are extremely luminous active galactic nuclei.",
    "Recent gamma-ray bursts may be linked to the collapse of massive stars.",
    "Gravitational waves are ripples in space-time caused by massive events.",
    "The Andromeda galaxy is approaching the Milky Way.",
    "NASA detected a potential signal from a distant black hole."
]

labels = [
    5, 0, 1, 4, 2, 6, 3, 5  # категории: 0-планеты, 1-астероиды, 2-звезды, 3-галактики, 4-квазары, 5-черные дыры, 6-грав.волны
]

# Разделим на train/test
train_texts, val_texts, train_labels, val_labels = train_test_split(texts, labels, test_size=0.2)

# Токенизация
tokenizer = DistilBertTokenizerFast.from_pretrained('distilbert-base-uncased')
train_encodings = tokenizer(train_texts, truncation=True, padding=True)
val_encodings = tokenizer(val_texts, truncation=True, padding=True)

# Создаем датасеты
train_dataset = Dataset.from_dict({**train_encodings, 'label': train_labels})
val_dataset = Dataset.from_dict({**val_encodings, 'label': val_labels})

# Модель
model = DistilBertForSequenceClassification.from_pretrained('distilbert-base-uncased', num_labels=7)

# Аргументы обучения
training_args = TrainingArguments(
    output_dir='./results',
    evaluation_strategy="epoch",
    per_device_train_batch_size=4,
    per_device_eval_batch_size=4,
    num_train_epochs=3,
    logging_dir='./logs',
    logging_steps=10,
)

# Trainer
trainer = Trainer(
    model=model,
    args=training_args,
    train_dataset=train_dataset,
    eval_dataset=val_dataset,
)

# Обучаем
trainer.train()

# Оцениваем
trainer.evaluate()
Вставить формулу как
Блок
Строка
Дополнительные настройки
Цвет формулы
Цвет текста
#333333
Используйте LaTeX для набора формулы
Предпросмотр
\({}\)
Формула не набрана
Вставить