Skip to main content

softmax_into

Function softmax_into 

Source
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

§数理仕様

$$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 を返却する。