モジュール 6 ・ 目安 90 分
転移学習 — 少ないデータで賢く
このモジュールで学ぶこと
これまでのモジュールで、私たちは深いニューラルネットワークを一から訓練する方法を学んできました。損失を勾配降下で下げ、データ拡張やDropoutで過学習を抑える――ここまでくれば、CIFAR-100 のような「たくさんの例が用意されたデータセット」ならそれなりのモデルが作れます。
ところが、研究や仕事で機械学習を使おうとした瞬間、多くの人が同じ壁にぶつかります。手元のデータが、決定的に足りないのです。たとえば「自分の研究室で撮った金属部品の写真を、正常品・キズあり・変色ありの3種類に分けたい」としましょう。集められる画像はせいぜい各クラス数十枚。この規模で数百万個のパラメータを持つCNNを一から訓練したら、待っているのは確実な過学習です。ネットワークは数十枚の写真を丸暗記し、新しい写真にはまるで歯が立たなくなります。
このモジュールの主役である 転移学習(Transfer Learning) は、まさにこの「小データ問題」を正面から解決する実務の定石です。要点を先に一言でまとめると、こうなります。
自分でゼロから学ばせるのをやめ、巨大なデータで訓練済みのモデルの「ものを見る目」だけを借りてくる。
この考え方は、みなさんが取り組む**授業課題3および最終レポート(締切 2026-07-30)**の中核でもあります。自前で集めた画像を多クラス分類する課題は、まさにここで学ぶパイプラインをそのまま実行するものです。可視化で直感をつかみ、末尾のColabノートブックで手を動かせば、レポートの土台はほぼ完成します。
順番はいつも通りです。まず「なぜ小データで一から学ぶと破綻するのか」を確かめ、次に「事前学習済みモデルとは何を持っているのか」を理解し、それを古典的な分類器につなぐ実務パターンを組み立てます。最後に自前データセットの作り方まで具体的に降りていきます。
なぜ小データで深層モデルを一から学ぶと破綻するのか
動機 — パラメータ数とデータ数の綱引き
過学習は、モジュール1と5でも繰り返し出てきたテーマでした。機械工学の実験にたとえるなら、測定点が10個しかないのに15次の多項式をあてはめるようなものです。曲線は10点をすべて完璧に通りますが、点と点の間ではぐにゃぐにゃに暴れ、実験ノイズまで忠実に「再現」してしまいます。これが 過学習(Overfitting) の正体でした。
深いCNNは、この多項式の係数にあたるパラメータを数百万〜数千万個も持っています。一方、手元の画像が数十枚しかなければ、方程式の未知数の数に対して式(データ)が絶望的に足りません。モデルはその自由度をすべて使って訓練画像を丸暗記できてしまい、汎化(未知データへの対応力)はまったく育ちません。
大まかな目安として、深層モデルを一から安定して訓練するには1クラスあたり数千枚以上の画像が欲しいところです。研究室や現場でそれだけの枚数を、しかもラベル付きで用意するのは、多くの場合まったく現実的ではありません。
直感 — 「見る力」はデータが少ないほど育たない
CNNが画像を分類するとき、内部では2つの仕事が同時に進んでいます。ひとつは特徴を取り出す仕事(エッジ→模様→部品→物体、と段階的に抽象化していく)、もうひとつは取り出した特徴をもとにクラスを判定する仕事です。
問題は、この「特徴を取り出す力」を育てるのに、とりわけ大量のデータが要る点にあります。エッジや質感やパーツといった、あらゆる画像に共通する見方を身につけるには、多種多様な画像を大量に見せる必要があるのです。数十枚の金属部品だけを見て育ったネットワークは、「金属部品を丸暗記する見方」しか獲得できず、普遍的な視覚特徴には到達しません。
ここで発想を転換します。「特徴を取り出す力」は、自分の小さなデータで育てる必要があるのでしょうか? 答えはノーです。この力は課題によらずかなり共通しているので、誰かが巨大なデータで育てたものを、そのまま借りてくればよいのです。これが転移学習の核心的なアイデアです。
ImageNet — 「見る目」の供給源
その「巨大なデータで育てられたモデル」の源泉が、 ImageNet(ImageNet) です。ImageNetは約1400万枚、1000クラスにおよぶ巨大な画像データセットで、2010年代の深層学習ブームの引き金を引いた歴史的存在でもあります。犬種の細かい違いから乗り物、家具、食べ物まで、ありとあらゆる日常物体が大量に含まれています。
研究者たちは、この膨大な画像でCNN(ResNet、VGG、EfficientNet などの バックボーン(Backbone) と呼ばれるネットワーク)をあらかじめ訓練し、その重みを公開しています。こうしてできあがったものを 事前学習済みモデル(Pretrained Model) と呼びます。
ここで大切な事実は、ImageNetで鍛えられた「見る目」は、ImageNetにない画像に対してもよく効くという点です。エッジ・角・質感・繰り返し模様といった低レベルの特徴や、部品らしいまとまりといった中レベルの特徴は、犬の写真だろうと金属部品だろうと共通しています。ImageNetに「キズのある金属板」というクラスは存在しませんが、キズを構成するエッジや陰影を捉える力はすでに備わっているのです。この「別の課題で育てた力が手元の課題にも効く」という性質こそ、転移(transfer)という名前の由来です。
事前学習済み特徴抽出器 + 古典分類器 という実務パターン
動機 — 分類の頭だけ、自分のデータで付け替える
事前学習済みモデルを丸ごと使いたいところですが、そのままでは困ります。ImageNetのモデルは「1000クラスのどれか」を答えるようにできており、私たちが欲しい「正常・キズ・変色の3クラス」とは出口が違うからです。
そこで、モデルを2つに割って考えます。
- 前半(特徴抽出器):画像を入力し、その内容を表す数百〜数千次元のベクトル(=特徴ベクトル)に変換する部分。ここはImageNetで鍛えた力そのものなので、そのまま凍結して借りる。
- 後半(分類器):特徴ベクトルを受け取り、自分の課題のクラスを判定する部分。ここだけ自分の小さなデータで新しく学ぶ。
肝心なのは、後半の分類器が受け取るのは生の画像ではなく、すでに情報が凝縮された特徴ベクトルだという点です。数万ピクセルの生画像を分類するのは至難ですが、「意味のある数百次元のベクトル」を分類するのははるかに簡単で、数十枚のデータでも十分に学べます。難しい仕事(見る力)は借り物で済ませ、簡単な仕事(判定)だけを自分でやる――これが実務パターンの妙です。
直感 — 特徴抽出は「賢い前処理」
特徴抽出器(Feature Extractor) を通す操作は、機械工学でいう賢い前処理だと考えると腑に落ちます。振動解析でいきなり生の時系列を扱わず、まずFFTでスペクトルという「意味のある特徴」に変換してから判断するのと同じ発想です。事前学習済みCNNは、画像に対する非常に高性能な特徴変換器(FFTの何万倍も賢い版)だと思ってください。
この「画像 → 特徴ベクトル」の変換を、実務では img2feat(image to feature) と呼びます。全画像をあらかじめimg2featで特徴ベクトルの表に変換してしまえば、あとはもう画像のことは忘れて、ただの数値ベクトルの分類問題として扱えます。
式 — 分類器には古典的手法が使える
特徴ベクトルに変換したあとの分類器は、深層モデルである必要すらありません。むしろ小データでは、scikit-learn の古典的な分類器(ロジスティック回帰、サポートベクターマシン、k近傍法、ランダムフォレストなど)のほうが手軽で頑健です。
たとえば、 次元の特徴ベクトル を線形分類器にかける場合、クラス に対するスコアは重み とバイアス を使って次のように書けます。
これを全クラス分そろえ、モジュール3で学んだ softmax で確率に変換すれば、そのまま多クラス分類器になります。
注目してほしいのは、学習する必要があるのが と というごく少数のパラメータだけだという点です。特徴抽出器の何百万ものパラメータは凍結されているので、実質的に「 次元ベクトルの線形分類」という小さな問題を解くだけになり、数十枚のデータでも安定して学習できます。ロジスティック回帰そのものの中身は、次のモジュール7でくわしく扱います。
パイプラインを1ステップずつ確かめる
言葉だけでは流れがつかみにくいので、画像 → 特徴抽出器(凍結)→ 特徴ベクトル → 古典分類器(学習)→ クラス予測という一連の流れを、ステップ実行で追ってみましょう。下の可視化で「次へ」を押すたびに各段階がハイライトされます。どこが借り物(凍結)で、どこだけを自分のデータで学ぶのか、色分けに注目してください。とくに「特徴抽出器を通した瞬間に、生画像が数百次元のベクトルに姿を変える」という変換の役割を意識すると、なぜ小データでも学習が成立するのかが腹落ちするはずです。
転移学習パイプライン
ステップ 1 / 5:入力画像
各クラス数十枚程度の「自分の画像」を入力します。ImageNet(約1400万枚)に比べれば決定的に少ないデータです。この規模でCNNを一から訓練すると確実に過学習します。
特徴空間をのぞく — なぜ古典分類器で十分なのか
動機 — 「特徴がよければ分類は易しい」を目で確かめる
「特徴ベクトルに変換すれば分類は簡単になる」と述べましたが、これは本当でしょうか。それを確かめる最良の方法は、特徴ベクトルたちが暮らす空間―― 特徴空間(Feature Space) ――を直接のぞいてみることです。
特徴ベクトルは数百次元なので、そのままでは目に見えません。そこで、モジュールでは触れませんが PCA や t-SNE といった次元削減の手法を使い、数百次元を人間が見られる2次元へ押しつぶして散布図にします。もし事前学習済みの特徴が良い仕事をしているなら、同じクラスの点は近くに集まり、違うクラスの点は離れているはずです。そうであれば、あとは点の集まりの間に境界線を引くだけ――まさに古典分類器の出番です。
特徴空間を散布図で観察する
下の特徴空間エクスプローラでは、事前学習済みモデルが出力した特徴を2次元に落とした散布図を、クラスごとに色分けして表示します。試してほしいのは次の点です。まずバックボーン(特徴抽出器の種類)を切り替え、クラスのまとまり具合(分離の良さ)がどう変わるかを見比べてください。良いバックボーンほど、同色の点がくっきりした島を作ります。次に線形分離線を表示し、まっすぐな境界線だけで各クラスの島をだいたい仕切れてしまうことを確かめてください。これが「特徴さえ良ければ、あとは単純な線形分類器で十分」という実務パターンの正しさを、目で見て納得する体験です。
なお、散布図に表示されるデータは学習用の合成データである場合があります(UIに明記されます)。実際の課題では、この散布図がみなさん自身の画像から生成されることになります。
特徴空間エクスプローラ
次元削減手法: PCA | 点数: 200
自前データセットの作り方
ここまでの仕組みを自分の課題で動かすには、自前のデータセットを用意する必要があります。授業課題3・最終レポートに直結する部分なので、実務的な作り方を具体的に押さえましょう。
フォルダ構成 — クラス=フォルダ
最も扱いやすいのは、クラスごとにフォルダを分ける構成です。多くのライブラリがこの形をそのまま読み込めます。さらに、モデルの本当の実力を測るために、訓練用(train)とテスト用(test)を最初から分けておきます。
dataset/
├── train/
│ ├── normal/ (正常品の画像)
│ ├── scratch/ (キズありの画像)
│ └── discolor/ (変色ありの画像)
└── test/
├── normal/
├── scratch/
└── discolor/
訓練データとテストデータの分割(Train/Test Split) は、モジュール2で強調した鉄則の実践です。テストデータは学習に一切使わず、最後の性能評価のためだけに取っておくこと。テスト画像で少しでもパラメータを調整したら、それは自分で自分の答案をカンニングするようなもので、報告する精度は嘘になります。目安として、各クラスの2〜3割をテスト用に取り分けるとよいでしょう。
画像サイズ — 256×256 にそろえる
事前学習済みモデルは、決まったサイズの入力を前提に訓練されています。そこで、集めた画像はすべて256×256ピクセル程度の正方形にリサイズしてそろえます。サイズをそろえておくと特徴抽出器にそのまま流し込め、バッチ処理も速くなります。撮影時の解像度や縦横比がばらばらでも、この前処理で統一できます。
枚数と品質のコツ
枚数は多いに越したことはありませんが、転移学習の強みは少なくても戦える点にあります。1クラスあたり数十枚からでも実用的な精度が出ることは珍しくありません。ただし、次の点には気を配ってください。
- クラス間の枚数の偏りを減らす:あるクラスだけ極端に多いと、モデルはそのクラスばかり答えるようになります。
- 撮影条件を訓練とテストで似せすぎない/偏らせない:正常品だけ明るい照明で、キズありだけ暗い照明で撮ると、モデルは「明るさ」を手がかりにしてしまい、キズを見ていないのに正解してしまいます。前モジュールで学んだデータ拡張(明度・反転・クロップ)は、こうした偏りへの耐性を高めるうえでも有効です。
- ラベルの正しさ:間違ったフォルダに入った画像は、そのまま誤った教師信号になります。
Colabで実際に動かす
以上の流れ――自前データセットを組み、img2featで特徴に変換し、古典分類器で多クラス分類する――を最初から最後まで実行できるノートブックを用意しました。これが授業課題3・最終レポート(締切 2026-07-30)の直接の出発点です。自分の画像を train/ と test/ に配置し、上から順に実行すれば、特徴抽出から精度評価までひと通り体験できます。
まとめ
このモジュールでは、少ないデータで機械学習を成立させる実務の定石を学びました。要点を振り返ります。
- 小さなデータで深いモデルを一から訓練すると、パラメータ数がデータ数を圧倒し、確実に過学習します。深い特徴抽出力を育てるには大量データが要るからです。
- そこで、ImageNetのような巨大データで訓練された事前学習済みモデルの「見る目」を借ります。低〜中レベルの視覚特徴は課題をまたいで共通するため、別課題で育てた力が手元の課題にも効きます。
- 実務パターンは、モデルを凍結した特徴抽出器と自分で学ぶ分類器に分けること。画像をimg2featで特徴ベクトルに変換し(賢い前処理)、その上に古典的な分類器を載せれば、数十枚のデータでも安定して学べます。
- 特徴空間を散布図でのぞくと、良い特徴のもとではクラスがきれいに島を作り、単純な線形境界で十分に仕切れることが目で確認できます。
- 自前データセットは、クラスごとにフォルダを分け、train/testを最初から分離し、256×256にそろえて作ります。テストデータは最後の評価専用に取っておくのが鉄則です。
次のモジュール7では、ここで古典分類器として登場したロジスティック回帰の中身に踏み込み、さらに画像の「どこに何があるか」まで当てる物体検出へと視野を広げます。そしてコース全体を締めくくります。
確認クイズ
各クラス数十枚しかない自前画像で、数百万パラメータのCNNを一から訓練するとどうなりやすいですか。
転移学習で「ImageNetで訓練したモデルの特徴抽出器」が、ImageNetにない金属部品の分類にも役立つのはなぜですか。
事前学習済み特徴抽出器+古典分類器という実務パターンで、「自分の小さなデータで新しく学習する」のはどの部分ですか。
事前学習済み特徴を2次元に落とした特徴空間の散布図で、「良い特徴」ほど見られる傾向はどれですか。
授業課題3・最終レポート向けの自前データセットの作り方として、適切でないものはどれですか。