ビットコインと癌とひらめきとネットワーク

ずっと前からぼんやり考えているアイディアと、昨日思いついたアイディア。

 ビットコインの仕組みがよくわかっているわけじゃないけど、癌との何らかの類似性がないかを考えている。組織の定常性が保たれている状態から、ある時から癌が発生していく状態が、ビットコインが負のサイクルに陥って終焉していく状態に似ているのではないかという妄想である。そもそもビットコインが終焉していくのがどういう状態なのか誰もわからないので、そんな類似性が本当にあるのかわからないが。ビットコインが終焉する段階では、マイナーの数も減り、簡単に誤ったブロックを生成することができるようになり、そのようなブロックがあちこちで生み出されるような気がするのである。そのような状況が本当に訪れるのかわからないが、癌と類似するのではないだろうか。この世の中の安定性や定常性は、手段があっても時間内にできないという事を基盤に保たれていることが多く、暗号もその一つだ。そのあたりと癌の類似性がどうなっているのか、なんとなくひっかかるものがある。そこらへんに若い頃は癌が発生せず、年齢を重ねてから癌が発生する秘密が隠されている気がする。とはいっても、生体はビットコインよりもずっと複雑だし、具体的にどのようにアナロジーを考えればいいのか全くわからないけどね。

 もうひとつは昨日思いついたアイディア。ディープラーニングで、特徴次元を落とした多次元空間を探るのは難しい。一つの学習モデルが作られたとしても、それを他の構成のネットワークに流用することは難しい。こういうのを人間はどうやってやっているんだろうか。僕が何かを考えていて、一番楽しいのは、全く別の場所のアイディアを他の場所に投影すると、意外な類似性を示すときだ。例えば、(本当にそんな類似性があるのかわからないが)上の段落で書いたビットコインと癌のように。これは、ある場所で使っている認識の構成を、他の場所に流用することとも考えられるかも知れない。つまり、人間は、特徴空間の構造を識別して、他の特徴空間と比べたり、ある場所で使っているネットワークを他の場所でも使ってみるというようなことが柔軟にできるのかも知れない。

 忘れないように書き留めておく。

Chainerの勉強中

とてもわかりやすい本です。読みながら勉強。

途中でお世話になったサイト 〜Pythonの基礎知識〜

Pythonの知識ゼロなので、適宜ググりながら読み進める。
Python: オブジェクトのメソッド一覧を取得する
Pythonでのファイル操作
クラス継承
Chainer v1からChainer v2への移行
Python入門 – リスト・タプル・辞書
__future__ モジュールについて

Rubyと違うところなど

・Pythonでは関数はオブジェクト
・Pythonでは空白インデントが意味を持つ
・Pythonではファイルが自動的にモジュールになる

Chainerのバージョン確認

Configオブジェクト

trainモードとtestモード

Variableクラス

numpy.ndarrayまたはcupy.ndarrayを梱包している。
どの関数から生成されたか記憶してあるため、計算グラフを構成できる。

ネットワークのグラフを描写する

誤差逆伝播の対象にするかどうか

Functionクラス

大量にあってどれが大事なのかよくわからない
https://docs.chainer.org/en/stable/reference/functions.html

Linkクラス

全結合のもの

p77 Chainerの主要クラスの関係性が秀逸

Optimizerクラス

Trainerクラス

なんとなく半分ぐらいわかった気になったので、exampleのコードを改変して遊んでみる

最小限MNIST

この資料が大変よい
Chainer: ビギナー向けチュートリアル Vol.1

MNISTでCNNもやってみる

Mnistのデータを3次元で呼ぶ必要がある。RubyとちがってMapできないから面倒だなと思ってforループで変換していたが、
chainer.datasets.get_mnist(ndim=3)
すればよいのだ。

MNISTのはずれ画像を眺めてみる

人間でも間違えそうなものと、人間だったら間違えないものが含まれている。とくに8は間違いすぎていると思う。
全体的に値の少ない文字のほうが間違いにくいという傾向があるように思われて、とても興味深い。










データセットクラス

