CNNの精度向上テクニックと軽量化

G検定対策 ── 図解つき解説
🔰 初心者

CNNを作っても、そのままだとうまく学習できなかったり精度が出なかったりするんですよね?何かコツがあるんですか?

🎓 上級者

いい質問だね。CNNの精度を上げるための6つの重要テクニックがあるよ。さらに、高精度なモデルをスマホなどで使えるように軽量化する技術も大事なポイントだ。

🗺️ テクニックの全体像
CNNの精度向上テクニック 6選 + 軽量化 🔧 学習を安定させる ① 重みの初期設定(Xavier / He) ③ バッチ正規化 🛡️ 過学習を防ぐ ② ドロップアウト / L2正則化 / ES ④ データ拡張 🚀 効率よく学習する ⑤ 転移学習 📦 モデルを軽く・速くする ⑥-a 蒸留 ⑥-b プルーニング ⑥-c 量子化 スマホ・IoTなどリソースが限られた環境向け
図1: 精度向上テクニックの分類
⚖️ ① 重みの初期設定(Weight Initialization)
🔰 初心者

ニューラルネットワークの重みって最初はどうなってるんですか?

🎓 上級者

学習前の重みはランダムな値で初期化するんだけど、その「ランダムの範囲」がとても重要なんだ。大きすぎると勾配爆発、小さすぎると勾配消失が起きてしまう。

重みの初期値が学習に与える影響 ❌ 初期値が大きすぎる 勾配爆発 → 発散してしまう ❌ 初期値が小さすぎる 勾配消失 → 学習が進まない ✓ 適切な初期値 安定して収束 → 学習成功!
図2: 初期値の大きさが学習の安定性を決める

Xavier(ザビエル)の初期値

シグモイド / tanh 向け

前後の層のノード数に基づいて
重みの分散を調整

分散 = 1 / 入力ノード数

He(ヒー)の初期値

ReLU 向け

ReLUは半分が0になることを考慮し
Xavierより大きめの分散

分散 = 2 / 入力ノード数

💡 覚え方

シグモイド・tanhXavier(X と sigmoid の s が対応するイメージ)
ReLUHe(He は ReLU の特性を考慮して設計された)

現在はReLUが主流なので、Heの初期値が最もよく使われる

🎲 ② ドロップアウト(Dropout)
🔰 初心者

過学習を防ぐ方法って何かありますか?

🎓 上級者

代表的なのがドロップアウトだよ。学習中にランダムにノードを無効化することで、特定のノードに依存しすぎるのを防ぐ手法なんだ。

ドロップアウトの仕組み 通常のネットワーク 全ノードが活性化 学習時に ランダムに無効化 ドロップアウト適用後 約50%のノードを無効化 ⚠️ 重要:推論時(テスト時)はドロップアウトをOFFにする(全ノードを使う) 毎回ランダムに異なるノードが無効化されるので、特定のノードに依存しない汎化性能の高いモデルになる
図3: ドロップアウトはランダムにノードを「休ませる」ことで過学習を防ぐ
🎯 ドロップアウトの超重要ポイント

学習時:ランダムにノードを無効化(通常50%程度)
推論時(テスト時):全ノードを使う(ドロップしない)
• 2012年のAlexNetで採用されて注目された

日常で例えると:チームで試験勉強するとき、毎回メンバーの何人かを休ませる。特定の人に頼りきりにならず、全員がまんべんなく実力をつける。

⚖️ ②-b L2正則化(Weight Decay)
🔰 初心者

ドロップアウト以外にも過学習を防ぐ方法はありますか?

🎓 上級者

L2正則化(Weight Decay)も代表的な過学習対策だよ。重みの二乗和をペナルティとして損失関数に加える手法で、大きな重みを抑制して過学習を防ぐんだ。

L2正則化の仕組み

損失関数(新)= 元の損失関数 + λ × 重みの二乗和

λ(ラムダ)はペナルティの強さを調整するハイパーパラメータ。大きな重みほどペナルティが大きくなるため、モデルがシンプルな解を選ぶようになる。「Weight Decay(重み減衰)」とも呼ばれる。

🛑 ②-c Early Stopping(早期打ち切り)
🔰 初心者

学習を長くやればやるほど良いわけではないんですか?

🎓 上級者

学習しすぎると訓練データに特化しすぎて過学習になる。Early Stoppingは、検証データの損失が上がり始めたら学習を止める手法だよ。「これ以上やっても悪化するだけ」というタイミングを見極めるんだ。

過学習対策の3点セット

G検定で頻出の過学習対策は以下の3つ。セットで覚えておこう。

1. ドロップアウト:ランダムにノードを無効化して汎化性能を高める
2. L2正則化(Weight Decay):大きな重みにペナルティを課してモデルをシンプルに保つ
3. Early Stopping:検証データの損失が悪化し始めたら学習を止める

📊 ③ バッチ正規化(Batch Normalization)
🔰 初心者

