Поделиться через


Интерпретация epoch_size, minibatch_size_in_samples и MinibatchSource.next_minibatch в CNTK

В этой статье мы проясним интерпретацию и использование следующих параметров и функций в Python:

epoch_size

Количество образцов меток (тензоров вдоль динамической оси) в каждой эпохе. В epoch_size CNTK — это количество выборок меток, после которых выполняются конкретные дополнительные действия, в том числе

  • сохранение модели контрольных точек (обучение можно перезапустить отсюда)
  • перекрестная проверка;
  • Управление скоростью обучения
  • мини-батч-масштабирование

Обратите внимание, что определение количества выборок меток аналогично количеству выборок, используемых для minibatch_size_in_samples. Определение epoch_size отличается от определения minibatch_size_in_samples в том смысле, что epoch_size это примеры меток , а не входные образцы.

Поэтому, что важно, для последовательных данных пример является отдельным элементом последовательности. Таким образом, CNTK epoch_sizeне относится к ряду последовательностей, а к числу элементовпоследовательности в метках последовательности, составляющих мини-пакет.

В равной степени важно epoch_size ссылаться на образцы меток , а не входные образцы, а количество меток на последовательность не обязательно является числом входных выборок. Например, можно иметь одну метку для каждой последовательности и для каждой последовательности иметь множество выборок (в этом случае epoch_size действует как число последовательностей), и можно иметь одну метку на выборку в последовательности, в этом случае epoch_size действует точно так же, как minibatch_size_in_samples в том, что каждый пример (не последовательность) подсчитывается.

Для небольших размеров наборов epoch_size данных часто устанавливается равный размеру набора данных. В Python для этого можно указатьcntk.io.INFINITELY_REPEAT. В Python можно также задать значение cntk.io.FULL_DATA_SWEEP, в котором обработка будет остановлена после одного прохода всего размера данных.

Для больших наборов данных может потребоваться руководство по выбору epoch_size путем создания контрольных точек. Например, если вы хотите потерять не более 30 минут вычислений в случае сбоя электроэнергии или сетевого сбоя, вам потребуется создать контрольную точку примерно каждые 30 минут (с которого можно возобновить обучение). Выберите epoch_size количество выборок, которое занимает около 30 минут для вычисления.

minibatch_size_in_samples

Примечание. Для пользователей BrainScript параметр для размера мини-пакета имеет значение minibatchSize; для Python пользователей это .minibatch_size_in_samples

CNTK имеет очень конкретное определение minibatch_size_in_samples параметра: оно обозначает количество выборок между обновлениями модели. Пример определяется как один вектор или тензор, который проходит через систему. Например, в задаче распознавания изображений один образ является одним примером.

Размер минибатча для каждой эпохи предоставляется в примерах (тензоры вдоль динамической оси). Значение по умолчанию — 256. Вы можете использовать разные значения для разных эпох; Например, 128*2 + 1024 (в Python) означает использование мини-батча размером 128 для первых двух эпох, а затем 1024 для остальных. Обратите внимание, что "размер мини-пакета" в CNTK означает количество выборок, обработанных между обновлениями модели. Это определение также содержится при параллелизации между рабочими ролей (например, для K рабочих ролей число выборок, которые будут обрабатываться minibatch_size_in_samples/K). В случае входных данных переменной длины указывает на количество элементов в этих последовательностях, minibatch_size_in_samplesа не количество последовательностей. ФУНКЦИЯ УПРАВЛЕНИЯ БУДЕТ пытаться вписаться в максимально возможное количество последовательностей в мини-batch, которые не превышают minibatch_size_in_samples общих выборок. Если задано несколько входных данных, тензоры добавляются в текущий мини-бат до тех пор, пока один из входных данных не превысит значение minibatch_size_in_samples.

