本文へ移動

ホーム / ML / 第2部 機械学習の基礎

第2部 機械学習の基礎・第3章

深層学習

★★☆ 重要7トピック・面接 3問

深層学習の仕組みと、代表的な構造を押さえる。

ひとことで

予測と正解のずれ(損失)を小さくする方向に、勾配を使って重みを少しずつ更新する。

ニューラルネットの学習は、「予測する → 正解とのずれ(損失)を測る → 損失が小さくなる方向(勾配)に重みを少し動かす」のくり返しです。勾配は誤差逆伝播(backpropagation)でまとめて計算します。霧の山で、足元の傾きだけを頼りに少しずつ下っていくイメージです。

学習は「予測 → ずれを測る → 勾配を計算 → 重みを少し動かす」のくり返し予測入力 → 出力損失正解とのずれ勾配誤差逆伝播重みの更新学習率の分だけ動かす次のバッチで、何千回もくり返す
学習のループ

誤差逆伝播:ニューラルネットは層を何段も重ねた関数です。出力の損失から入力側へ向かって、連鎖律(合成関数の微分のルール)で各層の勾配を順に計算すると、全部の重みの勾配を1回の逆向きの計算で求められます。PyTorch などのライブラリは、この計算を自動で行います(自動微分)。

用語意味
順伝播入力から予測と損失を計算する
逆伝播損失から各重みの勾配を計算する
更新オプティマイザーが勾配を使って重みを動かす
ミニバッチ1回の更新に使うデータのまとまり。全データを1回ずつ使うと1エポック

面接ではこう答える

ニューラルネットの学習は、予測して、正解とのずれである損失を測り、損失が小さくなる方向に重みを少し動かす、のくり返しです。各重みをどちらに動かせばよいかを表すのが勾配で、出力側から入力側へ連鎖律で順にさかのぼって計算する誤差逆伝播で、全部の重みの勾配を効率よく求めます。実際にはミニバッチという小さなまとまりごとに更新し、学習率で一歩の大きさを決めます。

ひとことで

学習率は1回の更新で重みを動かす歩幅。大きすぎると発散し、小さすぎると進まない。最初に調整するつまみ。

設定意味目安・注意
学習率1回にどれだけ重みを動かすか(歩幅)大きすぎると損失が暴れて発散、小さすぎると進まない。最初に一番効くつまみ。ウォームアップ(最初は小さく)と徐々に下げるスケジュールが定番
バッチサイズ1回の更新に使うデータの数大きいと GPU を効率よく使えるが、メモリを食う。大きくしたら学習率も上げる調整が要ることが多い
エポック数データ全体を何周するか検証の損失が下がらなくなったら止める(早期終了)
学習率と損失の動き(形はイメージ)損失学習のステップ大きすぎ:暴れて発散する小さすぎ:なかなか下がらないちょうどよい
学習率と損失の動き(イメージ)

最適化の手法(オプティマイザー)は、Adam や AdamW がまず選ばれます。どちらも、重みごとに過去の勾配の大きさを見て歩幅を自動で調整するので、学習率の設定に比較的強いです。AdamW は、重みを小さく保つ正則化(weight decay)を正しく分けて扱う改良版で、Transformer の学習で標準的に使われます。

面接ではこう答える

学習率は、勾配の方向に重みをどれだけ動かすかという歩幅で、深層学習で最初に調整するつまみです。大きすぎると損失が暴れて発散し、小さすぎると学習が進みません。最初は小さく始めて上げるウォームアップと、だんだん下げるスケジュールを組み合わせるのが定番です。バッチサイズを大きくしたら学習率も合わせて調整し、オプティマイザーはまず AdamW を使います。

学習が進まないときは、上流から順に切り分ける数バッチで損失がほぼ0になる?入力とラベル目で見て正しい?損失の形NaN・横ばい・発散学習と検証差が開く=過学習ならなければ、モデルかコードのバグ(ラベルのずれ・損失関数の選び間違い)
学習が進まないときは、小さく確かめてから広げる

