本文へスキップ
ひもとくAI

scikit-learnでニューラルネットワークを動かす

レッスン 5/6

MLPClassifier:いつもの fit と predict で使える

ここまで、ニューラルネットワークの中身を自分で組み立ててきました。実際に使うときは、ライブラリに任せるのが一般的です。scikit-learnでは、分類用のニューラルネットワークを MLPClassifier で使えます(MLPは Multi-Layer Perceptron、「多層のニューロン」の略です)。

XORのデータで、ロジスティック回帰と比べてみましょう。

import numpy as np
from sklearn.linear_model import LogisticRegression
from sklearn.neural_network import MLPClassifier

X = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])
y = np.array([0, 1, 1, 0])

logreg = LogisticRegression().fit(X, y)
logreg.predict(X)     # → [0, 0, 0, 0] (1本の直線では解けない)

mlp = MLPClassifier(hidden_layer_sizes=(4,), activation="tanh",
                    solver="lbfgs", max_iter=1000, random_state=0)
mlp.fit(X, y)
mlp.predict(X)        # → [0, 1, 1, 0] (正解)

ロジスティック回帰は4件すべてを0と予測しますが、隠れ層を持つ MLPClassifier は正しく [0, 1, 1, 0] と予測できました。使い方は、これまでのモデルと同じ fit → predict です。

activation="tanh" や solver="lbfgs" は、データが4件しかないこの小さな問題で、安定して学習させるための設定です(scikit-learnの説明書でも、小さなデータには lbfgs が向いているとされています)。設定の意味は次のスライドで紹介しますが、名前を覚える必要はありません。fit の中では、レッスン4で学んだ「損失を計算し、誤差逆伝播で勾配を求め、重みを少しずつ動かす」という学習が行われています。

主な設定と、重みの数

MLPClassifier の主な設定は次のとおりです。

設定意味例
hidden_layer_sizes隠れ層ごとのニューロンの数(4,) なら隠れ層1つで4個、(32, 16) なら隠れ層2つで32個と16個
activation活性化関数"relu"(既定)、"logistic"(シグモイド関数)、"tanh" など
solver重みを動かす方法"adam"(既定、勾配降下法を改良したもの)、"lbfgs" など
max_iter学習を繰り返す回数の上限多いほど学習が進むが、時間がかかる
random_state最初の重みを決める乱数の種同じ値にすると、毎回同じ結果になる(再現性)

tanh・adam・lbfgs などの名前は、今は覚えなくて大丈夫です。「活性化関数や、重みの動かし方にもいくつか種類があって、選べる」ということだけ知っておいてください。

乱数の種 について補足します。学習を始める前の重みは、でたらめな数(乱数)で決めます。コンピュータのでたらめな数は、実は「種」と呼ばれる番号から決まった手順で作られています。そのため、種の番号(random_state)を同じにすると、毎回同じでたらめな数が出て、同じ結果を再現できます。

重みの数を数えてみる

ネットワークの大きさは、重みとバイアスの数で表されます。隣り合う層のニューロンは、すべて線でつながっていて、線1本につき重みが1つあります。

  • 入力2つ → 隠れ層4つ: 重み 2×4=82 \times 4 = 8 個、隠れ層のバイアス4個
  • 隠れ層4つ → 出力1つ: 重み 4×1=44 \times 1 = 4 個、出力のバイアス1個

合計 8+4+4+1=178 + 4 + 4 + 1 = 17 個です。前のスライドのXORのモデルは、17個の数値を学習で決めていたことになります。大規模な言語モデルでは、この数が数千億個にもなります。

入力層(2)隠れ層(4)出力層(1)
入力層2つ、隠れ層4つ、出力層1つのネットワーク図。隣り合う層のすべてのニューロン同士が線で結ばれ、線は入力層と隠れ層の間に8本、隠れ層と出力層の間に4本あります。

よくある誤解と振り返り

誤解:「ディープラーニングは、ニューラルネットワークとは別の技術?」

ディープラーニング(深層学習)は、隠れ層をたくさん重ねた(深くした)ニューラルネットワーク のことです。この章で学んだニューロン、層、活性化関数、順伝播、誤差逆伝播という仕組みは、そのままディープラーニングの土台です。画像ならCNN(畳み込みニューラルネットワーク)、文章ならTransformerのように、データの種類に合わせて層のつなぎ方を工夫したものが使われています。

誤解:「大きなモデルほど、必ず良い結果になる?」

隠れ層やニューロンを増やすと、表現できることは増えます。しかし、データが少ないと過学習しやすく、学習にかかる時間も長くなります。第5章と同じように、訓練データとテストデータの成績を比べながら、ちょうど良い大きさを探します。

scikit-learnとPyTorchの使い分け

MLPClassifier は、表形式のデータで小さなニューラルネットワークを手軽に試すのに向いています。画像や文章を扱う大きなモデルを作るときは、GPUで高速に計算でき、層の組み立てを自由に設計できるPyTorchなどの専用のライブラリを使います。

振り返り

  • MLPClassifier で、これまでと同じ fit → predict の流れでニューラルネットワークを使える
  • hidden_layer_sizes で隠れ層の数とニューロンの数を決める
  • 重みの数は「隣り合う層のニューロン数の掛け算」の合計にバイアスを足したもの

演習

演習を読み込んでいます…