CNTK C#API:TrainingParameterScheduleDouble如何工作?

bri*_*rns 6 .net c# machine-learning deep-learning cntk

我试图了解TrainingParameterScheduleDoubleCNTK C#API中的工作方式。不幸的是,没有任何文件和之前的SO线程在这里似乎是不正确/不完整的,所以我试图反向工程的行为自己。谁能证实我的结论并回答我的遗留问题?

过载#1

TrainingParameterScheduleDouble(value, minibatchSize)
Run Code Online (Sandbox Code Playgroud)

这会将学习率设置为valueminibatchSize样本数量,而与传递给的实际小批量大小无关GetNextMinibatch。因此,使用minibatchSize: 1是指定每个样本学习率的简单方法。

在我看来,minibatchSize在这种情况下调用第二个参数非常容易引起误解,因为它与每个小批量的实际大小完全无关。我认为一个更好的名字应该是perNumSamples,或者我缺少什么?

过载#2

TrainingParameterScheduleDouble(value)
Run Code Online (Sandbox Code Playgroud)

这与minibatchSize: 0上面的设置相同,并且具有使用作为样本数量minibatchSize传递的“自然”效果GetNextMinibatch

因此,如果这样的GetNextMinibatch(64)new TrainingParameterScheduleDouble(0.001),学习速度将比 64倍new TrainingParameterScheduleDouble(0.001, 1)

过载#3

TrainingParameterScheduleDouble(schedule)
Run Code Online (Sandbox Code Playgroud)

使用“自然”的小批量大小,这会随时间改变学习率。因此,对于的时间表,(30, 0.321), (1, 0.123)前30个小批量的每次实际小批量学习率为0.321,此后为0.123。

过载#4

TrainingParameterScheduleDouble(schedule, epochSize)
Run Code Online (Sandbox Code Playgroud)

epochSize导致IsSweepBased()返回False而不是True,但是对学习率或其他任何因素都没有明显影响。这真是令人惊讶。任何人都可以epochSize在这种情况下解释其目的吗?

过载#5

TrainingParameterScheduleDouble(schedule, epochSize, minibatchSize)
Run Code Online (Sandbox Code Playgroud)

这是在不使用自然小批量大小的情况下随时间改变学习率的唯一方法。因此,(30, 0.321), (1, 0.123)with 的时间表minibatchSize: 1会在前30个样本中使用每个样本的学习率为0.321(与实际最小批量大小无关),之后的比率为0.123。和以前一样,历元大小没有明显的影响。

假设这是正确的,我不清楚如果在小批量生产过程中学习率发生变化会发生什么。谁能澄清?