学習が進まないときの確認:上から順に見ると切り分けやすくなります。

  • ごく少ないデータ(数バッチ)で損失がほぼ 0 になるか:ならなければ、モデルかコードのバグ(ラベルのずれ・損失関数の選び間違い)を疑います。
  • 入力とラベルを目で見る:画像と正解の組が入れ替わっていないか、正規化の前後で値がおかしくないか。
  • 損失が NaN・発散する:学習率を下げる、勾配クリッピング(勾配の大きさに上限をつける)、混合精度での桁あふれを確認します。
  • 損失がまったく動かない:学習率が小さすぎる、重みが更新されていない(凍結したまま・オプティマイザーに渡していない)。
  • 学習の損失は下がるのに検証は悪くなる:過学習です。データを増やす・正則化・早期終了。

学習の損失と検証の損失のグラフを毎回残しておくと、どの状態かがすぐ分かります。

ひとことで

小さなフィルターを画像の上でずらして掛け合わせ(畳み込み)、局所の模様から全体の特徴を学ぶネットワーク。

CNN は、画像のように「近くの値どうしに意味がある」データ向けのニューラルネットです。小さなフィルター(例:3×3)を画像の上でずらしながら掛け合わせる畳み込みで、線や角のような局所の模様を見つけます。層を重ねるほど、模様から部品、部品から物の形へと、より大きな特徴を表せるようになります。

小さなフィルターを画像の上でずらし、局所の模様から全体の形へ進む画像縦×横×色畳み込み線・角を検出プーリング縮めてまとめる畳み込み …模様・部品へ全結合クラスを出す同じフィルターを画像全体で使い回すので、重みが少なく、位置がずれても同じ特徴を拾える今は事前学習済みのモデル(ResNet 系・Vision Transformer など)から転移学習するのが普通
CNN の基本の流れ
部品役割
畳み込み層フィルターで局所の特徴を取り出す。同じフィルターを全体で使い回すので重みが少ない
プーリング層縦横を縮めて情報をまとめ、少しの位置のずれに強くする
全結合層最後に特徴をまとめてクラスや値を出す

画像の分類・物体検出・異常検知(製品の傷)などで使われます。最近は画像にも Transformer(Vision Transformer)が使われますが、データが少ない場合や軽さが要る場合は CNN もよく選ばれます。どちらでも、ゼロから学習するより事前学習済みのモデルを自分のデータに合わせるのが実務の基本です。

面接ではこう答える

CNN は、小さなフィルターを画像の上でずらしながら掛け合わせる畳み込みで、線や角のような局所の特徴を取り出すニューラルネットです。同じフィルターを画像全体で使い回すので重みが少なく、物の位置が少しずれても同じ特徴を拾えます。層を重ねると、模様から部品、物の形へと大きな特徴を表せます。実務では、事前学習済みのモデルを自分のデータで調整して使うのが普通です。

3.5Transformer と self-attention

用語★★☆ 重要
ひとことで

注意機構(attention)で、入力のどこを見るかを学習する構造。LLM の土台。

Transformer は、文章などの並び(トークンの列)を処理するモデルの構造で、今の LLM の土台です。中心にあるのが self-attention(自己注意)です。

self-attention の直感:文の中の各単語が、「自分の意味を決めるために、他のどの単語をどれくらい見ればよいか」を計算します。「彼はリンゴを食べた。それはおいしかった」の「それ」は、「リンゴ」を強く見ることで意味が決まります。具体的には、各トークンが「探しているもの(Query)」「自分の特徴(Key)」「渡す中身(Value)」を持ち、Query と Key の似ている度合いで重みを決めて、Value を混ぜ合わせます。これを複数の見方(マルチヘッド)で同時に行い、層を何十段も重ねます。並びの順番は、位置の情報を足して教えます。

