BrainScript で表現する操作方法
- BrainScript 構成ファイルの構文の強調表示について 説明します。
- バイナリ分類子のエラー率を表しますか?
- 温度パラメーターを使用して softmax を表現しますか?
- ゲーティングメカニズムを表現しますか?
- 動的軸上にソフトマックスを表現しますか?
- Zoneout?
- 定数 3D テンソルを構築しますか?
- BrainScript でベクターを結合または連結しますか?
- トレーニングの損失を解釈しますか?
BrainScript 構成ファイルの構文の強調表示を取得する
使用する場合 vim
の方法は次のとおりです。他の編集者も同様である必要があります
:set syntax=conf
これは完璧ではありませんが、構文の強調表示がないよりもはるかに優れています。 構文ファイルを記述する方法がわかっている場合は、 .vim
pull request を送信してください。
Emacs では、 conf-mode
最適です。 切り替えるには、キーを押 M-x
してコマンドの入力を開始し、次に「.」と入力 conf-mode
します。 Windows Emacs でも、そのモードはconf-windows-mode
コメント内の特殊文字によって混乱しているように見えます。
バイナリ分類子のエラー率を表す
多クラス ラベルに対してのみ機能する ClassificationError は使用しないでください。 標準の算術演算子と論理演算子を使用すると、次のように表現できます。
err = (label != (prediction > 0.5))
...
evaluationNodes = (err)
ここで、予測は入力を与えられた正のクラスの確率の推定値であると仮定します。
温度パラメーターを使用して softmax を表現する
温度ソフトマックスはBrainScriptで非常に簡単です
TemperatureSoftmax (z, T) = Softmax (z / Constant (T))
ゲーティングメカニズムを表現する
最も簡単な方法は、
BS.Boolean.If
(condition, thenExpression, elseExpression)
これはスカラーとテンソルで動作します(すべての引数は ブロードキャストできます)。
動的軸上でソフトマックスを表現する
動的軸上のソフトマックスは、繰り返しを使用して実行できます。
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 は次のように簡単です。
Zoneout (x, xprev) =
{
mask = Dropout (BS.Constants.OnesLike (x))
res = BS.Boolean.If (mask, xprev, x)
}.res
定数 3D テンソルを構築する
私はCNTKで定数3Dテンソルを構築したい。 私は1Dと2Dの定数配列を生成する方法を学びました。私はそれらを積み重ね(連結または結合)し、それらを繰り返すことができます。 今、私は3Dテンソルを作るために2Dテンソルを積み重ねる必要がありますか?
たとえば、3 つのテンソルがあるとします。
A = ParameterTensor {100:200}
B = ParameterTensor {100:200}
C = ParameterTensor {100:200}
次に、次の手順を実行します。
ABC = Splice (A:B:C, axis=3)
これはあなたに[100 x 200 x 3]テンソルを与えます。
(一方、スプライス (A:B:C、axis=1) と言っていた場合、[300 x 200] テンソルが取得され、スプライス (A:B:C,axis=2) は [100 x 600] テンソルになります)。
新しい寸法でスプライスするには、すべての入力の寸法が一致する必要があることに注意してください。 たとえば、ParameterTensor {100:200} と ParameterTensor {100:50} を軸 3 に積み上げることはできません (ただし、軸 2 に沿って積み重ねると、[100 x 250] テンソルになります)。
また、数式のように軸インデックスは 1 から始まる点にも注意してください。 たとえば、行列の行ディメンションは最初の軸、axis=1、列の次元は 2 番目の軸である axis=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
答えは後者です(平均は、可変長の場合はミニバッチのサンプルによって重み付けされます)。 つまり、エポックの最後にある状態でモデルの実際のトレーニング損失が得られない場合です。