シンプルな人々が派手なニューラルネットワークを構築するための簡単な考慮事項
'Simple considerations for building flashy neural networks by ordinary people'
写真提供:Henry & Co. (Unsplash)
機械学習が産業のあらゆる分野に浸透するにつれて、ニューラルネットワークの注目度はこれまでにないほど高まっています。たとえば、GPT-3などのモデルは過去数週間でソーシャルメディア上で話題となり、テックニュース以外のメディアでも恐怖心を煽る見出しを掲載されています。
- ハギングフェイスの読書会、2021年2月 – Long-range Transformers
- Hugging Faceを使用してWav2Vec2を英語音声認識のために微調整する
- BigBirdのブロック疎な注意機構の理解
一方で、ディープラーニングのフレームワーク、ツール、特化したライブラリにより、最先端の研究を利用した研究がこれまで以上に簡単に行えるようになり、機械学習の研究が民主化されつつあります。ほとんど魔法のようなプラグアンドプレイのコード5行で(ほぼ)最先端の結果を約束することがよくあります。私自身もHugging Face 🤗で働いているため、その点については一部罪を感じています。 😅 これにより、経験の浅いユーザーはニューラルネットワークがすでに成熟した技術であるかのような誤解を受けることがありますが、実際にはこの分野は常に発展途上にあるのです。
実際には、ニューラルネットワークの構築とトレーニングは非常にイライラする経験になることがしばしばあります :
- 自分のモデル/コードのバグによるパフォーマンスの問題なのか、モデルの表現力による制約なのかを理解するのが難しいことがあります。
- プロセスの各ステップで微小なミスを何度も犯しても最初は気づかず、モデルは依然としてトレーニングされ、まあまあのパフォーマンスを示します。
この記事では、ニューラルネットワークの構築とデバッグ時に考えるべき手順のいくつかを紹介します。「デバッグ」とは、自分が構築したものと自分が考えているものが一致していることを確認することを意味します。また、次のステップが何であるかわからない場合に考慮すべき事項も指摘します。これらは、自然言語処理の研究を通じた経験に基づく考え方の多くですが、ほとんどの原則は他の機械学習の分野にも適用できます。
1. 🙈 機械学習を置いておいて始める
直感に反するかもしれませんが、ニューラルネットワークを構築する最初のステップは、機械学習を一旦置いて、単にデータに焦点を当てることです。例を見て、ラベルを見て、テキストを扱っている場合は語彙の多様性や長さの分布などにも注目してデータに深く入り込んでみてください。モデルが捉えられる可能性のある一般的なパターンを抽出するために、データに没頭することが重要です。数百の例を見ることで、高レベルのパターンを特定することができるでしょう。以下は、自分自身に対して考えるべきいくつかの典型的な質問です:
- ラベルはバランスしていますか?
- 自分が同意しないゴールドラベルはありますか?
- データはどのように取得されましたか?このプロセスでのノイズの可能性のあるソースは何ですか?
- トークン化、URLやハッシュタグの削除など、自然な前処理ステップはありますか?
- 例はどれだけ多様ですか?
- この問題に対してまあまあのパフォーマンスを示すルールベースのアルゴリズムは何ですか?
データセットの定性的な高レベルの感覚と定量的な分析を把握することが重要です。パブリックなデータセットを使用している場合、他の誰かがデータについて深く掘り下げ、分析結果を報告している可能性があるので、必ずそれを確認してください(Kaggleのコンペティションなどではよく見られます)。
2. 📚 機械学習を始めたばかりと同じように続ける
データについて深く広く理解ができたら、常に機械学習を始めたばかりの自分自身の立場に立ち、CourseraでのAndrew Ngの入門クラスを見ているような状況を想像してみてください。タスクの難しさや標準的なベースラインのパフォーマンスを把握するために、可能な限りシンプルに始めることをおすすめします。たとえば、テキストを扱う場合、バイナリテキスト分類のための標準的なベースラインには、word2vecやfastTextの埋め込みの上にトレーニングされたロジスティック回帰が含まれることが一般的です。現在のツールでは、これらのベースラインを実行するのがBERTを実行するのと同じくらい簡単(もしくはより簡単)ですが、BERTは多くの自然言語処理の問題で標準的なツールの一つとされることができます。他のベースラインが利用可能な場合は、いくつか実行してみてください(または実装してください)。これにより、データにさらに詳しくなることができます。
開発者として、何か素晴らしいものを作ると気持ちが良いですが、簡単なベースラインをわずか数ポイント上回った場合に合理的に正当化するのは難しいことがあります。そのため、比較のための合理的なポイントを確認することが重要です:
- ランダムな予測子はどのように機能するでしょうか(特に分類問題では)?データセットはバランスが取れていない場合もあります…
- ランダムな予測子に対する損失はどのようになるでしょうか?
- 私のタスクの進捗を測るための最適なメトリクス(複数)は何ですか?
- このメトリクスの限界は何ですか?完璧な場合、どのような結論を出すことができますか?出すことができない結論は何ですか?
- 「シンプルなアプローチ」では完璧なスコアに到達するために何が不足していますか?
- データの帰納的バイアスをモデル化するために、私のニューラルネットワークのツールボックスにはどのようなアーキテクチャが適していますか?
3. 🦸♀️ これらの5行テンプレートの内部を見ることを恐れないでください
次に、以前に獲得した洞察と理解に基づいてモデルの構築を開始することができます。前述のように、ニューラルネットワークの実装は非常にトリッキーになることがあります。最適化プログラム、モデル、入力処理パイプラインなど、多くの動作部品が連携して動作し、これらの部品を実装し、接続する際には多くの小さな問題が発生する可能性があります。 問題は、これらのミスを犯すことがあり、モデルがクラッシュせずにまともなパフォーマンスを発揮することです…
しかし、実装が完了したと思ったら、少数の例に過学習(例えば16個)を行うのは良い習慣です。実装が(ほぼ)正しい場合、モデルはこれらの例を過学習し、0の損失を表示することができます(重み減衰などの正則化を削除することを確認してください)。そうでない場合は、実装に何か問題がある可能性が高いです。まれなケースでは、モデルが十分に表現力を持たず、容量が不足していることを意味します。再び、小規模なモデルから始める(例えば、より少ない層):モデルのデバッグを行いたいので、高いパフォーマンスではなく、迅速なフィードバックループを求めています。
プロのヒント:事前学習済みの言語モデルで作業する際には、埋め込みモジュールを事前学習された値に固定しても、微調整タスクのパフォーマンスにほとんど影響しないが、トレーニングを大幅に高速化することが多いです。
一般的なエラーには次のものがあります:
- 間違ったインデックス付け… (これらは本当に最悪です 😅)。例えば、正しい次元でテンソルを収集していることを確認してください…
- 評価モードで
model.eval()
を呼び出すのを忘れた(PyTorchでは)または勾配をクリアするためにmodel.zero\_grad()
を呼び出すのを忘れた - 入力の前処理に何か問題が発生しました
- 損失に誤った引数が渡されました(例えば、確率を予想できる場合にロジットが期待されている場合)
- 初期化が対称性を崩さない(通常、1つの定数値で行列全体を初期化する場合に発生します)
- 一部のパラメータは順方向パス中に呼び出されない(したがって、勾配を受け取らない)
- 学習率が常に0のような奇妙な値を取っています
- 入力が最適でない方法で切り捨てられています
プロのヒント:言語を扱う場合、トークナイザーの出力を真剣に見てください。トークン化に何か問題があったために結果を再現しようとした時間の数を数え切れません…🤦♂️
別の便利なツールは、トレーニングのダイナミックに深く潜り込み、トレーニングを通じて複数のスカラーの進化をプロットすることです。最低限、損失、パラメータ、およびその勾配のダイナミックを見る必要があります。
損失が減少するにつれて、モデルの予測も確認する必要があります。開発セットで評価するか、私の個人的なお気に入りであるいくつかのモデルの出力を表示することで確認します。例えば、機械翻訳モデルをトレーニングしている場合、トレーニングを通じて生成物がますます説得力を増していくのは非常に満足感があります。特に過剰適合については注意が必要です:トレーニング損失が続けて減少する一方で、評価損失は最高の結果を目指しています。💫
4. 👀 チューニングは盲目的に行わないでください
すべてが設定されて稼働している場合、最適な構成を見つけるためにハイパーパラメータを調整することがあります。一般的には、ランダムなグリッドサーチを使用することが効果的です。
ベイズ最適化などの高度なハイパーパラメータ調整手法を使用すると成功する人もいますが、私の経験では、比較的手動で定義されたグリッドサーチが最も優れたベースラインとなることが多いです。
最も重要なことは、異なるハイパーパラメータ(または活性化関数などのアーキテクチャの微調整)で1000回実行することに意味がないということです。代わりに、いくつかの異なるハイパーパラメータを持つ実行を比較して、どのハイパーパラメータが最も影響を与えるかを把握するためのアイデアを得ることが重要です。ただし、少数の値を調整するだけで最高のパフォーマンスを得ることを期待することは幻想です。たとえば、最高のパフォーマンスを発揮するモデルが学習率4e2でトレーニングされている場合、ニューラルネットワーク内部で何か根本的な問題が発生している可能性があり、この動作を特定して理解する必要があります。そして、現在の特定のコンテキスト以外でもこの知識を再利用できるようにします。
平均的に、専門家はより少ないリソースでより良い解決策を見つけることができます。
結論として、ニューラルネットワークの構築において、アーキテクチャを盲目的に調整するのではなく、各コンポーネントをできるだけ深く理解することを優先することが私にとって役立つ一般的なアドバイスです。シンプルに保ち、非常に困難な試行錯誤の結果でない限り、合理的に正当化できない微調整は避けるようにしましょう。もちろん、「試行錯誤」アプローチと「分析アプローチ」の間には適切なバランスが必要ですが、これらの直感は実践的な経験を積み重ねるにつれてより自然に感じられるものです。そして、あなた自身も内部モデルのトレーニングをしているのです。
さらに読むための関連するポイント:
- Joel Grusの機械学習エンジニアリングのベストプラクティスに関する再現性
- Cecelia Shaoのニューラルネットワークのデバッグチェックリスト
- Chase Robertsの機械学習コードのユニットテスト方法
- Andrej Karpathyのニューラルネットワークのトレーニングレシピ
We will continue to update VoAGI; if you have any questions or suggestions, please contact us!
Was this article helpful?
93 out of 132 found this helpful
Related articles