Skip to content

データセット、データセット

25-9月-16

 VGGによる画像分類は面白い。もしデータセットがあれば医用画像で人間の認識を超える精度を出すこともできる気がする。特にCTでは、あっという間に人間を超える高精度を出してくれそうでこわい。もしもCTの読影をDeep Learningでやらせようとすると、いくつかの課題があるように感じられる。第1に、個人情報保護の問題、第2に、完備されているデータセットを作ることが難しい問題、第3に、自動運転のような安全性に関する問題がある。
 このうちで最も問題になるのは、データセットを作るところだと思う。もちろんまず個人情報保護をきちんと解消しないとデータセットは作れなが、安全性に対する不安は、一旦高品質な分類器が作られ始めると、世間の反応は変わっていくのではないかと思う。今現在でも、レポート文章とレポート添付画像を使ってCNNとLSTM組み合わせて学習させれば相当なところまでやれるのかも知れない。国内でこういう事をこっそり研究してそうなところは富士フィルムさんかな。放射線科医はこの問題についてどう考えているのだろう。

 雑多な資料をながめていて思ったのは、ImageNetという団体が主催するコンテストによって画像認識がどんどん進化していったということ。そのようなコンテストが色々な領域で生まれて、やがて医療をとりまく環境も少しずつ変わっていくのでしょう。あるいは、オープンなデータセットが作られないまま謎の方向へ進化していく道も薄っすらと想像されるが、そちらの方向はあまり望ましくないと個人的には思います。

Ruby で畳み込みニューラルネットワーク(VGG-16)

23-9月-16

RubyでVGG16による画像分類を書いてみました。

行列計算はいつも通りNumo::NArrayを使いました。
学習済みの重みとバイアスは、こちらのchainerモデル(元々はCaffe)から取り出しました。

convの部分は、Rubyのループと、NArrayの行列計算が同居しています。遅いですがメモリをあまり食いません。
まだまだ改良の余地はありそうです。しかし、Pythonを使って計算したモデルを使っていますので「Ruby で Deep Learning」はできていませんね。

落書き Neural network visualization with Ruby

12-9月-16

よくある重みの途中経過とか見せるやつ。Numo::NArray + dRuby + Ruby/Tk
作り途中もいいところだけど、それなりに動いってるっぽい。
nn_visalization

人間と社会環境の相互作用としての病気

