你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
如何实现在 BrainScript 中表达内容
- 获取适用于 BrainScript 配置文件的好语法突出显示 ?
- 表示二进制分类器的错误率?
- 使用温度参数表达 softmax?
- 表示门控机制?
- 在动态轴上表达 softmax?
- 区域外?
- 生成常量 3D 张量?
- 在 BrainScript 中合并或连接矢量?
- 解释训练损失?
获取 BrainScript 配置文件的好语法突出显示
下面介绍如何使用 vim
;其他编辑器应类似
:set syntax=conf
这不是完美的,但它比没有语法突出显示好得多。 如果知道如何编写 .vim
语法文件,请向我们发送拉取请求。
在 Emacs 中, conf-mode
最适合。 若要切换,请按 M-x
开始输入命令,然后输入 conf-mode
。 在Windows Emacs 上,也有conf-windows-mode
,但是,这种模式似乎有时在注释中被特殊字符混淆。
表示我的二进制分类器的错误率
请勿使用 ClassificationError,因为它仅适用于多类标签。 使用标准算术和逻辑运算符,可以将其表示为
err = (label != (prediction > 0.5))
...
evaluationNodes = (err)
此处假设预测是给定输入的正类概率的估计值。
使用温度参数表达 softmax
在 BrainScript 中,温度 softmax 非常简单
TemperatureSoftmax (z, T) = Softmax (z / Constant (T))
Express a gating mechanism
最简单的方法是使用
BS.Boolean.If
(condition, thenExpression, elseExpression)
它适用于标量和张量, (所有参数都可以 广播) 。
在动态轴上表达 softmax
可以通过重复周期在动态轴上实现 softmax:
BrainScript:
SoftMaxOverSequence (z) = {
# define a recursive expression for \log(\sum_{i=1}^t \exp(z_i))
runningLogSumExp = LogPlus (z,
PastValue (0, runningLogSumExp, defaultHiddenActivation=-1e30))
logSumExp = If (BS.Loop.IsLast (runningLogSumExp), # if last entry
/*then*/ runningLogSumExp, # then copy that
/*else*/ FutureValue (0, logSumExp)) # else just propagate to the front
result = Exp (z - logSumExp)
}.result
实现区域输出
你可能想知道是否动态评估应用于常量的 Dropout。 是的! 因此 ,区域输出 与简单一样简单
Zoneout (x, xprev) =
{
mask = Dropout (BS.Constants.OnesLike (x))
res = BS.Boolean.If (mask, xprev, x)
}.res
生成常量 3D 张量
我想在CNTK中构建一个常量 3D 张量。 我学会了如何生成 1D 和 2D 常量数组,可以堆叠 (连接或组合) 它们并重复它们。 现在我需要堆叠 2D 张量才能制作三维张量?
假设你有三个张量,例如
A = ParameterTensor {100:200}
B = ParameterTensor {100:200}
C = ParameterTensor {100:200}
现在可以说
ABC = Splice (A:B:C, axis=3)
这将为你提供 [100 x 200 x 3] 张量。
(另一方面,如果说 Splice (A:B:C,axis=1) ,你会得到 [300 x 200] 张量,而 Splice (A:B:C,axis=2) 会得到 [100 x 600] 张量。)
请注意,若要在新维度中连接,所有输入的维度必须匹配。 例如,不能沿轴 3 (堆叠 ParameterTensor {100:200} 和 ParameterTensor {100:50},但你可以沿轴 2 堆叠它,这将为你提供 [100 x 250] 张量) 。
另请注意,轴索引基于 1,如数学。 例如矩阵的行维度是第一个轴,轴=1,列维度是第二个轴,轴=2。
解释训练损失
CNTK在结束时间后如何计算训练损失 (为粗体) ? 最终模型是否通过整个训练集来获取该值,或者它是否只是在模型更新期间更新时平均模型生成的 miniBatch 训练损失?
Finished Epoch[ 1 of 100]: [Training] CE = 0.15920662 * 59999999; totalSamplesSeen = 59999999; learningRatePerSample = 9.9999997e-05; epochTime=641.392s
Final Results: Minibatch[1-3510]: CE = 0.32190538 * 3592929
Finished Epoch[ 1 of 100]: [Validate] CE = 0.32190538 * 3592929
答案是后一个 (,如果样本是可变长度的) ,则平均值由小块中的样本加权。 即你不会在时代结束时的状态获得模型的实际训练损失。