中学の頃の遺物投下
こんばんは, pyt-314です. 例の小説はまだ書き終わっていませんがいろいろ考えているんで今日はゆるーく考えていきます. あと多分偶々ですが, この前書いた知能の自己拡散性とかとニーチェのお話が見事につながった, というより根本的には同じことを言っていたのでちょっとニチャァ. あ、そうだ, じゃあ今日は中学の頃考えていた畳み込みの代替案について書きますわ.
畳み込み演算の代替案, ということですがこの界隈にいた人も少数でしょうしまず解説していきます.
パーセプトロンの仕組みについてから始めましょう.
パーセプトロンの説明方法は, とりあえず2種類分考えていますが, 一般的なものから.
まずパーセプトロンは, 入力を受け取って, その入力を見て, 自分がどんな値を出すかを判断する, 関数です. (どちらを修飾しても合ってはいるので問題ありませんね.)
より具体的には, 入力のベクトル(という名の数値の並び: x∈ℝ)から, どこの情報が重要かを示す重み(w∈ℝ), そしてそれに加えてパーセプトロン1ニューロンあたりの偏りとしてバイアス(b∈ℝ)を加算します. そして, 最後にこの値を活性化関数と呼ばれるなんかいい感じの関数でグニョンと捻じ曲げてあげます. 活性化関数をψ:ℝ→ℝと置けば, パーセプトロンは数式で次のように書けます. ただし, ベクトルという仮定を使って, 入力と重みをかけて足す動作をベクトルの内積に書き換えて簡略化していることにご注意ください.
PP(x) := ψ(x・w+b)
さて, これでなんとなく重要そうだなってところを強調して判断するとわかっていただけたらと思うのですが, 如何せん文章が下手だしあまり丁寧に書いていないのでちょっと厳しいかもですね. まあ, 許せ!
話を戻します, 先のPP(x)では, ベクトルの内積が出てきたことを思い出してください. そして, このベクトルの内積って, 何か別の表現方法があったことを思い出してみて下さい. そう, ベクトルのノルム(長さ: |・|と表記)と成す角(θ)で表現するアレです. 式だとこうなりますね.
x・w = |x| |w| cosθ
んで, こいつの特にwの方に焦点を当てれば, そのwにxを射影してあげたときの長さってことが伝わると思います. つまり, 重みが記憶の役割をして, その記憶とどれくらい似ているかを判断している, とも解釈できます.
余談ですが中学の時にこの解釈を思いついて, 記憶との類似度だったら二乗和誤差でも学習できるはず!と思いmnistを回して若干普通の全結合層よりも精度が落ちますが結構ちゃんと学習できました. Python+脳筋実装で遅かったですけど.(1~2文くらいわかる人向けのことを書きました.)
んで, ニューラルネットワークでの畳み込みとかについてざーっくり説明します. (だんだん文の知能が下がってきているの自分で草生やしています)
まず前提として, 画像の数値上での表現を説明すると, 先のパーセプトロンとかではただの列だった数値を, 画像の縦, 横, そして色のRGBとして3層分重ねた形式で扱います. そして, 画像全部を丸暗記するよりも, 一部分の形や色を覚えて組み合わせた方が効率がいいよね, っていうアイデアのもとに, 例えば3×3のサイズに区切って, それをスライドさせていって初めてここでの畳み込みに成ります. いつもの畳み込みではありませんのでお気を付けください. 詳しくは調べてみてください(諦め).
さて, やっと本題です. さっきの畳み込み, 一つの特徴を覚えるのにサイズの分だけパラメーターが必要になりますよね. でも, 縦と横を分ければ, 縦を好きに見れる分準備しておいて, その組み合わせを横で指定すれば, 横が一列増えるたびに一種類多く見れるようになるよね~っていうお話です. そうすればデカめのモデルを作るときにそこそこパラメータ数を減らせます. まあ表現性も落ちるには落ちるんですけど, 畳み込みを回避しても問題なくなるようにすることもできるのです. 単純に書けばそれだけです. というかそれくらいしか利点がありません. しかも, 実験的な検証しかしていないんで, お蔵入りです. 興味ある人いたらやって見てください. 乱立する方法と同じですよ同じ.
とまあグダグダ書いてきましたが, 今日の内容は尽きたので終わります. 今晩もお疲れ様でした.