Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

+1 582новые вакансии за сутки·92 562вакансии открыты сейчас·Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Новые вакансии в TelegramРаботодателям
Talanto
Вакансии
Компании7 220
РезюмеAIПодготовкаСтатьи
BoostТарифыBoost
Войти

Не нашли подходящее?

Пусть нужная вакансия найдёт вас сама.

  1. Подборка в TelegramНовые вакансии по вашему фильтру — сразу в бота.Подключить
  2. Мэтчи по резюмеЗагрузите резюме — покажем, где вы подходите лучше всего.Загрузить
  3. Сохранить фильтрНастройте поиск один раз и возвращайтесь к новым вакансиям.Настроить
Что нового на TalantoTalanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Для работодателей

Опубликуйте вакансию — отклики придут в ваш кабинет.

  1. Вакансиябесплатно
  2. Откликиконтакты бесплатно
  3. Наймэтапы и интервью

40 компаний публикуют вакансии напрямую · 4 402 кандидата открыты к предложениям

Разместить вакансию

Популярные направления

Все подборки
  • Python17 105
  • Облачные технологии14 068
  • QA вакансии3 460
  • Backend вакансии2 098
  • Инженер данных1 796
  • Продакт-менеджер1 248

Разработка

  • Android1 866
  • iOS1 699
  • Fullstack вакансии979
  • AI вакансии951
  • Frontend вакансии742
  • Mobile вакансии44

По стеку

  • Go8 651
  • Java6 544
  • Node.js2 018
  • .NET1 719
  • Kotlin1 623
  • Rust1 453
  • C#709
  • PHP683
  • C++571

DevOps и инфраструктура

  • Kubernetes7 761
  • DevOps вакансии6 057
  • Linux-инфраструктура5 492
  • Terraform / IaC4 259
  • CI/CD3 240
  • Мониторинг и Observability1 782
  • SRE565
  • Кибербезопасность450

Аналитика и данные

  • Data Scientist1 127
  • Бизнес-аналитик925
  • Аналитик данных845
  • Системный аналитик154

Другие направления

  • Проджект-менеджер611
  • UI/UX дизайн145
  • Ручное тестирование14

По регионам

  • Вакансии в США43 686
  • Вакансии в Европе23 668
  • Вакансии в Канаде4 413
  • Работа в России3 909

По формату

  • Удалённые вакансии73 889
  • Релокация в США43 686
  • Гибридная работа12 392
  • Офисная работа7 088

По уровню

  • Senior вакансии42 236
  • Middle вакансии20 545
  • Junior вакансии6 653

Сейчас нанимают

Все компании
  • Wise190 вакансий
  • Rakuten189 вакансий
  • ASML166 вакансий
  • Grab138 вакансий
  • Celonis39 вакансий
  • Spotify36 вакансий
  • Adyen29 вакансий
  • Infobip28 вакансий
  • Monzo20 вакансий
  • Darktrace16 вакансий

Вакансии из 344 источников: карьерные страницы компаний и джоб-борды.

КомпанииО насНовостиПубличная офертаУсловия использованияПолитика конфиденциальностиПоддержка
←К теме PyTorchВсе вопросы
PyTorchMiddleТеория

Объясните batch normalization — что она делает и как реализована в PyTorch?

В закладки
Сначала попробуйте ответить сами30 секунд
Сравнить с ответом ↓

Batch Normalization нормализует активации по батчу: вычитает среднее, делит на std, затем масштабирует через обучаемые γ и β. В PyTorch: nn.BatchNorm1d/2d. Критично: разное поведение в train и eval режимах.

Что делает Batch Normalization

BatchNorm нормализует входные активации по размерности батча, что ускоряет обучение и снижает зависимость от инициализации весов. Формула для признака j:

μⱼ = (1/m) Σ xᵢⱼ          # среднее по батчу
σ²ⱼ = (1/m) Σ (xᵢⱼ - μⱼ)²  # дисперсия по батчу
x̂ᵢⱼ = (xᵢⱼ - μⱼ) / √(σ²ⱼ + ε)   # нормализация
yᵢⱼ = γⱼ · x̂ᵢⱼ + βⱼ        # масштаб и сдвиг (обучаемые)

γ и β — обучаемые параметры, позволяющие сети «отменить» нормализацию если это нужно. ε (~1e-5) предотвращает деление на ноль.

Реализация в PyTorch

import torch
import torch.nn as nn

# BatchNorm1d — для FC-слоёв, вход (batch, features) или (batch, features, seq)
batch_size, num_features = 16, 64
bn1d = nn.BatchNorm1d(num_features, eps=1e-5, momentum=0.1, affine=True)

x = torch.randn(batch_size, num_features)
out = bn1d(x)
print(out.shape)  # (16, 64)
print(bn1d.weight.shape)  # gamma: (64,)
print(bn1d.bias.shape)    # beta:  (64,)

# BatchNorm2d — для свёрточных сетей, вход (batch, channels, H, W)
# нормализует по batch+H+W, отдельно для каждого канала
batch_size, channels, H, W = 8, 32, 28, 28
bn2d = nn.BatchNorm2d(channels)
x_conv = torch.randn(batch_size, channels, H, W)
out_conv = bn2d(x_conv)
print(out_conv.shape)  # (8, 32, 28, 28)

# Разница train vs eval
bn1d.train()  # использует статистику текущего батча + обновляет running_mean/var
out_train = bn1d(x)

