Рекомендации и советы по машинному обучению для обучения моделей#
Введение#
Один из самых важных шагов при работе над computer vision project — это обучение модели. Перед тем как перейти к этому этапу, тебе нужно define your goals и collect and annotate your data. После preprocessing the data, чтобы убедиться в ее чистоте и согласованности, ты можешь перейти к обучению своей модели.
Model training — это процесс обучения твоей модели распознавать визуальные паттерны и делать предсказания на основе твоих данных, и он напрямую определяет точность твоего приложения. В этом руководстве рассматриваются лучшие практики, методы оптимизации и советы по устранению неполадок, которые помогут тебе эффективно обучать модели компьютерного зрения.
Watch: Model Training Tips | How to Handle Large Datasets | Batch Size, GPU Utilization and Mixed Precision
Как обучить модель машинного обучения#
Модель компьютерного зрения обучается путем корректировки своих внутренних параметров для минимизации ошибок. Изначально модели подается большой набор размеченных изображений. Она делает предсказания о том, что находится на этих изображениях, а предсказания сравниваются с фактическими метками или содержимым для вычисления ошибок. Эти ошибки показывают, насколько сильно предсказания модели отклоняются от истинных значений.
Во время обучения модель итеративно делает предсказания, вычисляет ошибки и обновляет свои параметры с помощью процесса, называемого backpropagation. В этом процессе модель настраивает свои внутренние параметры (весы и смещения) для уменьшения ошибок. Повторяя этот цикл много раз, модель постепенно улучшает свою точность. Со временем она учится распознавать сложные паттерны, такие как формы, цвета и текстуры.
Этот процесс обучения позволяет модели computer vision выполнять различные tasks, включая object detection, instance segmentation, semantic segmentation и image classification. Конечная цель состоит в том, чтобы создать модель, способную обобщать свои знания на новые, ранее не виденные изображения, чтобы точно понимать визуальные данные в реальных приложениях.
Теперь, когда мы знаем, что происходит «под капотом» при обучении модели, давай рассмотрим моменты, которые следует учитывать при тренировке.
Обучение на больших наборах данных#
Есть несколько аспектов, о которых стоит подумать, когда ты планируешь использовать большой набор данных для обучения модели. Например, можно настроить размер пакета (batch size), контролировать использование GPU, выбрать многомасштабное обучение (multiscale training) и т. д. Давай подробно разберем каждый из этих вариантов.
Размер пакета и использование GPU#
При обучении моделей на больших наборах данных ключевым фактором является эффективное использование GPU. Размер пакета — важный фактор. Это количество примеров данных, которые модель машинного обучения обрабатывает за одну итерацию обучения. Используя максимальный размер пакета, поддерживаемый твоим GPU, ты можешь в полной мере использовать его возможности и сократить время обучения модели. Однако стоит избегать нехватки видеопамяти. Если возникают ошибки памяти, постепенно уменьшай размер пакета, пока модель не начнет обучаться стабильно.
Watch: How to Use Batch Inference with Ultralytics YOLO26 | Speed Up Object Detection in Python 🎉
Что касается YOLO26, ты можешь настроить параметр batch в Train mode arguments в соответствии с емкостью своего GPU. На одном ускорителе batch=-1 профилирует модель и выбирает batch size, ориентируясь примерно на 60% использования памяти; дробное значение, такое как batch=0.70, задает другую долю. Запуски на нескольких GPU требуют явного глобального размера батча, кратного количеству устройств. На CPU и Apple silicon AutoBatch выдает предупреждение и переключается на batch=16.
Обучение на подмножестве данных#
Обучение на подмножестве — это разумная стратегия, которая предполагает обучение модели на меньшем наборе данных, который представляет собой весь большой набор. Это позволяет сэкономить время и ресурсы, особенно на этапе начальной разработки и тестирования модели. Если у тебя мало времени или ты экспериментируешь с различными конфигурациями модели, обучение на подмножестве — хороший вариант.
Когда дело касается YOLO26, ты можешь легко реализовать обучение на подмножестве с помощью параметра fraction. Используй такое соотношение, как fraction=0.1 для 10% обучающих данных, целое число вроде fraction=300 ровно для 300 обучающих изображений или список [train, val, test], такой как fraction=[300, 100, 0], чтобы ограничить каждый сплит и пропустить тестовые изображения. Списки из двух элементов, такие как [300, 100], оставляют тестовый сплит полным. Наборы данных NDJSON выбирают равномерно распределенные записи перед их загрузкой, поэтому повторяющиеся запуски используют то же самое подмножество. Эта техника поддерживает быстрые итерации и настройку перед переходом к полному набору данных.
Многомасштабное обучение#
Многомасштабное обучение — это метод, который повышает способность твоей модели к генерализации за счет ее обучения на изображениях разного размера. Твоя модель учится обнаруживать объекты в разных масштабах и на разных расстояниях, становясь более устойчивой.
Например, когда ты обучаешь YOLO26, ты можешь включить аугментацию масштаба, установив параметр scale. Этот параметр изменяет размер обучающих изображений на заданный коэффициент, имитируя объекты на разных расстояниях. Например, установка scale=0.5 случайным образом масштабирует обучающие изображения с коэффициентом от 0.5 до 1.5 во время обучения. Настройка этого параметра позволяет твоей модели сталкиваться с различными масштабами изображений и улучшать свои возможности обнаружения для объектов разных размеров и сценариев.
Ultralytics также поддерживает многомасштабное обучение по размеру изображения с помощью параметра multi_scale. В отличие от scale, который масштабирует изображения, а затем дополняет/обрезает их до imgsz, multi_scale изменяет сам imgsz для каждого батча (с округлением до шага модели). Например, при imgsz=640 и multi_scale=0.25 размер обучения выбирается в диапазоне от 480 до 800 с шагом (например, 480, 512, 544, ..., 800), в то время как multi_scale=0.0 сохраняет фиксированный размер.
Кеширование#
Кеширование — важный метод повышения эффективности обучения моделей машинного обучения. Храня предварительно обработанные изображения в оперативной памяти, кеширование сокращает время, которое GPU тратит на ожидание загрузки данных с диска. Модель может непрерывно получать данные без задержек, вызванных операциями ввода-вывода диска.
Кэшированием можно управлять при обучении YOLO26 с помощью параметра cache:
cache=True: Сохраняет изображения датасета в оперативной памяти, обеспечивая максимальную скорость доступа, но ценой повышенного использования памяти.cache='disk': Сохраняет изображения на диске, это медленнее, чем в оперативной памяти, но быстрее, чем каждый раз загружать свежие данные.cache=False: Отключает кэширование, полностью полагаясь на дисковый ввод-вывод, что является самым медленным вариантом.
Обучение со смешанной точностью#
Обучение в смешанной точности использует как 16-битные (FP16), так и 32-битные (FP32) типы с плавающей запятой. Преимущества как FP16, так и FP32 используются путем применения FP16 для более быстрых вычислений и FP32 для поддержания точности там, где это необходимо. Большинство операций neural network выполняются в FP16 для получения выгоды от более быстрых вычислений и меньшего использования памяти. Тем не менее, основная копия весов модели хранится в FP32 для обеспечения точности на этапах обновления весов. Ты можешь обрабатывать более крупные модели или большие размеры пакетов в рамках тех же аппаратных ограничений.
Чтобы внедрить обучение в смешанной точности, тебе нужно изменить свои скрипты обучения и убедиться, что твое оборудование (например, GPU) поддерживает его. Многие современные фреймворки deep learning, такие как PyTorch и TensorFlow, предлагают встроенную поддержку смешанной точности.
Обучение со смешанной точностью выполняется просто при работе с YOLO26: AMP уже включен по умолчанию (amp=True). На CUDA GPU YOLO выполняет однократную проверку возможностей в начале обучения и возвращается к полному FP32 в случае неудачной проверки; на CPU и Apple silicon AMP пропускается полностью. Установи amp=False, чтобы принудительно использовать FP32.
Предобученные веса#
Использование предобученных весов — это умный способ ускорить процесс обучения твоей модели. Предобученные веса поступают из моделей, уже обученных на больших датасетах, что дает твоей модели фору. Transfer learning адаптирует предобученные модели к новым, связанным задачам. Тонкая настройка предобученной модели предполагает начало с этих весов и продолжение обучения на твоем конкретном датасете. Этот метод обучения приводит к более быстрой ее продолжительности и часто к лучшей производительности, поскольку модель начинает с прочного понимания базовых признаков.
Предобученные веса задаются аргументом model, поэтому model=yolo26n.pt уже начинает работу с весами COCO. Параметр pretrained управляет тем, сохраняются ли эти веса (True по умолчанию), отбрасываются (False) или заменяются другим чекпоинтом (pretrained=path/to/best.pt). Установка pretrained=True для модели *.yaml не приводит к автоматической загрузке весов. Подробнее о полном рабочем процессе трансферного обучения читай в разделе How to Fine-Tune YOLO on a Custom Dataset.
Другие методы, которые стоит рассмотреть при работе с большими наборами данных#
Есть еще пара методов, которые стоит учесть при работе с большими наборами данных:
- Learning Rate Schedulers: Применение планировщиков скорости обучения динамически корректирует скорость обучения в процессе тренировки. Тонко настроенная скорость обучения может предотвратить пролет мимо минимумов и повысить стабильность. При обучении YOLO26 параметр
lrfпомогает управлять планированием скорости обучения, задавая конечную скорость обучения как долю от начальной. Для настроек, не поддерживаемых ни одним аргументом, таких как послойные скорости обучения или обрезка градиентов, унаследуй класс тренера. - Распределенное обучение: при работе с большими наборами данных распределенное обучение может кардинально изменить ситуацию. Ты можешь сократить время обучения, распределив нагрузку между несколькими GPU или машинами. Этот подход особенно ценен для корпоративных проектов с большими вычислительными ресурсами.
- Формат памяти channels-last:
channels_last=Trueиспользует расположение памяти NHWC на CUDA, что может повысить производительность свертки на совместимом оборудовании. На других устройствах выводится предупреждение и сохраняется компоновка по умолчанию.
Количество эпох для обучения#
При обучении модели epoch означает один полный проход по всему обучающему датасету. Во время эпохи модель обрабатывает каждый пример из обучающего набора один раз и обновляет свои параметры на основе алгоритма обучения. Несколько эпох обычно необходимы для того, чтобы модель могла учиться и уточнять свои параметры с течением времени.
Часто возникающий вопрос заключается в том, как определить количество эпох для обучения модели. Хорошей отправной точкой являются 300 эпох. Если модель переобучается рано, ты можешь уменьшить количество эпох. Если overfitting не происходит после 300 эпох, ты можешь продлить обучение до 600, 1200 или более эпох.
Тем не менее, идеальное количество эпох может варьироваться в зависимости от размера твоего датасета и целей проекта. Более крупные датасеты могут потребовать большего количества эпох для эффективного обучения модели, в то время как меньшие датасеты могут нуждаться в меньшем количестве эпох во избежание переобучения. Что касается YOLO26, ты можешь установить параметр epochs в своем скрипте обучения.
Ранняя остановка (Early Stopping)#
Ранняя остановка — ценный метод оптимизации обучения модели. Отслеживая производительность на валидационном наборе, ты можешь остановить обучение, как только модель перестает улучшаться. Ты можешь сэкономить вычислительные ресурсы и предотвратить переобучение.
Процесс включает установку параметра терпения (patience), который определяет, сколько эпох нужно ждать улучшения метрик валидации перед остановкой обучения. Если производительность модели не улучшается в течение этих эпох, обучение останавливается, чтобы не тратить время и ресурсы впустую.
Для YOLO26 ты можешь включить раннюю остановку, установив параметр patience в своей конфигурации обучения. Например, patience=5 означает, что обучение остановится, если метрики валидации не улучшатся в течение 5 эпох подряд. Использование этого метода гарантирует, что процесс обучения останется эффективным и достигнет оптимальной производительности без чрезмерных вычислений.
Выбор между облачным и локальным обучением#
Существует два варианта обучения твоей модели: облачное обучение и локальное обучение.
Облачное обучение предлагает масштабируемость и мощное железо и идеально подходит для работы с большими датасетами и сложными моделями. Такие платформы, как Google Cloud, AWS и Azure, обеспечивают по требованию доступ к высокопроизводительным GPU и TPU, ускоряя время обучения и позволяя проводить эксперименты с более крупными моделями. Однако облачное обучение может стоить дорого, особенно в течение длительного времени, а передача данных может увеличить затраты и задержку.
Локальное обучение обеспечивает больший контроль и возможности настройки, позволяя адаптировать среду под конкретные нужды и избежать постоянных расходов на облако. Это может быть более экономично для долгосрочных проектов, а поскольку данные остаются у тебя, это безопаснее. Однако локальное оборудование может иметь ограничения по ресурсам и требовать обслуживания, что может привести к увеличению времени обучения для крупных моделей.
Выбор оптимизатора#
Оптимизатор — это алгоритм, который настраивает веса твоей нейронной сети для минимизации loss function, которая измеряет, насколько хорошо работает модель. Проще говоря, оптимизатор помогает модели учиться, подкручивая ее параметры для уменьшения ошибок. Выбор правильного оптимизатора напрямую влияет на то, как быстро и точно обучается модель.
Ты также можешь настраивать параметры оптимизатора для улучшения производительности модели. Настройка скорости обучения определяет размер шагов при обновлении параметров. Для стабильности ты можешь начать с умеренной скорости обучения и постепенно снижать ее со временем, чтобы улучшить долгосрочное обучение. Кроме того, установка импульса (momentum) определяет, какое влияние прошлые обновления оказывают на текущие. Стандартное значение импульса — около 0.9. Обычно это обеспечивает хороший баланс.
Распространенные оптимизаторы#
Разные оптимизаторы имеют свои сильные и слабые стороны. Давай взглянем на несколько распространенных вариантов.
-
SGD (Stochastic Gradient Descent):
- Обновляет параметры модели, используя градиент функции потерь относительно параметров.
- Простой и эффективный, но может медленно сходиться и застревать в локальных минимумах.
-
Adam (Adaptive Moment Estimation):
- Сочетает в себе преимущества SGD с импульсом и RMSProp.
- Настраивает скорость обучения для каждого параметра на основе оценок первого и второго моментов градиентов.
- Хорошо подходит для зашумленных данных и разреженных градиентов.
- Эффективен и обычно требует меньше настройки. Для более коротких запусков обучения
optimizer=autoдля YOLO26 выбирает тесно связанный AdamW, а не сам Adam.
-
RMSProp (Root Mean Square Propagation):
- Настраивает скорость обучения для каждого параметра, деля градиент на скользящее среднее величин недавних градиентов.
- Помогает справиться с проблемой затухающего градиента и эффективен для recurrent neural networks.
-
MuSGD (гибрид Muon + SGD):
- Сочетает обновления в стиле SGD с поведением, вдохновленным Muon, для улучшенной стабильности при крупномасштабном обучении.
- Хороший выбор, когда ты хочешь обобщающую способность как у SGD, но нуждаешься в более плавной сходимости, чем у обычного SGD.
- Особенно актуально для YOLO26 training recipes; если не уверен, начни с
optimizer=autoи сравни с MuSGD на своем датасете.
Для YOLO26 параметр optimizer позволяет тебе выбирать из различных оптимизаторов, включая SGD, MuSGD, Adam, Adamax, AdamW, NAdam, RAdam и RMSProp, или ты можешь установить его в значение auto для автоматического выбора на основе количества итераций обучения.
yolo train model=yolo26n.pt data=coco8.yaml optimizer=MuSGDСвязь с сообществом#
Будучи частью сообщества энтузиастов компьютерного зрения, ты сможешь быстрее решать проблемы и учиться. Вот несколько способов связаться, получить помощь и поделиться идеями.
Ресурсы сообщества#
- GitHub Issues: Посети YOLO26 GitHub repository и используй вкладку Issues, чтобы задавать вопросы, сообщать об ошибках и предлагать новые функции. Сообщество и мейнтейнеры очень активны и готовы помочь.
- Ultralytics Discord Server: Присоединяйся к Ultralytics Discord server, чтобы общаться с другими пользователями и разработчиками, получать поддержку и делиться своим опытом.
Официальная документация#
- Ultralytics YOLO26 Documentation: Ознакомься с official YOLO26 documentation для получения подробных руководств и полезных советов по различным проектам компьютерного зрения.
Использование этих ресурсов поможет тебе решать сложные задачи и быть в курсе последних тенденций и практик в сообществе компьютерного зрения.
Основные выводы#
Обучение моделей компьютерного зрения предполагает следование хорошим практикам, оптимизацию твоих стратегий и решение проблем по мере их возникновения. Такие методы, как настройка размеров батча, precision обучение в смешанной точности и начало с предобученных весов, могут заставить твои модели работать лучше и обучаться быстрее. Такие методы, как обучение на подмножестве и ранняя остановка, помогают тебе экономить время и ресурсы. Поддержание связи с сообществом и отслеживание новых тенденций помогут тебе продолжать улучшать свои навыки обучения моделей.
FAQ#
Для повышения эффективности использования GPU установи параметр
batchна максимальный размер, поддерживаемый твоим GPU. На одном ускорителеbatch=-1профилирует модель и ориентируется примерно на 60% использования памяти. На CPU и память Apple silicon происходит возврат кbatch=16, в то время как для запусков на нескольких GPU требуется явный глобальный размер батча, кратный количеству устройств. Дополнительную информацию см. в разделе Train mode arguments.Обучение со смешанной точностью использует как 16-битные (FP16), так и 32-битные (FP32) типы с плавающей запятой для баланса скорости вычислений и точности. В YOLO26 оно включено по умолчанию с помощью
amp=True; установиamp=False, чтобы принудительно использовать FP32. AMP пропускается на CPU и Apple silicon. Подробнее см. в разделе Train mode arguments.Многомасштабное обучение повышает производительность модели за счет обучения на изображениях разного размера, позволяя модели лучше обобщать данные для различных масштабов и расстояний. YOLO26 предлагает для этого два отдельных параметра.
scale=0.5выбирает коэффициент масштабирования от 0.5 до 1.5, а затем дополняет или обрезает изображение до фиксированногоimgsz, в то время какmulti_scale=0.25изменяет самimgszдля каждого батча с шагом по шагам (stride). О настройках и других деталях читай в Train mode documentation.Использование предобученных весов может значительно ускорить обучение и повысить точность модели за счет использования модели, уже знакомой с базовыми визуальными признаками. Загружай их через аргумент
model, как вmodel=yolo26n.pt; затемpretrainedрешает, сохраняются ли эти веса (Trueпо умолчанию), отбрасываются ли они (False) или заменяются ли другим чекпоинтом (pretrained=path/to/best.pt— способ переноса весов в сборкуmodel=*.yaml). Узнай больше в Train mode documentation.Количество эпох относится к полным проходам по обучающему датасету во время обучения модели. Типичная отправная точка — 300 эпох. Если твоя модель переобучается рано, ты можешь уменьшить количество. В качестве альтернативы, если переобучение не наблюдается, ты можешь продлить обучение до 600, 1200 или более эпох. Чтобы установить это в YOLO26, используй параметр
epochsв своем скрипте обучения. Дополнительные советы по определению идеального количества эпох см. в этом разделе number of epochs.