クーの自由研究

マスターのかえるのクーは、弟子達の召喚術により新たな依り代を得てⅡ世として復活しました。

おたまじゃくしさんの自己符号化器

おわび

こんにちは、こんばんわ。「かえるのクー」といいます。このコーナーを担当(たんとう)していたのは「メモル」ですが、お盆(ぼん)よりあとはいそがしくなってしまいました。「音であそぼう」シリーズはすこし休憩(きゅうけい)となります。ごめんなさい。

おたまじゃくしさん(もしくは全国の小中学生のみなさん)むけにたのしく遊べる(そしてすこしは学べる)ことを考えていましたが、このままではおたまじゃくしさんがすぐにかえるになってしまいますし、小中学生のみなさんは夏休みが終わってしまいます。

f:id:np2LKoo:20170825231255j:plain

わってしまう!

涙。

f:id:np2LKoo:20170825231659p:plain

ボク「かえるのクー」が実験(じっけん)に行(い)き詰(づま)って他(ほか)のブログも停滞(ていたい:すすまないこと)しています。

そこで。

みなさんと一緒に「自己符号化器」(じこふごうかき)を勉強(べんきょう)しようと思います。ボクにとっても勉強です。人に教えるのが一番の勉強だ、という先生もいます。(「おーとまとん」はメモルに時間ができたら教えてもらいましょう)

この「自己符号化器」はしくみはとっても簡単(かんたん)なのですが、理解(りかい)するには高校で習う「ベクトル」というのと「行列」(ぎょうれつ)というのと、「微分」(びぶん)という数学(すうがく)が分かっている必要があります。

でも、書き方や表し方が独特(どくとく)なだけで、結構(けっこう)簡単(かんたん)なんだよ。今は分からなくても気にしないでね。だってまだ知らないんだもん。

f:id:np2LKoo:20170826200555j:plain

中学で習う合力(ごうりき:力をあわせるとどうなるか)は

ベクトルそのものなんだ。

もっとたくさんの数字(次元)を一度に扱うときは「ベクトル」といわず、「テンソル」ということもあるよ。

f:id:np2LKoo:20170826200639p:plain

行列は計算を一度にまとめてやるのに便利だよ。

計算は基本的に掛(か)け算と足し算なんだ。ベクトル(テンソル)計算するときに使うよ。

ゲームの中でも3次元のアイテムを回転させるときの計算などに使われているよ。

 

f:id:np2LKoo:20170826201821p:plain

微分は「ちょっとだけ」動こうとしたときにどっちの方向にいくのか知る方法だよ。

傾きを知るともいえるね。傾きは専門的には勾配(こうばい)ともいうよ。

 でも算数・数学を知らなくても「どんなふうに働(はたら)くのか」はイメージして知ることができます。(学校の算数・数学は分かるととっても楽しいので、がんばろう)

ボクも自己符号化器を勉強しなおしますので、いっしょにがんばってみませんか?

これをわかると、機械学習(きかいがくしゅう)とか人工知能(じんこうちのう)の入り口がすこしわかるかもしれませんよ。

ボクは説明が下手なので、実験のブログでも技術解説(ぎじゅつかいせつ)することはないのですが(他のわかりやすいブログは紹介します)、おたまじゃくしさん向けにかかれているブログはすくないので、がんばって説明してみます。

 

目標

・自己符号化器ってだいたいどんなものか、お友達に説明できるようになる。

・基本となる数学(算数)がすこしわかる。

・自己符号化器がどのように学習するのかなんとなくわかる。

がんばりましょう

(追記)さらなるお詫び

スター評価(ひょうか)いただいた方 申訳ございません。

小学生の方にレビュー(だめだしのこと)をいただき、すこし直しました。

 評価いただいた後に変更(へんこう)するのは、心苦(こころぐる)しいのですが、ご理解ください。

後悔公開(こうかい)しながら修正していくやり方は蛇道邪道(じゃどう:よくないやりかた)ですが、お許(ゆる)しください。。。

 

自己符号化器(じこふごうかき)ってなに?

自己符号化器とは、自分で自動的(じどうてき)に、元の情報(じょうほう:絵とか音とか文書とか)を元と違った形にして、それをまたもとに戻すしくみ(道具)のことです。

