Я пытаюсь понять, как 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 после этого. Как и прежде, размер эпохи не оказывает видимого влияния.
Если предположить, что это правильно, мне непонятно, что произойдет, если скорость обучения изменится в середине мини-партии. Может кто уточнить?