2018.01.16

AIサービス

なぜ機械学習やディープラーニングにはPythonが必要なの?〜機械学習周りをPython3で学んでみた〜

こんにちは、小林です。

今年は戌年

なので年男です。はい。

さて最近色々な言語を試してみようと思っていましたが、機械学習に興味を持ったので、とりあえずPython3から勉強してみました。

1. なぜMLやDLにはPythonが多く使われているの?

今回Pythonを学ぼうと思ったキッカケも全てこの疑問からです。

”なぜ機械学習やDeep learningにはPythonが必要なの?”

(先に言っておくとMLやDLに必ずしも"Python"というわけではない)

お笑い芸人の小藪さんが最近Instagramで使ってる言葉で

#マジぬんでなん #ぬんで?

がありますね。まさにこんな気持ちです。

話を戻しまして、勉強してみた結果少し理解して来たので下記にまとめてみました。

1.1. なぜ?の前に

そもそもプログラミングの言語には

- アセンブリ言語

- インタープリタ型言語(スクリプト言語)

- コンパイラ型言語

がありますね(ざっくり)。大まかに書くと

- アセンブリ言語=アセンブラ

- インタープリタ型言語=PythonやRubyなど

- コンパイラ型言語=CやC++など

ですね。中身は

- アセンブリ言語=C言語などを作るための言語(少量のメモリで色々出来る)

- インタープリタ型言語=コードを書いたらそのまま実行できる言語

- コンパイラ型言語=コンパイル→実行ファイルを生成→実行 みたいな言語

の様な感じです。ここで一つ疑問が...

コンパイラ型言語はコンパイルに時間と手間がかかる

しかし実行が高速

MLとDLはどちらも大量に計算を行うことが特徴

したがって実行の速度が速いほど良いはず...

では、どうしてインタープリタ型言語であるPythonが使われることが多いのでしょうか。

1.2 なぜインタープリタ型言語であるPythonが使われることが多い?

機械学習&ディープラーニングの通常のプロセスとして

コード実行

結果を見て修正

再実行

というのが大まかな(一般的な)流れですね。

もう少し掘ると

DL&MLは上記の様なプロセスで開発を行うことが多い

毎回コンパイルという手順を踏むコンパイラ型言語(c++ようなコンパイラ型言語は型に重きを置く)

=生産性が高いとは言えない

一方でPythonは、「型」の宣言が必要無いです。
(一応Python3.6以降で引数&関数の返り値&変数に型記述可能となった)

様々なデータを同時に扱うMLとDLにおいて、型をいちいち定義する必要のあるコンパイラ型言語はコードの作成に時間がかかります。

両方良し悪しはありますが、MLとDLにはPythonの様なインタープリタ型言語が適していると言えますね。

2. Python3の概要

細かい使い方は公式チュートリアルでお願いします。

とりあえず要点として

- DL&ML等を勉強する上で知っておくべし

- 高度な数値計算やデータ分析に大活躍

- Ver2がある(現在macにデフォルトで入っているのはVer2)

- Ver3では後方互換性に影響のある変更がある

- つまり、Ver3のコードはVer2では動かないことがある(逆もしかり)

- Ver3をサポートしていないモジュールは結構ある

比べてみた感じではVer3ではVer2における様々な点(print、unicode、整数除算等)が改善されているなと感じました。しかし、今からPythonをいじるならVer3を学ぶのがベター(Ver2は2020年でサポートが終了予定)なのでは...。

よって今からVer2を使う理由はあまりないと考えても過言ではないと思います。
(しかし知っておくことは大事な気がする=備えあれば憂いなし的な)

そもそもPythonとは

- 汎用プログラミング言語の一種

- インタープリタ型言語(=スクリプト言語)

- オブジェクト指向

- コードがシンプルで扱いやすく設計

- C言語などに比べてさまざまなプログラムを分かりやすく書ける

といった特徴(大まかですが)がありますね。まだ機械学習に触れていないので、少し触れていきましょう。

3. とりあえず機械学習の根幹を少し理解しよう(数3等)

さてここから少し数学嫌いな方は目を瞑りたくなるようなお題です。

機械学習の根幹には沢山の数学要素が詰め込まれてます。知っているだけでも

- 線形代数:よく聞くベクトルや行列。複数の値を一つの式で扱う際に使用

- 微分積分:特に学習に用いられる。未来のデータの値を予測したい時などに使用

- 統計:目標(今までのデータを基にあるものを予測すること)を設定

- 確率:より効果的な手法を求める為

な感じで、上記は最低限ですね。まだまだあります(ただいま絶賛勉強中)。

とりあえずこのマークはよく出てきます。

むむ(もう少しズーム)

こいつです。名前はシグマです(多くの人がお分かりだと思いますが)。

シグマの詳しい事はググってもらえれば、理解出来ると思います。
あとは因数分解やベクトル等をなんとなく分かっていれば、機械学習の簡単な式は理解出来るかな...?

