CNNを作っても、そのままだとうまく学習できなかったり精度が出なかったりするんですよね?何かコツがあるんですか?
いい質問だね。CNNの精度を上げるための6つの重要テクニックがあるよ。さらに、高精度なモデルをスマホなどで使えるように軽量化する技術も大事なポイントだ。
ニューラルネットワークの重みって最初はどうなってるんですか?
学習前の重みはランダムな値で初期化するんだけど、その「ランダムの範囲」がとても重要なんだ。大きすぎると勾配爆発、小さすぎると勾配消失が起きてしまう。
シグモイド / tanh 向け
前後の層のノード数に基づいて
重みの分散を調整
分散 = 1 / 入力ノード数
ReLU 向け
ReLUは半分が0になることを考慮し
Xavierより大きめの分散
分散 = 2 / 入力ノード数
• シグモイド・tanh → Xavier(X と sigmoid の s が対応するイメージ)
• ReLU → He(He は ReLU の特性を考慮して設計された)
現在はReLUが主流なので、Heの初期値が最もよく使われる。
過学習を防ぐ方法って何かありますか?
代表的なのがドロップアウトだよ。学習中にランダムにノードを無効化することで、特定のノードに依存しすぎるのを防ぐ手法なんだ。
• 学習時:ランダムにノードを無効化(通常50%程度)
• 推論時(テスト時):全ノードを使う(ドロップしない)
• 2012年のAlexNetで採用されて注目された
日常で例えると:チームで試験勉強するとき、毎回メンバーの何人かを休ませる。特定の人に頼りきりにならず、全員がまんべんなく実力をつける。
ドロップアウト以外にも過学習を防ぐ方法はありますか?
L2正則化(Weight Decay)も代表的な過学習対策だよ。重みの二乗和をペナルティとして損失関数に加える手法で、大きな重みを抑制して過学習を防ぐんだ。
損失関数(新)= 元の損失関数 + λ × 重みの二乗和
λ(ラムダ)はペナルティの強さを調整するハイパーパラメータ。大きな重みほどペナルティが大きくなるため、モデルがシンプルな解を選ぶようになる。「Weight Decay(重み減衰)」とも呼ばれる。
学習を長くやればやるほど良いわけではないんですか?
学習しすぎると訓練データに特化しすぎて過学習になる。Early Stoppingは、検証データの損失が上がり始めたら学習を止める手法だよ。「これ以上やっても悪化するだけ」というタイミングを見極めるんだ。
G検定で頻出の過学習対策は以下の3つ。セットで覚えておこう。
1. ドロップアウト:ランダムにノードを無効化して汎化性能を高める
2. L2正則化(Weight Decay):大きな重みにペナルティを課してモデルをシンプルに保つ
3. Early Stopping:検証データの損失が悪化し始めたら学習を止める
バッチ正規化って何をしているんですか?
各層の入力をミニバッチ単位で正規化(平均0・分散1に揃える)する処理だよ。料理で「味付けの基準を揃える」イメージで、各工程で極端にならないように毎回リセットするんだ。
| 効果 | 内容 |
|---|---|
| 勾配消失を緩和 | 値が極端にならないので勾配が安定する |
| 学習率を大きくできる | 安定しているので大胆に更新でき、学習が速くなる |
| 初期値への依存が減る | どんな初期値でも安定しやすい |
| 過学習の抑制効果もある | ドロップアウトの代わりになることもある |
データが足りないときはどうすればいいんですか?
既存の画像に変換を加えてバリエーションを増やす(水増し)手法があるよ。AIから見れば「違う画像」に見えるので、実質的にデータが増えたのと同じ効果になるんだ。
自分のデータが少ないときでも高精度にできる方法ってありますか?
転移学習がまさにそれだよ。別のタスクで学習済みのモデルの知識を、自分のタスクに流用する手法なんだ。英語ができる人がフランス語を学ぶとき、言語の基礎知識を活かせるのと同じイメージ。
高精度なモデルってスマホとかでも動かせるんですか?
そのままだと重すぎて無理だね。例えばResNet-152はパラメータが6000万個もある。そこでモデルを小さく・軽くする技術が必要になるんだ。
大きなモデル(教師)の
知識を
小さなモデル(生徒)に
移す
ベテランの教え方を
新人に伝授するイメージ
重要度の低い
重みやノードを削除
する
使っていない枝を
切り落とすイメージ
重みの精度を
32bit → 8bit などに
下げる
小数点以下を四捨五入して
計算を簡単にするイメージ
| テクニック | 主な目的 | キーポイント |
|---|---|---|
| 重みの初期設定 | 学習を安定させる | Xavier(sigmoid/tanh)、He(ReLU) |
| ドロップアウト | 過学習を防ぐ | 学習時のみノード無効化。推論時はOFF |
| L2正則化(Weight Decay) | 重みの二乗和をペナルティとして損失関数に加える | |
| Early Stopping | 検証データの損失が上がり始めたら学習を止める | |
| バッチ正規化 | 学習の安定化・高速化 | 各層の入力を平均0・分散1に正規化 |
| データ拡張 | データ不足に対応 | 反転・回転・拡大・色変えでデータを水増し |
| 転移学習 | 少データで高精度 | 前半を固定、後半だけ再学習 |
| 蒸留 | モデルの軽量化 | 教師→生徒に知識を移す |
| プルーニング | 不要な重み・ノードを削除 | |
| 量子化 | 重みの精度を下げる(32bit→8bit) |