06-9月-16

 以下、与太話が延々と続くので真面目な人はあまり真に受けないでほしいです。

 強化学習をやっていてふと考えた。病気とは何だろう。

 病気とは何か。そこにはいろいろな視点がある。例えば「正常であるものと正常でないものの境界は人間が決めるから、健康と病気も人間が決める」という考え方がある。なるほど、そう思う時もある。

 「未だかつて存在せず、これからも決して存在しないが、成立してもおかしくなかった病気。」というのがある。これは何かというと、人類には潜在的にそのような病気にかかるのに十分な構造があるけれども、その病気は頻度として極めて稀であるため、結果的に人類の誕生から滅亡まで、誰1人その病気に罹患しなかった(だからこの病気は存在しない)。というものである。この「存在しない病気」を私ちが知ることはないけれども、きっと存在する。ではこの存在しない状態は「病気」と言えるのだろうか?
 そこまで抽象的じゃなくて、ある病気と別の病気、あるいは健康と病気の境界のグレーゾーンについて考えてみる。病態をいくつに分割するかは、虹の色をいくつに分割するかと同じで恣意的なものだ。時代が新しくなるとともに、それまで一つの症候群としてまとまっていた病態が、複数の病気へと分類されていく。私は病気の分類の複雑さは、その病気が本来持つ性質ではなく、人間が今まで経験した症例数と比例しているのではないかと疑っている。人間分類器は似たような状態を一定数経験すると、それを新たに分類したがる性質を持っているからだ。けれども、あまりそういう話は聞いたことがない。やっぱり病気は病気で、最初から存在する、という考え方の方が人気がある。

 「果たしてチンパンジーは病気なのか?」という疑問を考えたことはあるだろうか。これは結構難しい問題で、チンパンジーを人間の病院で検査すれば多くの異常が発見されるだろう。健康診断なら間違いなく赤点だ。しかし、人間の標準からかけ離れているからといって、チンパンジーを「先天的な遺伝子疾患」であると見なすのは、あまりにも可哀想じゃないですか? チンパンジーが人間の病院でいくら病気の診断をもらっても、森林では元気に生活することができる。チンパンジーという状態は森林という環境によく適合しているのである。とすると環境に適合していることを「健康」と言ってよいのだろうか? それも、少し違う気がする。

 ここで、最初の話題に立ち返えろう。病気とは何だろうか。

 結論からいうと、現代社会で問題となっている「病気」は、病気が単独で存在しているのではなく、環境の変化に起因するものが少なくないのではないかと感じる。もう少し丁寧に書くと、太古の時代の環境に最適化されている人間の身体が、現在の環境に対応できていない状態のことを私たちは「病気」として認識しているのではないだろうか。(もちろん全ての病気が…というわけではなくて、現代社会でメジャーな病気が…という意味です。私達は何万世代とチューニングされているのですから、現代においてなお残っている「病気」の意味を考える必要があります。)

 例えば「糖尿病」は飢餓と低血糖に苦しんでいた人類が、飽食の時代に対応できずにいる状態とみることができるかもしれない。長い年月を慢性的な飢餓と低血糖に悩まされていた人類は、高血糖に対応して血糖値を下げるホルモンを1種類しか用意していなかった。そこで現在のような飽食の時代になって高血糖の状態が当たり前になると、簡単に不具合が発生してしまう。人類はインスリンを注射で補充するようになった。食欲も適度に抑えられ、結果的に肥満にならない人が健康的だと見なされるようになった。しかし、これは「飢餓はもう問題ではない」という社会環境が前提にあってはじめて成立する疾患ではないだろうか。

 誤解を恐れずに書くと、やはり糖尿病であることは生存に不利である。だから長い年月の後には糖尿病の人は少しずつ減少していくだろう。それは見方を変えれば、人々の飢餓に対する適応力が失われていくことにもつながるのではないだろうか。そうすると、一体どちらの状態が「健康」なのだろうか。飢饉に強い性質か? それとも飽食に強い性質か? その答えは人間だけ見ていても決まらず、社会環境によって左右される。つまり病気が独立して存在しているのではなく、社会との相互関係のなかで病気の範囲が定義されいる、ということにならないだろうか。

 心筋梗塞や脳梗塞など、動脈硬化と血栓に起因する病気には、血液をサラサラにする抗凝固療法が行われている。血液をサラサラにする薬を飲むことで血液が固まって血管が詰まることを防いでいる。ところが、血液がサラサラにして血を止まりにくいということは、怪我などで出血した際にも血が止まりにくくなるということを意味する。狩猟採集の時代には、恐らく現代とは比較にならないほど怪我が多かっただろう。そのような環境では出血が止まりにくいということは、それだけで生存に不利になると推測される。つまり「怪我による出血はもはや問題ではない」という社会環境のあって、はじめて血液ドロドロという性質が是正されるべき「不健康」な状態として立ちはだかるようになったと考えられるかも知れない。

 人は不老不死を求めてきたけれども、老化に介入する有効な手段は未だにみつからない。そういう意味では、現在行われている治療は、乱暴にまとめればすべて「延命治療」と言えなくもない。そこで私達は何をしているかと言えば、太古の時代に最適化され、新しい環境についていけない生体の性質を、薬剤を投与することで、より生存に有利な方向、あるいは勾配に傾けているのである。そうすることで生体をより現代環境に適した状態に変えて、結果として寿命を伸ばしているのである。そしてその生存に有利な方向・性質というものは、必ずしも人間の身体単体だけで決まる独立した定数ではなく、身体をとりまく社会環境によって大きく変化しうるものらしい。つまり、病気や疾患とは、私達が思っている以上に社会環境に依存する存在であり、環境と人間との相互作用の中に立ち現れてくるものだということになる。おまけに現代社会では社会保障制度が発達して、どの程度まで生体の性質を変化させられるかは、投入できる社会的な医療資源の量にも大きく左右されるようになった。

