Featured image of post 安定化モード

安定化モード

目次

背景

  • 毎回このコードを最初に貼り付けるが、いつも見失う
  • なのでgistとしてここに残す
  • 機械学習で毎回seedを固定するためのもの
  • 非決定的にせずに実験をスムーズにするための設定

課題

  • 機械学習での実験の課題はモデルの評価
  • 新しいネットワーク構造にしても差が数ポイントだったりする
  • そうすると、ノイズフロアによる誤差なのかがわからない
  • そこで、学習や推論をできるだけ決定的(deterministic)にして再現性を高める

非決定的

非決定的とランダムの違い

非決定的と似た概念としてランダムがあるが、同じではない。

$$ 非決定的 \neq ランダム $$
  • ランダム化アルゴリズム
    • 実際に乱数を使って1つの経路を選ぶ
  • 非決定的アルゴリズム
    • 理論上、複数の選択肢から「正解につながる選択ができる」と考える計算モデル

NOTE: ただしPyTorchのバージョン・プラットフォーム・CPU/GPUをまたいだ完全な再現性までは保証されない。

非決定的という言葉について

計算量理論でいう非決定的アルゴリズムと、PyTorchでいうnondeterministic operationは意味が異なる。

  • 計算量理論の non-deterministic
    • 複数の計算経路の中から正解につながる経路を選べると仮定する理論上の計算モデル
  • PyTorchやGPU計算のnon-deterministic
    • 並列計算や演算順序などにより、同じ入力でも実行ごとに数値結果がわずかに変わることがある

seed固定と deterministic algorithmの利用は、後者を抑えて実験の再現性を高めるために行う。

安定化モードのコード

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
def set_seed(seed: int):
    random.seed(seed)
    np.random.seed(seed)
    torch.manual_seed(seed)
    torch.cuda.manual_seed_all(seed)


def enable_determinism(strict: bool = True):
    torch.backends.cudnn.deterministic = True
    torch.backends.cudnn.benchmark = False
    torch.backends.cuda.matmul.allow_tf32 = False
    torch.backends.cudnn.allow_tf32 = False

    torch.use_deterministic_algorithms(
        True,
        warn_only=not strict,
    )

    print(
        f'use_deterministic_algorithms(True, warn_only={not strict}) '
        f'+ TF32 無効化 + cudnn.deterministic=True'
    )

# 実行
seed = 42
set_seed(seed)
enable_determinism(True)
print('set_seed / enable_determinism 定義完了')

注意点

  • たとえ、あるseedに固定して決定的にして実験して精度が出せても、それが完全に優れているとは限らない
  • なぜなら、ある条件A(仮にseed=42)の時の複数の実験結果の精度比較に過ぎないから
  • つまり、複数seedでの平均・標準偏差などを見て最終的には評価する必要がある

たとえば、以下の結果だったとする。

1
2
モデルA seed=42 → 90.2%
モデルB seed=42 → 90.8%

しかし、seedを変えたら、以下になったら、Bが良いとは言い難い。

1
2
3
4
5
6
seed   A      B
1      90.5   90.0
2      89.8   90.3
3      90.4   90.1
4      89.9   90.5
5      90.2   90.0

まとめ

  • モデル変更による数pointの差を比較するときは、seedや演算を固定して実験を決定的にすることで、ばらつきを抑えられる
  • これは開発中のデバッグやablationでは非常に便利で、変更前後を同条件で比較しやすくなる
  • 一方、最終的にモデル性能の改善を主張する場合は、単一seedでの結果だけでは不十分
  • つまり、複数seedで実験して平均や分散を見る必要がある
  • determinismは統計評価の代替ではなく、実験条件を揃えるための手段ということ

参考文献

Built with Hugo
テーマ StackJimmy によって設計されています。