データセットもクラスであると。(numpy配列, 正解ラベル)タプルの集合みたいになっている。
あらかじめchainerに同封されているサンプルデータもある。
・MNIST dataset
・CIFAR-10 (3, 32, 32) 50000 10000
・CIFAR-100 (3, 32, 32) 50000 10000
・Penn Tree Bank dataset as long word sequences (929589, 73760, 82430)
・Penn Tree Bank word vocabulary (dict 単語=>数字)
・SVHN dataset (3, 32, 32) 73257 26032

オプティマイザ

・AdaDelta
・AdaGrad
・Adam
・MomentumSGD
・NesterovAG
・RMSprop
・RMSpropGraves
・SGD
・SMORMS3

イテレータクラス

以前は自分でfor文書いてたらしい
・SerialIterator
・MultiprocessIterator

アップデータ

・Updater
・StandardUpdater
・ParallelUpdater(parallel GPU Updater)
・MultiprocessParallelUpdater(multiprocess parallel GPU Updater)

目標逆算と予想介入 2つの考え方

これから1ヶ月〜数カ月ぐらいかかるような大きめ仕事が増えていくと思うので、昔の記憶を思い出して書いてみる。

 これから書くことは、私が大学生の時に学祭の準備をしながら考えたことである。だから本当はかなり前の話になる。

 社会に出てからは「何をやるべきか」について自分の頭で考えて決断しなければならないような機会は少なかった。避けてきたと言ってよいかもしれない。世間では、自分の頭で考えることが大事だと言われている。しかし実際には、自分の頭で考えることが望ましいとは限らない。狭い視野で考えた結果が、集団心理に流されるよりも正しいという保証はどこにもない。個人の狭い考えで何か事を起こして、いざ問題が起こったら大変である。そうならないように、組織は大きな力で個人が自分の考えで行動しないように工夫している。それに第一、自分の頭で考えるということは大きな苦行なので、あまり続けていると精神がまいってしまう。こうしてみると果たして考えることが良いことなのかもわからない。…しかし、今日はその話はしない。

 2つの異なる考え方がある。これを「目標逆算」方式と「予想介入」方式と名づけることにする。世の中には仕事のハウツー本がたくさんあるので、それぞれの方式に、それらしい正式名称があるのかも知れない。とはいっても、大学生が考えたことなので、大した内容ではない。

 大きなプロジェクトに取り掛かるとき、人はそれを細かい仕事に細分化する。大きな仕事を、扱いやすい適度なサイズまで小さく切り分けて、紙に書きだしてリストアップする。頭の中だけで、仕事を整理しようとすると、やらなければならない事に抜けが生じるので、紙に書き出すことが大事だと思う。大学祭の準備で、僕が仕事が進まずに困っていると、ある先輩が「困っていることを全部紙に書きだしたか?」と尋ねてきた。紙に書いて、問題を実際に実行可能なサイズまで分割することが、とても大事だというのだ。これが「目標逆算」方式の考え方だと思う。

 大学生はみすぼらしいけど、夢がある。大学祭でも大きな理想を立てる。「これがやりたい」「あれがやりたい」と大きなプロジェクトが立ち上がる。一度目標を立てたら、その目標を達成するために必要な「やらなければならないこと」をノートにリストアップする。まず目標を立てて、逆算して仕事を分割し、最後に実行するので、これを「目標逆算」方式と名付けた。この、目標逆算方式は、確かに最初はうまくいくのだが、やがて目標と現実の乖離が目立ち始め、締め切りが近くなると、「あれも間に合わない」「これも間に合わない」として、否応なしに目標の方を下げていくことになる。少なくとも私の場合はそういうことが多かった。そして、大学生らしく、最後は徹夜の突貫工事が始まるのである。そして、プロジェクトが成功しようがしまいが、終わったあと、ちょっとした心の傷を負うのである。(それもよい思い出である)

 どうして、必ずこうなってしまうのか、うまくいかないのか。悩んでいた時に思い浮かんだのが「予想介入」方式だった。これは、目標逆算とは逆の方法だ。まず、目標は立てない。何をやろうとも考えない。もしも何の対策もせず、地球を放置していたら、この先ものごとがどう回転していくか、人々が何を重い、どう行動するかを、勝手気ままに予想する。その上で、望ましくない未来が生じる兆候をみつけた場合は、それに対してどのような変化を加えればいいか、介入すればいいかを考えるのである。この方法を使うと、「目標逆算」では想像していなかったようなボトルネックに気が付きやすくなる。それに目標逆算方式よりも、人々の気持ち…たとえば怠け心とか…汲んだ予想が行われるので、たとえ成果があがらなくても、「予想した未来よりはマシな結果になったな」と考えて、心の傷も負いにくいことがわかった。この方式を未来の予想に介入するため「予想介入」方式と名付けた。しかし最終的なアウトプットが、先ほどの目標逆算方式よりも高くなるとは限らない。

 以上が、つまらないが大学生のときに考えたことだ。自分の頭で考えて行動している人たちからみると(そういう人が多いとも思わないが)、ごく当たり前で初歩的なことが書いてあると思う。

 私は「予想介入」が苦手だ。だから、もし「目標逆算と予想介入のどちらがより高度な方法なのか?」と言われたら、「たぶん、予想介入の方が高度な方法なのだと思う」と答えるだろう。なぜならば、予想逆算は自分自身に対する予想ふくむ。つまり自己言及的要素があるためメタ度が高く難しいと思われる。また、予想逆算は、自分自身の心の中にあるポリティカル・コレクトネスを一時的にoffにして、自分自身の直感的なセンサーに正直になる必要がある。これも大変難しいことだ。