だとすると病気を治療するとは本当はどういうことなのだろう?

 強化学習を眺めていて、ふと、そんなことを考えた。なんだかもう予想以上に風呂敷を広げすぎたようで、頭が痛くなってきたのでこのへんで。

落書き Ruby/Tkでリアルタイムプロット

05-9月-16

使うもの
・Ruby/Tk + Plotchart
・dRuby

Ruby/Tk はThreadとの相性が非常に悪く、非同期処理やメインループを2つ回すような作業をやろうとすると上手くいかないことが多いです。
そこで真ん中にdRubyサーバーを挟みます。これで大抵の処理はRuby/Tkでリアルタイムに表示することができます。

drb.rb

env.rb

plot.rb

あとはdrb.rb、env.rb、plot.rbの順番に実行します。
終了するときはゾンビプロセスを残さないように気をつけます。

学習中や、順伝播中のニューラルネットワークの重みを表示するみたいなよくあるネタをやってみようかしらん。でもそれだけじゃあまりにも面白くないからもうひと工夫したいところ。。

雑記 人工知能やプログラミングを勉強する素人について考える

04-9月-16

 この日進月歩、一日千秋、不老長寿の時代、IT業界と直接縁がなくても「人工知能ってどんなものだろう?」と興味をもって、何となく暇な時間を使ってプログラミングを勉強したり、ニューラルネットワークについて調べたりしている人は決して少なくない。

 そういう人の一人として、別に使いこなせるわけでもなく、使いこなす必要すらないChainerの資料とかをボーッと眺めて週末を過ごしているわけだが、「ソフトウェア開発が本職ではない学生や研究者が多く参加している」というフレーズが頭に飛び込んできた。

 誤解を恐れずに言えば、Python や NumPy が普及したのは、プログラミングの事は考えずに計算や論理に集中すればよくて、雑多なプログラミング技法に興味がない研究者でも使いこなすことができたという点に強みがあったのではないかと思う。神様のような人はたくさんいるけれども、多くの分野の物事が何でもできる人は未だに見たことがない。徒競走が得意だからといって、上手に目玉焼きを作れるとは限らない。そこから類推すると、おそらく仕事プログラミングができる人は、機械学習のアルゴリズムに疎く、機械学習のアルゴリズムに詳しい人は仕事プログラミングの流儀には疎いのだろう。無知を無知のままに温存するという強い需要に応えるためにどの言語でも「ライブラリ」が発達しているのを見ても、人間は一つ以上のことを器用にこなしたりできないことがわかる。

 ここで一つの疑問が浮かぶ。仕事で、プログラミングや人工知能を全く使わない人が、それらを勉強することに何かメリットがあるのか?という問題だ。

 結論から言うと、現時点では、よほど特殊な職業をのぞいて何らメリットはないと思う。メリットはないけど、デメリットはある。頭のメモリーや暇な時間を人工知能やプログラミングなどの生きていくのに不必要な知識の習得に費やすため、何であれ本業に対する悪影響が懸念される。プログラミングを勉強すればするほど、本業の勉強がおろそかになり、本業における競争力を喪失する危険性が出てくる。
 しかし悪影響はそれにどどまらない。学校や職場では、人工知能とは頭がいい人がやる事で、普通の人には無関係だという誤解がある。そのため、おばかさん(と認識されている人間)が人工知能の話を少しでもすると不信の目を向けられることがある。オタクへの偏見もまだまだ根強い。ターミナルを起動しただけで迫害されたという話もよく聞く。100歩譲って「機械学習」という概念について理解してもらったとしても「おぉん? つまりYouは機械を手なづけて、俺達の仕事を奪おうとしているのかね?!?」などの余計な誤解を招き、白眼視されるかも知れない。(人間の介在しない状態を作り出すことで効率化を進めるという発想は興味深い問題を含むがそれは別の話)もしくは哀れみの目線で「悪いことは言わないから、君はもっと時間と能力を有効に使った方がいい。」と優しく諭されるかもしれない。もちろん彼は100%心から心配してくれているのである。どこの空間でも強烈な競争原理が働くため、いずれ人工知能やプログラミングを学ぶことをやめてしまう。もしも、常に賢くて合理的な選択をしなければならないのなら。

 ところで話は切り替わって、仕事で機械学習をしなければならないとしたら、おそらく、RubyやNArrayは選ばれない。Chainerすら選ぶかどうか微妙で、こそこそとRuby本を封印し、TensorFlow や Scikit-learn を勉強し始める自分の姿が目にうかぶ。その理由は簡単で、ユーザーが多くて、その結果として先行事例と動作確認が十分にあり、なおかつ知名度があって世界的にスタンダードになりそうで、顧客や上司や同僚から評価されそう、そして何より最後まで行けそうな道具を選びたい。そんな保守的な思考回路がピュンピュン回るからだ。妄想のなかでもそうなるのだから、実際にエンジニアをやってる人の中では確実にそうなるのに違いない。とすると、永久に日曜プログラマがRubyを使って機械学習で遊べる日は来ないことになる。そんな未来では私が困る。

 ところが、趣味でプログラミングをしているだけなら話は変わってくる。numpyで機械学習なんて世界中の人がやってるけれど、これをRubyに書きなおすだけで何か新しいことをやった気がしてくる。一日一善。早寝早起。七転び八起き。まあ、気がしてくるだけなのだが、焼肉定食、強化学習における「報酬」が簡単に手に入る。何かにコミットした気持ちになる。これ重要。ここでノンエンジニアであることがアウトプットに有利に働いてくる。プロのエンジニアやIT関係者は職業柄正しいことをしなければならないという防衛的なインセンティブがどうしてもある。しかし、ノンエンジニア素人なら失うものがない。間違いだらけのポンコツあっても、特に気にもせず、むしろポンコツを笑いの種に本職の人が来てくれたら儲けもの。という気持ちで適当に遊んでればいい。

 人工知能について考えるとき、人工知能に関わる人間が気になる。単純なニューラルネットワークCNNと異なり、強化学習DQNのインパクトをどう社会的に位置づけるかが難しいように、人工知能の未来については、人工知能そのものの評価よりも、人工知能をとりまくノンエンジニアの人間様の「報酬」や「コスト」について観察して、可能ならばその状況そのものに介入するのがよいと思うけど、これ、自分には手に余る難しさのようだ。