f:id:np2LKoo:20170826220724p:plain

符号(ふごう)というのはすこしむずかしいけど、「(元と違った形で)簡単(かんたん)にそれ自体や意味(いみ)などをあらわす」記号(きごう)や文字や数字」です。モノの「名前」も符号の一種(いっしゅ)です。

これをみてください。

 たとえば、こんな数字をおぼえていきます

f:id:np2LKoo:20170825234549p:plain

が、はじめはなかなかおぼえられません。

f:id:np2LKoo:20170825234601p:plain

なんども練習して学習するうちにだんだんとはっきりしてきます。

f:id:np2LKoo:20170825234623p:plain

ちゃんと再現(さいげん:もとにもどすこと)できるようになっていく感じです。

f:id:np2LKoo:20170825234711p:plain

でも、元の数字と「全く同じわけではありません」。

このような手書きの数字(図形:ずけい)をどんどん学習し、元の数字をだんだんうまく再現できるようになっていきます。(図形だけでなく、いろいろな情報を学習できます)はじめは、ぼやけた感じですが、だんだんはっきりしてきますね。

入力した数字そのまま出力しているのではなく、もとの形の特徴(とくちょう)を(そのままではないですが)取り出して、覚え、組み立てなおして(数字を)合成(ごうせい)しているのです。

実はボクたち、わたくしたちの脳(のう)のはたらきもこのようになっている部分(ぶぶん)があるとわかっています。(脳のはたらきをまねていますが、自己符号化器のほうがずっとずっと単純(たんじゅん)です。)

 

さて、どんな手書きの数字(たとえば癖(くせ)のあるまがった数字や、わかりにくい数字や、きれいな数字)を入れても「それなり」の数字を再現するためにはどうすればよいでしょうか。

数字を再現(さいげん)する機械(きかい)を設計(せっけい:デザイン)してみましょう。

作戦案

(1)全部「そのまま」覚(おぼ)える。覚えた形がきたら、それを出力(しゅつりょく)する。

(2)全く覚えない。判断もしない。来た形をなにもせず出力する。

(3)お手本(てほん)を覚えて、それに近ければそれを出力する。

 

(1)は確実(かくじつ)ですが、35億も覚(おぼ)えたら機械(きかい)がパンクしてしまいそうです。全部覚えることができたとしても、使うとき、探(さが)すのがたいへんです。覚える場所(ばしょ)が少ない場合はこの方法は使えません。まだ学習したことのないものへの対応は下手そうです。

f:id:np2LKoo:20170826223320j:plain

でも未知のものではなく、「覚えたそのものをすぐ使ってすぐに忘れる」のであればいい方法です。(このときは忘れるので、覚える場所はたくさんはいりません)

(2)は完璧(かんぺき)です。(あたりまえですが)入れたものを、そっくりそのままを出せます。その数字が何であるかを知ることはありません。学習したい場合はいい方法ではありません。

f:id:np2LKoo:20170826225000j:plain

でも、入ってきたことを別に「伝えるだけ」ならいい方法です。

(3)すこしぐらいへたくそな字でも、似ていれば、お手本が使えそうです。でもお手本をそのまま使うと、入れたものと違ったものが出てきます。「お手本」をどのように準備(じゅんび)するかもかんがえないといけません。お手本をどうするか考えるのはたいへんそうですね。

f:id:np2LKoo:20170826230538j:plain

実は、自己符号化器は実は(3)に近い動きをします。

(4)自己符号化器は(自分が都合(つごう)がいいように)お手本を(自動的に)作ります。このお手本を「いい感じに」重ね合わせて、もとに近い形(や情報)を出力します。でもお手本を「いい感じに」つくるにはとても、たくさんの情報を入力する必要があります。

f:id:np2LKoo:20170826233136j:plain

たくさんの情報をすこしつづ「学習」して「だんだん」元の形(や情報)を再現できるようになっていきます。

でもこのお手本は人(またはおたまじゃくしさん)が見てもよくわからないことがあります。「こんなへんな形がお手本なの?」と思うものもあります。あるときは、たとえば左下の部分にだけ注目したようなお手本もあります。数字がかさなったようなお手本や模様(もよう)のようなお手本ができることもあります。どのようなお手本ができるかは「やってみないとわからない」です。

 

