はるなし[医学・プログラミング]のblog

こんにちは!機械学習・プログラミングをやる医学生です。情報発信、アウトプットによるよりよい理解、に使っていきたいと思っています。

医学生的深層学習実装優先勉強法!!

こんにちは!はるなしです。

 

医局の研究に参加して、機械学習(深層学習)でデータ解析をしている地方の医学生です。深層学習を臨床に応用した論文が1本(共著です)出るめどがつきました。興味持ってくれた方はTwitterフォローしてあげてください。

 

さて、前回「一般平均地方医大生が深層学習を実装するまで」という題で記事を書きました。

harunaishina.hatenablog.com

 

この記事は単純な僕の体験談です。今回は、これをもっと抽象化して、「プログラミングの勉強ってこういう風にするべきだよね(医学生向け)」という勉強法のお話をしていこうと思います。

 

先に書いてしまうと、この記事でお伝えしたいことは

 

Pythonの最低限の基礎が終わったらとにかく何か作れ!作るのだ!!具体的な何かを!!「プログラミング基礎のお勉強」をどれだけ丁寧にしても何も作れないぞ!!!

 

です。

以上です。それではまた。

 

・・・実際のところ、ほんとにこれが全てです。基礎を丁寧にやる、というのは我々が受験時代から大事にしてきた勉強法ですが、どうもプログラミングに関してはこの考え方が通用しないようです。基礎がわからなくても、いきなり応用問題を解くのが実装への近道のようだ、と感じています。

 

今回の記事は、最初のほうは「プログラミングの勉強はこのように考えるべき」という総論的な、抽象的な話になっていて、後半に行くにつれて「実際に何したらいいのか」という具体的な話になっていく、という構成になっています。

 

対象とする人

・プログラミング初心者(おもに医学生)

Pythonの基礎を勉強し終わった人(Progate)

Pythonの基礎を昔勉強したけど、何も作れないからやめちゃった、の人

・とにかく、何かを作りたい人(実装が優先)

 

対象としない人

・プログラミングで何か実際に生み出せている人

・プログラミングの「勉強」が楽しい人

 (これはこれでアリですがこの記事の対象ではない)

・理工学系の学生と同等の実装力をつけたい、最新論文を自力で実装したい人

 

じゃんけんゲームの先に進むために

 

Pythonの基礎(Progate修了レベル)を終えた人って、よほどセンスがないとみんなこうなると思います。

f:id:harunaishina:20200908131030p:plain

僕もこの状態から脱出できずに、一度挫折しました(前記事参照)

ここを抜け出すために、何をすればいいでしょうか?講師付きのプログラミングコースはお高くてなかなか手が出ないし、(僕はやってないので安易に言及するべきではないですが)、巷にあふれている安めの教材では、「それやったから何ができるの?」つまり「丁寧な基礎のお勉強」以上の段階に進めない気がします。

 

前回の記事でも触れたのですが、プログラミング勉強において「目標をはっきりさせる」ことがとっても重要です。もっと言えば、「何作りたいのか」をはっきりさせる、ということです。

 

この記事では話に具体性を持たせるために、以下、題名の通り「深層学習の実装」に話を絞ります。そのうえで、どのように勉強するべきか、というお話を深めていきます。

 

解糖系知ってても治療はできない

 

みなさん「ライブラリ」を知っているでしょうか。

おおざっぱに言うと「ある機能を持ったプログラムをひとまとめにしたもの」です。

Progateでじゃんけんゲーム作る際、ランダムな整数値を取得する際に、自分で丁寧にコードを書くのではなく、

f:id:harunaishina:20200908133842p:plain

こんなかんじで「random」を「import」することで簡単に実装することができました。ランダムな整数値を取得するコード、なんてのは誰が書いたって同じなので、このように「random」の中にまとめておいて、簡単に使えるようになっているのです。

ランダムな数値を取得する、という機能をまとめたものが「random」というライブラリなわけです。

 

便利なライブラリはほかにもあって、厳密ではないですが、行列計算を扱いやすくしたのが「numpy」、表形式のデータに関して「pandas」、深層学習を書きやすくしたものが「keras」といった感じです。深層学習を実装するぞ!となった時、自分でコードをゼロから書くというよりは、これらライブラリの機能を使いこなしていく、というのが実際の作業になっていきます。

 

これをイメージとしてまとめるとこんな感じです↓