【Ruby】OpenAI Gymで遊ぶためのgemをつくった

29-8月-16

 夏休みなので、取り急ぎ作ってみました。
 ソースコード:https://github.com/kojix2/openai_gym

 OpenAI Gymとはイーロン・マスクらが率いる、人工知能(AI)を研究する非営利団体「OpenAI」が開設したAIシステムに、さまざまなゲームや課題を練習させることができる「ジム」です。人工知能開発のためのベンチマークとなることを目指して地道な取り組みが続いているようです。(内容はAtariゲームなどですが、こうやって人を集めて研究のインフラ基盤を作っていこうとする姿勢は本当に見習いたいと思います。)OpenAI GymはPythonで作られていますのでユーザーもPythonが中心です。GitHubを検索すると、Juliaのwrapperはありますが、Rubyのラッパーは見つかりませんでした。黙って待っていてもなかなか誰も作ってくれないでしょうから自分で手を動してみました。

 仕組みは単純で、open3で呼び出したPythonのプロセスのパイプを通してパックされた数字をPython←→Ruby間でやりとりしています。

 はじめてgemを公開してみたわけですが、IT業界ともデータサイエンスとも無縁な人が趣味と気合だけで作っていますので、変なところ、間違ってるところ、作りかけのところが多々あるかと思います。そういうところを見つけたら Pull Request 等して教えてくれると嬉しいですね。

 Numpyを使った機械学習なら、ちょっとした気合で大半のものがNumo::NArrayに直訳できると思われます。あとはRubyでもGPUを使った高速計算ができるようになればいいなと願っています。

