ニューラルネットワークからニューロンの74%を削除しました。 精度はわずか0.50%低下しました。 内訳は次のとおりです(コード付き)。
トレーニングされたニューラルネットワークには、パフォーマンスに実質的に寄与しないニューロンが常にあります。 しかし、それでもメモリを消費します。 これらは、精度を大幅に損なうことなく取り除くことができます。 それらを識別する方法を見てみましょう!
手順は次のとおりです。 ステップ1) 通常どおりニューラルネットワークをトレーニングします。 ステップ2) 検証セットをトレーニングされたネットワークに渡し、隠れ層のすべてのニューロンについて、以下を計算します。 - 平均活性化 - 活動化の分散 (活動化が -ve である場合) これを👇チェックしてください
ステップ3) モデルの出力にほとんど影響を与えないため、活性化平均と分散がほぼゼロのニューロンをプルーニングします。 理想的には、複数の剪定しきい値にわたってパフォーマンスをプロットして、サイズと精度のトレードオフに適合するモデルを選択します。 これを👇チェックしてください
コードを見てみましょう。 まず、単純なニューラルネットワークを定義し、それをトレーニングします。 後でプルーニングのためにニューロンレベルの活性化を計算するため、フォワードパスですべての中間活性化を返します。 これを👇チェックしてください
次に、次の 3 つの要素を含む 2 つのリストを定義します。 - 1つはアクティベーションの平均を格納します - 別の std dev はアクティベーションを保存します 検証セットをモデルに渡して、隠れ層ごとにこれらの統計を計算します。 これを👇チェックしてください
この時点で、上記で生成したニューロンレベルの統計量の分布プロットを作成しましょう。 以下に示すように、ほとんどのニューロンの平均活性化とその標準発達は、ほぼゼロの値付近に大きく分布しています。 次にそれらを剪定してみましょう。
プルーニングでは、しきい値のリストを反復処理し、次の操作を行います。 - 新しいネットワークを作成し、しきい値を超えた重みを転送します。 - 新しいネットワークを評価し、合計パラメータを計算します。 - 結果をリストに追加します。 これを👇チェックしてください
この表は、プルーニングされたモデルの精度とサイズの縮小を、元のモデルと比較して、いくつかのしきい値にわたって比較したものです。 mean=0.1 および std-dev=0.4 の場合: - モデルの精度が 0.08% 低下します。 - モデルのサイズが62%縮小されました。 これは大幅な削減です。 これを👇チェックしてください
ここに別の興味深い結果があります。 mean=0.5 および std-dev=1 の場合: - モデルの精度が 0.5% 低下します。 - モデルのサイズが74%縮小されました。 したがって、基本的に、パラメータの1/4でほぼ同様のパフォーマンスが得られます。 これを👇チェックしてください
もちろん、精度とサイズの間にはトレードオフがあります。サイズを小さくすると、精度が低下します(ビデオを確認してください)。 しかし、ほとんどの場合、最適化する指標は精度だけではありません。 代わりに、効率やメモリなどのいくつかの運用指標が重要な要素です。
40.99K