しかし、世の中には予想介入にばかり特化して、およそ目標逆算はできないといった人々も確かにいるらしく、その人たちはその人たちで、困ったものだろうと思う。

 実は最初は、目標逆算方式のことを「理想追求方式」と名付けようと思っていた。でも予想介入方式が理想を追求していないのかと言ったら、そうじゃないと思う。このあたりは「理想」、ひいては「自尊感情」、「モチベーションの維持」などの問題が絡むので考えるのが難しいところだ。そういうわけで十分に頭の中で整理できないので書けない。きっと誰かがいいことを書いているのだろうが、どうやってググればいいのかもわからないので調べにくい。

人工知能に神を期待すること

タイトルは釣りみたいなもので内容も中2みたいなエントリーだが、4月ごろからフワフワと考えていて、なかなか文章にできないことをアウトプットしてみる。

人工知能脅威論ってネット上でもよく見かける。たとえば

 > 将来は人工知能が全部決めて人間が従うだけ
 > 人工知能が人間に対抗してくる 

などなど。でもディープラーニングによる画像認識のようなちゃちなソフトを人工知能と言うなら、これはおかしな話だと思う。
なぜこんな認識違いが起こるかというと、実は人工知能が脅威だと思っている人と、そう思っていない人ではそもそも人工知能に求めている「機能」が違うんじゃないかっていう話です。

少し話が飛躍するかもしれないが、どんな組織でもいいので、日本型組織を想像してほしい。
働かないトップがいる。実務家がいる。

トップは必ずしも物事の詳細について詳しいわけではない。実務家ほど仕事ばかりやっているわけでもない。全体の方向性を決めたり、たまに口を挟む程度で、実権はあまりない。単なる偉い人だ。
一方で実務家は現場で指揮を取ってあくせく働く。知識も経験も豊富だ。何か決定したら、トップに奏上する。トップはこれを承認する。

実は、トップは余裕がある組織でないと養うことはできない。実務家だけの組織や、実務家がトップを兼任している組織はたくさんある。
それでも、僕は、働かないトップがいる組織の方がパフォーマンスがいいのを何回も見てきた。働かないトップを支えるのは日本型組織の一つの理想形だと思う(多分)。ただし働かないトップを養うためには組織の余裕がかなり必要になる。ある意味贅沢品である。(豊かであるからトップが養えるのか、トップがいるから豊かなのか、というのは難しい問題である。)

ここで、トップの果たしている役割と、実務家の果たしている役割は全く違う。
にもかかわらず、トップは実務家のように知識や実行力が豊富であるべきだとされ、実務家はトップのように品格のある人であるべきだとされる。

トップの果たしている「機能」は明らかに重要だが、その意味・内容は実務家のもたらす「機能」と違って明瞭ではない。トップとは何をしている人なのだろうか。

