PR

多層パーセプトロン(MLP)とは 機械学習のNeural Network

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

多層パーセプトロン(MLP: Multi-Layer Perceptron)は、人工ニューラルネットワークの一種で、機械学習アルゴリズムの基本となるモデルです。

MLPは入力データから特徴を自動的に抽出し、複雑なパターンを認識できるため、様々な分野で活用されています。特に画像認識や自然言語処理の分野では、CNNやRNNなどのニューラルネットワークモデルの基礎として重要な役割を果たしています。

MLPは以下の特徴を持っています。

多層構造
入力層、出力層に加えて1つ以上の隠れ層(中間層)を持つ多層構造になっています。
各層はさらに複数の層に分かれている場合があります。

全結合型ネットワーク
各層間のノード(パーセプトロン)は全て互いに結合しているような構造になっています。
このような構造を持つニューラルネットワークを「全結合型(Fully Connected)ニューラルネットワーク」と呼びます。

フィードフォワード構造
一般にMLPは回帰(再帰)構造を持たない「フィードフォワードニューラルネットワーク(FFNN)」です。

パーセプトロンの多層化
MLPは人間の脳をモデル化したパーセプトロンを多層化したものです。
単純パーセプトロンは入力層と出力層のみですが、MLPには中間層が追加されています。

機械学習の基礎
MLPは機械学習のアルゴリズムの1つであり、ニューラルネットワークの基本となるものです。
現在の機械学習の多くにMLPの形式を拡張したものが使われています。

誤差逆伝播法による学習
MLPの学習には誤差逆伝播法が用いられ、入力データに対する重みを調整することで様々なデータを分類できます。

回帰問題と分類問題の解決
MLPは回帰問題(連続した数値データの予測)と分類問題(クラス分類)の両方を扱うことができます。

ディープラーニングの基礎
MLPはディープラーニングの基礎となる手法で、ディープラーニングはMLPの構造を発展させたものです。

MLPは単層のパーセプトロンでは解決できない複雑な問題に対応できる汎用的なモデルとして、機械学習やディープラーニングの分野で広く利用されています。

多層パーセプトロンの応用例

多層パーセプトロン(MLP)は、機械学習やディープラーニングの基礎となる重要なアルゴリズムです。MLPの応用例は以下のようなものがあります。

画像認識

  • 手書き文字認識
  • 物体検出
  • 画像分類

自然言語処理

  • 文書分類
  • 機械翻訳
  • 感情分析

関連 Pythonの自然言語処理

その他

  • 音声認識
  • 時系列データ予測
  • クレジットスコアリング
  • 医療診断

MLPは教師あり学習のみならず、教師なし学習や強化学習にも適用可能です。ディープラーニングの発展により、MLPを拡張した高度なモデルが次々と登場していますが、MLPの基本的な考え方は現在でも機械学習の中核を成しています。

多層パーセプトロンのPythonでの実装

The Multilayer Perceptron: Built and Implemented from Scratch | by David Cullen | Towards AI

多層パーセプトロンをPythonで実装する手順は以下の通りです。

前処理

必要なライブラリをインポートします。

import numpy as np

訓練データと正解ラベルを準備します。

# XORゲートの訓練データ
X = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])
y = np.array([[0], [1], [1], [0]])

モデルの構築

重み行列と バイアスを初期化します。

# 入力層->隠れ層の重み行列
W1 = np.random.randn(2, 3) 
# 隠れ層->出力層の重み行列
W2 = np.random.randn(3, 1)
# 隠れ層のバイアス  
b1 = np.zeros((1, 3))
# 出力層のバイアス
b2 = np.zeros((1, 1))

活性化関数を定義します(ここではシグモイド関数)。

def sigmoid(x):
    return 1 / (1 + np.exp(-x))

順伝播の計算を行う関数を定義します。

def forward_prop(X):
    z1 = X.dot(W1) + b1 # 入力層->隠れ層
    a1 = sigmoid(z1) # 隠れ層の活性化
    z2 = a1.dot(W2) + b2 # 隠れ層->出力層  
    a2 = sigmoid(z2) # 出力層の活性化
    return a2

損失関数を定義します(ここでは二値クロスエントロピー損失)。

def loss(y, y_hat):
    return -np.mean(y * np.log(y_hat) + (1 - y) * np.log(1 - y_hat))

訓練

逆伝播の計算を行う関数を定義します。

def backprop(X, y, y_hat):
    m = y.shape[0]
    
    # 出力層の勾配
    dl_wrt_a2 = -(np.divide(y, y_hat) - np.divide(1 - y, 1 - y_hat))
    dl_wrt_z2 = dl_wrt_a2 * sigmoid(z2) * (1 - sigmoid(z2))
    dl_wrt_w2 = np.dot(a1.T, dl_wrt_z2)
    dl_wrt_b2 = np.sum(dl_wrt_z2, axis=0, keepdims=True)
    
    # 隠れ層の勾配
    dl_wrt_a1 = np.dot(dl_wrt_z2, W2.T)
    dl_wrt_z1 = dl_wrt_a1 * sigmoid(z1) * (1 - sigmoid(z1))
    dl_wrt_w1 = np.dot(X.T, dl_wrt_z1)
    dl_wrt_b1 = np.sum(dl_wrt_z1, axis=0, keepdims=True)
    
    return dl_wrt_w1, dl_wrt_b1, dl_wrt_w2, dl_wrt_b2

訓練ループを実行し、重み行列とバイアスを更新します。

epochs = 10000
learning_rate = 0.1

for i in range(epochs):
    # 順伝播
    y_hat = forward_prop(X)
    
    # 損失計算
    loss_val = loss(y, y_hat)
    
    # 逆伝播
    dl_wrt_w1, dl_wrt_b1, dl_wrt_w2, dl_wrt_b2 = backprop(X, y, y_hat)
    
    # 重み・バイアスの更新
    W1 -= learning_rate * dl_wrt_w1
    b1 -= learning_rate * dl_wrt_b1  
    W2 -= learning_rate * dl_wrt_w2
    b2 -= learning_rate * dl_wrt_b2
    
    # 進捗の表示
    if i % 1000 == 0:
        print(f"Epoch {i}, Loss: {loss_val}")

以上が多層パーセプトロンのPython実装の基本的な流れです。提供された検索結果を参考にしながら、詳細を確認することができます。