こんにちは!はるなしです。地方大学の医学部4年生です。
最初の記事ということで、「平均的な医学生が深層学習を実装するまで」というテーマで書いてみようと思います。駄文お許しください。
書くこと、書かないこと
「深層学習を実装するまで」はおおざっぱですね。この記事のゴール、すなわち今の僕の到達地点を正確に書くなら
インターネット上の新型コロナウイルス肺炎X線画像をつかって、Google Colabでプログラミングをし、CNNや転学習を用いてコロナウイルス肺炎/その他の肺炎を判別する正解率82%のモデルを作ることができる。
その後、医局にお願いして実際の医療データをいただき、臨床に応用できそうなモデルを作ろうとしている。
です。
今回は僕がこのゴールに至るまでの道のりを記事にしようと思います。
記事の趣旨は、プログラミング知識皆無の医学生の学習経過を失敗、無駄を含めてリアルに伝えることであって、最短学習法の紹介などではありません。過去の僕はその手の記事を読んでも、「そんなにうまくいかないよ、やっぱ素人にはプログラミングは無理だ」と心が折れることが多々ありました。そんな僕があえて泥臭い記事を書くことで、勉強を始めた人の励まし、あるいは勉強中の方の学習法見直しにつなげてもらえればと思います。
AI、なんかすごいね
プログラミングやろうかな、と思ったきっかけは2年生の時に東京大学松尾豊先生の「人工知能は人間を超えるか」を読んだことです。
最近AIがすごいらしい、医者の仕事も奪われてしまうかも!?というぼんやりとした不安を抱えていた僕でしたが、その本を読んで深層学習を具体的な問題解決の手法としてイメージすることができるようになりました。不安は期待に変化し、あれもできそう、これもできそう、と妄想は膨らみ、「プログラミング勉強して人工知能を作ってやろう!」と決意しました。
Progate、その先にあるもの
鼻息荒くプログラミング勉強法を検索し、初心者にはProgateというサービスが良いらしい、やってみよう、ということになりました。
無料版を試してみると確かに完全初心者にわかりやすく、「学習している実感」みたいなものを得ていました。すぐに1000円課金して毎日せっせと勉強し、1か月後にはコースを修了し、pythonで動く「じゃんけんゲーム」をつくることに成功していました。
じゃんけんゲームです。
その先がありませんでした。次に何を勉強するべきなのか、何を検索したらいいのかすらわからず、途方に暮れました。何かしないといけないな、と思い、コードを覚えていないから、ということでProgateの2周目をしたりしました。しかしだからと言って何かができるようになるわけもなく、つまらなくなり、やがて勉強するのをやめました。このようにして僕の第一次プログラミングブームは終焉を迎え、冬の時代へと突入しました。
Google Colabと理解を求める時代
僕が冬眠している間にも医療に関わるAIは様々な成果を上げていました。消化管の授業で早期腫瘍を高精度で発見するAIが紹介されたり、AIで医者がいらなくなる、とネットニュースで特集があったりしました。それらの話題は徐々に僕の心を揺さぶり、温め、「やっぱAIはこれから重要だ、もう一度勉強して今度こそ何か作るぞ」と心に決めることとなりました。(冬眠期間約1年)
Progateを離れてとにかくコードを書けるようになりたい、ということで探し回るとGoogle Colabに出会いました。初めて自分のパソコンでPythonが動き、勉強のテンションも上がりました。
僕は前回の勉強が失敗した理由を「深層学習に対する理解が足りないからだ」と考えました。じゃんけんゲームは仕組みを理解していたから作ることができた、深層学習も具体的なすべての計算を理解することで自作できるはずだ、と考えたのです。
言うまでもなくこれは完全に沼でした。
僕は頭が悪い
体系的な教科書が欲しいと思い、「pythonによるAI・機械学習・深層学習アプリの作り方」という本を買いました(3200円)。そのおかげでアヤメやMNISTなど有名な問題があることには気づき、具体的なコードの存在を把握することができました。
ためしに、MNISTのコードをColabで丸写し(写経)してみると確かに動きました。しかし当時の僕はそこに書いてあるコードをひとつも理解することができませんでした(だって、Progateで習ってない!)。なにやらわちゃわちゃとコードが書いてありますが、結局大事なのはmodel.fit()という行だけのようです。・・・(´゚д゚`)ハァ?もっと計算式とかあれよ!なにやってるのか「わからない」だろうが!
ということで僕はもっと詳しい解説を求めてネットを放浪しました。深層学習については解説記事がたくさんあり、それぞれについて理論はわかるのですが、実際のコードでなぜそれを再現できるのか意味不明でした。当時の僕の状態は
「実際に動くコードを丸写ししたけど、何をやっているのか全く分からない。応用のめども立たない。やっぱプログラミングって難しいな」
という感じです。何度かコードを理解しようと頑張ってみましたが、結局挫折しました。今度こそ、という決意をもって始めただけあって、失望も大きかったです。世の中にはプログラミングできる人はいっぱいいるのに、僕には無理だ。その理由はおそらく、僕の頭が悪いからだ、と結論しました。僕はがっかりして、あきらめ、情けなくなり、プログラミングから離れました。こうして僕の心は凍り付き、2度目の冬が訪れます。
プログラミングをする必要性と最も重大な転機
少し、深層学習の話から外れます。
これは完全に個人的な事情なのですが、僕の大学では3年生の秋に研究室実習というものがあり、1か月好きな研究室に配属されます。僕は免疫学講座で研究の手伝いをすることになりました。
講座でやった研究を大さっぱに言えば、Tcellに様々な刺激を与え、その分化(Th1とか17とか)を見てみよう、というものです。こうなるはず、という予想があったのですが、その予想がことごとく外れてよくわからない結果となりました。なのでちょっとずつ条件を変えたりして、何回も実験を繰り返しました。しかし何回やってもうまくいかず、そのたびに条件を変え、ますますわけわからなくなりました。
ということでサンプル数ばかり増え、実験条件もとんでもない数になりました。で、間抜けなのですが僕は最終的にそのデータが意味するところが全然分からなくなってしまいました。何とかしてレポートを書かないといけないのですが、このままだと「いっぱい実験したけどよくわかりませんでした」という情けない内容になってしまいます。データを眺めると、様々な実験条件があるものの、なんとなく分化は結局2パターンになるような気がしました。これを何とかして客観的に説明できないでしょうか。
いろいろ調べるとtSNEという次元削減方法にぶち当たりました。要するに「いろんな実験条件があったけどそれら加味して全体的な結果の分布はこんなかんじ」という説明をしてくれる機械学習の手法です。これをやりたいと思いました。医学生がよく使う統計ソフトEZRではできないようです。調べてみると、Pythonを使ってtSNEをやっている人がネット上にいました。これをマネできたら僕のレポートは少しはまともになるかもしれません。僕は再びColabを立ち上げ、若干の期待と不安を胸にプログラミングの世界へと足を踏み入れたのでした。
実は、これが最も重要な転機です。僕は解析したい生データを得て、プログラミングによって実装したい具体的な目標(tSNE)ができたのでした。
なんか、できたわ!
前回までのプログラミングブームとの違いは、「解決したい具体的な問題がある」ということです。この問題が解決さえすれば極論中身はどうだっていいのです。tSNE解析にあたっていろんな人のブログを読みましたがやはり少し難しく、Aidemyの機械学習講座(2000円くらい)を購入しました。いろんな機械学習の方法が紹介されていて正直よくわからなかったのですが、tSNEの部分だけ読みました。そこに書かれているコードの写経を行い、与えられたデータでtSNE解析をすることができました。いよいよ自分のデータで解析したい、のですがColabで自分のパソコンにあるファイルを読み込むことができません。ここで結構途方にくれたのですが、以前に買った「深層学習アプリ本」にColabにデータを読み込む方法が書いてあったな、と思い出し、「データ読み込み部分」と「Aidemyの写経部分」を組み合わせてColabで動かしました。なんやかんやエラーがあったのち、、、できました!正直よくわからずにコードが動いたのですが、ともかく初めて自分で書いたプログラムが動いたのです。かなり感動しました。
初めての成果物がこちら↓
とにかく、ちゃんと出力ができたのです。
※後日談 実はtSNE解析、EZRでできるそうです。なんじゃそりゃ。ちなみにちゃんと勉強すると今回のデータに対してtSNEを使うのはあんまり適切じゃないようです。おいおい。さらに、Colabでの解析は結局レポート提出期限には間に合わず、何が言いたいのかよくわからない実験と結果をつらつら並べた悲惨なものとなったのでした・・・。トホホ・・・。
コピペでいいんだ。ほかにもできることありそう
ここで僕が悟りを開いたのは、「プログラミングは問題解決の手法であって、目的ではない」ということです。第一次、第二次ブームではプログラミングで何をしたいのか、すなわち目標をまったく考えていませんでした。免疫学講座の実習で学んだのは、プログラミングはまず動かす、実装することが大事、ということです。少なくとも素人がプログラミングをしたいなら、プログラミングの勉強→やりたいこと→実装 ではダメで、やりたいこと→コピペ・組み合わせ→実装→プログラミングの勉強、のほうが効率が良いようです。
それを踏まえて「深層学習アプリ本」、その他のブログ記事などを読むといろんな知識がするする入ってきて、勉強が進みました。例えば、まず、アヤメデータの分類がしたい、という目標があり、ブログ記事などのコードを真似=写経し、実際に動くことを確認、その後それぞれの行が何を意味しているのか勉強しました。わからない部分があってもこだわりすぎず、先に進めました。お手本のコードが大方理解できたら、自分オリジナルの課題を見つけて、その課題を解いてみました。
以下に、僕がその後やったことを簡単にまとめます。
アヤメデータの分類(写経)
健診データの分類(オリジナル課題)
MNISTをニューラルネットワークで分類(写経)
MNISTをCNNで分類(写経)
肺X線画像の男女判別(オリジナル課題)
特に、自分で達成したい課題を決めて、具体的な問題に取り組みながら勉強する、という手法が良かったのだと思います。
挫折しかける、先駆者の講演
上にやったことを簡単にまとめましたが、それぞれの項目で問題なく進んだわけではないです。様々なわからないことがあり、解決できないエラーがあり、苦労しました。深層学習モデルそのものに対するエラーより、データの読み込みや整形などで手間取ることが多かったように思います。一つのエラーに1週間引っかかる、なんてこともざらにありました。
いくつかのエラーがどうしても解決できなくて、冬の時代に入りかけたことがありました。そんな時、ある医局の掲示板に「プログラミング初心者がAI研究をはじめるには」という内容で講演があるよ、というポスターがありました。今思えばそれは外部から講師を呼んだ医局内の勉強会で学生向けではなかったのですが、興奮した僕はその場で困惑する秘書さんを捕まえ、参加させてください、とお願いしたのでした。
講演してくださったのは東京大学循環器内科の小寺聡先生でした。先生は完全初心者からプログラミングの勉強をはじめ、心不全の判断をX線画像から機械学習で行う研究をされていました(最近論文が出版されています)。医療者がプログラミング勉強をする難しさにも触れられ、そのうえで皆さんにもできますよ、ということを伝えていただきました。
そこで紹介されていた勉強法が僕が行っているものと似ていたので、非常に勇気をもらいました。おおざっぱに言えば、初心者がコードをゼロから書く必要はなく、ネット上で公開されている記事やKaggleのコードをまずコピペして、それを自分の課題に対応させるのが良い、ということです。僕は教室の隅で講演を聞き、今やっていることは間違っていない、勉強を続けるぞ、と決意を新たにしたのでした。
その後と具体的な研究への参加
そんなこんなで僕はコロナウイルスの肺炎判別、を作ることができました。最初は精度低かったですが、データを増やしたり、転学習を行ったりしてだんだん良いものになっています。
僕は実際の現場に関わるデータを扱いたい、と思い、学生の研究参加を歓迎しているある講座に突撃しました。教授と相談し、この講座では深層学習をすぐには活かせないけど、他の講座でやりたがってるところがあるから紹介してあげるよ、ということになりました。その後実際に紹介があり、ある医局で現在、生の臨床のデータを扱って研究を進めようとしています。(まだ環境構築の段階です)
ここがゴール(僕の現在地)です
終わりに
ここまで読み進めていただいてありがとうございます。思っていた数倍長くなってしまいました。
おそらく、Prpgateなど基礎的な勉強をしたものの、次が続かない、という冬の時代にいる医学生は多いのではないでしょうか。そのような方々が、僕の軌跡を少しでも参考にしていただけるとありがたいです。医学生のプログラミング勉強法、みたいな話はまた別で書こうと思います。今回はある平均大学生の「うまくいかなかった感じ」を伝えることを主眼としました。
また、この記事でいくつかのサービスだったり本だったりを紹介しましたが、それらが無意味、というわけではありません。それぞれ必要な勉強だったと考えています。それらの組み合わせが重要ということです。
実際に研究を進めた実感、医学生がプログラミングすることについての意義、将来性、勉強法、これから先にやろうとしていることは別記事とします。機会があれば書きます。今回はここまで!どうもありがとうございます。