私は仕事でも、あえてこの「トップ」の持つ役割・機能を意識して振る舞うときがある。つまり自分は何もしなくても、ただ黙って傍らで他者の仕事を眺めているだけで、自分は何らの知識や技能がなくても、何もしないよりはうまく仕事が回転していくことをよくある。本当に何もしていない。ただ横にいて見ているだけなのだ。誠に非科学的な話かもしれないが、この時、私は心理的には上司や同僚や部下の心理的負担に手を差し伸べている。お金に例えると、自分はなにもしていないが精神的に作業に「出資」しているような状態だと思う。私は実際には何も働いていない状況ではあるが、人々は私の精神的な出資率も高いと判断して、私も仕事の完遂を願っていると判断して勝手に行動してくれる。そして、終わったあとなぜかとても感謝される。

一方でこの精神的な出資のことを意図的にまたは無意識のうちに軽視していると、どんなに実務能力があっても、あいつは「未熟」であると影口を叩かれる。

このような状況は誰しも経験するのではないだろうか。

上司がまだ仕事をしている時に、特に用事がなくても居残ってしまう日本人の奇妙な性質もこれで説明ができる。例えシゴトをしていないくても、上司と一緒に居残りしている彼は精神的に出資をしているのだ。そしてこの精神的な出資が、とてもありがたく感じられるのである。(念のために書いておくと、そのような仕事法の総合的な善悪までは私は判断しかねる。)

出資者には当然要件があって、それは「仕事の成功を強く願っている」ということが必要だ。逆に「願う」ことさえできれば実務能力はゼロでも構わない。

では「願う」とは何なのだろうか? 既存の枠組み…たとえば強化学習の延長線上で、それは実現できるのか?

その答えは現状では2通りあると思う。(1)マシーンは願っているふりをすることができる (2)マシーンが願うことは実現できていない。
両方共正解だ。欲望するコンピュータというものがまだ開発できていないので(2)は当然だ(本当かな?)

それより(1)に注目したい。人間は仮想的なマシーンを頭の中に構築することで、願っているふりをするマシーンを作ることができる。え?意味がわからないって?もう少し読み進めてほしい。

組織や国家は、昔から膨大な予算をかけてこれをやってきた。卑弥呼の時代から、人々は祈祷をしてきた。シャーマンとはひょっとすると、願う力の強い人たちである。膨大な僧侶を雇い、彼らは鎮護国家を祈祷…「願って」きた。僧侶は膨大な知識を使って仏教理論を構築していった。

奈良の大仏様をみてみよう。人々はコレが銅の塊に過ぎないことを知っている。しかしそれは同時に宇宙の真理を人々に照らし悟りに導く仏なのである。平安時代の人々は仏教による鎮護国家を目指して、真面目に国家予算を使ってこの大きなオブジェを作った。

このオブジェは実質的には何の機能も持たないが、「願う」機能を持つと想定されるオブジェであり、人々を何もせずに「見て」いるのである。つまり擬似的に「トップ」の機能を実現したマシーンの一種だと言ってよいかもしれない。

あるいは、本当の意味で作られたものは、「毘盧遮那仏」という概念であり、この仏像はそのガワに過ぎないにしても…
「大仏様」は人々の頭に毘盧遮那仏という概念を無理なくインストールするための装置だと考えると面白いと思う。

つまり、この点でも歴史は繰り返しているのだと思う。作ろうと思えば、「トップ」すなわち「神」の機能を持つ「人工知能」は作れる。なぜならば「人工知能」に求められている機能は、「神のような実務能力」ではなく「神」の能力なのである。とすると必ずしも高度な実務能力を実装する必要はないからだ。昔から多くの天才的な「神エンジニア」たちがが国家のために働いてきた。そして現在も…

さて君たちも神を作ってみる気になったかな?
一つアドバイスするなら、神を作りたいなら必ずしも人工知能は要らないということだ。

まあ中2的文章を、これ以上書くと自分でも恥ずかしくて恥ずかしくて大怪我しそうなのでこのへんで。でも書かないと気が済まなかった。

numo-gnuplot playground

今日の落書き red-arrowで遊ぶ

難しそうなので今日まで敬遠していたred-arrowを使ってみた。
公式の通りインストール。手順通りコピペでインストールしているだけなので何もわかっていないけど、そういうアホなユーザーも世の中一定数いるから仕方ないよね。Pythonの方もcondaでPyArrowをインストールした。

