バイナリ演算
要素ごとの 2 項演算子。
ElementTimes (x, y)
x .* y
Minus (x, y)
x - y
Plus (x, y)
x + y
LogPlus (x, y)
Less (x, y)
Equal (x, y)
Greater (x, y)
GreaterEqual (x, y)
NotEqual (x, y)
LessEqual (x, y)
BS.Boolean.And (x, y)
BS.Boolean.Or (x, y)
BS.Boolean.Xor (x, y)
パラメーター
x
: 左入力y
: 右入力
x
サイズとy
一致する必要があります (ブロードキャスト ルールの対象となります。以下を参照)。
3 つの Boolean
操作では、両方の入力が 0 または 1 のいずれかであることが想定されます。それ以外の場合、関数の動作は指定されておらず、実際には将来のバージョンで変更されます。
スパース値は現在サポートされていません。
戻り値
これらの関数は、対応する操作の結果を返します。 リレーションシップ演算子 (Equal()
など) と 3 つの Boolean
操作は、0 または 1 の値を返します。
出力ディメンションまたはテンソルシェイプは、ブロードキャストの対象となる入力と同じです。以下を参照してください。
説明
これらは一般的な二項演算子です。
これらは要素別に適用されます。
(BrainScript の *
演算子は要素 単位ではなく 、 マトリックス積の略であることに注意してください。これは、たとえば Python の numpy
ライブラリとは異なります)。
ブロードキャストを除き、入力のディメンションは同じである必要があります。
ブロードキャスト セマンティクス
Python numpy
のライブラリの後にモデルをCNTKするという概念であるブロードキャストは、いずれかの入力のディメンションが 1 で、もう一方の入力がそうでない場合は 1 にすることができます。
その場合、1 次元の入力がコピー n
されます。これは n
、対応する他の入力のディメンションです。
テンソルランクが一致しない場合、次元が小さい入力のテンソル形状は1と見なされ、ブロードキャストがトリガーされます。
たとえば、ベクトルに [13 x 1]
テンソルを [1 x 42]
追加すると、すべての組み合わせの合計を含むベクトルが生成 [13 x 42]
されます。
リレーションシップ操作
リレーションシップ演算子 (Equal()
など) は異ならず、グラデーションは常に 0 と見なされます。
これらは、フラグに使用できます。たとえば、操作の If()
条件引数として使用できます。
LogPlus()
この演算では LogPlus()
、対数形式で表される値の合計が計算されます。
つまり、次のように計算されます。
LogPlus (x, y) = Log (Exp (x) + Exp (y))
ここで x
、値 y
の対数です。
この演算は確率を扱う場合に便利です。多くの場合、対数表現のみが適切な数値精度を可能にするほど小さくなります。
注: この操作のもう 1 つの一般的な名前は、 sciPy など、log-add-exp です。
例
標準の Sigmoid レイヤー
このレイヤーでは、要素ごとのバイナリ +
が使用されます。
z = Sigmoid (W * x + b)
上記は要素ごとのものではなく、マトリックス積を表す*
点に注意してください。
Softmax アクティブ化の代替実装
アクティブ化関数は Softmax()
、ブロードキャスト Minus
を使用して記述できます。
MySoftmax (z) = Exp (z - ReduceLogSum (z))
ここで、 ReduceLogSum()
対数合計を計算することで、ベクトル z
をスカラーに減らします。 このスカラーは、減算のブロードキャスト セマンティクスを通じて、すべての入力値から減算されます。
これにより、Softmax 関数内のすべての値の合計による除算が実装されます。
要素ごとの最大 2 つの入力
要素ごとの最大 2 つの入力は、次の組み合わせGreater()
If()
として計算できます。
MyElementwiseMax (a, b) = If (Greater (a, b), a, b)
これは放送でも機能します。 たとえば、線形整流器は、2 番目の入力としてスカラー定数を使用して、これを使用して書き込むことができます。
MyReLU (x) = MyElementwiseMax (x, Constant(0))