self-attention:「それ」の意味を決めるとき、文中のどの語をどれだけ見るか彼はリンゴを食べた。それはおいしかった強く見るn 個のトークンがすべての組を見るので、計算量は n × n(長さの2乗)で増える
self-attention のイメージ

RNN(前から1語ずつ順に読む構造)と違い、全部のトークンの関係を一度に並列で計算できるので、GPU で大量のデータを速く学習できます。

RNNTransformer
読み方前から1語ずつ順に全部のトークンを一度に
学習の並列化しにくいしやすい(GPU を活かせる)
離れた語の関係途中で情報が薄れやすい直接見られる
長さに対する計算量長さに比例attention は長さの2乗

面接ではこう答える

Transformer は、今の LLM の土台になっている構造で、中心は self-attention です。各トークンが、文の中の他のどのトークンをどれくらい見ればよいかを、Query と Key の似ている度合いで計算し、Value を重み付きで混ぜます。RNN のように1語ずつ順に読まず、全部のトークンの関係を一度に並列で計算できるので、GPU で大量のデータを速く学習でき、離れた語の関係も直接扱えます。弱点は、計算量とメモリが長さの2乗で増えることです。

ひとことで

モデルが一度に扱えるトークン数の上限。attention の計算が長さの2乗で増えることが理由の一つ。

全トークンが全トークンを見るので、長さを2倍にすると計算は約4倍長さ 4 → 16 の組長さ 8 → 64 の組KV キャッシュ:生成のたびに過去の Key・Value を再利用(長い文脈で GPU メモリを圧迫)
長さ n の attention は n × n の組み合わせを計算する

計算量とコンテキスト長:全トークンが全トークンを見るので、計算量とメモリは長さの2乗で増えます。入力を 2倍にすると attention の計算は約 4倍です。そのため、モデルには一度に扱える長さの上限(コンテキスト長)があります。実務では次の点が効いてきます。

  • LLM の料金と待ち時間は、入力と出力のトークン数に比例して増えます。長い文書を毎回丸ごと渡すより、必要な部分だけ渡す(RAG)ほうが安く速いことが多いです。
  • 文章を生成するときは、過去のトークンの Key・Value を保存して使い回します(KV キャッシュ)。長い文脈や同時のリクエストが多いと、このキャッシュが GPU メモリを圧迫します。
  • 長いコンテキストを扱えるモデルでも、真ん中あたりの情報を見落とすことがあります。大事な情報は短く、目立つ位置に置きます。

面接ではこう答える

コンテキスト長は、モデルが一度に扱える入力と出力のトークン数の上限です。Transformer の attention は全トークンの組み合わせを計算するので、長さを2倍にすると計算は約4倍になります。文章を生成するときは、過去のトークンの Key と Value を保存して使い回す KV キャッシュで計算を減らしますが、長い文脈や同時のリクエストが多いと GPU メモリを圧迫します。実務では、必要な情報だけを渡すほうが安く速く、精度も保ちやすいです。

3.7事前学習と転移学習

用語★★☆ 重要
ひとことで

大量のデータで学習済みのモデルを出発点にし、自分のタスクに合わせて一部だけ学習し直す方法。

大量のデータで学習済みのモデル(事前学習済みモデル)は、画像なら模様や形、文章なら言葉の意味のような、多くのタスクに共通する特徴をすでに持っています。それを出発点にして自分のタスクに合わせるのが転移学習です。ゼロから学習するより、ずっと少ないデータと時間で高い精度が出ます。

