世界を動かす技術を、日本語で。

作れる最小の脳: Pythonによるパーセプトロン

概要

  • パーセプトロン は最小の「脳」で、1つの入力に対し Yes/No で答える単純な仕組み
  • 重み・バイアス・ループ のみで構成され、現代ニューラルネットワークの基礎
  • 決定境界バイアスの役割学習率正規化 の重要性を解説
  • Pythonで実装 し、学習の様子やパラメータ更新の流れを観察
  • 複数のニューロンを重ねることで、より複雑な問題にも対応可能

パーセプトロンとは何か

  • パーセプトロン は1958年にFrank Rosenblattが考案した計算モデル
  • ニューロン (脳細胞)を模倣し、入力信号が十分強ければ出力を発火
  • 数式: output = 1 if (w · x + b) > 0, 0 otherwise
  • x は入力、 w は重み、 b はバイアス
  • 入力値に重みをかけて合計し、バイアスを足して閾値(0)を超えたら「Yes」

人間の意思決定との類似

  • John Doeの例: 要素(入力)ごとに重み付け して合計、閾値を超えたら決断
  • 重み は「どれだけ重要か」、 バイアス は「基準値(閾値)」の役割
  • 体言止め: 人間の意思決定プロセス

パーセプトロンの構造

  • 複数入力(例:給料・勤務地) × 重み + バイアス → 合計値
  • 合計値が0を超えたら「Yes」、それ以外は「No」
  • 体言止め: 単純な二値分類器

最も単純な判断:「この数は正か?」

  • 入力1つ判定基準は0
  • 数式: prediction = (weight * value + bias) > 0
  • 重み・バイアス は初期値としてランダム
  • 体言止め: 単純な分類関数

学習の仕組み

  • 予測が間違った場合のみ、重みとバイアスを微調整
  • 誤差計算: error = result - prediction
  • 更新式: weight += learning_rate * error * value
  • learning_rate (学習率)は修正幅を決定
  • epoch (エポック):全データを1周学習
  • 体言止め: 逐次的な誤差修正

決定境界とは

  • 決定境界 :出力がFalseからTrueに切り替わる点
  • 数式: decision_boundary = -bias / weight
  • バイアスがない場合、決定境界は常に0に固定
  • 体言止め: 分類の分岐点

バイアスの重要性:合格ラインの例

  • 新たな問題: 試験の合格(50点以上)
  • バイアスなし では決定境界が0から動かせない
  • バイアスあり だと境界を50に設定可能
  • 重み は傾きを決定、 バイアス は境界の位置を調整
  • 体言止め: バイアスによる柔軟な境界設定

エポックと学習率

  • エポック :データ全体を何度繰り返し学習したか
  • 学習率 :1回の修正の大きさ
  • 小さい学習率は安定だが遅い、大きいと速いが不安定
  • 体言止め: 学習パラメータの調整

データの正規化の必要性

  • 入力値が大きいと、1回の誤りで重みが大きく変動
  • 正規化 :入力を0〜1など小さな範囲に変換
  • 異なるスケールの入力要素のバランス調整
  • 一般的な方法: 最大値で割る、または 平均・標準偏差で標準化
  • 体言止め: 安定した学習のための前処理

Pythonによるパーセプトロン実装

  • 重み・バイアス をランダム初期化
  • 学習率・エポック数 を設定
  • データ生成 :正の数(True)、負の数(False)を用意
  • 逐次的に 予測・誤差計算・重みバイアス更新
  • 決定境界 の計算と表示
import random
learning_rate = 0.1
EPOCHS = 100
weight = random.uniform(-1, 1)
bias = random.uniform(-1, 1)
data = [(i * 0.1, True) for i in range(1, 501)]
data += [(i * 0.1, False) for i in range(-500, 0)]
random.shuffle(data)
for epoch in range(EPOCHS):
    for value, result in data:
        prediction = (weight * value + bias) > 0
        if prediction != result:
            error = result - prediction
            weight += learning_rate * error * value
            bias += learning_rate * error
decision_boundary = -bias / weight
print(f"weight = {weight:.3f}")
print(f"bias = {bias:.3f}")
print(f"decision boundary = {decision_boundary:.3f}")
  • 学生合格判定 への応用:データを試験点数に変更、バイアスの有無で挙動を比較
  • 体言止め: シンプルなパーセプトロンの全体像

まとめと次のステップ

  • パーセプトロン は入力を重み付けし、バイアスを加えて判定
  • 誤りから学習 し、エポックごとに精度向上
  • 単一ニューロン は直線分離までだが、 多層化で複雑な問題に対応
  • すべてのニューラルネットワークの基礎となる動作
  • 体言止め: 深層学習の出発点としてのパーセプトロン

参考・謝辞

  • 本記事のインスピレーション:Welch Labsの動画「The Perceptron」
  • 視覚的に学びたい方 におすすめ
  • 体言止め: 学習リソースの紹介

Hackerたちの意見

MLの基本を学びたいなら、クリス・ビショップの「Deep Learning: Foundations and Concepts」って本をおすすめするよ。オンラインで学びたいなら、https://course.fast.ai/もいい選択肢だね。MLを知らないなら、即席のデモではあまり学べないと思うよ。

この本のおかげで、機械学習を視覚化するための直感やツールが身についたよ。もっと頭が良ければ、全部をうまくまとめられたのに。

おすすめしてくれた本を見てみたら、サイトに無料のオンラインオプションもあったよ!めっちゃ親切だね:https://www.bishopbook.com/

ビショップが新しい教科書を出してたなんて知らなかった。ちょっと見てみるつもり。彼の「Pattern Recognition」本はちょっと密度が高すぎてあんまり好きじゃなかったな。マーフィーやアルパイディンの本の方が好きだった。追記:彼の息子が共著者なの?

