あなたはテスラの機械学習エンジニアの面接を受けています。 インタビュアー:車両のエッジハードウェアにニューラルネットを展開する必要がありますが、メモリに収まりません。あなたならどう対処しますか? あなた:知識蒸留を使って、より小さなモデルを訓練します。 面接終了。 見落とした内容は以下の通りです:
知識の抽出には数週間の計算が必要です。なぜなら本質的に新しいモデルを訓練しているからです。 しかし、解決策はすでにあなたの訓練されたネットワークの中にあります。 ほとんどのニューロンは無駄な存在で、記憶を消費するものの予測にはほとんど貢献しません。 見分け方を見てみましょう!
手順は次のとおりです。 ステップ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でほぼ同様のパフォーマンスが得られます。 これを👇チェックしてください
もちろん、精度とサイズの間にはトレードオフがあります。サイズを小さくすると、精度が低下します(ビデオを確認してください)。 しかし、ほとんどの場合、最適化する指標は精度だけではありません。 代わりに、効率やメモリなどのいくつかの運用指標が重要な要素です。
364