バッチ正規化って何をしているんですか?

🎓 上級者

各層の入力をミニバッチ単位で正規化(平均0・分散1に揃える)する処理だよ。料理で「味付けの基準を揃える」イメージで、各工程で極端にならないように毎回リセットするんだ。

バッチ正規化のイメージ ❌ バッチ正規化なし 層1 平均0.2 層2 平均5.8! 層3 平均0.001... 値の分布がバラバラ → 学習が不安定 ✓ バッチ正規化あり 層1 平均0 BN 層2 平均0 ✓ BN 層3 平均0 ✓ 各層の入力を毎回正規化 → 学習が安定&高速
図4: バッチ正規化は各層の入力を平均0・分散1に揃える
効果内容
勾配消失を緩和値が極端にならないので勾配が安定する
学習率を大きくできる安定しているので大胆に更新でき、学習が速くなる
初期値への依存が減るどんな初期値でも安定しやすい
過学習の抑制効果もあるドロップアウトの代わりになることもある
🖼️ ④ データ拡張(Data Augmentation)
🔰 初心者

データが足りないときはどうすればいいんですか?

🎓 上級者

既存の画像に変換を加えてバリエーションを増やす(水増し)手法があるよ。AIから見れば「違う画像」に見えるので、実質的にデータが増えたのと同じ効果になるんだ。

データ拡張の例:1枚の画像から複数のバリエーション 🐱 元画像 🐱 左右反転 🐱 回転 🐱 拡大 🐱 切り出し 🐱 色変換 1枚 → 数十枚 に増加! ⚠️ 意味が変わる変換はNG(例:6と9の上下反転)
図5: さまざまな変換を加えてデータを水増しする
🔄 ⑤ 転移学習(Transfer Learning)
🔰 初心者

自分のデータが少ないときでも高精度にできる方法ってありますか?

🎓 上級者

転移学習がまさにそれだよ。別のタスクで学習済みのモデルの知識を、自分のタスクに流用する手法なんだ。英語ができる人がフランス語を学ぶとき、言語の基礎知識を活かせるのと同じイメージ。

転移学習のイメージ ❌ ゼロから学習(通常) ランダム ランダム ランダム ランダム ✓ 転移学習 学習済み 🔒固定 学習済み 🔒固定 学習済み 🔒固定 ここだけ 再学習 自分のデータで 再学習 ✏️ 少ないデータでも 高精度!🎉 💡 なぜうまくいくのか 浅い層:エッジ、テクスチャなど → どのタスクでも共通の特徴 深い層:犬の顔、車のタイヤなど → タスク固有の特徴(ここを入れ替える)
図6: 学習済みの前半を流用し、後半だけ自分のデータで再学習する
📌 ファインチューニング(Fine-tuning)
転移学習の一種。固定せずモデル全体を小さな学習率で微調整する方法。データがある程度ある場合に有効。
📦 ⑥ モデルの軽量化
🔰 初心者

高精度なモデルってスマホとかでも動かせるんですか?

🎓 上級者

そのままだと重すぎて無理だね。例えばResNet-152はパラメータが6000万個もある。そこでモデルを小さく・軽くする技術が必要になるんだ。

🎓 蒸留(Distillation)

大きなモデル(教師)の
知識を
小さなモデル(生徒)に
移す

ベテランの教え方を
新人に伝授するイメージ

✂️ プルーニング(Pruning)

重要度の低い
重みやノードを削除
する

使っていない枝を
切り落とすイメージ

📉 量子化(Quantization)

重みの精度を
32bit → 8bit などに
下げる

小数点以下を四捨五入して
計算を簡単にするイメージ

3つの軽量化手法の比較 🎓 蒸留 教師モデル (大きい) 知識 生徒 (小さい) 大→小にノウハウを移す 精度の低下が少ない ✂️ プルーニング 不要な接続を削除 モデルがスリムになる 📉 量子化 0.123456789... 32-bit(高精度) 0.12 8-bit(軽い) 精度を落として軽量化 サイズ約1/4、速度も向上
図7: 3つの軽量化手法のイメージ
📋 テクニック比較まとめ
テクニック主な目的キーポイント
重みの初期設定 学習を安定させる Xavier(sigmoid/tanh)、He(ReLU)
ドロップアウト 過学習を防ぐ 学習時のみノード無効化。推論時はOFF
L2正則化(Weight Decay) 重みの二乗和をペナルティとして損失関数に加える
Early Stopping 検証データの損失が上がり始めたら学習を止める
バッチ正規化 学習の安定化・高速化 各層の入力を平均0・分散1に正規化
データ拡張 データ不足に対応 反転・回転・拡大・色変えでデータを水増し
転移学習 少データで高精度 前半を固定、後半だけ再学習
蒸留 モデルの軽量化 教師→生徒に知識を移す
プルーニング 不要な重み・ノードを削除
量子化 重みの精度を下げる(32bit→8bit)

🎯 G検定で押さえるべきポイント