Multinomial

バージョン名: Multinomial-13

カテゴリー: 生成

簡単な説明: Multinomial 操作は、入力クラス確率に基づいて多項分布からサンプリングされたクラス・インデックスのシーケンスを生成します。

詳細な説明: Multinomial 操作では、多項分布からサンプリングされた一連のクラス・インデックスが生成されます。このコンテキストでは、確率 (probs) 値は、多項分布内の各クラスに関連付けられた確率を表します。この操作を実行すると、これらの確率に基づいてクラスがランダムに選択されます。その後、probs 配列で選択したクラスのインデックスが、対応するバッチの output シーケンスに追加されます。

アルゴリズムの定式化:

次の表記は、a と b 間の実数の範囲を示します。

\[[a, b] => { x \in \mathbb{R}, a <= x <= b }\]

確率 x1、x2、…、xn のリストが与えられると、次のようになります。

  • log_probs が true の場合:

    • 各確率 x について、値 \(e^{x}\) に置き換えます。

  • 配列 - 離散 CDF (累積分布関数) - これらの確率の累積和を作成します。i 番目の値が確率 x1、…、xi の合計である値の配列を作成します。

  • 作成された配列をその最大値で除算して、範囲 [0, 1] の実数値間の累積確率を正規化します。この配列は、CDF の定義により昇順でソートされるため、最大値は配列の最後の値になります。

  • [0, 1] の範囲の倍精度浮動小数点数のシーケンスをランダムに生成します。

  • 生成された数値ごとに、累積確率が生成された値以下となる最小のインデックスを持つクラスを割り当てます。

  • with_replacement が False の場合 (置換なしのサンプリング):

    • インデックス i を持つクラスが選択されていると仮定します。その場合、i 番目のインデックスから始まるすべての CDF 値は、選択されたクラスの元の確率だけ低下するはずです。これにより、指定されたクラスのサンプリング確率が実質的に 0 に設定されます。

    • その後、CDF を最後の (最大) 値で除算して、範囲 [0, 1] の実数値間の累積確率を正規化します。

  • 出力インデックスを convert_type に変換します。

  • 出力インデックスを返します。

計算例:

例 1 - 1 つのバッチを含む単純な 2D テンソル

  • probs = [[0.1, 0.5, 0.4]]num_samples = 5、log_probs = false、with_replacement = true とします

  • 確率論の probs = [[0.1, 0.1 + 0.5, 0.1 + 0.5 + 0.4]] = [[0.1, 0.6, 1]]

  • ランダムに生成された float = [[0.2, 0.4, 0.6, 0.8, 1]]

  • 割り当てられたクラス = [[1, 1, 1, 2, 2]]

例 2 - 2D テンソル、対数確率

  • probs = [[-1, 1, 2], [50, 1, 21]]num_samples = 10、log_probs = true、with_replacement = true とします

  • べき乗された probs = [[0.36, 2.71, 7.38], [5184705528587072464087.45, 2.71, 1318815734.48]]

  • バッチごとの probs の CDF = [[0.36, 3.07, 10.45], [5184705528587072464087.45, 5184705528587072464090.16, 5184705528588391279824.64]]

  • 正規化された CDF = [[0.03, 0.29, 1], [1.0, 1.0, 1.0]]

  • ランダムに生成された float = [[0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1], [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1]]

  • 割り当てられたクラス = [[1, 1, 2, 2, 2, 2, 2, 2, 2, 2], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]

例 3 - 2D テンソル、置換なし

  • probs = [[0.1, 0.5, 0.4]]num_samples = 2、log_probs = false、with_replacement = false とします

  • probs の CDF= [[0.1, 0.6, 1]]

  • ランダムに生成された float = [[0.3, 0.2]]

  • ループ内:

    • 値が 0.3 の場合、idx 1 のクラスが選択されます

    • したがって、CDF では、idx 1 で始まるすべてのクラスについて、idx 1 = probs[1] = 0.5 のクラスの確率を減算します。

    • CDF = [[0.1, 0.6 - 0.5, 1.0 - 0.5]] = [[0.1, 0.1, 0.5]]

    • 最後の値で除算して CDF を正規化します: CDF = [[0.2, 0.2, 1.0]]

    • 次のランダムに生成された浮動小数点 (ここでは 0.2) を取得し、すべてのランダムサンプルにクラスが割り当てられるまで繰り返します。sampled values < = 0.2 の場合、sample value < = CDF probability を満たす最初の値を持つインデックスで検索が停止するため、idx 0 のクラスのみを選択できることに注意してください

  • 割り当てられたクラス = [[1, 2]]

