[機械学習のはじめ方] Part31: 多層パーセプトロン(MLP)と誤差逆伝播

機械学習

はじめに:単純パーセプトロンを超えて

前回学んだ「単純パーセプトロン」は、ニューラルネットワークの最も基本的な形でしたね。しかし、単純パーセプトロンは線形分離可能な問題しか解けないという限界がありました。現実の問題はもっと複雑で、単純な直線(あるいは平面)だけでは分けられないデータがたくさんあります。

そこで登場するのが多層パーセプトロン(Multilayer Perceptron, MLP)です!✨ MLPは、単純パーセプトロンを複数層に重ねることで、より複雑な問題を解けるようにしたニューラルネットワークです。ディープラーニングの基礎となる重要なモデルなので、しっかり理解していきましょう!

多層パーセプトロン(MLP)とは?

MLPは、文字通りパーセプトロン(ニューロン)が複数の層になったネットワークです。最低でも以下の3つの層で構成されます。

  • 入力層 (Input Layer): 外部からデータを受け取る層です。
  • 隠れ層 (Hidden Layer): 入力層と出力層の間にある層です。この層が1つ以上あるのがMLPの特徴です。隠れ層のニューロンは、前の層からの情報を受け取り、活性化関数という非線形な関数を通して次の層に情報を渡します。この非線形性のおかげで、MLPは複雑なパターンを学習できます。
  • 出力層 (Output Layer): 最終的な計算結果を出力する層です。

単純パーセプトロンでは入力層と出力層しかありませんでしたが、MLPでは中間に隠れ層が入ります。この隠れ層が、入力データからより高度な特徴を抽出し、複雑な関係性を捉える役割を果たします。隠れ層の数や、各層のニューロンの数を調整することで、モデルの表現力を変えることができます。

💡 ポイント: MLPの各層のニューロンは、基本的に次の層のすべてのニューロンと結合されています(全結合層)。そして、隠れ層や出力層で使われる「活性化関数」が、ネットワークに非線形な表現力をもたらす鍵となります。(活性化関数については、次の記事で詳しく解説します!)

誤差逆伝播法(Backpropagation)とは? ⚙️

MLPが複雑な問題を解けるのは分かりましたが、どうやって学習するのでしょうか?単純パーセプトロンでは比較的簡単なルールで重みを更新できましたが、層が増えるとそうはいきません。ここで登場するのが誤差逆伝播法(Backpropagation)です。

誤差逆伝播法は、ニューラルネットワークの学習において、予測値と実際の正解値との「誤差」を計算し、その誤差を小さくするようにネットワークの重みを効率的に調整するためのアルゴリズムです。

名前の通り、「誤差」を「逆」方向に「伝播」させていきます。具体的なステップは以下の通りです。

  1. 順伝播 (Forward Propagation): まず、入力データを入力層から出力層へと順方向に計算を進め、予測値を出力します。これは通常の予測と同じプロセスです。
  2. 誤差の計算: 出力層で得られた予測値と、実際の正解値との差(誤差)を計算します。この誤差を評価するための関数を「損失関数」と呼びます。(損失関数も後の記事で詳しく解説します!)
  3. 逆伝播 (Backward Propagation): 計算した誤差を、出力層から入力層に向かって逆方向に伝播させていきます。各層で、その層の重みが最終的な誤差にどれだけ影響を与えたか(勾配)を、連鎖律(Chain Rule)という微分の法則を使って計算します。
  4. 重みの更新: 計算した勾配に基づいて、各層の重みを少しずつ更新します。誤差が小さくなる方向に重みを調整することで、ネットワークの性能を改善していきます。この更新には勾配降下法などの最適化アルゴリズムが使われます。

この「順伝播 → 誤差計算 → 逆伝播 → 重み更新」のサイクルを何度も繰り返すことで、ニューラルネットワークはデータから学習を進めていきます。

📉 なぜ逆向きなの? 出力層に近い部分の重みを更新しても、影響範囲はその層だけです。しかし、入力層に近い部分の重みを先に更新すると、それ以降のすべての層の計算に影響が出てしまい、効率が悪くなります。出力側から誤差を計算し、その影響度を逆に戻していくことで、各重みの調整量を効率的に計算できるのです。

簡単なPythonコード例(scikit-learn)

理論だけだと難しいので、Pythonのライブラリscikit-learnを使ってMLPを実装してみましょう。ここでは、簡単な分類問題を解く例を示します。


from sklearn.neural_network import MLPClassifier
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import accuracy_score

# 1. データの準備 (簡単な分類データを作成)
X, y = make_classification(n_samples=200, n_features=20, random_state=42)

# データを学習用とテスト用に分割
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# データの標準化 (重要!)
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)

# 2. MLPモデルの構築と学習
# hidden_layer_sizes=(50, 30) は、50個のニューロンを持つ隠れ層と
# 30個のニューロンを持つ隠れ層の2つの隠れ層を指定
# max_iterは学習の繰り返し回数の上限
mlp = MLPClassifier(hidden_layer_sizes=(50, 30), max_iter=500, random_state=42,
                    activation='relu', # 活性化関数 (ReLU)
                    solver='adam')     # 最適化アルゴリズム (Adam)

print("学習を開始します...")
mlp.fit(X_train_scaled, y_train)
print("学習が完了しました!")

# 3. モデルの評価
y_pred = mlp.predict(X_test_scaled)
accuracy = accuracy_score(y_test, y_pred)

print(f"\nテストデータでの精度: {accuracy:.4f}")

# 予測確率の確認 (例: 最初の5サンプル)
# probabilities = mlp.predict_proba(X_test_scaled[:5])
# print("\n最初の5サンプルの予測確率:")
# print(probabilities)
      

このコードでは、make_classificationでダミーデータを作成し、StandardScalerでデータを標準化(平均0、分散1に変換)しています。MLPのようなニューラルネットワークでは、多くの場合、入力データの前処理としてスケーリングが重要になります。

MLPClassifierのインスタンスを作成する際に、hidden_layer_sizesで隠れ層の構造(各層のニューロン数)を指定します。max_iterで学習の繰り返し(エポック)の上限を設定します。そして、fitメソッドで学習を実行します。内部では、誤差逆伝播法を使って重みが更新されています。最後に、predictでテストデータの予測を行い、accuracy_scoreで精度を評価しています。

scikit-learnを使うと、誤差逆伝播法の複雑な計算を意識することなく、比較的簡単にMLPを試すことができます。

まとめ

今回は、単純パーセプトロンの限界を克服する多層パーセプトロン(MLP)と、その学習アルゴリズムである誤差逆伝播法について学びました。

  • MLPは入力層、1つ以上の隠れ層、出力層から構成される。
  • 隠れ層と非線形な活性化関数により、線形分離不可能な複雑な問題を扱える。
  • 誤差逆伝播法は、予測誤差を出力層から入力層へ逆伝播させ、効率的に重みを更新するアルゴリズム。
  • 学習は「順伝播 → 誤差計算 → 逆伝播 → 重み更新」のサイクルで行われる。

MLPと誤差逆伝播法は、現代の深層学習(Deep Learning)の基礎となる非常に重要な概念です。次回は、MLPの性能を左右する「活性化関数」について、さらに詳しく見ていきましょう!🚀

コメント

タイトルとURLをコピーしました