pytorch---のBN層パラメータの詳細と応用(1,2,3)(1,2)?

2703 ワード

BN層パラメータ詳細(1,2)
  • 一般的にpytorchのモデルは継承nn.Moduleクラスであり、いずれも属性trainningが訓練状態かどうかを指定し、訓練状態があるかどうかは一部の層のパラメータが固定されているかどうかに影響する.例えばBN層(BN層試験に対する平均値と分散は統計訓練に合格したときのすべてのbatchの平均値と分散の平均値)またはDropout層(Dropout層が試験中にすべてのニューロンが活性化された)である.現在のモデルmodel.train()をトレーニングステータスとして、modelをテストステータスとして指定します.
  • 同時に、model.eval()のAPIには、BNがアフィニティを必要とするかどうかを指定するパラメータと、現在のaffineの統計的特性を追跡するかどうかを指定するパラメータがいくつかあります.問題が発生しやすいのもちょうどこの3つのパラメータです:track_running_stats,batch,trainning.
  • のうちaffineは、アフィニティが必要かどうか、すなわち上記の式の4番目が必要かどうかを指定し、track_running_statsの場合affineは更新を学習できません.一般的にはaffine=Falseに設定されます.(ここでは学習可能なパラメータです)
  • γ=1,β=0 \gamma=1,\beta=0γ=1,β=0およびaffine=True,trainningは、トレーニング中のbatchの統計的特性を追跡し、現在入力されているtrack_running_statsの統計的特性のみに依存するのではなく、分散および平均値を得ることを示す(すなわち、新しいbatchは、以前のbatchの平均および分散に依存する.ここではmomentumパラメータを用いて、指数移動平均のアルゴリズムEMAを参照).逆に、track_running_stats=Trueであれば、現在入力されているbatchの統計的特性における平均値と分散を計算するだけである.推論段階において、batchである場合、track_running_stats=Falseが比較的小さい場合、その統計特性はグローバル統計特性と大きくずれ、悪い効果をもたらす可能性がある.

  • 応用テクニック:(1,2)
    通常pytorchではoptimizerが使用されます.zero_grad()は、pytorchでVariableで計算された勾配が積算されるため、以前のbatchで累積された勾配をクリアします.batchごとに勾配を再クリアするには、次のようにします.
    質問:パラメータnon_blocking、およびpytorchの全体的なフレームワーク??
    コード(1)
    for index,data,target in enumerate(dataloader):
        data = data.cuda(non_blocking=True)
        target = torch.from_numpy(np.array(target)).float().cuda(non_blocking = Trye)
        output = model(data)
        loss = criterion(output,target)
        
        # 
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

     
    ここではminibacthを真似するためにbatchが0をクリアしないたびに、一定の回数に蓄積して0をクリアし、重みを更新します.
    for index, data, target in enumerate(dataloader):
        # Tensor, torch.from_numpy()
        data = data.cuda(non_blocking = True)
        target = torch.from_numpy(np.array(target)).float().cuda(non_blocking = True)
        output = model(data)
        loss = criterion(data, target)
        loss.backward()
        if index%accumulation == 0:
            # 
            optimizer.step()
            # 
            optimizer.zero_grad()
    

    ここでの勾配は元のaccumulation倍に相当するが,実際には前方伝播の過程でBNにはほとんど影響しない.前方BNはbatchの平均値と分散にすぎないため,この場合pytorchにおけるBNのmomentumパラメータを用いることができ,デフォルトは0.1であり,BNパラメータは以下のように指数移動平均である
    x_new_running = (1 - momentum) * x_running + momentum * x_new_observed. momentumリファレンスリンク:https://www.jianshu.com/p/a646cbc913b4,https://www.zhihu.com/question/303070254/answer/573037166