難しそうなので公式のexampleを試すだけ

パイソン

ルビー

おお、普通に動くじゃないか…。
/dev/shmというのが何か気になったのでインターネッツでググるとRAMディスクのことらしい(正確には違うらしい)。

ということは…なにこれすごい∑( ゚д゚ )

公式スライド

正直Webサイト製作に関するプロの道具であることを求めなければ、Rubyでデータ解析できる状況は十分に整ってきていると感じる。

機械学習に関してはscikit-learnのようなライブラリの力を借りる必要があり、pycallを呼び出して適宜red-arrowでデータを変換していくような使い方が望ましいのかもしれない。

RubyやPythonといった便利な道具があることを知らない or キャリアをまともにこなしていると学習コストを支払えない制度設計になっているために、プログラムでやった方が早いことも含めてプログラムと縁のない方法で仕事をこなさざるをえない非エンジニアの世界の方が、エンジニアの世界よりも広いのである。。

今日の落書き Rubyでアヤメ(Iris)のデータを眺める

データを用意する

https://raw.githubusercontent.com/pandas-dev/pandas/master/pandas/tests/data/iris.csv

Jupyter Notebookを起動する

※ホビーでRubyを手軽に使うのにJupyter Notebookが必ずしもベストとは思わない…

ライブラリを読み込む

CSVファイルを読み込む

SepalLength SepalWidth PetalLength PetalWidth Name
0 5.1 3.5 1.4 0.2 Iris-setosa
1 4.9 3.0 1.4 0.2 Iris-setosa
2 4.7 3.2 1.3 0.2 Iris-setosa
3 4.6 3.1 1.5 0.2 Iris-setosa
4 5.0 3.6 1.4 0.2 Iris-setosa
5 5.4 3.9 1.7 0.4 Iris-setosa
6 4.6 3.4 1.4 0.3 Iris-setosa
7 5.0 3.4 1.5 0.2 Iris-setosa
8 4.4 2.9 1.4 0.2 Iris-setosa
9 4.9 3.1 1.5 0.1 Iris-setosa

アヤメの品種を確認する

Name
0 Iris-setosa
50 Iris-versicolor
100 Iris-virginica

基礎統計量を表示してみる

PetalLength PetalWidth SepalLength SepalWidth
count 150.0 150.0 150.0 150.0
mean 3.759 1.199 5.843 3.054
std 1.764 0.763 0.828 0.434
min 1.0 0.1 4.3 2.0
max 6.9 2.5 7.9 4.4

グループにしてみる

SepalLength SepalWidth PetalLength PetalWidth
Iris-setosa 5.006 3.418 1.464 0.244
Iris-versicolor 5.936 2.77 4.26 1.326
Iris-virginica 6.588 2.974 5.552 2.026

アヤメの品種ごとにデータをわける

SepalLengthのヒストグラム DataFrameから

Nyaplotを使う場合

※ Daruから NyaplotやGnuplotrb、Plotlyを通してグラフを描けるらしい. 残念ながらNyaplotの開発は止まっている…

SepalLengthのヒストグラム Statsampleから

StatsampleがDaruと統合する前に独自に持っていたグラフ機能が残っている

setosaの散布図を描く

Nyaplotを使うとき

Numo::Gnuplotを使うとき

Daru::Vector→RubyArrayへの変換が必要。

相関係数を求める

SepalLength SepalWidth PetalLength PetalWidth
SepalLength 1.0 0.747 0.264 0.279
SepalWidth 0.747 1.0 0.177 0.28
PetalLength 0.264 0.177 1.0 0.306
PetalWidth 0.279 0.28 0.306 1.0

散布図行列

現状では簡単に描く方法は存在していないとおもわれる。

単回帰分析を行う

Numo::Gnuplotで回帰直線を描く

多分Nyaplotでも描ける

重回帰分析

【Ruby】 Numo::Gnuplot で箱ひげ図 (boxplot)

忘れないうちにメモ

1.配列をさっと比較したいとき

2.ラベル付きのデータのとき

using の設定がややこしいけど、丸暗記するしかないっぽいね

医療とAIの未来について再び妄想する

頭の整理をするために、また医療とAIの未来について考えている。

医療データサイエンス 1.0

