FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

Champsim の Hashed Perceptronの実装を読む (6. しきい値の調整)

github.com

この辺の実装がどのようになっているのかを勉強したい。ChatGPTにお願いしながら、読み進めていくことにする。

msyksphinz.hatenablog.com


4. 閾値(theta)の動的調整

adjust_threshold(prediction_correct);

adjust_thresholdは次のように定義されている。

void hashed_perceptron::adjust_threshold(bool correct)
{
    constexpr int SPEED = 18;
    if (!correct)
    {
        // 連続誤予測がSPEED回たまると閾値を上げる
        tc++;
        if (tc >= SPEED) {
            theta++;
            tc = 0;
        }
    }
    else
    {
        // 弱いが正しい予測がSPEED回たまると閾値を下げる
        tc--;
        if (tc <= -SPEED) {
            theta--;
            tc = 0;
        }
    }
}
  • theta:学習時に「弱い正解」を判定する閾値である。
  • tc:正/誤のカウンタで、SPEED(ここでは18)回分の結果を溜めてからthetaを±1調整する。

  • 誤予測が続くとthetaを大きくして学習条件を厳しく(より自信が低いときのみ学習する)

  • 弱い正解が続くとthetaを小さくして学習条件を緩く(より多く学習する)

これはSeznecのO-GEHL論文で提案された動的閾値設定手法を踏襲している。

学習処理の全体イメージ

  1. 分岐後、全履歴レジスタに実際のtaken/not-takenをプッシュ(履歴更新)。
  2. 直前の予測結果last_result.youtを見て
    • 誤予測か
    • 自信の低い正解 のいずれかなら学習を行う。
  3. 各テーブルの参照インデックスで重みを±1更新(パーセプトロン学習則)。
  4. 動的に学習閾値thetaを調整し、自信基準を最適化。
  5. (オプション)命令アドレス単位で誤予測数をカウント。

この一連の更新ループによって、ハッシュ化パーセプトロンは実行時に「分岐予測の精度」を継続的に改善しつつ、「過学習」や「学習のし過ぎ」を防ぐ工夫を両立している。