f:id:harunaishina:20200908134604p:plain

 厳密じゃないんで見る人が見たら怒られそうですが、イメージとしてはまあこんな感じです。

で、実際に深層学習のコードを書いてみて、Pythonの勉強って少し医学の勉強と似ているな、と思ったんです。どういうことかというと、

 

f:id:harunaishina:20200908135019p:plain

こんな風に対応するな、と思ったのです。このイメージが、「Pythonの基礎を延々と勉強しても役立つ何かは作れないでしょ」という考え方の根拠になります。

 

つまり、僕らがしたいのはとにかく治療なんです(kerasを使って深層学習)。それを分子生物学(Pythonの基礎)から積み上げ方式で勉強すると、数年は余裕でかかってしまいます。(たぶん、理工系とかプログラミング専門の人は積み上げ方式で勉強するのでしょう)

 

ですが僕ら医学生で「実装優先」なので、基礎を丁寧に、「積み上げ方式」で勉強する時間はないです。たぶんその必要性もあんまりないです。

 

したがって、僕が提案したい勉強法のイメージは以下のようになります

f:id:harunaishina:20200908135836p:plain

まず、わからなくてもいいから何か具体的なものを作って、それに必要な知識を掘り下げていこう、という戦略です。こうすれば、役立つ何かを最小限の勉強量で実装することができますね。

 

じゃあ具体的に何するのか、を説明していこうとおもいます!!

 

 写経と課題設定

 

先に全体像を示しておきます。

 

f:id:harunaishina:20200908145015p:plain

 

この図で全部っちゃ全部ですが、もう少し掘り下げて話します。

 

まず、どうやってコードを書くか、ですがGoogle Colabを強くお勧めします。環境構築は初心者に難しすぎます。パソコン得意な人はAnacondaなど入れてやってもいいと思いますが、深層学習で表データはともかく画像を扱いだすと普通のパソコンで学習させるのは不可能です。ColabはGPU(めっちゃ計算速いやつ)を無料で使えるので、どのみちColab にお世話になることになります。自分のパソコンで始めることに最初こだわらなくてもいいと思います。 

 

コードを書く場所が整ったところで、今度はコードの「写経」をします。写経するための経本が必要なので、この段階で1冊深層学習を実装するための本を買いましょう。深層学習の理論の解説、というよりは実装を目的とした本(つまりコードがいっぱい書いてある本)が良いと思います。自分に合いそうな本を選べば良いと思いますが、pythonによるAI・機械学習・深層学習アプリの作り方」が個人的なおすすめです。

 

実際に写経をしましょう。入門書には簡単な機械学習の実装(ロジスティック回帰とか)のコードがあるので、写経してColabで動かしてみましょう。最初、何で動くのかよくわからないと思いますが、とにかく期待される出力が実際に得られることを確認してください。

 

その次に簡単な、表データを使った深層学習をやりましょう。多くの本で「アヤメデータの分類」を最初の課題にしていることが多いようです。データの読み込みから出力まで写して、同じくコードが動くことを確認してください。

 

そしていよいよ自分で課題を設定し、取り組みましょう。アヤメの分類、と近い課題がやりやすいので、データが表形式になっていて、その分類を課題とするとよいと思います。僕は公衆衛生の講義で配られた健診データを使って深層学習(心血管イベント発生の予測)をやりました。このように自分で興味を持てるデータを準備するのがベストですが、オープンデータとしてタイタニック乗客の表データやボストン住宅価格の表データがあるので、それを利用してもいいと思います。

 

データの読み込み部分をアヤメデータから自分のデータに差し替えて、写経したコードが動けばよいわけです。これができると、少なくとも表データに関しては実際の研究にもつなげることができそうですね。

おそらく皆さん「写経をしただけでいきなり自分で用意したデータを解析できるのか?そんなにうまくいくか?」と思っていると思います。その通りです。そんなにうまくいきません。

 

延々と出現するエラーを感謝の気持ちで迎え撃つ

 

写経したコードのデータ入力部分を差し替えたくらいで、コードは動かないです。「エラー」が出ます。

たとえば、こんな感じです↓

f:id:harunaishina:20200909003026p:plain

これを頭から一個一個ぜーんぶ解決していくと、そのうちちゃんと動くコードが書けるだろう、というわけです。 しかもエラーを解決するためにはそのコードに関わる周辺知識や、深層学習モデル全体の理解も必要になってくるので、プログラミングの勉強の「掘り下げ」ができるでしょう、という戦略なわけです。

 

