この記事は「最近AIやディープラーニングって流行っているけど、何から勉強したらいいかわからない」「文系でもできるの?」という方に、「全然大丈夫ですよ!むしろ一緒に勉強しましょうよ!」とガチ文系の筆者がお伝えし、勉強の手段や、モチベーションをあげる方法を紹介するという構成となっています。
ガチ文系な私とディープラーニング
私は筋金入りの文系ですが、いまディープラーニングの勉強にはまっています。
アメリカでサーバーを借りて(月7ドル)ラーメンの種類を判定するWebアプリを開発したり、トランプさんのツイッターを分析してトランプさんの言いそうな事を喋るAIを作ったりしています。
さて、そんな私がどれだけ筋金入りの文系かという話に戻りましょう。
中二の定期テストで数学17点を取ったり、センター試験の数学2Bが20点だったせいで国公立大学に落ちたり、数学は僕の人生において大きな壁としてそびえ立っているんですよね。挫折感を味わったのは小学生の頃。秒速2cmで動く点Pや、池の周りを急いで走るサトシくんに「ちょ待てよ」なんて思ったのが懐かしい。物理?なにそれ。生物で十分だよ...。
こんな僕でもディープラーニングで遊べているわけですから、意外と敷居が低そうじゃありませんか?
勉強する手段
FastAI course v3
僕が神とあがめるJeremy Howordセンセイが主催する動画によるディープラーニング講座。
FastAIが目指すゴールは、
Make Neural Network Uncool Again
「ニューラルネットワークをありふれたものにする」というものです。
AIにより社会が変化していく中、どんなバックグラウンドの人でもAIに関わっていくことができる、そんな社会の実現を目標にされています。
だからこそFastAIは、ボトムアップアプローチで我々に語りかけてくれます。まずは動かしてみて、なぜそれが上手く行ったのか教えてくれます(後述しますが、上手く行ったというレベル以上に出来上がりがすごい)
そしてFastAIの素晴らしいところは、最新の研究をライブラリという形で提供してくれるところ。
例えばLeslie Smithさんが2017年に発表したCLRという理論。ざっくり言うと、ニューラルネットワークに学習をさせる際に、「どれだけ学ぶか(学習率)」を固定せずに、勉強させている間に増減をさせるというものです。
https://arxiv.org/pdf/1506.01186.pdf
青い線が学習率で、上下の赤線が増減させる範囲。緑が一回あたりの学習ですね。こうすることで、今まで以上にAIに効率よく学習させる事ができるそうです。
初心者である僕には「これってどう実装するの?」って感じなのですが、FastAIがすごいのはコード自体一行で実装できる事。優秀なエンジニアが既に作ったコードを、この一行で呼び出すことが出来るんです。
https://docs.fast.ai/callbacks.one_cycle.html
よく見ると、精度99%ってなってますよね。
そもそもAIが今回なにを学んでいるかというと、「人が書いた手書きの数字(0~9)を見分ける」というデータベースです。MNIST(エムニスト)なんて呼ばれたりしています。つまりfit one cycleで勉強させた結果、AIは1%以内の誤差で、手書きの数字を当てられる、ということです。5秒間学んだだけで。
(英wikiより)
では、世界の基準はどうなんでしょう。
英wikiによると、2016年にウクライナのRomanukeさんが出した誤差0.21%が最下限だそうですね。
試しにどんな論文か覗いてみましょう。ちょうどコードの全体像が載ってるページがあります。
難しすぎて僕にはわかりません。
ただ一つ言えるのは、FastAIのライブラリを使えば、たった数行のコードと5秒で、世界クラスのAIを作れるということです。(Lesson7では2分で誤差0.4%という結果が出ています)
本当に Make Neural Network Uncool Again ですよね。すごい。
さらに全編を通じて、「もう少し勉強したければこの論文やブログを読むといいよ」とおすすめしてくれるので、突っ込んで数学的なものを勉強したいという方にも向いています。線形代数はもちろん、物理とか統計とか沢山出てくるので、そこまで突き詰めればより理解が深まるでしょうね。
ご参考までに、筆者はこんな感じで勉強を楽しんでいます。
まず一回分の動画を見る→フォーラムでお勧めされたノートを読む→わからないところだけ動画を見る→もし興味のある分野だったら自分でプログラムを作ってみる
あと、ハイスペックパソコンがなくても、GoogleのColaboratoryを使えば、FastAIで学ぶことは実践できますよ。
各種書籍
①ゼロから作るDeep Learningシリーズ
ゼロから始めるシリーズは、「ゼロから手を動かして作ってみる」という点が面白かったです。前述のFastAIは優秀なエンジニアが作ったライブラリを、まるでレゴブロックを組み立てるようにつなげて行って大きなお城を作るというものですが、こちらはブロック自体を自作して、こぢんまりした田舎の一軒家をつくるイメージ。
使用するのはPythonという言語で、他の言語と比べれば非常にわかりやすい。理論を数式で説明し、その数式をPythonで実装していきます。「ニューラルネットワークってなんだか難しそうだけど、中身はただの数式の連続なんだ」と勇気をもらえました。語り口も非常に優しい。本当に頭がいい人って、専門用語で煙に巻かず、難しいことを平易な語り口で伝える人なんだなって再認識しました。
1は概論、2は自然言語処理寄りって感じですので、ぜひ1からやってみてください。ちなみに2には1の表紙に載ってる可愛い魚のしおりがついています、これが可愛いのでぜひ買ってください。
②入門python3
僕のようにプログラミング未経験者の方にはおすすめ。語り口が非常にユーモラスで、勉強していて苦になりません。よく専門書とかであるじゃないですか、形式張って堅苦しい感じの文章って。この本は一切そんな要素はありません。
とりあえず一周してみて、他の教材でわかりにくいコードがあったらこの本で調べるみたいな使い方をされると良いのではと思います。
③ディープラーニングの数学
やはり数学に造詣が深い方がディープラーニングへの理解も早いのかなと思ったので、僕はこの本を手にとってみました。「必要な数学を最短で教え込む」というスタンスなので、大胆にややこしいとか回りくどいところは省きながら説明してくれるので、大変わかりやすい。数学17点の僕でも微分、積分、ベクトル、統計学の基礎を知ることができました。
僕は自分の手で数式を計算できるとかそんなレベルではありませんが、いろんな文脈で数式が出てきたときに、多分こういうことだろうって推測できるようになったのは非常に助かっています。
モチベーションをあげる
他の人が作ったAIで遊んでみる
FastAIの公式フォーラムではShare your work hereというスレッドがあって、そこには世界中の受講者が作ったAIやアプリが紹介されています。
「音波の波形画像を分析して何の音(ギター、エンジン、人の声...みたいに)か分析する」という真面目かつ実用的なものから、「フィアンセに36人いる自分のいとこを紹介する為に、写真をアップしたら36人のうちの誰か判別する」というユーモラスなものまで、いろんな作品が掲載されていて、みんながいいねを送りあったり、神ことJeremy先生がコメントをくれたりしています。
つたない英語ですが僕も自分の作品をアップしています。ラーメンチェッカーと言って、「ラーメンの画像をアップすれば、AIが醤油、塩、豚骨、味噌のうちのどれかを判別する」というものです。さて、なんの役に立つかはまったくもって不明ですが、この記事を読まれた方にもぜひ試していただければ幸いです。
https://ramenchecker.onrender.com/
東大の松尾先生が出てるメディアを見る
誰に聞いたとしても、日本のAI界におけるトップランナーといえば間違いなく東大の松尾豊先生でしょう。僕がディープラーニングの勉強を始めようと思ったのも、先生の講演会を聞いた事がきっかけでした。
ディープラーニングでは、大きく分けて「認識」「運動の習熟」「言葉の意味理解」が順番に起こると考えています。4年ぐらい前からこの順番で進むことを言っていますが、ほぼこの通りにディープラーニングは進展してきました。
(上記hpより引用)
言葉の意味理解が出来た時、さらなるAIの進化がもたらされるというお話にはすごくワクワクしました。
Kaggleに挑戦してみる
Kaggleはデータサイエンティスト向けのコンペが開かれる会場になっていて、数千万単位の賞金をかけて世界中の人々が技を競いあっています。
初心者向けのコンペもあったりするので、そちらで遊んでみるのも一興ですよ。また、コンペとは関係なく有志でAI訓練用のデータセットが公開されていたりするので、そのデータを使ってAIを訓練するのも楽しいです。手前味噌で恐縮ですが、僕が遊んだ記録はこちら。
最後に
長々とお話をしてきましたが、お伝えしたいのは、ガチ文系な私でも、いま十分にディープラーニングを楽しめています、ということです。もちろん研究者やエンジニアの皆様には技術力で到底及びませんが、いま日進月歩で進んでいるディープラーニングに触れるだけで、なんだかすごく楽しいんですよね。
ぜひ皆さんも一緒に勉強しましょう!僕でお答えできることであれば何でもご相談にのりますので、お気軽に話しかけてくださいね。
おわり。