そもそも上記は前々回出した記事の根幹ですね、機械学習をもう一度分かり易く図で表すと

こんな感じです(これは教師あり学習)。説明を加えると

ラベルを持ったデータセットを用意

入力と出力をひたすら行う

モデル完成

全く新しいデータを入力

そのモデルが答えを予測して出力

という流れですね。

次にツールを説明しながら数式をサンプルで表示したいと思います。

3.1. Jupyter Notebook

こんな便利なものがあるのか!というのが初めて触った時の感想です。

そもそもJupyter Notebookとは

- ローカル(ネット使わない)で、使用できるノートアプリ

- 数式描ける(markdownとして出力。長いコードだと反応しない事もある)

- Python3が書ける

- 作成したFile(.ipynb)をGitHubにup→自動的にグラフや式などがレンダリング

少々画質荒めですが、こちらが自動的にグラフや式などがレンダリングした時のgifです。

https://gyazo.com/76be37e9f68529cf633053dabb12b0ab

$$で数式を囲んでMarkdownとして出力すると、このようになります。
(複雑でなければ囲まなくてもokayな場合有り!)

これらはアルゴリズムの確認&ドキュメント作成などに便利ですね(現在自分のメモとして大活躍)。

作成したノートブックは下記のようにHTMLやPDF、スライドとして出力可能です。

拡張子一覧です。

かなり用途が広がりますね。

又、作業したいフォルダが決まっている場合はターミナル上で、

- コマンドで作業したいディレクトリに移る
- jupyter notebookと打ち込む

で完了です。

ここで少しjupyter notebookの主要コマンドについてまとめます

上記のようにターミナルでしか動かせないコマンドもあります。
理想は画面にJupyter Notebookとターミナルを画面分割して置くと、変更履歴も確認出来て大分作業が捗ります。

こんな便利な勉強用ノートはなかな無いと思います...。

ここでちらっと触れた行列について軽くgistでまとめると、

こちら.md

上記の数式をMarkdownで読み込ませるとレンタリングされます。

https://gyazo.com/4dd05df2bed3ac99cd29348dfbcc1164

JupyterやPython3等をまだインストールしていない人は、次のAnacondaをまず先にインストールするのがオススメです。

3.2. Anaconda

とりあえず画面はこんな感じです。

Anacondaとは、

- Pythonのディストリビューション

- pandasやJupyterも入ってる

- もちろん無料

のような簡単にPython実行環境を整えてくれるものです。

なぜAnacondaを使うのか

Pythonには便利なライブラリが沢山ある

しかしそれらのライブラリの多くはPythonに標準で付属されていない

別途インストール&自分で環境を整えなければならない

初めての人にとって環境構築は手間がかかる

そこでAnacondaの出番

という感じですね。
より快適にPythonを動かすにあたりAnacondaのようなディストリビューションは必要不可欠です。

それぞれの説明
ちなみにPythonとconda のみの最小構成Minicondaもあります(名前かわいいな)。

4. とりあえず遊んでみる

話がガラッと変わりますが、とりあえずPython3を使ってゲームをしてみました。

4.1. オセロ

実際にオセロを作成し、遊んでみました(機械学習とは関係ないがPython3に慣れる為)。
ターミナルで動かします。

オセロ起動

スタート(僕がM、相手はS)

むっ...

まあこんなものか

圧勝

っていう感じでした(PCの置き場の優先度はランダム&設定は僕がいじっているので勝てて当然ですが...)。

割とオセロには自信がありましたが、未だ弊社Bossには勝利した事がありません(半端なく強いです笑)。

簡単に流れを説明すると

マトリクスを設定(=ボードスコアを最大化する移動を行うように=四隅はスコア高いみたいな)

ランダム(import)に置けるところを探すようにする(無ければskip)

マスが埋まりきらない状態で置ける場所が無くなった場合は強制終了&判定し勝ち負けをprint(稀にある笑)

埋まったところで、差分を判定し勝ち負けをprintする

みたいな感じでした。こちらgitです。

5. 感想

浅い内容でしたが

- 機械学習は昔から追求され続けているものなんだな

- MLやDLにpythonが必ず必要、ってわけでもない(Rの様な言語もある)

- Pythonって面白い
- Pythonをもっと勉強したいので、次回はPandasやJupyter上で機械学習を諸々やってみたい

と思いました。

ありがとうございました。

6. ベトナムでのオフショア開発なら・・・

ベトナムへ進出されるなら、若くて優秀なエンジニア達とホーチミンで約9年、オフショア開発・アプリ開発を展開しているバイタリフィバイタリフィアアジアへお気軽にご相談ください。又、オフショア開発のリスクや費用を極限まで抑えた『拠点開設プラン』も用意しております。またベトナム向けIT・WEBサービス/アプリの開発支援、ローカライズ、テストマーケティングといった進出支援に加えて、日本や他国向けのオフショア開発やアプリ開発も行っております。ご興味がありましたら、ぜひご連絡下さい。

問い合わせ