このFast AIコース、めっちゃ良さそうだね!絶対にすぐに学び始めるよ。ありがとう!

シンプルでいいね!JavaScriptで似たようなアプローチを試して、NanoNeuronを作ったよ。https://github.com/trekhleb/nano-neuron(でもPythonよりは冗長だけどね)

インタラクティブデモから今日はたくさん学んだよ。あなたは教育するのに必要な明確さとスキルを持ってるね。

ありがとう!他のコンセプトでももっとデモを作るようにするよ。

パーセプトロンは、作れる中で最小の脳なんだ。 > 1958年、フランク・ローゼンブラットという研究者が「パーセプトロン」と呼ぶ機械を作ったんだ。 > それは、単一の脳細胞、ニューロンにインスパイアされたものだよ。

そうだね。でも、少なくともこの投稿はOP自身が書いたみたいだし、素晴らしい学習リソースだよね。これって、もっと重要かもね :-)

IF文はソフトウェアプログラミングの根本的なクリエイターなんだ。二つの値を比較して、指示のブロックに分岐する能力がある。だから、読み取り、意思決定、ルーティングを行っていて、これが生命と無生物を分けるものなんだ。AIエージェントも同じループを実行していて、最初の二つのステップをモデルに委任してる。さらに遡ると、トランジスタ(またはPNP接合)がIF文のハードウェアレベルの実現を可能にしてる。電流によって駆動されるアクション(スイッチング)は、無生物が電気の速さで「観察して行動する」最初の現れなんだ。もちろん、機械的な同等物も存在していて、燃料の流れを制御するガバナーの速度が、ガバナーの速度を制御している。

チューリング・タンブルで遊ぶのも楽しいかもしれないよ。

でも、パーセプトロンでは本当にIF文ってわけじゃないよ。むしろ論理ゲートに近いんだ。飽和状態に駆動されたトランジスタの方が、ずっと良いモデルだね。

じゃあ、トレーニングされたモデルと同じ形のトランジスタのスタックやセットを作ったらどうなるかな?そうすれば、ほとんどのソフトウェアスタックも排除できるし、すごく速く動くはずだよ。メモリやGPUも必要なくて、チップがストレージと処理装置の両方の役割を果たす、トレーニングされたモデルの物理モデルとして作られてるんだ。

代替IF表現や文は、1958年にジョン・マッカーシーによって導入されたもので、彼は1959年初頭にAND、OR、NOTの自分のバージョンを定義するために使いました。これは計算のための可能なプリミティブの一つです。プリミティブ操作の同等なセットはいくつか存在します。NANDやNORだけ、またはANDとNOT、ORとNOTの両方を含むセットはより有名ですが、これらの論理操作はより抽象的で、ハードウェアの実装を正確に示すものではありません。つまり、こうした論理ゲートを作るための異なるハードウェア手法がたくさんあります。他のプリミティブ操作のセットは、ハードウェアデバイスに直接マッピングされます。例えば、最大値と補数、または最小値と補数から構成されるプリミティブ操作のセットは、整流ダイオードや反転増幅器を使ったハードウェア実装に直接マッピングされます(これは半導体デバイスや真空管、または空気圧や油圧デバイスでも作れます)。他のプリミティブ操作のセットは、最大または最小回路をスイッチの直列または並列接続に置き換えることで得られます。これは現在主流のCMOSロジックのようなものです。代替IF表現はハードウェアでは2ウェイのマルチプレクサに対応し、これに2つの定数関数「0」と「1」(別名「偽」と「真」、または「低電圧」と「高電圧」)が加わることで、完全な計算プリミティブのセットが得られます。上記のものに加えて、完全な計算プリミティブのセットの主な残りのバリアントは、アナログ(おそらく重み付き)加算器とアナログ比較器で、これはいわゆるRTL回路(抵抗トランジスタロジック)で使用され、パーセプトロンにも対応します。RTLは初期の集積回路で使用されていましたが、その後DTLやTTL回路(最小値と補数関数に基づく)に置き換えられました。ハードウェア、例えばRTL回路では、アナログ加算器と比較器を高ゲインの増幅デバイス1つと、重み付け抵抗器のセット、バイアス抵抗器を組み合わせて作ることができます。RTL回路は、少ないデバイスで複雑な論理を実装できます(例えば、アナログ領域でニューラルネットワークを実装できる)。しかし、1960年代にはDTL、次いでTTLに置き換えられました。なぜなら、これらはより速かったからです(RTLでは、抵抗が入力コンデンサや寄生コンデンサの充電電流を制限し、論理遷移を遅くします)。デバイスが多く必要だったことは重要ではなく、回路密度の急速な増加があったからです。

機械学習の初期(最初のAI冬の前)には、こういったネットワークがハードウェアで実装されて訓練されることが多かったんだ: https://en.wikipedia.org/wiki/ADALINE 「作れる中で最小の脳」という言葉を読んだとき、真っ先に思い浮かんだのはそれだったよ。今では、その「小さな脳」はオペアンプを使ってブレッドボード上に作られることが多いだろうね。

これは素晴らしい洞察だね、シェアしてくれてありがとう!

まだまだ質問がたくさん残ってるけど、それはさておき、すごく面白かった!シェアしてくれてありがとう!

カーパシーのmicrogptのブログ記事は、このジャンルでは久しぶりの最高のものだと思うし、マルチレイヤーパーセプトロンも含まれてる。階層の一段上に進んでるから、両方読むのはもちろん役に立つよ。 https://karpathy.github.io/2026/02/12/microgpt/