Рекомендации и лучшие практики машинного обучения для обучения моделей#
Введение#
Один из важнейших этапов работы над проектом в области компьютерного зрения — обучение модели. Прежде чем перейти к нему, нужно определить цели и собрать данные и добавить к ним разметку. Затем предварительно обработай данные, чтобы убедиться в их чистоте и согласованности, и переходи к обучению модели.
Обучение модели — это процесс, в ходе которого модель учится распознавать визуальные закономерности и делать прогнозы на основе данных. Этот процесс напрямую влияет на точность приложения. В руководстве собраны рекомендации, методы оптимизации и советы по устранению неполадок, которые помогут тебе эффективно обучать модели компьютерного зрения.
Смотри: Советы по обучению моделей | Как работать с большими наборами данных | Размер пакета, загрузка GPU и смешанная точность
Как обучить модель машинного обучения#
Модель компьютерного зрения обучается путём настройки внутренних параметров для минимизации ошибок. Сначала модели передают большой набор изображений с разметкой. Модель прогнозирует, что изображено на этих снимках, а затем эти прогнозы сравниваются с истинными метками или содержимым изображений, чтобы вычислить ошибки. Ошибки показывают, насколько прогнозы модели отличаются от истинных значений.
Во время обучения модель многократно строит прогнозы, вычисляет ошибки и обновляет параметры с помощью процесса, который называется обратным распространением ошибки. В ходе этого процесса модель корректирует внутренние параметры (веса и смещения), чтобы уменьшить ошибки. Многократное повторение этого цикла постепенно повышает точность модели. Со временем модель учится распознавать сложные закономерности, например формы, цвета и текстуры.
Благодаря этому процессу обучения модель компьютерного зрения может выполнять различные задачи, включая обнаружение объектов, сегментацию экземпляров, семантическую сегментацию и классификацию изображений. Конечная цель — создать модель, которая сможет обобщать полученные знания на новые, ранее не встречавшиеся изображения и точно интерпретировать визуальные данные в реальных приложениях.
Теперь, когда мы разобрались, что происходит при обучении модели, рассмотрим, что нужно учитывать во время обучения.
Обучение на больших наборах данных#
Планируя обучать модель на большом наборе данных, нужно учесть несколько аспектов. Например, можно настроить размер пакета, контролировать использование GPU, выбрать обучение с несколькими масштабами и так далее. Рассмотрим каждый из этих вариантов подробнее.
Размер пакета и использование GPU#
При обучении моделей на больших наборах данных важно эффективно использовать GPU. Один из ключевых факторов — размер пакета, то есть количество образцов данных, которые модель машинного обучения обрабатывает за одну итерацию обучения. Если выбрать максимально возможный размер пакета, GPU будет использоваться на полную мощность, а обучение модели займёт меньше времени. Однако важно не допустить нехватки памяти GPU. При ошибках памяти постепенно уменьшай размер пакета, пока модель не начнёт обучаться без сбоев.
Смотри: Как использовать пакетный инференс с Ultralytics YOLO26 | Ускорение обнаружения объектов в Python 🎉
Для YOLO26 ты можешь задать параметр batch в аргументах режима обучения, чтобы учесть объём памяти твоего GPU. На одном ускорителе batch=-1 профилирует модель и выбирает размер батча, рассчитанный примерно на 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: хранит изображения набора данных в RAM, обеспечивая самый быстрый доступ, но увеличивая расход памяти.cache='disk': хранит изображения на диске. Это медленнее, чем в RAM, но быстрее, чем каждый раз загружать данные заново.cache=False: отключает кэширование и полностью полагается на ввод-вывод с диска — это самый медленный вариант.
Обучение со смешанной точностью#
При обучении со смешанной точностью используются числа с плавающей точкой двух форматов: 16-битного (FP16) и 32-битного (FP32). Преимущества обоих форматов сочетаются: FP16 ускоряет вычисления, а FP32 обеспечивает необходимую точность. Большинство операций нейронной сети выполняется в FP16, что ускоряет вычисления и снижает расход памяти. При этом основная копия весов модели хранится в FP32, чтобы обеспечить точность при обновлении весов. Так ты сможешь работать с более крупными моделями или пакетами в рамках тех же аппаратных ограничений.
Чтобы использовать обучение со смешанной точностью, измени скрипты обучения и убедись, что твоё оборудование (например, GPU) поддерживает этот режим. Многие современные фреймворки для глубокого обучения, такие как PyTorch и TensorFlow, поддерживают смешанную точность из коробки.
В YOLO26 обучение со смешанной точностью настроено просто: AMP уже включён по умолчанию (amp=True). На GPU с CUDA в начале обучения YOLO однократно проверяет возможности устройства и при неудачной проверке переключается на полный FP32; на CPU и Apple silicon AMP полностью отключён. Установи amp=False, чтобы принудительно использовать FP32.
Предобученные веса#
Использование предварительно обученных весов — эффективный способ ускорить обучение модели. Такие веса получены от моделей, уже обученных на больших наборах данных, и дают твоей модели хороший старт. Трансферное обучение адаптирует предварительно обученные модели к новым связанным задачам. При дообучении предварительно обученной модели сначала используются имеющиеся веса, а затем обучение продолжается на конкретном наборе данных. Этот подход сокращает время обучения и часто повышает производительность, поскольку модель уже хорошо понимает базовые признаки.
Предварительно обученные веса задаются аргументом model, поэтому model=yolo26n.pt уже использует веса COCO на старте. Параметр pretrained определяет, сохраняются ли эти веса (True, значение по умолчанию), отбрасываются (False) или заменяются другой контрольной точкой (pretrained=path/to/best.pt). Если задать pretrained=True для модели *.yaml, веса не будут загружены автоматически. Полный рабочий процесс трансферного обучения описан в руководстве Как дообучить YOLO на пользовательском наборе данных.
Другие методы для работы с большими наборами данных#
При работе с большими наборами данных можно использовать ещё несколько методов:
- Планировщики скорости обучения: планировщики динамически меняют скорость обучения в ходе обучения модели. Правильно подобранная скорость обучения помогает модели не проскакивать минимумы и повышает стабильность. При обучении YOLO26 параметр
lrfуправляет планированием скорости обучения, задавая конечную скорость как долю от начальной. Если нужное поведение нельзя настроить аргументом — например, скорость обучения для отдельных слоёв или ограничение градиента, — создай подкласс тренера. - Распределённое обучение: при работе с большими наборами данных распределённое обучение может значительно ускорить процесс. Можно сократить время обучения, распределив вычислительную нагрузку между несколькими GPU или компьютерами. Этот подход особенно полезен для крупных корпоративных проектов с большими вычислительными ресурсами.
- Формат памяти channels-last: при обучении на CUDA автоматически используется более быстрая раскладка памяти NHWC в PyTorch 1.11 и новее, кроме Windows, где она показала более низкую скорость. Установи
channels_last=True, чтобы включить этот формат принудительно, илиchannels_last=False, чтобы оставить NCHW; в PyTorch 1.10 и более ранних версиях, на CPU и MPS по умолчанию остаётся NCHW.
Количество эпох обучения#
При обучении модели эпоха — это один полный проход по всему обучающему набору данных. За одну эпоху модель обрабатывает каждый обучающий пример и обновляет параметры в соответствии с алгоритмом обучения. Обычно требуется несколько эпох, чтобы модель успела обучиться и постепенно уточнить свои параметры.
Часто возникает вопрос: как определить, сколько эпох нужно обучать модель? Хорошая отправная точка — 300 эпох. Если модель рано переобучается, количество эпох можно уменьшить. Если после 300 эпох переобучения нет, обучение можно продлить до 600, 1200 или большего числа эпох.
Однако оптимальное количество эпох зависит от размера набора данных и целей проекта. Для эффективного обучения на больших наборах данных может потребоваться больше эпох, а для маленьких наборов данных может понадобиться меньше эпох, чтобы избежать переобучения. Для YOLO26 можно задать параметр epochs в скрипте обучения.
Ранняя остановка#
Ранняя остановка — полезный способ оптимизировать обучение модели. Следя за результатами валидации, можно остановить обучение, когда модель перестанет улучшаться. Так ты сэкономишь вычислительные ресурсы и предотвратишь переобучение.
Для этого задаётся параметр терпения: он определяет, сколько эпох ждать улучшения метрик валидации, прежде чем остановить обучение. Если за это время результаты модели не улучшатся, обучение прекратится, чтобы не тратить время и ресурсы впустую.
В YOLO26 раннюю остановку можно включить, задав параметр терпения в конфигурации обучения. Например, значение patience=5 означает, что обучение остановится, если метрики валидации не будут улучшаться в течение 5 эпох подряд. Этот метод обеспечивает эффективное обучение и оптимальные результаты без лишних вычислений.
Облачное или локальное обучение#
Обучать модель можно двумя способами: в облаке или локально.
Обучение в облаке обеспечивает масштабируемость и доступ к мощному оборудованию, поэтому идеально подходит для работы с большими наборами данных и сложными моделями. Такие платформы, как Google Cloud, AWS и Azure, предоставляют доступ по запросу к высокопроизводительным GPU и TPU, сокращая время обучения и позволяя экспериментировать с более крупными моделями. Однако обучение в облаке может быть дорогим, особенно при длительном использовании, а передача данных увеличивает расходы и задержки.
Локальное обучение обеспечивает больший контроль и гибкость: ты можешь настроить среду под конкретные потребности и избежать регулярных расходов на облако. Для долгосрочных проектов оно может быть экономичнее, а поскольку данные остаются в локальной инфраструктуре, такой подход безопаснее. Однако ресурсы локального оборудования могут быть ограничены, а само оборудование требует обслуживания, из-за чего обучение крупных моделей может занимать больше времени.
Выбор оптимизатора#
Оптимизатор — это алгоритм, который изменяет веса нейронной сети, чтобы минимизировать функцию потерь, показывающую, насколько хорошо работает модель. Проще говоря, оптимизатор помогает модели учиться, корректируя ее параметры для уменьшения ошибок. Выбор оптимизатора напрямую влияет на скорость и точность обучения модели.
Ты также можешь настроить параметры оптимизатора, чтобы повысить качество работы модели. Изменение скорости обучения задает размер шагов при обновлении параметров. Для стабильности можно начать с умеренной скорости обучения и постепенно снижать ее со временем, чтобы улучшить обучение в долгосрочной перспективе. Кроме того, параметр импульса определяет, насколько сильно прошлые обновления влияют на текущие. Обычно значение импульса составляет около 0.9. Как правило, это обеспечивает хороший баланс.
Распространенные оптимизаторы#
У разных оптимизаторов есть свои преимущества и недостатки. Рассмотрим несколько распространенных вариантов.
-
Стохастический градиентный спуск (SGD):
- Обновляет параметры модели, используя градиент функции потерь по отношению к этим параметрам.
- Простой и эффективный, но может медленно сходиться и застревать в локальных минимумах.
-
Adam (адаптивная оценка моментов):
- Сочетает преимущества SGD с импульсом и RMSProp.
- Настраивает скорость обучения для каждого параметра на основе оценок первого и второго моментов градиентов.
- Хорошо подходит для зашумленных данных и разреженных градиентов.
- Эффективен и обычно требует меньше настройки. Для коротких запусков обучения
optimizer=autoв YOLO26 выбирает близкий к Adam вариант AdamW, а не сам Adam.
-
Распространение среднеквадратичного значения (RMSProp):
- Настраивает скорость обучения для каждого параметра, деля градиент на скользящее среднее величин недавних градиентов.
- Помогает справиться с проблемой затухающего градиента и эффективен для рекуррентных нейронных сетей.
-
MuSGD (гибрид Muon и SGD):
- Сочетает обновления в стиле SGD с принципами Muon, повышая стабильность обучения в большом масштабе.
- Хороший выбор, если тебе нужно обобщение, характерное для SGD, но при этом более плавная сходимость, чем у обычного SGD.
- Особенно актуален для рецептов обучения YOLO26; если сомневаешься, начни с
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: зайди в репозиторий YOLO26 на GitHub и открой вкладку Issues, чтобы задать вопросы, сообщить об ошибках и предложить новые функции. Участники сообщества и сопровождающие проекта активно помогают пользователям.
- Сервер Ultralytics в Discord: присоединяйся к серверу Ultralytics в Discord, чтобы общаться с другими пользователями и разработчиками, получать поддержку и делиться опытом.
Официальная документация#
- Документация Ultralytics YOLO26: изучи официальную документацию YOLO26: в ней есть подробные руководства и полезные советы по различным проектам в области компьютерного зрения.
Эти ресурсы помогут тебе решать задачи и быть в курсе последних тенденций и практик в сообществе компьютерного зрения.
Основные выводы#
Обучение моделей компьютерного зрения требует соблюдения проверенных практик, оптимизации стратегий и решения возникающих проблем. Такие приемы, как настройка размера пакета, обучение со смешанной точностью и использование предварительно обученных весов, помогают повысить качество работы моделей и ускорить обучение. Обучение на подмножестве данных и ранняя остановка позволяют экономить время и ресурсы. Общение с сообществом и знакомство с новыми тенденциями помогут тебе постоянно совершенствовать навыки обучения моделей.
Часто задаваемые вопросы#
Чтобы повысить загрузку GPU, установи для параметра
batchмаксимальный размер, поддерживаемый твоим GPU. На одном ускорителеbatch=-1профилирует модель и стремится использовать примерно 60% памяти. На CPU и Apple silicon вместо этого используетсяbatch=16, а для запуска на нескольких GPU необходимо явно задать общий размер пакета, кратный числу устройств. Подробнее см. в разделе Аргументы режима обучения.При обучении со смешанной точностью используются типы чисел с плавающей точкой разрядностью 16 бит (FP16) и 32 бита (FP32), чтобы сбалансировать скорость вычислений и точность. В YOLO26 этот режим включен по умолчанию с помощью
amp=True; задайamp=False, чтобы принудительно использовать FP32. AMP не используется на CPU и Apple silicon. Подробнее см. в разделе Аргументы режима обучения.Обучение на нескольких масштабах повышает качество работы модели: она обучается на изображениях разного размера и лучше обобщает данные при разных масштабах и расстояниях. В YOLO26 для этого предусмотрено два отдельных параметра.
scale=0.5выбирает коэффициент масштабирования от 0.5 до 1.5, а затем дополняет изображение полями или обрезает его до фиксированногоimgsz;multi_scale=0.25меняет само значениеimgszв каждом пакете с шагом, кратным stride. Настройки и подробности см. в документации по режиму обучения.Предварительно обученные веса могут значительно ускорить обучение и повысить точность модели, поскольку она уже знакома с базовыми визуальными признаками. Загрузи их с помощью аргумента
model, например, указавmodel=yolo26n.pt. Затемpretrainedопределяет, оставить ли эти веса (True, значение по умолчанию), отбросить (False) или заменить другим чекпойнтом (pretrained=path/to/best.pt— так можно перенести веса в сборкуmodel=*.yaml). Подробнее см. в документации по режиму обучения.Число эпох — это количество полных проходов по обучающему набору данных. Обычно для начала выбирают 300 эпох. Если модель рано переобучается, число эпох можно уменьшить. Если признаков переобучения нет, обучение можно продлить до 600, 1200 или большего числа эпох. Чтобы задать число эпох в YOLO26, используй параметр
epochsв скрипте обучения. Дополнительные рекомендации по выбору оптимального числа эпох см. в разделе о числе эпох.