# 機械学習を2年間勉強した結果 実は、去年からいたkikannsyaです。 誰おま?という人も多いと思うので、簡単に自己紹介します。 先進理工電生2年で、FPSプレイヤーでBF、シージ、Apexというくそげーをイライラしながらプレイしています。最近はVRゲームにはまっていて、Vtol VRとかIron Revelionもしていて、こういうゲーム作りてぇと思ってます。まじで、MIS.Wでなんも活動してないです。ちょっとはなにかしようかなあと思って今回アドカレ書きます。  で、今回のアドカレで何を書くかと言えば機械学習についてです。 ~~いちおう、プロ研なので~~ 実は去年から、機械学習プログラミングを多少勉強していてその成果?を書こうかなと思いました。本家の方でやれよって感じですが、大したことしてないから恥ずかしいのでこっちでやります。あと、数式は出すつもりもないですし、図も探してくるの面倒なので気になったら、コピペで検索してみてください。多分、出てきます。 ## 機械学習って?  そもそも、機械学習って何してるの?ということ思う人もいるでしょう。 簡単に説明すると、何か問題があたえられたとき、ある方法で計算して計算結果に従って結果を出力する。その出力と実際とを比較して、計算方法を修正する。このような、プログラムを総称して機械学習と言っています。 データをもとに機械に計算をさせて、意味のあるデータを取り出せるようにすると言ってもいいでしょう。  ではどのようにプログラムを組むのか。本当に色々あります。上げればきりがないので代表的なものを上げます。 1. 回帰 2. ベイズモデリング 3. 深層学習(ニューラルネットワーク)  授業でもよく出てくる代表の回帰は基本中の基本です。単回帰とか重回帰とか、ロジスティク回帰とかいろいろあります。。単回帰や重回帰ではデータから数学的操作によって指標に従って回帰式を計算します。よくある指標は残差の最小二乗ですね。回帰式の計算結果と答えの差を残差と言い、説明変数(データ)に対する残差の2乗の合計が最小となるように回帰式を計算します。その回帰式で説明変数(データ)から目的変数(結果、答え)を予測します。  次はベイズモデリングで、純然たる統計的予測ですね。まあ、純然とは言ってもフィッシャー統計学とは真っ向から対立してて、統計学者からしたらベイズ主義か頻度主義かで宗教戦争が起こるらしいので、あまりひとくくりにしない方がいいのですが門外漢なのでまとめて統計的予測といいます。  ベイズ統計学は高校でも習った条件付確率の式(ベイズの定理)を用います。あれを、単独の確率ではなく確率密度関数に置き換えられたものと思ったらいいと思います。確率密度関数というのは、確率変数Xの実現値xが観測される確率を表す関数です。日本人全体の各身長に対する割合を示したものが確率密度関数で、身長170が実現値、確率密度関数に170を代入して出てきた、値が身長170の人間が日本の人口に占める割合です。正確には違いますが、知りたかったら、統計の本を読んでください。  で、ベイズ統計学はある事象が起こったとき事前分布と観測された事象の確率密度関数をかんがえます。事前分布は事象が起こる前に予測される確率密度関数のことで、事前分布と観測された事象で計算して、事後分布を出します。これをベイズ更新と言って、学習に当たります。事前分布が従来の予測、観測された事象で予測と実際の差を学習して、事後分布を計算する。つまり、まんま機械学習をしています。 ベイズ統計学を用いて変数同士の関連性を定義して、説明変数から目的変数を予測しようとするのがベイズモデリングです。 面白いのはベイズの定理は発見から2百年近くたった最近まで、注目されていなかったことです。色々な理由がありますが最も大きいのは、ベイズ統計では限られた事前分布でしか事後確率を表現することができなくて使用しにくかったというものがありましたが、近年のコンピュータの発展によって、MCMC(マルコフ連鎖モンテカルロ)法が利用できて、どのような関数でも事後分布を評価できるようになったため、発展しました。   最後に、深層学習(ニューラルネットワーク)です。本当はニューラルネットワークと深層学習(ディープラーニング)は違うのですが、近年のほとんどが深層学習なのであまり区別されていないと感じています。 これらは生物の神経細胞(ニューロン)を模倣してできた学習方法です。生物の神経細胞は入力が一定以上になると、出力するという性質があってこれをプログラムで模倣したものをパーセプトロン、パーセプトロンを繋げたものをニューラルネットワーク、入力から出力まで多数のパーセプトロンを経由するのが深層学習です。 これまでの学習方法と違って、数学的に裏打ちされたものではありません。深層学習では通常の関数では表現できないような関数を表現できるから上手く学習できたとき、物凄い性能を発揮出来るという説もありますがよくわかっていないというのが現状です。これが弱点で、例えば人命がかかわる場面でエラーが起きたときその理由が分からないという致命的な欠点が存在してます。 しかし、現状画像認識スコア、自然言語処理スコアが人間を超えたり、囲碁で世界チャンピオンを倒したりしているのはこの深層学習です。 ## お前は何ができるようになったの?  これだけ長々と話して、結局お前は何ができるの?と思っているでしょう。  私が最も多く勉強したのはAlphaZeroとGANについてで、辛うじてこれらのプログラムを書けるはず~~だと思いたい~~。 中でも特にGANは夢が広がる分野で、絵などの画像、動画、音楽、文章などを生成することができます。 GANの日本語は敵対的生成ネットワークで、仕組みを簡単に説明すると、鑑定士と偽物製造業者がいて、鑑定士は偽物を見つけようとし、製造業者は偽物とわからないようにするという仕組みです。すると、本物と見間違うような画像が生成することができます。一時期、そういう動画で有名人の顔に差し替えて逮捕されたというのがありましたが、これを使っています。 捕まるので、やりませんが一応できるはず。 実際にしたのは音楽生成と画像生成です。 人の画像とアニメの顔画像を同時に学習させて、人の画像をアニメの画像に変換したり ![](https://i.imgur.com/QajyHvA.png) クラシックのデータセットから短い音楽を生成したり、 [(グーグルドライブの共有フォルダです、音声ファイルってどうやって共有すればいいんだ?)](https://drive.google.com/drive/folders/1rtaWPNbMGse_e5ErajvscqIiX40c_etK?usp=sharing) そんなことができます。 ネットワークの実装自体は、たいてい本や原著論文を参考に行います。場合によってはQiitaや個人ブログも参考にして行います。研究者では無いのでネットワーク自体をいじったりはほとんどしないです。 どちらかというと、プログラミングはデータセットを作るときに必要になります。 スクレイピングとか、画像処理とか。まあ、これもネットの記事見ればすぐできるんですけれども。 GANは[クリプコ](https://crypko.ai/)でも多分使われています。 頑張ればこんなかわいい絵も自動生成できるようです。 ## 大した事できねえんだな  そう思っているでしょう。その通りです。機械学習で物を言うのは計算資源のみです。グーグルが囲碁チャンピオンをボコったのも計算力のごり押しです。私たちも今から機械学習を試すことができますが、実用レベルにするにはGCPで数百万円必要でしょう。  機械学習が発展すればするほど、計算資源の価値は高まっていきます。それに伴って、GPU、TPUを生産できる会社の価値は高まっていくでしょう。日本も生産するべきだと思うけど、偉い人にはそれが分からんのですよ状態ですね。 ## 機械学習の始め方 [Anacondaをインストールして](https://www.python.jp/install/anaconda/windows/install.html) absl-py==0.8.1 appnope==0.1.0 astor==0.8.0 astunparse==1.6.3 attrs==19.2.0 backcall==0.1.0 bleach==3.1.0 cachetools==4.1.1 certifi==2020.6.20 chardet==3.0.4 cycler==0.10.0 decorator==4.4.0 defusedxml==0.6.0 entrypoints==0.3 gast==0.3.3 google-auth==1.18.0 google-auth-oauthlib==0.4.1 google-pasta==0.2.0 h5py==2.10.0 idna==2.10 imageio==2.6.1 importlib-metadata==0.23 ipykernel==5.1.2 ipython==7.8.0 ipython-genutils==0.2.0 ipywidgets==7.5.1 jedi==0.15.1 Jinja2==2.10.3 jsonschema==3.1.1 jupyter==1.0.0 jupyter-client==5.3.4 jupyter-console==6.0.0 jupyter-core==4.6.0 Keras==2.3.1 Keras-Applications==1.0.8 Keras-Preprocessing==1.1.0 kiwisolver==1.1.0 Markdown==3.1.1 MarkupSafe==1.1.1 matplotlib==3.1.1 mistune==0.8.4 more-itertools==7.2.0 music21==5.7.0 nbconvert==5.6.0 nbformat==4.4.0 networkx==2.3 notebook==6.0.1 numpy==1.17.2 oauthlib==3.1.0 opt-einsum==3.1.0 pandas==0.25.1 pandocfilters==1.4.2 parso==0.5.1 pexpect==4.7.0 pickleshare==0.7.5 Pillow==6.2.0 prometheus-client==0.7.1 prompt-toolkit==2.0.10 protobuf==3.10.0 ptyprocess==0.6.0 pyasn1==0.4.8 pyasn1-modules==0.2.8 pydot==1.4.1 pydotplus==2.0.2 Pygments==2.4.2 pyparsing==2.4.2 pyrsistent==0.15.4 python-dateutil==2.8.0 pytz==2019.3 PyYAML==5.1.2 pyzmq==18.1.0 qtconsole==4.5.5 requests==2.24.0 requests-oauthlib==1.3.0 rsa==4.6 scikit-image==0.17.2 scipy==1.4.1 Send2Trash==1.5.0 six==1.12.0 tensorboard==2.2.2 tensorboard-plugin-wit==1.7.0 tensorflow==2.2.0 tensorflow-addons==0.10.0 tensorflow-estimator==2.2.0 termcolor==1.1.0 terminado==0.8.2 testpath==0.4.2 tornado==6.0.3 traitlets==4.3.3 typeguard==2.9.1 urllib3==1.25.9 wcwidth==0.1.7 webencodings==0.5.1 Werkzeug==0.16.0 widgetsnbextension==3.5.1 wrapt==1.11.2 zipp==0.6.0 これをコピペしてrequirements.txtとして保存して pip install -r requirements.txt のコマンドをanaconda上で実行すれば環境は構築完了です。 あとは[ここ](https://qiita.com/hideki/items/4de4928236ca15152c18)とか参考にして頑張ってください。