Введение в fastai
fastai — это высокоуровневая библиотека машинного обучения на Python, построенная поверх PyTorch, которая радикально упрощает создание, обучение и применение современных нейронных сетей. Разработанная исследователями Джереми Ховардом и Сильваном Гугжаром, библиотека используется как в академических курсах ведущих университетов, так и в коммерческих проектах крупных компаний.
Основная философия fastai заключается в предоставлении максимально простого интерфейса для решения сложных задач машинного обучения, при этом сохраняя возможность глубокой настройки и кастомизации. Библиотека позволяет достигать state-of-the-art результатов буквально в нескольких строках кода.
Ключевые особенности и преимущества fastai
Высокоуровневый API поверх PyTorch
fastai построена на базе PyTorch, но предоставляет гораздо более удобный и интуитивный интерфейс. Это означает, что вы получаете всю мощь PyTorch с минимальными усилиями по написанию кода.
Поддержка множества типов задач
Библиотека поддерживает широкий спектр задач машинного обучения:
- Классификация изображений
- Сегментация объектов
- Обработка естественного языка
- Табличные данные
- Коллаборативная фильтрация
- Генерация изображений и текста
- Регрессионные задачи
Встроенные современные техники обучения
fastai автоматически применяет передовые методы обучения нейронных сетей:
- One Cycle Policy для оптимизации скорости обучения
- Mixup и CutMix для аугментации данных
- Progressive resizing для работы с изображениями
- Label smoothing для улучшения генерализации
- Automatic mixed precision для ускорения обучения
Предобученные модели и transfer learning
Библиотека предоставляет доступ к множеству предобученных архитектур:
- ResNet, EfficientNet, RegNet для компьютерного зрения
- LSTM, AWD-LSTM для обработки текста
- UNet для сегментации
- Трансформеры через интеграцию с HuggingFace
Мощные инструменты визуализации и интерпретации
fastai включает встроенные инструменты для анализа и интерпретации моделей, что критически важно для понимания работы алгоритмов и отладки.
Установка и начальная настройка
Установка библиотеки
Для установки fastai рекомендуется использовать conda или pip:
# Установка через conda (рекомендуется)
conda install -c fastai fastai
# Или через pip
pip install fastai
Импорт основных модулей
# Для работы с изображениями
from fastai.vision.all import *
# Для работы с текстом
from fastai.text.all import *
# Для работы с табличными данными
from fastai.tabular.all import *
# Для коллаборативной фильтрации
from fastai.collab import *
Архитектура fastai и основные компоненты
DataBlock API
DataBlock API — это декларативный подход к описанию данных, который позволяет четко определить, как загружать, обрабатывать и подавать данные модели.
dblock = DataBlock(
blocks=(ImageBlock, CategoryBlock),
get_items=get_image_files,
get_y=parent_label,
splitter=RandomSplitter(),
item_tfms=Resize(224),
batch_tfms=aug_transforms()
)
Learner — центральный класс обучения
Learner инкапсулирует модель, данные, функцию потерь, оптимизатор и метрики в единый объект, упрощая процесс обучения.
Система Callbacks
Callbacks позволяют добавлять функциональность в процесс обучения:
- EarlyStoppingCallback для раннего останова
- SaveModelCallback для сохранения лучших весов
- CSVLogger для логирования метрик
- ReduceLROnPlateau для адаптивного изменения learning rate
Mid-level API
При необходимости fastai предоставляет доступ к PyTorch-уровню для тонкой настройки и кастомизации.
Работа с изображениями
Классификация изображений
# Загрузка данных
path = untar_data(URLs.PETS)
files = get_image_files(path/"images")
# Функция для извлечения меток
def label_func(fname):
return re.match(r'^[a-zA-Z_]+', fname.name).group(0)
# Создание DataLoaders
dls = ImageDataLoaders.from_name_func(
path, files, label_func,
item_tfms=Resize(224),
batch_tfms=aug_transforms()
)
# Создание и обучение модели
learn = vision_learner(dls, resnet34, metrics=accuracy)
learn.fine_tune(3)
Сегментация изображений
# Загрузка данных для сегментации
path = untar_data(URLs.CAMVID_TINY)
dls = SegmentationDataLoaders.from_label_func(
path, bs=8, fnames=get_image_files(path/"images"),
label_func=lambda o: path/"labels"/f"{o.stem}_P{o.suffix}",
codes=np.loadtxt(path/"codes.txt", dtype=str)
)
# Создание U-Net модели
learn = unet_learner(dls, resnet34, metrics=Dice())
learn.fine_tune(10)
Детекция объектов
# Загрузка данных для детекции
path = untar_data(URLs.COCO_SAMPLE)
dls = ObjectDetectionDataLoaders.from_df(
df, path, folder="train",
label_func=get_annotations,
bs=16
)
# Создание модели детекции
learn = object_detection_learner(dls, arch=models.retinanet_resnet50_fpn)
learn.fine_tune(5)
Обработка естественного языка
Классификация текста
# Загрузка данных IMDB
path = untar_data(URLs.IMDB)
dls = TextDataLoaders.from_folder(path, valid='test')
# Создание классификатора
learn = text_classifier_learner(dls, AWD_LSTM, drop_mult=0.5, metrics=accuracy)
learn.fine_tune(4, 1e-2)
Языковое моделирование
# Создание языковой модели
dls_lm = TextDataLoaders.from_folder(path, is_lm=True)
learn_lm = language_model_learner(dls_lm, AWD_LSTM, drop_mult=0.3)
learn_lm.fit_one_cycle(1, 2e-2)
# Сохранение энкодера для дальнейшего использования
learn_lm.save_encoder('finetuned')
Интеграция с трансформерами
# Использование BERT для классификации
from transformers import AutoTokenizer, AutoModel
tokenizer = AutoTokenizer.from_pretrained('bert-base-uncased')
model = AutoModel.from_pretrained('bert-base-uncased')
# Создание DataLoaders с кастомным токенизатором
dls = TextDataLoaders.from_folder(path, tokenizer=tokenizer)
Работа с табличными данными
Классификация на табличных данных
# Загрузка данных Adult
path = untar_data(URLs.ADULT_SAMPLE)
df = pd.read_csv(path/'adult.csv')
# Определение категориальных и непрерывных признаков
cat_names = ['workclass', 'education', 'marital-status', 'occupation', 'relationship', 'race']
cont_names = ['age', 'fnlwgt', 'education-num', 'hours-per-week']
# Создание DataLoaders
dls = TabularDataLoaders.from_df(
df, path=path, y_names="salary",
cat_names=cat_names, cont_names=cont_names,
procs=[Categorify, FillMissing, Normalize]
)
# Обучение модели
learn = tabular_learner(dls, metrics=accuracy)
learn.fit_one_cycle(5)
Регрессия на табличных данных
# Для регрессионных задач
learn = tabular_learner(dls, loss_func=MSELossFlat(), metrics=rmse)
learn.fit_one_cycle(10, 1e-2)
Коллаборативная фильтрация
Рекомендательная система
# Загрузка данных MovieLens
path = untar_data(URLs.ML_SAMPLE)
dls = CollabDataLoaders.from_csv(path/'ratings.csv')
# Создание модели коллаборативной фильтрации
learn = collab_learner(dls, n_factors=50, y_range=(0, 5.5))
learn.fit_one_cycle(10, 5e-3)
Оптимизация обучения и advanced техники
One Cycle Policy
One Cycle Policy — это метод обучения, который циклически изменяет learning rate и momentum для достижения быстрой конвергенции:
# Поиск оптимального learning rate
learn.lr_find()
# Обучение с One Cycle Policy
learn.fit_one_cycle(5, lr_max=1e-2)
Градиентное накопление
# Для работы с большими батчами при ограниченной памяти
with learn.no_bar():
learn.fit(5, lr=1e-3, grad_accum=4)
Mixed Precision Training
# Использование mixed precision для ускорения обучения
learn = learn.to_fp16()
learn.fit_one_cycle(5, 1e-2)
Прогрессивное изменение размера
# Постепенное увеличение размера изображений
learn.fine_tune(3, base_lr=1e-3, freeze_epochs=1)
learn.dls = learn.dls.new(size=256)
learn.fine_tune(3, base_lr=1e-4)
Интерпретация и анализ моделей
Анализ ошибок классификации
# Создание интерпретатора
interp = ClassificationInterpretation.from_learner(learn)
# Матрица ошибок
interp.plot_confusion_matrix()
# Примеры с наибольшими ошибками
interp.plot_top_losses(9, figsize=(15,11))
# Наиболее спорные примеры
interp.most_confused(min_val=5)
Визуализация активаций
# Визуализация того, на что обращает внимание модель
learn.show_results(max_n=6, figsize=(15,8))
# Grad-CAM для понимания важных областей
from fastai.vision.all import *
learn.show_cam(idx=0)
Анализ важности признаков
# Для табличных данных
learn.feature_importance()
# Permutation importance
from sklearn.inspection import permutation_importance
perm_importance = permutation_importance(learn.model, X_val, y_val)
Сохранение и развертывание моделей
Экспорт и загрузка моделей
# Экспорт обученной модели
learn.export('model.pkl')
# Загрузка модели для инференса
learn_inf = load_learner('model.pkl')
# Предсказание на новых данных
pred, pred_idx, probs = learn_inf.predict(img)
Развертывание через веб-интерфейс
# Создание простого веб-приложения с Gradio
import gradio as gr
def classify_image(img):
pred, pred_idx, probs = learn_inf.predict(img)
return {labels[i]: float(probs[i]) for i in range(len(labels))}
gr.Interface(
fn=classify_image,
inputs=gr.Image(shape=(224,224)),
outputs=gr.Label(num_top_classes=3)
).launch()
Оптимизация для продакшена
# Экспорт в ONNX для кросс-платформенного использования
learn.export_onnx('model.onnx')
# Квантизация для уменьшения размера модели
learn.model = torch.quantization.quantize_dynamic(
learn.model, {torch.nn.Linear}, dtype=torch.qint8
)
Интеграция с экосистемой
Интеграция с HuggingFace
# Использование предобученных трансформеров
from transformers import AutoTokenizer, AutoModelForSequenceClassification
tokenizer = AutoTokenizer.from_pretrained('bert-base-uncased')
model = AutoModelForSequenceClassification.from_pretrained('bert-base-uncased')
# Адаптация для fastai
learn = text_classifier_learner(dls, model, tokenizer=tokenizer)
Интеграция с PyTorch Lightning
# Использование fastai компонентов в PyTorch Lightning
import pytorch_lightning as pl
class FastaiLightningModule(pl.LightningModule):
def __init__(self, arch, dls):
super().__init__()
self.model = create_cnn_model(arch, dls.c)
self.dls = dls
def training_step(self, batch, batch_idx):
x, y = batch
y_hat = self.model(x)
loss = F.cross_entropy(y_hat, y)
return loss
Интеграция с MLflow
# Логирование экспериментов с MLflow
import mlflow
import mlflow.pytorch
with mlflow.start_run():
learn.fit_one_cycle(5, 1e-2)
mlflow.pytorch.log_model(learn.model, "model")
mlflow.log_metric("accuracy", learn.recorder.values[-1][1])
Продвинутые техники и кастомизация
Создание кастомных архитектур
# Создание собственной архитектуры
class CustomNet(nn.Module):
def __init__(self, n_classes):
super().__init__()
self.backbone = models.resnet50(pretrained=True)
self.backbone.fc = nn.Linear(2048, n_classes)
def forward(self, x):
return self.backbone(x)
# Использование в fastai
learn = Learner(dls, CustomNet(dls.c), metrics=accuracy)
Кастомные функции потерь
# Создание собственной функции потерь
class FocalLoss(nn.Module):
def __init__(self, alpha=1, gamma=2):
super().__init__()
self.alpha = alpha
self.gamma = gamma
def forward(self, inputs, targets):
ce_loss = F.cross_entropy(inputs, targets, reduction='none')
pt = torch.exp(-ce_loss)
focal_loss = self.alpha * (1-pt)**self.gamma * ce_loss
return focal_loss.mean()
# Использование кастомной функции потерь
learn = Learner(dls, model, loss_func=FocalLoss(), metrics=accuracy)
Кастомные callbacks
# Создание собственного callback
class PrintCallback(Callback):
def after_epoch(self):
print(f"Epoch {self.epoch}: loss={self.recorder.values[-1][0]:.4f}")
# Использование callback
learn = Learner(dls, model, cbs=PrintCallback())
Полная таблица методов и функций fastai
Загрузка и подготовка данных
| Функция/Класс | Описание | Пример использования |
|---|---|---|
untar_data() |
Загрузка и распаковка датасетов | path = untar_data(URLs.PETS) |
get_image_files() |
Получение списка файлов изображений | files = get_image_files(path) |
ImageDataLoaders.from_folder() |
Создание DataLoaders из папок | dls = ImageDataLoaders.from_folder(path) |
ImageDataLoaders.from_name_func() |
Создание DataLoaders с кастомной функцией | dls = ImageDataLoaders.from_name_func(path, files, label_func) |
TextDataLoaders.from_folder() |
Загрузка текстовых данных | dls = TextDataLoaders.from_folder(path) |
TabularDataLoaders.from_df() |
Загрузка табличных данных | dls = TabularDataLoaders.from_df(df, y_names='target') |
CollabDataLoaders.from_csv() |
Загрузка данных для коллаборативной фильтрации | dls = CollabDataLoaders.from_csv(path) |
DataBlock |
Гибкое API для создания DataLoaders | dblock = DataBlock(blocks=(ImageBlock, CategoryBlock)) |
Создание и обучение моделей
| Функция/Класс | Описание | Пример использования |
|---|---|---|
vision_learner() |
Создание модели для компьютерного зрения | learn = vision_learner(dls, resnet34, metrics=accuracy) |
text_classifier_learner() |
Создание текстового классификатора | learn = text_classifier_learner(dls, AWD_LSTM) |
tabular_learner() |
Создание модели для табличных данных | learn = tabular_learner(dls, metrics=accuracy) |
collab_learner() |
Создание модели коллаборативной фильтрации | learn = collab_learner(dls, n_factors=50) |
unet_learner() |
Создание U-Net для сегментации | learn = unet_learner(dls, resnet34, metrics=Dice()) |
language_model_learner() |
Создание языковой модели | learn = language_model_learner(dls, AWD_LSTM) |
Learner() |
Базовый класс для создания кастомных моделей | learn = Learner(dls, model, loss_func, metrics) |
Методы обучения
| Метод | Описание | Параметры |
|---|---|---|
fit() |
Базовый метод обучения | epochs, lr, wd |
fit_one_cycle() |
Обучение с One Cycle Policy | epochs, lr_max, div, div_final, pct_start |
fine_tune() |
Тонкая настройка предобученной модели | epochs, base_lr, freeze_epochs |
fit_sgdr() |
Обучение с SGDR | epochs, lr, cycle_len, cycle_mult |
lr_find() |
Поиск оптимального learning rate | start_lr, end_lr, num_it |
freeze() |
Заморозка слоев модели | n (количество слоев) |
unfreeze() |
Разморозка всех слоев | - |
Предсказание и оценка
| Метод | Описание | Возвращаемое значение |
|---|---|---|
predict() |
Предсказание на одном примере | prediction, index, probabilities |
get_preds() |
Получение предсказаний на наборе данных | predictions, targets |
validate() |
Валидация модели | validation_loss, metrics |
tta() |
Test Time Augmentation | tta_predictions, tta_targets |
show_results() |
Визуализация результатов | - |
Интерпретация моделей
| Класс/Метод | Описание | Область применения |
|---|---|---|
ClassificationInterpretation |
Интерпретация классификационных моделей | Анализ ошибок, confusion matrix |
plot_confusion_matrix() |
Построение матрицы ошибок | Классификация |
plot_top_losses() |
Визуализация наихудших предсказаний | Отладка модели |
most_confused() |
Наиболее спорные классы | Анализ ошибок |
show_cam() |
Grad-CAM визуализация | Понимание решений CNN |
feature_importance() |
Важность признаков | Табличные данные |
Сохранение и загрузка
| Метод | Описание | Формат |
|---|---|---|
save() |
Сохранение весов модели | .pth |
load() |
Загрузка весов | .pth |
export() |
Экспорт модели для инференса | .pkl |
load_learner() |
Загрузка экспортированной модели | .pkl |
save_encoder() |
Сохранение энкодера языковой модели | .pth |
load_encoder() |
Загрузка энкодера | .pth |
Трансформации и аугментации
| Функция/Класс | Описание | Область применения |
|---|---|---|
Resize() |
Изменение размера изображений | Компьютерное зрение |
RandomCrop() |
Случайная обрезка | Аугментация изображений |
aug_transforms() |
Стандартный набор аугментаций | Компьютерное зрение |
Normalize() |
Нормализация данных | Табличные данные |
Categorify() |
Кодирование категориальных признаков | Табличные данные |
FillMissing() |
Заполнение пропусков | Табличные данные |
Tokenize() |
Токенизация текста | NLP |
Numericalize() |
Преобразование токенов в числа | NLP |
Метрики
| Метрика | Описание | Область применения |
|---|---|---|
accuracy |
Точность классификации | Классификация |
error_rate |
Частота ошибок | Классификация |
top_k_accuracy |
Точность в топ-k | Классификация |
Dice() |
Коэффициент Dice | Сегментация |
JaccardCoeff() |
Коэффициент Жаккара | Сегментация |
F1Score() |
F1-мера | Классификация |
Precision() |
Точность | Классификация |
Recall() |
Полнота | Классификация |
rmse |
Среднеквадратичная ошибка | Регрессия |
mae |
Средняя абсолютная ошибка | Регрессия |
R2Score() |
Коэффициент детерминации | Регрессия |
exp_rmspe |
Экспоненциальная RMSPE | Регрессия |
Callbacks
| Callback | Описание | Назначение |
|---|---|---|
EarlyStoppingCallback |
Ранний останов обучения | Предотвращение переобучения |
SaveModelCallback |
Сохранение лучших весов | Сохранение прогресса |
ReduceLROnPlateau |
Уменьшение LR при плато | Оптимизация обучения |
CSVLogger |
Логирование в CSV | Мониторинг обучения |
WandbCallback |
Интеграция с Weights & Biases | Эксперименты |
TensorBoardCallback |
Интеграция с TensorBoard | Визуализация |
GradientClip |
Обрезка градиентов | Стабилизация обучения |
MixUp |
Применение MixUp аугментации | Улучшение генерализации |
Функции потерь
| Функция потерь | Описание | Область применения |
|---|---|---|
CrossEntropyLossFlat |
Кросс-энтропия (плоская) | Классификация |
MSELossFlat |
Среднеквадратичная ошибка | Регрессия |
L1LossFlat |
Средняя абсолютная ошибка | Регрессия |
BCEWithLogitsLossFlat |
BCE с логитами | Бинарная классификация |
LabelSmoothingCrossEntropy |
Кросс-энтропия со сглаживанием | Классификация |
FocalLoss |
Focal Loss | Несбалансированная классификация |
DiceLoss |
Dice Loss | Сегментация |
Примеры реальных применений
Медицинская диагностика
# Классификация рентгеновских снимков
path = Path('chest_xray_data')
dls = ImageDataLoaders.from_folder(
path, train='train', valid='test',
item_tfms=Resize(224),
batch_tfms=aug_transforms(size=224, min_scale=0.8)
)
learn = vision_learner(dls, resnet50, metrics=[accuracy, F1Score()])
learn.fine_tune(5)
# Интерпретация результатов
interp = ClassificationInterpretation.from_learner(learn)
interp.plot_confusion_matrix()
Анализ настроений в отзывах
# Классификация отзывов на положительные/отрицательные
path = untar_data(URLs.IMDB)
dls = TextDataLoaders.from_folder(path, valid='test')
learn = text_classifier_learner(dls, AWD_LSTM, drop_mult=0.5)
learn.fine_tune(4, 1e-2)
# Предсказание на новом тексте
text = "This movie was absolutely fantastic!"
pred = learn.predict(text)
print(f"Prediction: {pred[0]}, Confidence: {pred[2][pred[1]]:.4f}")
Сегментация спутниковых изображений
# Сегментация земельных участков
path = Path('satellite_data')
codes = ['background', 'building', 'road', 'water', 'vegetation']
dls = SegmentationDataLoaders.from_label_func(
path, bs=4, fnames=get_image_files(path/"images"),
label_func=lambda o: path/"masks"/f"{o.stem}.png",
codes=codes,
item_tfms=Resize(512),
batch_tfms=aug_transforms(size=512, min_scale=0.75)
)
learn = unet_learner(dls, resnet34, metrics=Dice())
learn.fine_tune(10)
Рекомендательная система
# Система рекомендаций фильмов
path = untar_data(URLs.ML_100k)
ratings = pd.read_csv(path/'u.data', delimiter='\t',
names=['user','movie','rating','timestamp'])
dls = CollabDataLoaders.from_df(ratings, item_name='movie',
rating_name='rating', user_name='user')
learn = collab_learner(dls, n_factors=100, y_range=(0.5, 5.5))
learn.fit_one_cycle(10, 5e-3)
# Получение рекомендаций
movie_factors = learn.model.i_weight.weight
user_factors = learn.model.u_weight.weight
Часто задаваемые вопросы
Что такое fastai и чем она отличается от PyTorch?
fastai — это высокоуровневая библиотека, построенная поверх PyTorch, которая предоставляет упрощенный интерфейс для создания и обучения нейронных сетей. Основные отличия:
- Простота использования: fastai позволяет достичь отличных результатов в несколько строк кода
- Встроенные best practices: автоматическое применение современных техник обучения
- Готовые архитектуры: большой выбор предобученных моделей
- Интегрированные инструменты: визуализация, интерпретация, деплой
Подходит ли fastai для начинающих?
Да, fastai специально разработана для упрощения входа в машинное обучение. Библиотека позволяет:
- Сосредоточиться на решении задач, а не на технических деталях
- Изучать машинное обучение на практических примерах
- Постепенно углубляться в детали реализации
Можно ли использовать свои модели PyTorch в fastai?
Да, fastai полностью совместима с PyTorch. Вы можете:
- Использовать любые PyTorch модели в качестве основы
- Комбинировать fastai компоненты с PyTorch кодом
- Постепенно мигрировать с PyTorch на fastai или наоборот
Какие типы задач поддерживает fastai?
fastai поддерживает широкий спектр задач машинного обучения:
- Компьютерное зрение: классификация, сегментация, детекция объектов
- NLP: классификация текста, языковое моделирование, генерация
- Табличные данные: классификация, регрессия
- Рекомендательные системы: коллаборативная фильтрация
- Временные ряды: прогнозирование, аномалии
Есть ли поддержка GPU в fastai?
Да, fastai автоматически использует GPU, если он доступен. Библиотека поддерживает:
- Автоматическое определение и использование CUDA
- Mixed precision training для ускорения обучения
- Мультиг-GPU обучение
- Оптимизацию памяти GPU
Как развернуть обученную модель в продакшене?
fastai предоставляет несколько способов деплоя:
- Экспорт в .pkl: простой способ сохранения модели
- ONNX экспорт: для кросс-платформенного использования
- Веб-интерфейсы: интеграция с Gradio, Streamlit
- API сервисы: развертывание через FastAPI, Flask
- Мобильные приложения: экспорт для iOS/Android
Можно ли использовать fastai для исследований?
Да, fastai активно используется в исследованиях. Библиотека предоставляет:
- Гибкость для экспериментов
- Возможность кастомизации всех компонентов
- Интеграцию с системами трекинга экспериментов
- Воспроизводимые результаты
Заключение
fastai представляет собой мощный инструмент, который демократизирует доступ к современному машинному обучению. Библиотека успешно балансирует между простотой использования и гибкостью, позволяя как новичкам быстро начать работу, так и экспертам создавать сложные решения.
Ключевые преимущества fastai:
Скорость разработки: Благодаря высокоуровневому API и встроенным best practices, разработка моделей происходит значительно быстрее.
Качество результатов: Автоматическое применение современных техник обучения позволяет достигать state-of-the-art результатов.
Образовательная ценность: Библиотека отлично подходит для изучения машинного обучения благодаря четкой структуре и обширной документации.
Производственная готовность: Встроенные инструменты для интерпретации, валидации и деплоя делают переход от прототипа к продакшену более плавным.
Активное сообщество: Большое и активное сообщество разработчиков постоянно развивает библиотеку и предоставляет поддержку.
fastai продолжает эволюционировать, регулярно внедряя новейшие достижения в области машинного обучения и делая их доступными для широкой аудитории разработчиков. Это делает библиотеку отличным выбором как для образовательных проектов, так и для решения реальных бизнес-задач.
Настоящее и будущее развития ИИ: классической математики уже недостаточно
Эксперты предупредили о рисках фейковой благотворительности с помощью ИИ
В России разработали универсального ИИ-агента для роботов и индустриальных процессов