bn1d.eval()   # использует running_mean/running_var (накопленную статистику)
out_eval = bn1d(x)
print(torch.allclose(out_train, out_eval))  # False! Разные значения

# Накопленная статистика (exponential moving average)
print(bn1d.running_mean.shape)  # (64,) — обновляется при train()
print(bn1d.running_var.shape)   # (64,)
# running_mean = (1 - momentum) * running_mean + momentum * batch_mean

# Встраивание в архитектуру: BN обычно ДО активации
class ConvBlock(nn.Module):
    def __init__(self, in_ch, out_ch):
        super().__init__()
        self.block = nn.Sequential(
            nn.Conv2d(in_ch, out_ch, kernel_size=3, padding=1, bias=False),  # bias=False!
            nn.BatchNorm2d(out_ch),
            nn.ReLU(inplace=True),
        )
    def forward(self, x):
        return self.block(x)

# Пример: влияние размера батча на статистику
small_batch = torch.randn(2, 64)   # батч из 2 — нестабильная статистика
large_batch = torch.randn(64, 64)  # батч из 64 — стабильнее

bn_test = nn.BatchNorm1d(64)
bn_test.train()
out_small = bn_test(small_batch)
out_large = bn_test(large_batch)
# При batch_size=1 BatchNorm выбросит RuntimeError: Expected more than 1 value per channel

# Инспекция параметров
for name, param in bn1d.named_parameters():
    print(name, param.shape)  # weight (gamma), bias (beta)
for name, buf in bn1d.named_buffers():
    print(name, buf.shape)    # running_mean, running_var, num_batches_tracked

BatchNorm vs LayerNorm vs GroupNorm

BatchNorm нормализует по батчу — эффективен для CNN с большими батчами. LayerNorm нормализует по признакам одного примера — используется в Transformer (не зависит от размера батча). GroupNorm нормализует по группам каналов — работает при batch_size=1 (сегментация, detection).

Подводные камни

  • Забыть model.eval() при инференсе: в режиме train() BatchNorm использует статистику текущего батча. При инференсе на одном примере это даёт случайные результаты. Всегда вызывайте model.eval() перед inference.
  • bias=True в Conv перед BatchNorm: BatchNorm имеет собственное смещение β, поэтому bias у Conv-слоя перед BN бесполезен и тратит память. Стандарт: nn.Conv2d(..., bias=False).
  • Малый батч: при batch_size=1 в режиме train() PyTorch бросает RuntimeError. При batch_size=2–4 статистика нестабильна и обучение расходится — используйте GroupNorm или LayerNorm.
  • Несоответствие train/eval статистики: если модель обучается на данных с одним распределением, а на инференсе получает другое, running_mean/var будет некорректным — BN деградирует до бесполезного слоя. Следите за distribution shift.
  • Перенос весов без running stats: при загрузке state_dict с strict=False можно случайно не загрузить running_mean и running_var. Модель будет работать в eval() с нулевыми буферами — все предсказания неверны.
  • Fine-tuning замороженных BN: при замораживании слоёв BatchNorm через requires_grad=False веса γ/β не обновляются, но running stats продолжают обновляться если слой в режиме train(). Для полной заморозки нужно явно вызвать bn_layer.eval().
  • Gradient через BN во время backward: BN делает нормализацию дифференцируемой, но при маленьком батче градиент по дисперсии нестабилен и может привести к взрывному росту gradients на первых эпохах.
  • DataParallel и синхронизация BN: при multi-GPU обучении через nn.DataParallel каждый GPU считает статистику только по своему sub-batch. При маленьких батчах используйте nn.SyncBatchNorm.convert_sync_batchnorm(model) с DistributedDataParallel.

Частые вопросы на собеседовании

  • Как сохранять и загружать веса модели в PyTorch (state_dict vs полная модель)?
  • Объясните разницу между режимами model.train() и model.eval().
  • Зачем нужен optimizer.zero_grad() и почему его необходимо вызывать перед каждым обратным проходом?
  • В каких data/AI-задачах PyTorch даёт реальный выигрыш, а где лучше выбрать другой инструмент или более простой pipeline?

Типичные ошибки

  • Объяснять batch normalization только синтаксисом без shape, dtype, состояния или режима выполнения.
  • Игнорировать leakage, воспроизводимость, пустые входы и скрытые копии данных.
  • Не проверять production-симптомы: latency, память, ретраи, дрейф качества и несовпадение версий.

Что проверяет интервьюер

  • Может ли связать batch normalization с реальным контрактом входов и выходов.
  • Упоминает ли тесты, метрики, reproducibility и диагностику ошибок.
  • Видит ли различие между demo-кодом в ноутбуке и production-пайплайном.

Как вы знаете этот вопрос?

Проверить себя по теме PyTorch →

Источники

  • https://docs.pytorch.org/docs/stable/generated/torch.nn.Module.html
←Предыдущий вопросКак реализовать кастомный слой `nn.Module` в PyTorch?Следующий вопрос→Как перемещать модель и тензоры между CPU и GPU в PyTorch?

Связанные темы

PyTorchdata-aievaluationmodel-training

Вакансии с этим навыком

  • Senior AI Engineer (REMOTE)
  • Google Cloud AI Architect
  • AI/AI Agent Developer (Python)
  • AI/ML Solution Architect
  • Machine Learning Engineer