大量のデータで学習済みの本体を借り、自分のタスクの部分だけ学習する事前学習済みの本体一般的な特徴(模様・文の意味)を持っている新しい出力の層自分のクラス数に合わせるデータが少ない → 本体は固定(凍結)データが多い → 本体も小さな学習率で調整ここは必ず学習するゼロから学習するより、少ないデータ・短い時間で高い精度が出やすい
転移学習:本体を借り、最後だけ付け替える
自分のデータやり方注意
少ない(数百件)本体を固定し、最後の層だけ学習する。埋め込みを取り出して軽いモデルに入れるのも手過学習しやすいのでデータ拡張・早期終了
中くらい上のほうの層だけ固定を外して調整する学習率は小さめ(本体を壊さない)
多い・分野が大きく違う全体を小さな学習率で調整する(ファインチューニング)計算が多い。元の能力を忘れることがある

事前学習のデータと自分のデータの分野が近いほど効果が大きくなります。使うモデルのライセンス(商用で使えるか)も最初に確かめます。LLM の場合の考え方は ファインチューニングとの使い分け を参照してください。

面接ではこう答える

転移学習は、大量のデータで事前学習したモデルを出発点にして、自分のタスクに合わせる方法です。データが少なければ本体を固定して最後の層だけを学習し、データが多ければ本体も小さな学習率で調整します。事前学習のモデルが一般的な特徴を持っているので、ゼロから学習するより少ないデータと時間で高い精度が出ます。分野が近いモデルを選ぶことと、ライセンスの確認が大事です。

この章のまとめ

🖨 まとめシート(印刷・PDF)
  • ニューラルネットの学習の仕組み(勾配降下・誤差逆伝播)
  • CNN・Transformer の要点

この章のクイズ

面接ではこう聞かれる

まず答えを見ずに声に出して答え、そのあと開いて比べる。

Q1Transformer が RNN より広く使われる理由は?

模範回答

大きな理由は2つあります。1つ目は並列化です。RNN は前の単語の計算が終わらないと次に進めないので、長い文ほど時間がかかり、GPU の力を活かしにくいです。Transformer は self-attention で全トークンの関係を一度に計算できるので、学習を大きく並列化でき、大量のデータと大きなモデルで学習できるようになりました。

2つ目は長距離の依存です。RNN は情報を順に受け渡すので、遠く離れた単語の情報が途中で薄れがちです。attention ならどんなに離れたトークン同士も直接参照できます。その代わり計算量が長さの2乗で増えるので、コンテキスト長に上限がある、という弱点もあります。

深掘りされたら

  • 長いコンテキストを扱うとき、推論で何がボトルネックになりますか?

見られているポイント並列化と長距離の依存

Q2学習の損失が NaN になりました。何を確かめますか?

模範回答

まず学習率が大きすぎないかを疑い、下げて試します。次に、勾配が爆発していないかを見て、勾配クリッピングを入れます。混合精度の FP16 を使っているなら、桁あふれが起きていることがあるので、loss scaling が効いているか、BF16 に変えられるかを確かめます。

データ側では、入力に NaN や極端な値が混ざっていないか、0 で割る・0 の log を取るような前処理や損失の計算がないかを見ます。どのステップから NaN になったかをログで特定し、そのときのバッチを取り出して調べると早いです。

深掘りされたら

  • 損失がまったく下がらない場合は、何から確かめますか?

見られているポイント学習率・勾配・混合精度・データの順に切り分ける

Q3事前学習済みのモデルを使って、自分のタスクに合わせる方法を説明してください。

模範回答

大量のデータで学習済みのモデルを出発点にして、少ないデータで自分のタスクに合わせる方法を転移学習といいます。データが少ないときは、モデルの大部分の重みを固定して、最後の層だけを学習します。データが多めなら、全体を小さい学習率で学習し直します(ファインチューニング)。

ゼロから学習するより、少ないデータと計算で高い精度が出やすいのが利点です。注意点は、元のモデルの学習データと自分のデータが大きく違うと効果が小さいこと、学習率が大きすぎると元の知識を壊してしまうことです。LLM では LoRA のように一部だけを学習する方法もよく使います。

深掘りされたら

  • どの層を固定するかは、どう決めますか?

見られているポイント固定する範囲とデータ量の関係・学習率の注意