Open7

Scratchでライブラリ等全く使わずにニューラルネットワークを開発する記録

手羽先手羽先

スクラップの正しい使い方などが分かりませんが、記録程度にまとめていきます。
詳しいことはこちらに書いています。⬇️
https://www.chickensblog.com/scratch-neural-network-no-library/

Qiitaにも簡単にまとめてみました⬇️
https://qiita.com/Teba_eleven/items/7cf4a8417eead64addd0

拡張機能、ライブラリ等を一切使わずにニューラルネットワークを作り上げる。

ScratchにはそもそもライブラリなどがないのでNumPyなどの計算ライブラリなど全く使わずにニューラルネットワークを作ります。

ScratchのAI拡張機能も使っていません。(PENのみ使用)

PENはScratch2.0までは標準搭載だったのに3.0になってから拡張機能になりました。完全に拡張機能使っていないとは言い切れないので残念。

AIなどの拡張機能は全く使っていないため、今後拡張機能は使っていないと表現します。

実際の作品⬇️
https://scratch.mit.edu/projects/564599222

手羽先手羽先

必要なもの
・行列演算(NumPy再現)
・ソフトマックス関数
・シグモイド関数
・MNISTデータをScratchのリストに読み込ませる(重み、バイアス、テストデータ)

手羽先手羽先

現段階でのニューラルネットワークの性能
・入力層が784個
・1つ目の隠れ層が50個
・2つ目の層が100個
・出力層が10個
まだ推論のみ。学習はできないので微分とかを使って実装したい。現段階での自分のレベルで実現可能な方法は、重み、バイアスの値を遺伝的アルゴリズムで求める方法。

手羽先手羽先

遺伝的アルゴリズムだと比較的簡単に実装できる。微分をScratchでどうやってやるかが課題。

手羽先手羽先

遺伝的アルゴリズムでどうやって実装するか。
・重み、バイアスの値をランダム生成
・一番成績の良かった個体を交叉させるなどしていいパラメーターを探すのみ

手羽先手羽先

今後の課題
・Scratchで微分などをどう実装するか
・そもそも微分などの数学を勉強しなくてはいけない。
・純正のScratchだと処理速度が遅い→TWでJSにコンパイルしてもいいが、それでも重くなりそう
・重み、バイアスデータをどうやって保存するか→Scratchはリストの数が200,000個の制限がある
→リスト1項目に対しては制限がないのでどうにかして詰め込む?

手羽先手羽先

現段階での課題
・テストデータが100個しかない(リストサイズ制限)
・推論しかできない(学習できない)
・コードが汚い
・文字が書きにくい(広範囲でドットいじれない)