属性:

  • convert_type

    • 説明: 出力のタイプ生成アルゴリズムを決定し、結果の値に影響します。convert_type の異なる値に対して生成される出力番号は、等しくない場合があります。

    • 値の範囲: “i32”、“i64”

    • タイプ: 文字列

    • 必須: はい

  • with_replacement

    • 説明: 置換によってサンプリングするかどうかを制御します (クラスは複数回サンプリングできます)。

    • 値の範囲: truefalse

      • true - クラス・インデックスは複数回サンプリングできます。

      • false - クラス・インデックスは出力内で繰り返されず、probsclass_size 次元のサイズは num_samples 値以上である必要があります。パフォーマンスに影響を与える可能性があります。

    • タイプ: bool

    • 必須: はい

  • log_probs

    • 説明: inputs を確率として扱うか、正規化されていない対数確率として扱うかを制御できます。

    • 値の範囲: truefalse

      • true - inputs の設定値は、正規化されていない対数確率であり、任意の実数を指定できます。

      • false - inputs の確率は非負で有限であり、非ゼロ和であることが期待されます。

    • タイプ: bool

    • 必須: はい

  • global_seed

    • 説明: グローバルシード値。

    • 値の範囲: 負ではない整数

    • タイプ: unsigned int 64 ビット

    • デフォルト値: 0

    • 必須: いいえ

  • op_seed

    • 説明: 運用シード値。

    • 値の範囲: 負ではない整数

    • タイプ: unsigned int 64 ビット

    • デフォルト値: 0

    • 必須: いいえ

入力:

  • 1: probs - 確率を伴う T_IN タイプおよび形状 [batch_size, class_size] の 2D テンソル。許可される値は、log_probs 属性によって異なります。値は、指定されたバッチ内のすべての確率の合計が 1 に等しい [0, 1] の範囲の値を持つように内部的に正規化されます。必須。

  • 2: num_samples - 多項分布から抽出するサンプルの数を指定する T_SAMPLES タイプの単一要素を持つスカラーまたは 1D テンソル。必須。

出力:

  • 1: output- 属性 convert_type と形状 [batch_size, num_samples] で指定されたタイプを持つテンソル。

タイプ:

  • T_IN: サポートされている浮動小数点タイプ。

  • T_SAMPLES: 32 ビットまたは 64 ビット整数。

例 1: 1 つのバッチを含む 2D 入力テンソル。

 <layer ... name="Multinomial" type="Multinomial">
     <data convert_type="f32", with_replacement="true", log_probs="false", global_seed="234", op_seed="148"/>
     <input>
         <port id="0" precision="FP32">  <!-- probs value: [[0.1, 0.5, 0.4]] -->
             <dim>1</dim> <!-- batch size of 2 -->
             <dim>3</dim>
         </port>
         <port id="1" precision="I32"/> <!-- num_samples value: 5 -->
     </input>
     <output>
         <port id="3" precision="I32" names="Multinomial:0">
             <dim>1</dim> <!--dimension depends on input batch size -->
             <dim>5</dim> <!--dimension depends on num_samples -->
         </port>
     </output>
 </layer>

例 2: 複数のバッチを含む 2D 入力テンソル。

 <layer ... name="Multinomial" type="Multinomial">
     <data convert_type="f32", with_replacement="true", log_probs="true", global_seed="234", op_seed="148"/>
     <input>
         <port id="0" precision="FP32">  <!-- probs value: [[-1, 1, 2], [50, 1, 21]] -->
             <dim>2</dim> <!-- batch size of 2 -->
             <dim>3</dim>
         </port>
         <port id="1" precision="I32"/> <!-- num_samples value: 10 -->
     </input>
     <output>
         <port id="3" precision="I32" names="Multinomial:0">
             <dim>2</dim> <!--dimension depends on input batch size -->
             <dim>10</dim> <!--dimension depends on num_samples -->
         </port>
     </output>
 </layer>

例 3: 置換なしの 2D 入力テンソル。

 <layer ... name="Multinomial" type="Multinomial">
     <data convert_type="f32", with_replacement="false", log_probs="false", global_seed="234", op_seed="148"/>
     <input>
         <port id="0" precision="FP32">  <!-- probs value: [[0.1, 0.5, 0.4]] -->
             <dim>2</dim> <!-- batch size of 2 -->
             <dim>3</dim>
         </port>
         <port id="1" precision="I32"/> <!-- num_samples value: 2 -->
     </input>
     <output>
         <port id="3" precision="I32" names="Multinomial:0">
             <dim>2</dim> <!-- batch size of 2 -->
             <dim>2</dim> <!-- 2 unique samples of classes -->
         </port>
     </output>
 </layer>