いきなり難(むずか)しいかもしれませんが、だいたい下のような感じで学習していきます。

下は今はわからなくてもいいです。なんとなく、のイメージを持ってください。

はじめに

・学習するデータはたくさん必要です。

・0から9までの数字であっても何万字も準備します。(MNISTという学習練習(れんしゅう)・研究(けんきゅう)用のデータがよくつかわれます。

・数字をかいてある範囲(はんい)、おおきさは全部同じです。

・お手本の個数を決めます。ここでは100個とします。(専門的(せんもんてき)にはノード数といいます。「お手本」と言っていますが、「たとえの説明」です。

少しわかってきらた他の言い方で説明します)

学習のしかた

・お手本は初め「仮」に準備します。はじめはバラバラなデータを使いますが、お手本はすべて別々のもの(同じものがない)ようにします。

・以下を繰り返します。(学習がいい感じになったら終了します)

  (1) 数字を10個とか100個まとめてとってきます。(これを「バッチ」と呼んでいます)

  (2) 数字とお手本を比べ、どれだけ違っているか、どれだけ同じか調べます。調べるのは例えば重ね合わせて、光に透(す)かしてみてみるなどのイメージです。よく重なっているほど「近い」ことになります。数字部分を透明にしておくと、お手本と図形がすこし違っても、あっている部分だけた光ります。このしくみでどれくらい近いか計算できるんです。

(例えで「お手本」といっていますが、この部分のことを「重み」といいます。実際にはお手本はたくさんの「ドット」からなっており、上のMNISTの例では28×28個=784個の「ドット」からできています)

    (3) 入力とお手本が近いとお手本の部分が「元気」になります。(活性化(かっせいか)ともいいます。)急に元気になったり、ゆるやかに元気になったり調整できます。

(この元気の出方、はいろいろ種類があります。「合格」と「不合格」(または「似てる!」と「似てない!」)とか点数が「70点」「75点」「80点」「85点」...とかいろいろです。)

    (4) 元気になったお手本を重ね合わせると元の数字に近くなるはずです。お手本から出来上がった(重ね合わせてできた)数字と元の数字をくらべます。どれくらい違っているか調べます。(引き算して差を求めます!)

 (5) 差があるのはお手本がちゃんとしていないからです。この差が次の計算で少なくなるよう、どの「向き」に調整すればよいか計算します。

   (6) 点数の付け方が厳しすぎたりやさしすぎたりしていないか調べて「おまけや厳しさ」を調整します。(みんな100点とかみんな0点とかのテストはあまりテストの意味がありません。ちょっとでもあっていたらOkにしようとか、逆にちょっとでも違っていたらダメにしようなどの調整をします。「バイアスを調整する」といいます。)(5)の差が少なるなる調整(バイアス)の「向き」を計算します。 

    (7) (5)と(6)で計算した「向き」の方向に「お手本」(おもみ)と「おまけや厳しさ」(バイアス)を微調整します。

 計算した「向き」(傾き)をもとに引き算します。(誤差が小さくなる向き(方向)に少しだけ引きます。方向の値がマイナスの場合加算されます。(マイナスを引くと足してるのと同じ)

   (8) 元の情報と再現(さいげん)した情報の差の値(呼び方はいろいろあって、ロスとかエラーとかコストとか)を計算します。何回やっても「差の値」がほとんどかわらなくなれば、または決めていた回数が終われば終了します。そうでなければ、繰り返しを続けます。

 

何回もやっていると、だんだん「お手本」(重み)の形がととのってきて「おまけや厳しさ」(バイアス)もちょうどよくなってきます。

そうなると、元の数字をかなりよく再現(さいげん)できるようになります。
特徴(とくちょう)を抽出(ちゅうしゅつ)できた。といえるかもしれません。

じゃぁまたね。
宿題残っている人は「アニメ」や「ゲーム」や「ネット」を少し控(ひか)えてがんばりましょう!

 すこし難しいよね。でも、ボクの説明がへたなのでそう思うだけかも。

1回ではわからないと思うので、このあとも「すこしづつ」見ていきます。

 あまりおもしろくは説明できなきけど、興味があったらまた見に来てね。