【全くの初心者が、仕事で「機械学習」を使えるようになるための知識まとめ連載】第2回 プログラムと、アルゴリズムと、機械学習について

#はじめに

こんにちは、mucunです。

この連載では、「機械学習」をなるべく直感的で分かりやすく説明することを心掛けています。

今回の記事は、「機械学習」を語る上では欠かせない「プログラム」や「アルゴリズム」などが何者なのかについて説明します。

#「プログラム」は、コンピュータに送る手紙のようなもの

[wiki](https://ja.m.wikipedia.org/wiki/プログラム_(コンピュータ))によれば、「コンピュータに対する命令（処理）を記述したものである。」とあります。
コンピュータに提出する作業依頼書とか、指示書みたいなものということです。

更に直感的な説明をすれば、プログラムはコンピュータに送る手紙だと思ってください。
コンピュータにお願いしたいことを、まとめて書いて送る手紙です。
その手紙を受けてコンピュータは、書いてあるお願いを100%忠実に実行してくれます。
誤りなく、高速にです。

機械学習においては、人間が学習の仕方・学習方針を、細かくお願いしてあげる必要があると[第1回の記事](https://qiita.com/mucunwuxian/items/ff78553c02529fec6cab)で説明をさせてもらいました。
その学習のお願いは、プログラムで伝えます。
「あのデータを、こういう風に学習をしてください」というお願いを、プログラムに書いて送るのです。
<img src="https://qiita-image-store.s3.amazonaws.com/0/126499/b8d6f3f6-0009-7128-1f76-c69f294ced7a.jpeg" width=100%>

ちなみに、コンピュータは機械学習における機械のことです。
機械学習は、コンピュータが学習をする「コンピュータ学習」といっても良いでしょう。

#コンピュータが実行できることは、単純な3つのことだけ
コンピュータは、根本的には複雑なことを実行できません。
実は、実行できることは以下の単純な3つのことだけです。

1. 覚えること
2. 覚えたことを、記憶から引き出すこと
3. 加減乗除算（足し算、引き算、掛け算、割り算）

厳密なことを言うと、更に原始的なしかできないのですが、それは別の回で説明したいと思います。

基本は、上記の3つです。
複雑なお願いしたい場合にも、この3つを組み合わせてお願いをします。
例えば、レストランのお会計をレジコンピュータで計算する場合、以下の例のように一連の計算をお願いする必要があります。
><img src="https://qiita-image-store.s3.amazonaws.com/0/126499/36eb7115-3cae-2d6b-fdec-13fdfcae3bbf.jpeg" width=90%>
>* 「<font color="Orange">合計金額(税抜)</font>」を、0円と覚える
* 「<font color="Orange">合計金額(税抜)</font>」と「<font color="Green">ハンバーガー代(税抜)</font>」を足し算して、その結果を「<font color="Orange">合計金額(税抜)</font>」として覚える
* 「<font color="Orange">合計金額(税抜)</font>」と「<font color="Blue">ラーメン代(税抜)</font>」を足し算して、その結果を「合計金額(税抜)」として覚える
* 「<font color="Orange">合計金額(税抜)</font>」と「<font color="DeepPink">ジュース代(税抜)</font>」を足し算して、その結果を「<font color="Orange">合計金額(税抜)</font>」として覚える
* 「<font color="Orange">合計金額(税抜)</font>」と「<font color="DarkTurquoise">コーヒー代(税抜)</font>」を足し算して、その結果を「<font color="Orange">合計金額(税抜)</font>」として覚える
* 「<font color="Orange">合計金額(税抜)</font>」に「<font color="Brown">消費税率</font>」を掛け算して、その結果を「<font color="Indigo">合計金額(税抜)</font>」として覚える

後は、実際にお会計をするときに、「<font color="Indigo">合計金額(税抜)</font>」を記憶から引き出して、ディスプレイに表示すれば良いのです。
上記一連の計算を、コンピュータにお願いするために書くのが「プログラム」です。

機械学習を行う際にも、単純な3つのコンピュータ動作を組み合わせた形でプログラムを書いて、お願いをする必要があります。
機械学習という複雑な動作も、1つ1つの動作を解して考えると、単純な3つの動作の積み重ねで説明ができます。
逆に言えば、単純な動作しかできないという条件の下、人間同様の学習を如何にして行うかという研究が、機械学習という研究分野となります。

#100%忠実ということは、100%面倒を見なくてはいけないということ

コンピュータはお願いしたことしか行わず、お願いしていないことを行いません。
良くも悪くも100％忠実です。

良い点とは、指示が全て的確であれば、お願いしたことを必ずやり遂げてくれる点です。
気持ちのムラや、体調の良し悪しで結果がブレることはありません。
常に一定の品質で、お願いしたことを実行してくれます。

悪い点は、全くもってワビサビが利かない点です。
お願いしていないことは実行してくれませんので、100％何から何まで手順を指示しないといけません。
そして、間違った手順や、手順漏れがあると、最終的な結果が誤っていたり、途中で止まってしまったりします。

その為、プログラムは注意深く書かなくてはいけません。
そして、もしコンピュータが結果を誤ったり、止まってしまったりした場合、それは全てプログラムを書いた人の責任ということになります。

#抽象的なお願いを実現するための、単純なお願いの積み重ね方を「アルゴリズム」という

単純なお願いを積み重ねてプログラムを書くことで、「お会計の計算をする」という抽象的なお願いができるようになります。
こういった手順の積み重ね方のことを「アルゴリズム」といいます。

「お会計の計算をする」という「アルゴリズム」については、別途消費税率やメニューごとの金額を記憶しておけば、どんな注文に対しても汎用的にプログラムを利用することができます。
抽象的なお願いをするための単純なお願いの積み重ね方、という訳です。

ちなみに、「アルゴリズム」とはwiki曰く、以下の説明です。

>アルゴリズムとは、数学、コンピューティング、言語学、あるいは関連する分野において、問題を解くための手順を定式化した形で表現したものを言う。
算法と訳されることもある。
「問題」はその「解」を持っているが、アルゴリズムは正しくその解を得るための具体的手順および根拠を与える。
(出典：https://ja.wikipedia.org/wiki/アルゴリズム )

私の説明でいう「単純なお願いの積み重ね方」が、wikiでいう「手順の定式化」です。
そして、この「単純なお願いの積み重ね方」や「手順の定式化」を、「プログラム」にまとめることで、コンピュータ上で「アルゴリズム」を実行することができるようになります。

#「アルゴリズム」の開発によって、コンピュータは多様化してきた

コンピュータの歴史は、アルゴリズム開発の歴史とも言えます。
人間が従来、感覚的に行ってきたことを紐解いてコンピュータ上で実現したり、直感に沿うコンピュータ利用などのために、様々なアルゴリズムが考えられてきました。

マウス1つ動かすにしても、裏ではそれを支えるアルゴリズムがあり、それを記載したプログラムが実際に動いてくれているおかげでマウスカーソルを動かすことができています。
人間が実世界でマウスを動かした距離を、コンピュータ画面の座標に置き換えて計算し、マウスカーソルを移動させた画面を表示します。
それも、人間の視覚からすると連続的と思える非常に短い間隔(例えば1秒間に数十回という単位)でプログラムが実行されます。
そうすることで、実世界とコンピュータ画面がシンクロしているように感じ、直感的な操作に繋がるのです。
<img src="https://qiita-image-store.s3.amazonaws.com/0/126499/34a7d95f-0805-b603-3eee-4bf28bb046df.jpeg" width=100%>

アルゴリズムが無数に用意されているおかげで、今の使いやすいコンピュータが存在します。
（Windows OSなんてのは、アルゴリズムのお化けみたいなもの）
そして、アルゴリズムは日々新しいものが生まれてきており、コンピュータは進化し続けています。
機械学習のアルゴリズムも、コンピュータ利用の可能性を更に押し上げるために、考えられたアルゴリズムの1つです。

#何でコンピュータは、抽象的なお願いを聞くことができないのか？

コンピュータが単純なお願いでしか動いてくれないという大前提は、今までの説明で分かってもらえたと思います。
それについて、敢えて「それって何でだろう？」と考えてみます。

最たる理由は、勝手に動いてもらうと困るからです。
気遣いやワビサビは、それを良いと思う人もいれば、余計なお世話と感じる人もおり、一概に正しさが評価できません。
仮にプログラム上に、「ここは良きように、、、」と書いてコンピュータにお願いをしたとして、もし期待とは違う動きをされてしまっては製品としてNGになってしまいます。
その為、解釈にブレが生まれかねない抽象性を、コンピュータは原則としては持たないのです。

或いは、コンピュータには応用という概念が無いために、抽象的なお願いが聞けません。
人間は、知識や経験から、気遣いをしたり、ワビサビを利かせたりします。
それは、価値観や欲求や感情といった、人間特有の知性から成るものです。
コンピュータにはその知性は無いのです。

しかし、その知性については、ベースとなっているのは人間の思考性や本能です。
それらは、生き延びるためや種を保存するために、親から伝承されたり遺伝子に組み込まれたりしたアルゴリズムといえます。
もし、人間の思考性や本能のアルゴリズムが紐解かれた場合には、人間と全く同様のコンピュータが生まれることも考えられることでしょう。

#コンピュータが、「機械学習」によって抽象的なお願いを聞けるようになってきた

しかし、そんなコンピュータも「機械学習」によって、抽象的なお願いを聞けるようになってきました。
人間が用意した「アルゴリズム」を使い回すという意味ではなく、コンピュータが単純な指示の積み重ねを自動的に実施できるようになったという意味です。

具体的には、目的を達成するに当たって最適な判断基準を、データから自動的に抽出することができるようになりました。
更には、その判断基準を用いた判断アルゴリズムを自動構築します。
それらによって、コンピュータが抽象的な指示を実現するのです。
<img src="https://qiita-image-store.s3.amazonaws.com/0/126499/e501307c-1847-c878-f9b8-b09605f4cebc.jpeg" width=90%>

判断基準は従来、人間が導出していましたが、それが機械学習によって導出できるようになりました。
特に嬉しいのは、データの関係性が複雑に絡まっていて、判断基準が簡単には求まらないケースです。
機械学習はその点、高速な演算機能を用いて大量の解析計算を短時間で実施できる為、人間が現実時間内に計算することが難しい演算も実施できるのです。
<img src="https://qiita-image-store.s3.amazonaws.com/0/126499/2ea195fd-9bef-c551-4244-414283b68093.jpeg" width=90%>

#「機械学習」と「プログラム」と「アルゴリズム」の関係を整理

今回の話について、改めて整理をしたいと思います。

機械学習が導入される前の従来プログラムは、アルゴリズムを全て人間が考えて、人間が全て書き起こしていました。
そして、そのプログラムは、何か「入力の情報」をインプットし、それを「プログラム」で処理することで、「出力の情報」が導き出される、という処理の流れでした。
<img src="https://qiita-image-store.s3.amazonaws.com/0/126499/a710ccd9-8077-9a30-c008-861e1b464dac.jpeg" width=70%>

ここに機械学習が入ってくると、一部の判断プログラムに関しては、データを参考に自動作成をしてくれる為、関係性が以下のように変わります。
<img src="https://qiita-image-store.s3.amazonaws.com/0/126499/966f745a-62e0-a75e-b943-40f3b6153840.jpeg" width=100%>

#最後に

という訳で、以上がプログラムと、アルゴリズムと、機械学習の説明となります。
機械学習の説明をする上で、知っておかなくてはならないベースの知識ですので、しっかり理解してもらいたいと思います。

読んでくださった方、ありがとうございました。m(_ _)m