元プログラマーが機械学習を勉強してみた件 2020年6月15日00:30:00














LIST

nekositen news

元プログラマーが機械学習を勉強してみた件 2020年6月15日00:30:00

機械学習を学んだ本

元プログラマーがチープな数学の知識で、機械学習の本を読んで勉強してみました。


 元プログラマーがチープな数学の知識で機械学習を理解できるのか?
 元プログラマーがチープな数学の知識で機械学習を理解できるのか?
個人レベルで使いこなせそうか?という疑問を解決するために本を読んでみました。
以前から気になっていた機械学習。スマホのアプリでの文字認識や、顔認識等は機械学習があってできるようになったもの。
世の中で「AIやぞ~」と言っているものはほとんど機械学習があって完成しているものと考えています。

 さて、今回私が読んだのは「RasberryPiではじめる機械学習」と「ニューラルネットワーク自作入門」です。
「RasberryPiではじめる機械学習」は最初からプログラム作成を通じて機械学習を勉強していく形のものです。
ラズベリーパイという小型のコンピュータで動作させることを前提としています。
「ニューラルネットワーク自作入門」は機械学習のしくみを最初に勉強してからプログラム作成をするというものです。
どちらもプログラム言語はPythonです。
実は「ニューラルネットワーク自作入門」のほうは本文中に数式が出てくるので、途中で分からなくなってしまい挫折してしまいました。
「RasberryPiではじめる機械学習」を読んでから「ニューラルネットワーク自作入門」を読むと少し理解は深まりました。
やはり何らかのプログラム言語を理解している人はプログラムの解説を見ながら読み進めていくほうが理解が早いようです。

 コンピューターは数字を扱うことができ、人間よりも早く計算することができます。
人間はコンピューターが不得意な曖昧な事象を扱うことができます。
例えば集合写真の中から友達を探し出したりするといったこと。
でも、コンピューターの得意な計算を数多く行うことで、曖昧な事象を取り扱うことが少しずつできるようになっています。
スマホのアプリでも、カメラに映った人の顔を認識し、人の目を判別して大きくもできます。
これまでコンピューターが苦手としてきたことができるようになっており、びっくりですね。

 その方法は人間の頭の中の仕組み、ニューロンによる情報の伝達を真似ることで行っているとのこと。
ご存知の通り、人間の頭の中にはニューロンが多数あり、網の目のようなネットワークを構築しています。
そして、ニューロンから複数のニューロンに電気信号を伝播していくことで、見たものが何かを理解したり、考えることができます。
そこでコンピューターの中でも仮想的にニューロンからなる階層をいくつか配置して、入力した値が各層のニューロンを次々と伝播することで答えに辿り着くようにしました。
入力があるとそれがニューロンを次々と伝播していくのですが、その中で情報は簡略化されたり、重みづけが変化し、最終的に答えが出力されるようになっています。
しかし、階層やニューロンを適当に組んで重みづけも適当にしただけでは、私たちの意図した正しい答えが出るようにはなっていません。

 どのようにしたら私たちの意図した正しい答えが出せるのでしょうか?コンピューターに学習させることが必要です。
学習用のデータを作成します。
例えば手書きの数字認識の場合、0~9までの手書き数字を映した写真のデータと、その答えをセットにして入力します。
最初は何も調整されていないので当然のように間違えます。しかし、間違えた後が機械学習の真骨頂。
正解との誤差を取得し、階層から階層へニューロンに情報が伝播される際の重みづけを少しずつ変化させるのです。
これを何千回何万回と繰り返すことにより、徐々に正答率が上がっていくということらしい!!
正答率が十分上がったところで、その時のコンピューターのニューロンにおける重みづけの状態を保存して再利用できるようにします。
そしてそれを利用して実際のケース(自分や他人の手書き数字等)を認識させて十分に通用するかテストします。

 学習データを基にコンピューターが「うおおおお~」って処理して、答えが間違っていたら重みを変更し、
「もう一回じゃあうおおおお~」って感じで何千回何万回と繰り返します。
そのうちに間違いが少なくなった所で止めて、実際の場面で通用するか試すということです。
コンピューターに教えていくような鍛えていくような作業を繰り返して完成に近づけさせます。
すごく簡単に言うと、以上のような話になります。

 それにしても、プログラム開発とは完成までの過程がだいぶ違いますね。
通常のプログラムはデータの入力と出力を定義して、入力から出力を作成するための手順を全て把握して作成します。
入力とそこから得たい出力は、仕様を作った時点で決まっているので、あとは入力のデータに対して四則演算したり分離したり合体したりして加工し、目標の出力を作り上げるためのプログラムを書きます。
すべては意図したとおりです。
最後にテストデータを用意して、プログラムに誤りが無いかどうか確認します。

 機械学習はやりたいことから階層の数、各階層のニューロンの数等の言うならば脳の仕様を決めて、学習用のデータを作成して学習させます。
入力とそこから得たい出力は決めるのですが、次に脳(ニューロンの数等)の性能を決定し、学習用データがどれだけ必要か決定し、それを用意して学習させた後、実際のケースに当てはめる。
思ったように正解が出ない場合は、脳の性能を見直したり、学習用データを作り直したりしてやり直します。
基本的には階層の数や階層のニューロンの数を増やせばより複雑な事象に対処できるようです。しかしながら、これらを増やしていくとそれを実行するコンピューターに負担がかかり、学習が遅くなりすぎて終わらなくなったりするようなので、注意が必要だそうです。
そのように調整し、実際のケースで十分な正解率が出れば、そこで完成というとこでしょうか。

 私が一番知りたかったことは、機械学習が数学あまり得意でない人でも個人レベルで扱えて、何か便利なことに利用できるかどうかという点でした。
努力して勉強して使えるようになっても処理能力の早い高級なパソコンを必要としたり、調整等で複雑な数式を入力する必要があったりしたら、私ではとても手に負えない!!
きっちり最適化したり、正解率を100%近くまで上げるには数学の知識を使用してそれぞれの層やニューロンの最適化を細かく行わなければなりませんが、ある程度の出来でよいのならば、私のような数学に疎い個人でもいろいろできそうです。
例えば、部屋の中で動き回る猫を判別して自動的にカメラの台座を動かして追随させたりとかできそうじゃないでしょうか?
このような機械学習で、カメラ等の画像認識を使用していろいろなことをしたい場合、「Interface紙2020年7月号」のAI時代の画像処理教科書という特集が詳しく説明されていて、面白いと感じました。
画像認識する場合に注意する必要のあるカメラのセンサの構造から実際に顔認識したり、人の目を大きくしたりするところまで記事になっているようです。
いろいろ応用ができそうな記事です。まだ途中までしか読んでいませんが、内容が充実しており次のステップに移るには最適の記事だと思いました。

© 2020 nekositen news All right reserved.