この辺の実装がどのようになっているのかを勉強したい。ChatGPTにお願いしながら、読み進めていくことにする。
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論文で提案された動的閾値設定手法を踏襲している。
学習処理の全体イメージ
- 分岐後、全履歴レジスタに実際のtaken/not-takenをプッシュ(履歴更新)。
- 直前の予測結果
last_result.youtを見て- 誤予測か
- 自信の低い正解 のいずれかなら学習を行う。
- 各テーブルの参照インデックスで重みを±1更新(パーセプトロン学習則)。
- 動的に学習閾値thetaを調整し、自信基準を最適化。
- (オプション)命令アドレス単位で誤予測数をカウント。
この一連の更新ループによって、ハッシュ化パーセプトロンは実行時に「分岐予測の精度」を継続的に改善しつつ、「過学習」や「学習のし過ぎ」を防ぐ工夫を両立している。