pub fn softmax_into(
logits: &[f64],
out: &mut [f64],
temperature: f64,
) -> Result<()>Expand description
ロジット列から温度付きソフトマックス確率分布を計算し、指定されたバッファへ書き込む。
§概要
- 推論ランタイム等の高スループット処理向けに、ヒープ割り当てを行わずに確率分布を算出する。
- 数値安定性を担保するため、最大値減算(Max-subtraction)および温度除算を適用する。
- 算出された確率値は浮動小数点演算の累積丸め誤差を考慮し、
[0.0, 1.0]の閉区間にクランプされる。
flowchart TD
Start["入力: logits, out, temperature"] --> Val{"バリデーション
(空配列 / 長さ不一致 / 非有限値 / tau <= 0)"} Val -- 不正 --> Err["CoreError::MathError 返却"] Val -- 正常 --> KCheck{"候補数 K == 1 ?"} KCheck -- Yes --> Single["out[0] = 1.0 (ショートサーキット)"] KCheck -- No --> MaxFind["Pass 1: 最大値 z_max 探索
(同時 NaN/Inf 検出)"] MaxFind --> ExpSum["Pass 2: 指数計算 & 累積和
exp((z_i - z_max) / tau_eff)"] ExpSum --> Norm["Pass 3: 分母除算正規化 & clamp(0.0, 1.0)"] Single --> Done["Ok(()) 返却"] Norm --> Done
(空配列 / 長さ不一致 / 非有限値 / tau <= 0)"} Val -- 不正 --> Err["CoreError::MathError 返却"] Val -- 正常 --> KCheck{"候補数 K == 1 ?"} KCheck -- Yes --> Single["out[0] = 1.0 (ショートサーキット)"] KCheck -- No --> MaxFind["Pass 1: 最大値 z_max 探索
(同時 NaN/Inf 検出)"] MaxFind --> ExpSum["Pass 2: 指数計算 & 累積和
exp((z_i - z_max) / tau_eff)"] ExpSum --> Norm["Pass 3: 分母除算正規化 & clamp(0.0, 1.0)"] Single --> Done["Ok(()) 返却"] Norm --> Done
§数理仕様
$$p_i = \frac{\exp\left(\frac{z_i - z_{\max}}{\tau_{\text{eff}}}\right)}{\sum_{j=1}^K \exp\left(\frac{z_j - z_{\max}}{\tau_{\text{eff}}}\right)}, \quad z_{\max} = \max_{1 \le j \le K} z_j$$ ここで、有効温度 $\tau_{\text{eff}} = \max(\tau, 10^{-4})$ である。
§引数
logits: 未正規化の生ロジットスライス(f64)。out: 算出された確率値を書き込む出力先バッファスライス(f64)。logitsと同一の要素数が必要。temperature: 較正温度パラメータ $\tau$。正の有限実数。
§戻り値
- 成功時は
Ok(())、入力異常時はCoreError::MathErrorを返却する。