AI Discovery Parktouch, play, and understand AI

AIの中身を、
手を動かして理解する
自分だけのノート。

ニューラルネットワークの構造、手書き数字の認識、畳み込みによる特徴抽出、ソートアルゴリズム。読むだけでは掴みにくい概念を、触って・描いて・動かして確かめるためのリファレンスです。

↓ scroll — 各ノートは実際に操作できます

exhibit.0 — 信号のながれ
EXHIBIT 01 / STRUCTURE

ニューラルネットワークは層の重なりでできている

入力層に入った数値が、重み付きの接続を通って隠れ層を伝わり、出力層で「答え」になります。層やニューロンの数を変えて、ネットワークの形がどう変わるか試してみてください。ニューロンにマウスを乗せると、その接続だけが浮かび上がります。

「信号を流す」で順伝播(forward pass)の様子を再生します
入力層(特徴量が入る) 隠れ層(変換を重ねる) 出力層(各クラスのスコア)

本実装メモ: 実サイトでは重みの値を可視化したり、TensorFlow.js で本物の学習過程(損失が下がる様子)をその場で再生できます。

EXHIBIT 02 / MNIST

AIは手書き数字を28×28個の数値として見ている

左の枠に数字(0〜9)をマウスや指で描いてみてください。人間には「7」に見える線も、AIにとっては 28×28 = 784個の明るさの数値でしかありません。描いた数字はMNISTと同じ流儀で正規化(最長辺を20pxに縮小し、重心を中央へ移動)してからCNNに入力され、右のスコアは学習済みモデルの本物の推論結果です。

① あなたが描いた数字

② AIが見ている 28×28(正規化後)

③ 出力層のスコア(学習済みCNNの本物の推論)

重み埋め込み型の小型CNN(3×3畳み込み×2+全結合、5,258パラメータ)による推論です。TensorFlow.jsが読み込めた環境ではTF.jsで、読み込めない環境では同じ重みを純JSで計算します。学習データはこのモック用に合成した手描き風数字4.4万枚(検証精度99.9%)。本番ではMNIST学習済み重みにそのまま差し替え可能です。

EXHIBIT 03 / CONVOLUTION

特徴量は小さなフィルタで取り出される

CNN(畳み込みニューラルネットワーク)は、3×3などの小さな数値の窓「カーネル」を画像の上で滑らせ、縦線・横線・輪郭といった特徴を取り出します。カーネルを切り替えて、同じ画像から違う特徴が浮かび上がる様子を確かめてください。

入力画像

カーネル(3×3)

特徴マップ(出力)

本実装メモ: カーネルの9つの数値をユーザーが直接編集できるようにすると「自分でフィルタを設計する」体験まで作れます。

EXHIBIT 04 / ALGORITHM

アルゴリズムの性格の違いは動きに表れる

同じ「並べ替え」でも、アルゴリズムによって手順はまったく違います。青は比較、オレンジは交換。比較回数を見比べると、計算量 O(n²) と O(n log n) の差が体感できます。

比較: 0 交換: 0