じゃ、プログラミングの勉強を基礎しかやっていないのに、このエラーをどうやって解決するのか?ということになります。みなさんは困ったことがあった時に何に頼るでしょうか?友人?両親?いえ、Google大先生です。

 

f:id:harunaishina:20200909003951p:plain

 

エラーが出るときに「こんなエラーですよ」という文が出てくるので、これをググります。するとエラーに関する解説記事が必ず出てくるので、それを読みます。その解説記事に書いてあることを理解するための知識が足りないなら、足りない知識をググって補完します。頑張って解説を読むと何が間違っているのか わかってくるので、そこを修正します。すると次に進むことができるわけです。

 

100個エラーが出ているなら100回これを繰り返せ、というわけですね。

 

脳みそ筋肉なの?馬鹿なの?という声が聞こえてきそうですが、とにもかくにも僕がやったのはこれの繰り返しです。100回繰り返す、と言っても同じエラーが出た時はすぐ解決できるようになるので、だんだん成長し、効率化することはできます。さらに、エラー解決と同時に周辺知識もついてくるので、コードの意味も全体を通してわかってくるようになります。僕は今画像の深層学習をしていますが、コードのほとんどの意味を理解しているつもりですし、簡単な応用ならできるようになってきています。

 

おおまかなところ、僕が提案する勉強法は以上のような感じです。まとめると

 

  • Pythonの基礎修了
  • コードの写経
  • 写経コードに似た課題の設定
  • エラー解決を繰り返す
  • わからないことはGoogle検索

という流れです。

このやり方が最適解なのかはわかりませんが、とにかく、何かが作りたいなら「勉強」の段階をどこかのタイミングで超えて、「実際に作る」という作業をしなければ何も生み出せないとは思います。

 

補足とデメリットの事

上の勉強法の解説ではコードを書く部分について話を深めていますが、そもそも「深層学習ってなんなん?」ということをわかってないと実装は難しいです。エラー解決をしながら、本を買ったり、解説記事を読み漁ったりして理論側の知識を増やすべきです。

 

具体的にどんなコードを書けばいいのか、は皆さんが知りたがっているところだと思います。そのレベルになると「教材」になるので、今回の勉強法の解説記事としては具体的なコードには触れないです。ただ、何かしらの方法で僕が今まで書いたコードはすべて公開してだれでも見れる状態にしようと思っています。

 

また、現在大学のプログラミング勉強会を立ち上げていて、そこでの教材として深層学習実装テキスト、なるものを僭越ながら作っています。めっちゃ評判いいので、もしかしたら公開するかもしれないです。

 

この勉強法のデメリットについてです。

この方法だと最短で実装まで到達できる代わりに、プログラミングに関して網羅的な知識を得ることができないです。必要な部分だけを虫食い状態で知っている、ということになります。なのでこの先「わからないこと」に出くわすのは明らかで、その都度エラー解決をし、必要な知識の吸収をしないといけません。

 

また、このやり方だとほかの人が書いたコードを読む力、があまり養われないように思います。自分で書いたコードが動けばいいや、という思考になりがち。人から教わるときに苦労しました。

 

最新論文の実装、などはすぐにできるようにはなりません。写経が最初なので、基本的にはほかの誰かがやったことを真似する、ということになります。深層学習を臨床応用する際、最新の手法を実装する必要はないと思いますが(むしろある程度確立されて実績ある手法が良い)、最新手法を試したい!という人は地道な基礎の勉強をするべきかもしれません。

 

終わりに

ここまで読んでくださって本当にありがとうございます!勉強法って無限にあるので、合う、合わないがあるのは仕方がないことです。ですが、僕の経験をもとに、こう考えるべきでは、という部分を言語化しました。なにかを「作ることができる」のはとっても楽しいことです。初めてCNNが動いた時の感動を忘れてないですし、その感動を皆さんにも味わってほしいです。挫折しちゃうくらいなら、まず一冊本を買って写経してみてはいかがでしょうか!?

 

最後にデメリットについて触れたように、自分自身のプログラミング技術の限界を感じ始めている部分があって、これから解決しないといけない課題はたくさんあるのだと思います。そのあたり、今後の僕の課題と成長を含めて記事にできたら、後輩たちの参考になるのかなと思っています。

 

今後とも何かしらを記事にしていこうと思っています!読んでくださってありがとうございます!!