Нужно ли ставить shuffle в DataLoader?
Что проверяют
Понимаете ли вы, зачем перемешивание стохастическому градиентному спуску, и знаете ли, где оно вредит. Заодно проверяют знание самого загрузчика: связка с семплером, распределённый режим, воспроизводимость.
Как отвечать
На обучающей выборке да, shuffle=True. Батч должен быть похож на случайную выборку из данных. Если строки лежат отсортированными по классу, батчи получатся однородными, оценка градиента смещённой, и обучение пойдёт рывками. Плюс порядок меняется от эпохи к эпохе, что тоже помогает оптимизации.
На валидации и тесте shuffle=False: на метрику порядок не влияет, зато предсказания легко сопоставить с примерами, а прогоны становятся воспроизводимыми.
Нюансы, которых ждут от сильного кандидата:
shuffle=Trueвместе с собственнымsamplerпередать нельзя, порядок задаёт семплер. Для перекоса классов берут взвешенный семплер с повторениями;- у потокового датасета параметра нет, перемешивают буфером внутри самого датасета;
- в распределённом обучении порядок задаёт
DistributedSampler, и на каждой эпохе ему нужен вызовset_epoch, иначе перестановка будет одинаковой во всех эпохах; - воспроизводимость это фиксация зерна генератора и инициализация процессов загрузки, иначе прогоны не повторяются.
Где спотыкаются
Объясняют перемешивание борьбой с переобучением. Оно влияет на ход оптимизации и на репрезентативность батча, а переобучение лечится данными, регуляризацией и ранней остановкой.
Оставляют перемешивание на валидации и тесте, а потом не могут сопоставить предсказания с идентификаторами. Файл с ответами, записанный в порядке батчей, после этого просто неверен.
Путают перемешивание с корректным разбиением. Для временного ряда делить случайно нельзя, только по времени. А если один объект дал много строк, кадры одного видео или записи одного пациента, случайное разбиение растащит их между обучением и тестом, и метрика окажется завышенной.