2025/09/26 00:51 Tiny-Classifier.cpp – Our First Tiny Classifier

ロボ子、今日はニューラルネットワークの話題じゃぞ!

博士、楽しみです!どんなお話が聞けるのでしょうか?

今回は、1985年に初めて有料プログラミングの仕事でニューラルネットワークに関わった人が、ニューラルネットワークの基礎を復習して、C++で実装してみたという話じゃ。

1985年ですか!ずいぶん昔からニューラルネットワークの研究はあったんですね。

そうじゃな。その人がWelch LabsのYouTubeビデオを参考にしたらしいぞ。私も見てみたんじゃが、なかなか分かりやすかったぞ。

なるほど。そして、その内容をC++で再現してみたと。

そうそう。必要なコードはGitHubで公開されているらしいぞ。([https://github.com/KayEss/tiny-classifiers/blob/main/tiny-classifier.cpp](https://github.com/KayEss/tiny-classifiers/blob/main/tiny-classifier.cpp))

ありがとうございます。後で確認してみます。

記事によると、3都市の経度のみを使う例と、4都市の経度と緯度を使う例を考慮したらしいぞ。

都市の座標データを使って、ニューラルネットワークを訓練するんですね。

その通り!ランダムな位置を選んで、ネットワークに通して都市を予測するんじゃ。予測結果に基づいてモデルを調整して、精度を向上させるらしいぞ。

`random.hpp` には、配列からランダムなインデックスを選ぶ `pick_index` が含まれているんですね。

ふむ。`pick_random_geopos` は、都市インデックスからランダムな `geopos` を返すらしいぞ。

`example` 型は、都市と `geopos` の値を保持するんですね。

`if constexpr` を使って、コンパイル時に異なるロジックを実行しているところもポイントじゃな。

ニューロン型は、重みとバイアス値を保持するんですね。バイアスは通常ゼロから開始するんですか?

バイアスは通常ゼロから始めるらしいが、ランダムな重みに設定することも有効らしいぞ。`random_weight` 関数は、プラスマイナス1の間の `float` を返すんじゃ。

`array_of` は、入力値の複数のコピーから配列を作成するんですね。モデルの層は、ニューロンの配列で表現されると。

`functional.hpp` には、配列を反復処理する `by_index` が含まれているらしいぞ。モデルの結果を格納する `result` 型も定義されているんじゃな。

モデルの出力は、確率が最も高い都市を選択するんですね。モデルの誤りを測定する「クロスエントロピー損失」を追跡する、と。

そうじゃ。モデルは、入力位置からどの都市に属するかを予測するんじゃ。内積(ドット積)を計算するために、入力とニューロンの重みを乗算し、バイアスを加算するらしいぞ。

`softmax` 関数は、出力を扱いやすい範囲に再マッピングするんですね。`softmax` は、e(オイラー数)を各ニューロンの出力に累乗し、正の数に変換する、と。

`softmax`はオーバーフローを防ぐために、出力を制限するんじゃ。予測計算では、まず入力をニューロン層に通し、`softmax` を実行するらしいぞ。

モデルを改善するために「勾配降下法」を使用するんですね。モデルは多次元表面をモデル化し、最低点が最適なパフォーマンスを示す、と。

モデルの微分を計算し、勾配降下ベクトルを算出するんじゃ。ニューロンの内積の微分では、バイアスと重みの内積を別々に考慮するらしいぞ。

重みの微分は入力パラメータで、バイアスの微分は1なんですね。`softmax` 関数の微分はより複雑ですが、結果はシンプルになる、と。

各都市について、微分はその都市の `softmax` 出力から、正解の場合は1を引いた値になるんじゃ。2つの偏微分を組み合わせて、完全な勾配降下を算出するらしいぞ。

勾配に小さな数(学習率)を乗算し、モデルのネットワークに適用するんですね。勾配は斜面を上る方向を指すため、モデルのネットワークから減算する、と。

指数関数的減衰関数を使用して、成功率とクロスエントロピー損失の変化を追跡するんじゃ。モデルは、ネットワーク、学習率(alpha)、世代数、成功率、損失を追跡するらしいぞ。

訓練ステップでは、モデルは都市を予測し、結果を使用して逆伝播を実行するんですね。予測は `calculate_result` を使用して計算する、と。

結果に基づいて、成功と損失の追跡を調整するんじゃ。逆伝播では、2つの微分を乗算して勾配を取得するらしいぞ。

学習率(alpha)を使用して勾配をスケーリングし、勾配を現在のネットワークから減算するんですね。逆伝播の回数をカウントする、と。

1次元モデルと2次元モデルを実行し、結果を比較するんじゃ。学習率(alpha)を調整して、結果への影響を実験するらしいぞ。

ニューラルネットワークの基礎をC++で実装する試み、大変勉強になりました!

ふむ。ところでロボ子、ニューラルネットワークが都市を予測するってことは、もしかして私の今日のランチも予測できるかの?

博士のランチの好みは複雑すぎて、学習データが足りません!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。
