我试图在Caffe中实现一个带有“温度”参数的Softmax层。我正在实现一个使用这里概述的蒸馏技术的网络。
本质上,我希望我的Softmax层使用如下带温度的Softmax函数:
F(X) = exp(zi(X)/T) / sum(exp(zl(X)/T))
使用这个函数,我希望能够在训练前调整温度T
。我找到了一个类似的问题,但那个问题试图在部署网络上实现带温度的Softmax。我在实现第一个答案中描述为“选项4”的额外Scale层时遇到了困难。
我使用的是Caffe示例目录中找到的cifar10_full_train_test prototxt文件。我尝试进行了以下更改:
原版
.........layer { name: "accuracy" type: "Accuracy" bottom: "ip1" bottom: "label" top: "accuracy" include { phase: TEST }}layer { name: "loss" type: "SoftmaxWithLoss" bottom: "ip1" bottom: "label" top: "loss"}
修改版
.........layer { name: "accuracy" type: "Accuracy" bottom: "ip1" bottom: "label" top: "accuracy" include { phase: TEST }}layer { type: "Scale" name: "temperature" top: "zi/T" bottom: "ip1" scale_param { filler: { type: 'constant' value: 0.025 } ### 我希望T = 40,所以1/40=.025 } param { lr_mult: 0 decay_mult: 0 }}layer { name: "loss" type: "SoftmaxWithLoss" bottom: "ip1" bottom: "label" top: "loss"}
经过快速训练(5,000次迭代)后,我检查了分类概率是否看起来更均匀,但实际上它们似乎分布得更不均匀了。
例如:
高温T: F(X) = [0.2, 0.5, 0.1, 0.2]
低温T: F(X) = [0.02, 0.95, 0.01, 0.02]
~我的尝试: F(X) = [0, 1.0, 0, 0]
我的实现看起来是正确的吗?无论如何,我遗漏了什么?
回答:
你没有使用你的"Scale"
层产生的“冷却”预测"zi/T"
。
layer { name: "loss" type: "SoftmaxWithLoss" bottom: "zi/T" # 使用“冷却”预测而不是原始预测。 bottom: "label" top: "loss"}