Как переносить данные (например, веса или признаки) из одной ML-модели в другую?

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

Ответ

Перенос знаний (Transfer Learning) — это мощный метод, особенно когда данных для новой задачи мало. Вот основные подходы:

1. Использование предобученной модели как фичейного экстрактора:

from tensorflow.keras.applications import ResNet50
from tensorflow.keras import layers, models

# Загружаем модель, обученную на ImageNet, без верхних полносвязных слоев
base_model = ResNet50(weights='imagenet', include_top=False, input_shape=(224, 224, 3))

# Замораживаем все слои базовой модели
base_model.trainable = False

# Сверху добавляем свои слои для новой задачи
x = layers.GlobalAveragePooling2D()(base_model.output)
x = layers.Dense(256, activation='relu')(x)
output = layers.Dense(10, activation='softmax')(x) # 10 новых классов

model = models.Model(inputs=base_model.input, outputs=output)
model.compile(optimizer='adam', loss='categorical_crossentropy')
# Теперь обучаем только новые, добавленные слои
model.fit(new_dataset, ...)

2. Тонкая настройка (Fine-Tuning): После начального обучения на новых данных, можно разморозить часть слоев предобученной модели для совместного дообучения.

# Размораживаем последние 10 слоев ResNet50
base_model.trainable = True
for layer in base_model.layers[:-10]:
    layer.trainable = False

# Важно: используем очень маленькую скорость обучения для тонкой настройки
model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=1e-5), ...)
model.fit(new_dataset, ...)

3. Перенос для табличных данных (например, в ансамблях):

  • В библиотеках типа XGBoost или LightGBM можно использовать параметр init_model или model_path для инициализации новой модели весами старой, что ускоряет обучение.
  • Можно извлечь важность признаков (feature_importances_) из обученной модели и использовать её для отбора признаков или взвешивания потерь в новой задаче.

Ключевые соображения:

  • Совместимость данных: Предобученная модель ожидает определенного распределения входных данных (например, нормализацию ImageNet). Нужно применять идентичную предобработку.
  • Схожесть задач: Перенос наиболее эффективен, когда исходная и целевая задачи семантически близки (например, распознавание разных типов транспортных средств).