PythonでのAI入門です。AIやPythonも参照のこと。
Pythonは、機械学習(AI)と科学技術計算の分野で、デファクトスタンダードになりつつある。
機械学習や科学技術計算をPythonで行いたい場合は、Anacondaと呼ばれるPythonのディストリビューションを使うことができる。ライブラリが最初から入っているため、便利である。
後日注記:WindowsでPythonによるプログラミングを学びたい場合は、Anacondaを使ってAnacondaプロンプトからPythonを実行するのが手軽です。特に以下の京都大学の教科書はPDFで公開されており参考になります。
Pythonで使われる機械学習用のライブラリは以下。
ライブラリ | 解説 |
---|---|
NumPy | 数値計算 |
SciPy | 数値解析 |
Matplotlib | グラフ描画 |
Pandas | データ解析 |
scikit-learn | 機械学習 |
(【決定版】WindowsでPythonを使って『機械学習』を学ぶための環境構築 - Qiitaを参考に執筆しました。)
NumPyとSciPyは、Pythonで数値の計算や解析を行うためのライブラリ。
以下が参考になる。
NumPyを参照のこと。
Pandasはデータ解析用のライブラリ。
Pandasを参照のこと。
scikit-learnはPythonのオープンソースな機械学習ライブラリ。
scikit-learnを参照のこと。
Chainerはオープンソースで日本製のディープラーニング用のライブラリ。
日本の機械学習系ベンチャー企業のPreferred Networksが開発を主導している。
以下のサイトからチュートリアルが参照できる。
後日注記:ディープラーニングの書籍として有名な「ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装」の著者である斎藤康毅さんはPreferred Networksの方です。
TensorFlowはGoogleによるオープンソースの機械学習・ディープラーニング用のライブラリ。
ほかにも、ディープラーニング用のライブラリとしてCaffeやTheanoなどが知られている。
Googleも参照のこと。
AIで良く使うコードを、コピペできるように掲載されているサイトがあります。
【保存版・初心者向け】独学でAIエンジニアになりたい人向けのオススメのAI勉強方法 (2019年改定版) - Qiitaというページが参考になる。
上のページはAI Academyというオンラインの学校の紹介ページだが、どんな書籍を読めば良いかが書いてあってとても参考になる。
また、僕が好きな@ITにもAI・人工知能のページができている。Pythonの入門記事もあって、AIがやりたいプログラミング初心者におすすめ。
機械学習については、Qiitaにさまざまな記事がある。特に、僕が見た限り以下のページが特に興味深い。「AIの研究はこのようにする」ということが分かる。
また、以下はなんと中学一年生の方の記事である。まだ執筆途中だが、将来の世代に期待がかかる。
機械学習やデータサイエンスは、数学的な数式や回帰アルゴリズムからデータ処理・変換・グラフ可視化モジュールまでたくさんの要素がある。全てを理解するためには途方もない時間と手間と労力が必要である。簡単に「Pythonの練習だからやりなさい」と言うわけにはいかない。本腰を据えてそれだけを勉強しても、何週間もかかるだろう。
以下のデータサイエンティストの方の講座は、数式が多く出てきて難しいですが、データサイエンスとはなんであるかを知るためにとても参考になります。おすすめです。
僕は、ディープラーニングのことを学びたいと思われている方は、書籍「ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装」を読むことをおすすめします。
この本は「ゼロから作る」とも書かれている通り、既存のライブラリやモジュールを極力使わず、ゼロから作ることを目指したディープラーニングの書籍です。
まだ僕はいくらかしか読めていませんが、この本はディープラーニングに対して「気軽に挑戦」することができる本です。掲載されている数式やプログラムは難しくなく、記述は丁寧かつざっくばらんで、用語もある程度のIT技術と基礎数学の知識があれば理解できます。
特に、「AIを作る面白さと理解するためのセンス」の書かれた、面白くAIの開発とそのための勉強ができるとても素晴らしい本だと思います。
Pythonの前提知識もあまり必要ではありません。Python初心者であっても理解出来るでしょう。それどころかこの本でPythonコードを書くセンスが身につくと思います。
(ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装を参考に執筆しました。)
パーセプトロンでは、それぞれのパラメータに「重みづけ」を行うことで、AND/NAND/ORゲートなどの論理回路を設計・実装できる。
たとえば、xに対して0.5という「重み」を掛け算し、yに対しても0.5という「重み」を掛け算し、これを足して0.7を超えた値になるかどうかを判断し、その結果を1か0として返すようなANDゲートが考えられる。
xが1で、yが0ならば、重みの和は0.5となり、0.7を超えないため、戻り値は0となる。
xが1で、yも1ならば、重みの和は1となり、0.7を超えるため、戻り値は1となる。
これで、パーセプトロンにより、ANDゲートは実装できた。NANDゲートやORゲートについても、重みパラメータを変えるだけで同様に実装できる。
基準となるのは、「バイアス + 重み1 + 重み2」の計算結果で、これが0以下であれば0を返し、0より大きければ1を返す。ANDの場合は重みの0.5に対してバイアス(発火する基準)が-0.7、NANDの場合は重みの-0.5に対してバイアスが0.7、ORの場合は重みの0.5に対してバイアスを-0.2とする。XORはこれらのゲートの組み合わせで実装できる。
だが、ここまでの実装では、パラメータの重みづけは人間の手で「0.5」とか「0.7」と決めていた。この重みを自動的にデータから学習することができるのが、ニューラルネットワークである。
ニューラルネットワークでは、判断を行う「活性化関数」を用いて、入力した信号の総和を出力する信号へと変換する。活性化関数は、入力の総和から出力が「どのような場合に発火するか」を記述した関数のこと。基本的にパーセプトロンとニューラルネットワークの違いは、活性化関数の違いだけ。
ニューラルネットワークでは、重みづけを人間の手ではなくデータから自動的に学習できる。このため、何百とか何千とか何万とか何億などといった単位でパラメータに自動的に重みづけを行うことができる。
僕の作ったロボット思考AIについては、ロボットを参照のこと。以下はロボットのページから転載。自分で作ったコードです。
#!/usr/bin/python # -*- coding: utf-8 -*- # 初版作成 Assy, 在導万創 import sys class Robot: def __init__(self): self.ego = 0 def msg_loop(self): while True: e = self.view() self.action(e) def action(self, msg): self.do(msg) self.think(msg) self.make_ego(msg) def do(self, msg): if msg == 0: print('晴れだ') elif msg == 1: print('雨だ') def think(self, msg): if msg == 0: print('散歩に出かけよう') elif msg == 1: print('家の中に居よう') if self.ego > 20: print('僕もそろそろ大人になったなあ') def make_ego(self, msg): #自我を作る self.ego += 1 if self.ego > 100: print('死にました') sys.exit() def view(self): #外を見て、晴れ(0)か雨(1)かを判断する #ここでは常に0 return 0 if __name__ == "__main__": rb = Robot() rb.msg_loop()
僕は、人間型のロボットを作るために必要なのは、「自分の状態」(ステート)が鍵になると思います。
ロボットが居るその環境を見ながら、変化を分析して「出来事」(イベント)を認識し、その上で「自分の状態に基づいたことを言う」ことができれば、ロボットは作れます。
出来事や状態とは、たとえば、ご飯を食べたら「おなかがいっぱいになった」とか、違う場所に行けば「この場所に来た」とか、そういうことを自分のステートとイベントに応じて言えるようにすれば良いのです。
その上で、自分の意志を持つ必要がありますが、これは単にステートの一部として意志を持つデータを格納すればいいのです。
ステートとイベントに応じたことを、上のPythonによるAIプログラムのように、永遠に考え続けることができたら、それで、外界とは全く分離されたロボットが作れます。このステートとイベントをパターン認識と分析した結果としての記憶から行えるようにすれば、きっと人間と同じロボットは作れるでしょう。鍵は「状態」です。
書籍