はじめに:モデルの「学びすぎ」を防ぐために
ディープラーニングや機械学習のモデルを訓練していると、「訓練データではとても良い性能を出すのに、未知の新しいデータに対しては性能が大きく下がってしまう」という現象が起こることがあります。これを過学習(Overfitting)と呼びます。
過学習は、モデルが訓練データに存在する細かいノイズや特徴まで「暗記」してしまい、データの裏にある本質的なパターンを捉えられなくなることで発生します。その結果、少しでも傾向の違うデータに対応できなくなってしまうのです。
この厄介な過学習を防ぐためのテクニックが正則化(Regularization)です。正則化は、モデルが複雑になりすぎるのを防ぐための「ブレーキ」のような役割を果たします。その中でも特に有名な手法の一つが、今回解説するL1正則化です。
L1正則化とは?
L1正則化は、別名Lasso(ラッソ)回帰とも呼ばれ、モデルの学習時に課すペナルティの一種です。
機械学習モデルは、学習の際に「損失関数」という指標を最小化しようとします。これは、モデルの予測がどれだけ正解から外れているかを示す「間違い度合い」のようなものです。L1正則化は、この損失関数に「全パラメータ(重み)の絶対値の合計」というペナルティ項を追加します。
つまり、モデルは「間違い度合い」を小さくすると同時に、「パラメータの絶対値の合計」も小さくしなければならなくなります。これにより、モデルは不必要に大きなパラメータを持つことをためらうようになり、結果としてモデル全体の複雑さが抑制されるのです。
L1正則化の最大の特徴「スパース性(疎性)」
L1正則化の最も重要な特徴は、スパースなモデル(疎なモデル)を作り出す性質があることです。スパースとは「スカスカ」や「まばら」といった意味で、モデルの多くのパラメータ(重み)が完全に0になる現象を指します。
なぜパラメータが0になるのでしょうか? L1正則化は、パラメータの絶対値に比例したペナルティを科すため、効果の薄い(予測への貢献度が低い)パラメータを中途半端に小さい値で残すよりも、思い切って0にしてしまった方がペナルティを効率的に減らせるからです。
パラメータが0になるということは、そのパラメータに対応する入力データ(特徴量)が「予測に不要である」とモデルが判断したことを意味します。このように、L1正則化は自動的に重要な特徴量だけを選び出す「特徴選択」の役割も果たしてくれるのです。
L1正則化とL2正則化の違い
正則化には、L1正則化とよく比較されるL2正則化(Ridge回帰)という手法もあります。この二つの違いを理解することは、適切な正則化手法を選ぶ上で非常に重要です。
項目 | L1正則化 (Lasso) | L2正則化 (Ridge) |
---|---|---|
ペナルティ項 | パラメータの絶対値の和 | パラメータの二乗の和 |
パラメータへの影響 | 不要なパラメータを0にする(スパース性) | パラメータを全体的に0に近づけるが、完全な0にはなりにくい |
特徴選択 | 行われる。モデルの解釈性が向上する | 行われない。全てのパラメータがモデルに残る傾向がある |
主な用途 | 特徴量が多く、不要なものが含まれている可能性が高い場合。モデルをシンプルにしたい場合。 | 全ての特徴量が予測に寄与すると考えられる場合。一般的に広く使われる。 |
ディープラーニングの世界では、L2正則化の方がより一般的に利用される傾向にありますが、L1正則化もモデルの解釈性を高めたい場合や、特徴量を削減して計算コストを下げたい場合に有効な選択肢となります。
コードで見るL1正則化の実装(TensorFlow/Keras)
実際にディープラーニングのフレームワークであるTensorFlowのKeras APIを使ってL1正則化を実装する方法を見てみましょう。Dense(全結合)層にL1正則化を適用するのは非常に簡単です。
層を追加する際に、kernel_regularizer
という引数にregularizers.l1()
を指定します。括弧内の数値は正則化の強さを決める係数(λ)で、この値が大きいほどペナルティが強くなります。
import tensorflow as tf
from tensorflow.keras import layers, models, regularizers
# モデルを定義
model = models.Sequential([
layers.Dense(
128,
activation='relu',
# この層の重みにL1正則化を適用
# 係数0.01で正則化の強さを指定
kernel_regularizer=regularizers.l1(0.01),
input_shape=(784,)
),
layers.Dropout(0.2),
layers.Dense(10, activation='softmax')
])
# モデルの概要を表示
model.summary()
このように、kernel_regularizer
を指定するだけで、その層の重みに対して学習中にL1正則化のペナルティが適用されるようになります。L1とL2の両方を適用したい場合はregularizers.l1_l2()
を使用することも可能です。
まとめ
L1正則化は、ディープラーニングにおける過学習を抑制するための強力な手法の一つです。
- モデルの損失関数にパラメータの絶対値の和をペナルティとして加える。
- 不要なパラメータの値を完全に0にする効果(スパース性)がある。
- 自動的に特徴選択を行い、モデルをシンプルにする。
- 過学習を防ぎ、モデルの汎化性能を高めるのに役立つ。
L1正則化の仕組みと特徴を理解することで、より性能が高く、解釈しやすいモデルを構築するための選択肢が広がります。