Важно отметить, что для последовательных данных пример является отдельным элементом последовательности. Таким образом, CNTK minibatch_size_in_samplesне относится к числу последовательностей в мини-батче, но совокупное число элементов и маркеров последовательности в последовательностях, составляющих мини-батч. CNTK имеет встроенную поддержку последовательностей переменной длины, т. е. она может размещать последовательности очень разных длин в одном мини-пакете без необходимости обходных путей, таких как сегментирование. Вместе с понятием CNTK о указании скорости обучения на выборку (вместо среднего мини-батча), каждый элемент последовательностей любой длины способствует тому же градиенту, что приводит к согласованной конвергенции. (Многие другие наборы средств определяют размер мини-пакета для последовательных данных в качестве количества последовательностей в мини-пакете. Это проблематично, особенно если градиенты также определяются как средние значения минибатча, а не суммы мини-батов CNTK, так как вклад в градиент из каждого токена или шага последовательности будет обратно пропорциональна длине последовательности. CNTK подход избегает этого.)

При использовании нескольких входных данных возможно, что не все входные данные имеют одинаковую длину последовательности. Например, в классификации последовательностей метка каждой последовательности является одним маркером. В этом случае входные данные с наибольшим количеством выборок управляют размером мини-пакета. (Это поведение можно изменить, указав defines_mb_size=True для некоторых входных данных, размер мини-пакета будет подсчитываться на основе последовательностей из этого конкретного входного значения. Если задано несколько входных данных, только один из них может иметь defines_mb_size значение True.)

Несмотря на четкое определение minibatch_size_in_samples количества выборок между обновлениями модели, существует два случая, когда необходимо расслабить определение:

  • последовательные данные: последовательности переменной длины обычно не суммировать до запрошенного размера мини-пакета. В этом случае как можно больше последовательностей упаковываются в мини-пакет без превышения запрошенного размера мини-пакета (за одним исключением: если следующая последовательность в случайном корпусе превышает длину мини-пакета, размер мини-пакета будет состоять из этой последовательности).
  • Параллелизм данных: здесь размер мини-пакета приблизительный, так как наш алгоритм случайной выборки на основе фрагментов не может гарантировать, что каждый работник получает точно такое же количество выборок.

Все описанные выше рекомендации также относятся к epoch_size, но epoch_size имеют некоторые различия, см. выше.

MinibatchSource.next_minibatch

Метод MinibatchSource.next_minibatch() считывает мини-пакет, содержащий данные для всех входных потоков. При вызове во время обучения MinibatchSource.next_minibatch(minibatch_size_in_samples, input_map) выбирается случайное подмножество k выборок из набора данных для обучения, где k=minibatch_size_in_samples.

Реализация гарантирует, что при next_minibatch вызове N времени (где N = number_of_training_samples/minibatch_size_in_samples) весь обучающий набор данных покрывается в конце N вызовов next_minibatch. Это также означает, что при next_minibatch вызове 2*N времени весь набор данных покрывается дважды.

Дополнительные сведения:

  • Каждый цикл по данным будет иметь другой случайный порядок.
  • Если вы удвоите размер мини-batch, один мини-batch теперь будет содержать именно образцы, которые, прежде, соответствующие две последовательные мини-батчи бы содержали (это может быть приблизительно, если у вас есть последовательности переменной длины). Т. е. два запуска, которые отличаются только в размере мини-пакета, обрабатывают данные в одном порядке.
  • При прерывании и перезапуске из контрольной точки вы получите тот же случайный порядок, что и если бы вы не прервали обучение. Это реализуется путем заземления процесса чтения и случайной обработки на номинальной оси времени с помощью этого простого алгоритма:
    • Обучение продолжается на номинальной бесконечной оси времени. Если вы извлекаете мини-пакет размером 256, номинальное время выполняется на 256.
    • Обучающий корпус реплицируется бесконечное количество раз на этой оси времени. Если у вас есть M примеры, первая реплика охватывает номинальное время 0..M-1; второй M..2M-1и т. д.
    • Каждая реплика случайным образом перетасовываются внутри, но не через границы реплики. Т.е. как только вы обработали точные M образцы, вы видели каждый образец ровно один раз.
    • Вызов next_minibatch(K) предоставляет следующие K примеры на этой перешагнутой бесконечной временной шкале. Это то же самое, что призыв next_minibatch(1) к K временам.
    • Все это делается лениво.
    • Перезапуск из контрольной точки выполняется так же просто, как сброс номинального времени до номинального времени создания контрольной точки.