tf.clip_by_global_norm理解する
Tf Clip_by_global_norm Understand
グラデーションの爆発またはグラデーションの消失の問題に対処するために、グラデーションクリッピングが導入されました。反復で重みの更新が速すぎると、損失の発散が発生しやすくなります。 グラデーションクリッピングの直感的な役割は、重みの更新を適切な範囲に制限することです。
具体的な詳細は
1にソルバー最初に1つ設定しますclip_gradient
2.順伝播と逆伝播の後、各重みの勾配差分を取得します。現時点では、これらの勾配を直接使用して通常のように重みを更新する代わりに、最初に重み勾配の2乗を計算します。sumsq_diff、万一に備えてsumsq_diff> clip_gradient、次にスケーリング係数を見つけます=clip_scale_factor勾配/ sumsq_diff。これですscale_factor(0,1)の間。重量勾配の二乗和の場合sumsq_diff大きいほど、倍率は小さくなります。 A
3.最後に、すべての重み勾配にこのスケーリング係数が乗算され、取得された勾配が最終的な勾配情報になります。
これにより、反復更新で、重みの勾配の2乗の合計が設定された範囲内にあり、この範囲は次のようになります。clip_gradient。
tf.clip_by_global_norm
tf.clip_by_global_norm(t_list, clip_norm, use_norm=None, name=None)
複数のテンソルの値は、重み勾配の合計の比率によってインターセプトされます。 A
t_list 勾配テンソルです、clip_norm傍受された比率です。この関数は、切片化された勾配テンソルとすべてのテンソルのグローバルノルムを返します。
t_list [i]更新式は次のとおりです。
t_list[i] * clip_norm / max(global_norm, clip_norm)
どこglobal_norm = sqrt(sum([l2norm(t)** 2 for t in t_list]))
global_normの場合、すべての勾配の二乗の合計ですclip_norm> global_norm、傍受は実行されません。 A
しかし、この関数はより高速ですclip_by_norm()すべてのパラメータを傍受する前に準備する必要があるため、遅くなります
————————————————
著作権表示:この記事は、CC 4.0BY-SA著作権表示に準拠したCSDNブロガー「mstar1992」のオリジナル記事です。転載のために、元のソースリンクとこのステートメントを添付してください。
元のリンク:https://blog.csdn.net/u013713117/article/details/56281715