你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

如何实现在 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

答案是后一个 (,如果样本是可变长度的) ,则平均值由小块中的样本加权。 即你不会在时代结束时的状态获得模型的实际训练损失。