朝三暮四じゃなくて朝令暮改だった

23-8月-16

前のエントリーで、RMSPropのコメントの「朝三暮四」は「朝令暮改」の間違いだった。
日本語能力のなさが露呈した。ところで、朝三暮四のサルたちは、強化学習的にはとても正しい行動をしているのではないか。
そんなことを思った。

それ以前にnumpyとnarrayのfloatのやりとりに完全に失敗しているけど、それでも何となく動いてしまうから人工知能すごい。

強化学習 + ニューラルネットワークがどうやって実社会に応用されていくのか考えがまとまらない。。
Policy gradient ってすごい。

強化学習:ピクセルから『ポン』 をRubyで書いてみた – 1

21-8月-16

強化学習について調べていたところ深層強化学習:ピクセルから『ポン』という面白い記事を見つけましたので、Rubyでやってみました。

4500回ぐらい学習させたところの動画。右側の緑が学習させたAI

まだまだ弱いです。。

Andrej karpathy さんの書いた元記事のPythonのコード (何と132行)を、Ruby/NArray にほぼ直訳しています。NArrayとはRubyでは最速の行列計算ライブラリです。
OpenAI Gym の Pong はPython製なので、Rubyとはパイプで通信することにしました。最初は自作の簡易ニューラルネットワークを流用しようと試みましたが、RMSProp や報酬の正規化などやらないと思うように学習してくれないことが判明したので、諦めて直訳しました。コード量はRubyの部分だけでも270行と膨大な量(100行以上のコードは膨大だという思想)になりましたが、理解のためにごちゃごちゃとコメントを入れたりPythonとの接続で増加した分がほとんどです。エンジニアじゃない人が適当に書いてるので間違ってる部分も多数残ってるかと思いますが、何となく学習できていそうなのでよしとします。

Python側のコードです。pong.py

次にRuby側のコードです。rl.rb

何時間も実行するとだんだんとメモリの使用量が増えていくので、どこかまずい部分があると思われます。

感想

・policy gradient は実装が簡単で素晴らしい。
・強化学習はディープラーニングを用いた分類器よりも奥が深い技術のような気がする。世間の人がいう「人工知能」はこっちに近い。
・強化学習はアルゴリズムが人間の哲学的な領域にまで踏み込んでくる怖さがどこかにある。
・人工知能じゃ実現できないなと思っていたようなことも案外実現できてしまいそうな気がする。
・ボールそのものよりも相手の動きをみてボールの位置を判定しているフシがあり、敵プレーヤーが代わっても実力を発揮できるか少し疑問。
・やはりRubyでも機械学習は可能なのだ。

RubyでシンプルなQ学習

13-8月-16

rl0rl2rl1qv

せっかくなので『機械学習と深層学習』を参考に簡単なQ学習を書いてみる。
hoge

プロットにはnumo/gnuplotを使用しました。

〜早熟なタイプ〜

rl0
早熟なタイプが一番多いけど、あまりグラフが凡例に被らないようにコイツにしました。

〜途中でぐんぐん成長するタイプ〜

rl2
見ていて気持ちがいいです。

〜彼の実力はまだ目覚めていないタイプ〜

rl1
俺達の戦いはこれからだ。

200000回ぐらい試行するとQ値もだいたいいい感じに収束するみたいですね。
qv