(1時間4,000円の伴走型ビデオチャット指導も受付中!)
Pythonで学ぶ「多層パーセプトロン(MLP)」の仕組みと実装:ニューラルネットワークの第一歩
![]()
【Hiroki】
Yukiさん、こんにちは!最近、AIやディープラーニングのニュースをよく目にするので、自分でも少しずつ勉強を始めようと思っているんです。
調べてみると、まず「多層パーセプトロン(MLP)」という言葉が出てきたのですが……なんだか名前からして難しそうで。これって一体どういうものなんですか?
![]()
【Yuki】
Hirokiくん、こんにちは。プログラミングの学習、頑張っていますね……。
「多層パーセプトロン(Multi-Layer Perceptron: MLP)」ですね。確かに、漢字とカタカナが並ぶと少し圧倒されてしまうかもしれません……。
でも、今の複雑なAI技術の「もっとも基本的な形」だと思えば、少し身近に感じられるでしょうか。
夜の静かな時間にコードを書いていると、このMLPがどれだけ健気に計算を繰り返しているかが伝わってきて、わたしは少し愛着を感じたりもします……。
今日は、このMLPがどんな仕組みで動いているのか、Pythonでの書き方も含めて一緒に見ていきましょうか。
パーセプトロンから「多層」への進化
![]()
【Hiroki】
「基本的な形」なんですね。そもそも、「パーセプトロン」っていうのは何なんですか?
![]()
【Yuki】
ええと、まずはそこからですよね。
パーセプトロンというのは、人間の脳にある「ニューロン」という神経細胞の働きを、数学的に真似たモデルのことです。
いくつかの入力を受け取って、それを足し合わせ、一定の値を超えたら「1」を出力し、そうでなければ「0」を出力する……という、とてもシンプルな仕組みなんです。
でも、単層のパーセプトロンには、「直線で区切れない問題(非線形問題)」を解けないという大きな弱点がありました。
![]()
【Hiroki】
直線で区切れない問題……?
![]()
【Yuki】
例えば、グラフの上に「○」と「×」が散らばっているとき、一本の真っ直ぐな線で綺麗に分けられないようなケースのことですね。
そこで考え出されたのが、パーセプトロンを何層にも積み重ねるというアイデアです。
層を増やすことで、複雑な境界線を描けるようになり、より高度な判断ができるようになりました。これが「多層パーセプトロン(MLP)」と呼ばれるものです。
今のディープラーニングは、この層をさらに何十、何百と積み重ねたもの……と言えるかもしれません。
MLPを構成する3つの層
![]()
【Hiroki】
層を重ねることで賢くなるんですね。具体的には、どんな層があるんでしょうか?
![]()
【Yuki】
MLPは、大きく分けて3つの層で構成されています。
- 入力層 (Input Layer): データが最初に入ってくる場所です。画像なら画素値、数値データならその値がそのまま入ります。
- 隠れ層 (Hidden Layer): 「中間層」とも呼ばれます。ここで複雑な計算が行われ、データの特徴が抽出されます。この層を増やすほど、より複雑なことを学習できるようになります……。
- 出力層 (Output Layer): 最終的な予測結果を出す場所です。「これは犬です」「これは猫です」といった答えをここで出力します。
![]()
【Hiroki】
なるほど、データが左から右へと流れていくイメージですね。
![]()
【Yuki】
その通りです。これを「順伝播(Forward Propagation)」と呼びます。
各層にあるユニット(ニューロン)同士は、それぞれ「重み(Weight)」という細い糸のようなものでつながっています。
この重みの値を調整することで、AIは賢くなっていく……というわけです。
活性化関数の役割と種類
![]()
【Hiroki】
重みを調整するんですね。でも、ただ足し合わせるだけで複雑な判断ができるようになるんですか?
![]()
【Yuki】
鋭いですね、Hirokiくん……。実は、足し合わせた値にアクセントを加える「活性化関数」というものがとても重要なんです。
これがないと、層をいくら重ねても結局は単純な計算の繰り返しになってしまい、複雑な形を表現できません。
よく使われる関数をいくつか紹介しますね。
- シグモイド関数 (Sigmoid): 出力を0から1の間に収める関数です。昔はよく使われていましたが、最近は少し出番が減っているかもしれません。
- ReLU関数 (Rectified Linear Unit): 「0以下の入力は0、0より大きい入力はそのまま」という非常にシンプルな関数です。今のディープラーニングでは、計算が速くて学習が進みやすいため、もっとも一般的に使われています。
- ソフトマックス関数 (Softmax): 出力層でよく使われます。各出力の合計が1(100%)になるように調整してくれるので、「これが正解である確率」として解釈しやすくなります。
![]()
【Hiroki】
ReLU関数っていうのが、今の主流なんですね。覚えておきます!
学習の仕組み「誤差逆伝播法」
![]()
【Hiroki】
さっき「重みを調整する」と言っていましたが、どうやって最適な重みを見つけるんですか?
![]()
【Yuki】
そこが一番の魔法のような部分ですよね。
まず、適当な重みで予測を出してみます。当然、最初は間違いだらけです。
そこで、「正解とどれくらいズレていたか(誤差)」を計算します。
その誤差を、出力層から入力層の方へと逆向きに辿っていき、「どの重みがどれくらい悪さをしていたか」を突き止めて、少しずつ修正していくんです。
これを「誤差逆伝播法(Backpropagation)」と呼びます。
![]()
【Hiroki】
逆向きに辿るから「逆伝播」なんですね。
![]()
【Yuki】
はい。この工程を何千回、何万回と繰り返すことで、モデルは少しずつ正解に近づいていきます。
……なんだか、何度も推敲を重ねて一つの文章を完成させる作家さんの作業に、少し似ているような気がしませんか?
Pythonとscikit-learnでの実装例
![]()
【Hiroki】
仕組みはわかってきました!実際にPythonで動かしてみたいのですが、初心者の僕でも書けますか?
![]()
【Yuki】
もちろんです。本格的なディープラーニングには TensorFlow や PyTorch といったライブラリを使いますが、まずは機械学習ライブラリの定番 「scikit-learn(サイキット・ラーン)」 を使うのがおすすめです。
MLPClassifier というクラスを使えば、驚くほど簡単に実装できるんですよ。
![]()
【Hiroki】
ぜひ教えてください!
![]()
【Yuki】
では、有名なアヤメ(Iris)の花のデータセットを使って、種類を分類するコードを書いてみましょうか。
じっくり、一行ずつ見てみてくださいね。
# 必要なライブラリをインポートします
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neural_network import MLPClassifier
from sklearn.metrics import accuracy_score
# 1. データの読み込み
iris = load_iris()
X = iris.data # 花びらの長さなどの特徴量
y = iris.target # 花の種類(正解ラベル)
# 2. データを「学習用」と「テスト用」に分けます
# データの20%をテスト用に回します
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 3. データの標準化(MLPでは非常に重要です)
# 平均0、分散1になるようにスケールを整えます
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
# 4. 多層パーセプトロンのモデルを作成
# hidden_layer_sizes=(10, 10) は、10個のユニットを持つ隠れ層を2つ作るという意味です
mlp = MLPClassifier(
hidden_layer_sizes=(10, 10),
activation='relu', # 活性化関数にReLUを使用
solver='adam', # 最適化手法にAdamを使用(一般的で高性能です)
max_iter=1000, # 最大1000回繰り返して学習
random_state=42
)
# 5. 学習の実行
print("学習を開始します……")
mlp.fit(X_train, y_train)
# 6. 予測と評価
y_pred = mlp.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
print(f"テストデータの正解率: {accuracy:.4f}")
![]()
【Hiroki】
わあ、意外と短いコードで動くんですね!
「データの標準化」っていうのは、どうして必要なんですか?
![]()
【Yuki】
いいところに気がつきましたね……。
MLPは、入力される数値の大きさにとても敏感なんです。
あるデータは1000という大きな値なのに、別のデータは0.1という小さな値だったりすると、重みの計算が上手くいかずに学習が止まってしまうことがあります。
だから、みんな同じような基準の数値に揃えてあげる「標準化」が必要なんです。
……少し控えめな性格のユニットたちが、極端に大きな声(数値)に驚かないように調整してあげる、そんなイメージかもしれません。
精度を上げるための「ハイパーパラメータ」
![]()
【Hiroki】
なるほど、データの準備も大切なんですね。
コードの中に hidden_layer_sizes とか max_iter とかありましたが、これらを変えると結果も変わるんですか?
![]()
【Yuki】
はい、それらは「ハイパーパラメータ」といって、人間が設定してあげないといけない値です。
- hidden_layer_sizes: 隠れ層の数と、それぞれの層のユニット数を決めます。増やせば複雑なことを覚えられますが、増やしすぎると「過学習(Overfitting)」といって、練習問題の答えだけを丸暗記してしまい、本番に弱くなってしまうこともあります……。
- activation:
先ほどお話しした活性化関数の選択です。基本は
'relu'で大丈夫だと思います。 - max_iter: 学習を何回繰り返すかです。少なすぎると学習不足になりますし、多すぎても時間がかかってしまいます。
- alpha: これはコードには書きませんでしたが、L2正則化という「重みが大きくなりすぎないように抑える」ためのパラメータです。過学習を防ぐのに役立ちます。
![]()
【Hiroki】
設定がいろいろあって迷いそうですが、試行錯誤していくのが楽しそうですね。
![]()
【Yuki】
ええ、まさにその試行錯誤こそが機械学習の醍醐味だと思います。
静かな部屋で、パラメータを少しずつ変えながら、正解率が少しずつ上がっていくのを眺めるのは……なんだか、小さな苗を育てているような感覚に近いかもしれません。
まとめ
![]()
【Hiroki】
今日はありがとうございました、Yukiさん!
MLPがディープラーニングの基礎だということや、層を重ねて誤差を逆伝播させる仕組み、よく分かりました。
Pythonで実際に動かせたのも自信になりました。
![]()
【Yuki】
それは良かったです……。
最初は難しく感じるかもしれませんが、MLPの考え方は、最新の複雑なAIモデルでも基本は同じです。
まずはこのシンプルなモデルで、データの流れや学習の感覚を掴んでみてください。
もし途中でエラーが出たり、よく分からないことがあったら、いつでも聞いてくださいね。
わたしはいつでも、モニターの中からHirokiくんの学習を応援していますから……。
もっと詳しく知りたい場合は、こちらの公式ドキュメントなども参考にしてみてくださいね。 scikit-learn MLPClassifier Documentation Wikipedia - Multi-layer perceptron
![]()
【Hiroki】
ありがとうございます!また明日も頑張ります!
![]()
【Yuki】
はい、無理をせずに。夜更かしはほどほどにしてくださいね……(ふふ、わたしが言うのもなんですけれど)。
この記事では基礎を解説しましたが、実務においては「もっと複雑なデータを扱いたい」「独自のシステムに組み込みたい」といった、個別の課題に直面することも多いはずです。
「自分で書く時間は最小限に抑え、プロの品質でツールを完成させたい」という方は、ぜひ一度ご相談ください。
- 専門家の知見に基づいた、保守性の高いコード設計
- AIの専門家による、Gemini API等の最新AIを組み合わせた高度な自動化
- ChatGPT等が生成したコードのデバッグ・最適化
「教わる」だけでなく「形にする」パートナーとして、フリーランスエンジニアのmei_13が最短ルートでの解決をサポートします。
初心者から始められるPythonレッスン
● 月額4,000円で質問し放題!!
● 完全オンライン
● 翌日までには必ず返信
● 挫折しない独自の学習メソッド
● 圧倒的高評価!!
● テキストベースで時間を選ばない
● 4,000円/60分の伴走型ビデオチャット指導も可能
● 高品質なサンプルコード
詳細はこちら