これは、近い将来にきっと起きる変化だ。AIの医療応用を考える多くの人が思い描いている未来だ。
具体的には
・CTやMRI画像などが、Deep Learning技術で自動的に診断できるようになる
・医療用のデータセットを作成する患者団体や、病院、学会が現れる
・APIを用いて医療データを取得する手段が整備されはじめる
・データセンタを持つ企業が医療データを低価格で診断するサービスを始めてデータを収集・蓄積しはじめる 
・対抗して、よりオープンな医療データセットやオープンなモデルも公開される
・大病院が工学技師としてデータサイエンティストを雇いはじめる
・もしくは医者がデータサイエンスをかじりはじめる
・少しずつ人工知能が普及しはじめる
・画像診断の精度、血液検査の精度、内視鏡の精度、遺伝子の解析、心電図モニタリングetc
 すべてでコンピュータが人間を上回る
・個別化された医療が行われるようになる
・診断だけではなく、治療にロボットの活用がはじまる
・確実にどんどん成果を生まれ、治療成績も激的に向上していく
・にもかかわらず、不思議なほど医療そのものには何らの変化がない なんでだろう?
・保険点数が厳しく減額され、利益が減少したりする
・IT企業に対する患者の医療訴訟が多発するようになる。高額の賠償が請求される事例も発生する
・IT企業も、次第に状況を理解して(最初は不合理だと思っていた)製薬会社のやり方を真似するようになる
・もしくはもともと無料でサービスを提供できる体力のあるところだけが他の会社を焼き払う形で生き残る
・最初からこうなることを見越していた老舗企業もしぶとく生き残る
・患者とエンジニアの間にゆっくりと失望が広がっていく
・業界の熱気が冷めて、少しずつ落ち着いてくる
・なんかいい感じになる
といった感じだろうか。とってもワクワクしないよね。あまりにも想像するのが容易だ。
妄想にしても陳腐だ。
こういったことに無邪気に夢を感じるには、少し歳をとりすぎた気がする。

問題は、ここからだと思っている。上記の筋書きはちゃんと考えれば誰もが見通せる素直な未来だ。
未来は、だいたい思い描いた通り素直には歩いてくれない。

医療データサイエンス 2.0

上で描いた1.0は人工知能は、あまり医療の本質に触れていない。
つまり1.0は来るが、そのままの形ではこない。

僕が思いつくだけで大きな焦点は2つあると思う。
1つ目の焦点は、割と簡単だ。簡単だということは、乗り越えうるということである。
乗り越えた先は、たとえばアルファ碁のあとの囲碁界みたいな事になっていると思う。ある意味楽しい世界である。

2つ目の焦点も簡単だが、もう少し医療の本質に関わる問題である。
この問題が乗り越えられるかどうかはわからない。乗り越えるとしたら、人工知能は俺が考えているよりもやばい。
少なくとも、今の段階では人工知能がこういった問題を乗り越えることは想像できないな。多分、人工知能はこの問題を乗り越えられずに迂回すると思う。
少なくとも人間は、こういう問題を直接乗り越えるよりは迂回することを好む。

この問題について、ちょうどいいツイートがあったので引用しておく

そしてその根本にある問題や、その他の問題もおぼろげに見える気がする。

いつものことだが妄想日記にしても考えがよくまとまらない。

考えれば考えるほど、やっぱり人工知能も今までの技術革新と同じで、結局は医療は変わらないという説の方を採用したくなるね。

Rubyを使ってDICOM画像で遊んでみる

RubyでDICOM画像を扱う情報がほとんどないので少しずつメモしてみる。

ruby-dicomhttps://github.com/dicom/ruby-dicom

インストール

DICOM画像を読み込む

メタデータを取り出す

画像データを取り出す

IRuby Notebook上にDICOM画像を表示する

imageメソッドで、ImageMagickオブジェクトに変換できる。
内部ではrmagickもしくはmini_magickが動いている。
rmagickは更新が滞っているので、mini_magickがおすすめ。


※画像はDSB2017に使用されたsampleの1つです

ヒストグラムを表示する


Guido ZuidhofFull Preprocessing Tutorial
の序盤をRubyに書き換えてみた。とりあえず動いてくれればOKという発想なので、例によって間違いあるかも。