CNTK C # API: как работает TrainingParameterScheduleDouble?

Я пытаюсь понять, как TrainingParameterScheduleDouble работает в CNTK C # API. К сожалению, документации нет, и предыдущий поток SO здесь кажется неправильным / неполным, поэтому я сам пытался перепроектировать поведение. Может ли кто-нибудь подтвердить мои выводы и ответить на оставшиеся у меня вопросы?

Перегрузка №1

TrainingParameterScheduleDouble(value, minibatchSize)

Это устанавливает скорость обучения равной value на minibatchSize количество выборок, независимо от фактического размера минипакета, переданного в GetNextMinibatch. Таким образом, использование minibatchSize: 1 - простой способ указать скорость обучения для каждой выборки.

Мне кажется, что вызов второго параметра minibatchSize в этом контексте очень вводит в заблуждение, поскольку он совершенно не связан с фактическим размером каждой мини-партии. Думаю, лучшим названием было бы что-то вроде perNumSamples, или я что-то упускаю?

Перегрузка №2

TrainingParameterScheduleDouble(value)

Это то же самое, что и установка minibatchSize: 0 выше, и имеет эффект использования «естественного» minibatchSize, которое передается в GetNextMinibatch в качестве количества выборок.

Таким образом, если у нас есть GetNextMinibatch(64), тогда new TrainingParameterScheduleDouble(0.001) приведет к скорости обучения в 64 раза медленнее, чем new TrainingParameterScheduleDouble(0.001, 1).

Перегрузка №3

TrainingParameterScheduleDouble(schedule)

Это изменяет скорость обучения с течением времени, используя «естественный» размер минипакетов. Таким образом, в расписании (30, 0.321), (1, 0.123) будет использоваться скорость обучения для фактических мини-пакетов 0,321 для первых 30 мини-пакетов и скорость 0,123 после этого.

Перегрузка №4

TrainingParameterScheduleDouble(schedule, epochSize)

epochSize заставляет IsSweepBased() возвращать False вместо True, но в остальном не оказывает видимого влияния на скорость обучения или что-либо еще. Это удивительно. Может ли кто-нибудь объяснить цель epochSize в этом контексте?

Перегрузка №5

TrainingParameterScheduleDouble(schedule, epochSize, minibatchSize)

Это единственный способ изменить скорость обучения с течением времени без использования естественного размера мини-пакета. Таким образом, расписание (30, 0.321), (1, 0.123) с minibatchSize: 1 будет использовать скорость обучения на выборку 0,321 для первых 30 выборок (независимо от фактического размера минипакета) и скорость 0,123 после этого. Как и прежде, размер эпохи не оказывает видимого влияния.

Если предположить, что это правильно, мне непонятно, что произойдет, если скорость обучения изменится в середине мини-партии. Может кто уточнить?


person brianberns    schedule 28.03.2018    source источник
comment
Отличная работа. Отсутствие документации по библиотеке CNTK просто невероятно.   -  person DavidGuaita    schedule 14.04.2019