深層学習: 勾配クリッピングを理解する

深層学習の分野では、勾配クリッピングは勾配が小さすぎたり大きすぎたりするのを防ぐために使用される一般的な手法です。以下に、グラデーション クリッピングの原理と方法を簡単に紹介します。

グラデーションクリッピングの概要

深層学習モデルのトレーニング プロセス中に、ネットワーク パラメーターは勾配降下アルゴリズムを通じて更新されます。一般に、勾配降下法アルゴリズムは、順方向伝播と逆方向更新の 2 つの段階に分かれています。
順伝播段階では、ネットワークが抽象関数ffを使用できると仮定して、出力ベクトルを取得するためにニューロンの各層によって入力ベクトルが計算されます。fは、式は次のとおりです:
KaTeX 解析エラー: そのような環境はありません: 位置 8 の方程式: \begin{̲e̲q̲u̲a̲t̲i̲o̲n̲}̲ y = f(x) \end{...
ネットワークの推定値を計算した後、同様の式を使用します。平均二乗誤差 真の値と推定値の間のギャップ、つまり損失関数を計算する方法 loss: KaTeX
解析エラー: そのような環境はありません: 位置 8 の方程式: \begin{̲e̲q̲u̲a̲t̲i̲o̲n̲}̲ loss = \frac{ 1…
逆の段階で更新し、ネットワークパラメータθ \thetaθには重みWWがWと偏差bbbネットワーク パラメーターを更新するには、まずパラメーター∂ loss ∂ θ \frac{\partial loss}{\partial \theta}∂θ _ロス_ _ _次に、何らかの勾配更新アルゴリズムを使用して勾配降下のステップを実行し、損失関数の値を減らします。次の式:
KaTeX 解析エラー: そのような環境はありません: 位置 8 の方程式: \begin{̲e̲q̲u̲a̲t̲i̲o̲n̲}̲ \theta_{t+1} =... 注:
上記の式から、場合によっては、学習率と勾配クリッピングは同等です。
上記の学習過程において、勾配値が極端に小さくなったり、極端に大きくなったり、場合によってはオーバーフローしたりする、いわゆる「勾配消失」や「勾配爆発」が発生する場合があり、この場合、学習は収束しにくくなります。 。勾配爆発は一般に、初期重みによって計算される損失が特に大きい場合に発生します。勾配の値が大きいとパラメータの更新量が過剰になり、最終的に勾配降下法が発散して大域最適値に収束できなくなります。さらに、ネットワーク層の数が増加するにつれて、「勾配爆発」の問題がますます顕在化する可能性があります。3 層の隠れ層ネットワークで連鎖則の式を考えると、入力に対する各層の出力の偏導関数が > 1 の場合、ネットワーク層の数が増えるにつれて、勾配はますます大きくなり、 「勾配爆発」が発生する可能性があります。
KaTeX 解析エラー: そのような環境はありません: 位置 8 の方程式: \begin{̲e̲q̲u̲a̲t̲i̲o̲n̲}̲ \frac{\partial…

勾配爆発は、反復間でパラメーターが大幅に変化する場合、またはモデル パラメーターと損失関数の値が NaN になる場合に発生したと考えることができます

「勾配爆発」が発生した場合、最適解はネットワーク学習プロセス中に直接スキップされ、発散する (収束できない) 可能性もあるため、学習中にネットワークが最適解を横切らないように勾配クリッピングを実行する必要があります。学習過程。勾配クリッピング方法: 範囲値クリッピングと L2 ノルムによるクリッピングを設定します。

範囲値のクリッピングを設定する

範囲値を設定するクリッピング方法は簡単で、パラメータの勾配は範囲に制限されており、この範囲を超える場合はクリッピングされます(しきい値を超えると上限しきい値 max ⁡ \max max ; しきい値未満は下限しきい値min ⁡ \minmin ) ですが、通常、適切なしきい値を決定するのは困難です。
KaTeX 解析エラー: そのような環境はありません: 位置 8 の方程式: \begin{̲e̲q̲u̲a̲t̲i̲o̲n̲}̲ y=\left\{ \beg…

L2 ノルムによるクリッピング

L2ノルムによるクリッピングとは、勾配ベクトルのL2ノルムを閾値で制限し、勾配をクリッピングすることである。

KaTeX 解析エラー: そのような環境はありません: 位置 8 の方程式: \begin{̲e̲q̲u̲a̲t̲i̲o̲n̲}̲ y=\left\{ \beg…

添付

モデルのトレーニング中にエラーが発生します。

ValueError: マトリックスに無効な数値エントリが含まれています

エラー位置に対応する変数を出力すると、nan 値が表示されることがわかります。

tensor([[nan, nan, nan,  ..., nan, nan, nan],
        [nan, nan, nan,  ..., nan, nan, nan],
        [nan, nan, nan,  ..., nan, nan, nan],
        ...,
        [nan, nan, nan,  ..., nan, nan, nan],
        [nan, nan, nan,  ..., nan, nan, nan],
        [nan, nan, nan,  ..., nan, nan, nan]], device='cuda:0',

この問題の理由:
(1) 勾配爆発
(2) 不適切な入力
(3) 不適切なモデル設計
解決策:
(1) 学習率を下げる、
(2) 正規化ノルムを追加する、
(3) 勾配クリッピングを追加する、
(4)データ内にダーティなデータがあり、クリーンアップする必要があります;
(5) ネットワーク設計に誤りがないか確認します。

おすすめ

転載: blog.csdn.net/weixin_43603658/article/details/131959569