▼ヒープソートについて
void sort0(int n, float ra[]){ int l,j,ir,i; float rra; l=(n>>1)+1; ir=n; for(;;){ if(l > 1){ rra = ra[--l]; } else { rra = ra[ir]; ra[ir] = ra[1]; if(--ir ==1) { ra[1] = rra; return; } } i = l; j = l << 1; while(j <= ir){ if(j < ir && ra[j] < ra[j+1]) ++j; if(rra < ra[j]) { ra[i] = ra[j]; j += (i=j); } else j = ir+1; } ra[i] = rra; } }これはNumerical Recipiesのヒープソートのルーチンなんだけど、訳わからなさ過ぎ。(解釈のヒントは配列の要素ra[i]は対ra[2*i]とra[2*i+1]のどちらよりも大きくなるように並んでいなければならないということ。この条件を満たす配列を「ヒープ」と呼ぶ。)
少しだけ分かりやすく書き直してみる。
inline void order_heap(int n, float ra[], int i){ float rra = ra[i]; int j = i*2; while(j <= n){ if(j+1<= n && ra[j] < ra[j+1]) j++; // jを大きな方に照準 if(rra < ra[j]) { ra[i] = ra[j]; i = j; j = i*2; } else break; } ra[i] = rra; } void sort(int n, float ra[]){ // heap sort, 1-based array, can be non-stable if(n==1) return; for(int l = n>>1; l > 0; l--){ order_heap(n, ra, l); } for(int ir = n;;){ float rra = ra[ir]; ra[ir] = ra[1]; ra[1] = rra; ir--; if(ir ==1) return; order_heap(ir, ra, 1); } }今のコンパイラなら上と同じ早さで動くでしょう。 上も下もコンパイルが通る事は確認したけど、テストしてないので使うならat your own riskでね。 このアルゴリズムの問題はすでに整列しているときにもかなり時間がかかる事。
order_heapを再帰を使って書くと(遅くなるけど)さらに分かりやすくなる。
void order_heap2(int n, float ra[], int i){ int j = i*2; if( j>n) return; if(j+1<= n && ra[j] < ra[j+1]) j++; // jを大きな方に照準 if(ra[i] < ra[j]) { swap(ra[i], ra[j]); order_heap2(n, ra, j); } }swap()は自分で書いてね。
▼
認知の基本モデルとしてのベイズ推定とニューロン間のコミュニケーションの類似性について
---あるいはベイズ推定のニューロンへの実装
---あるいは細胞間の通信プロトコル
ある物体があるとき、それが網膜上にどのような像を構成するのか。これは光学の問題であり、物理学的にきちんと定義された、いわば解決済みの問題である。その証拠にphoto-realisticなコンピュータグラフィックはゲームに映画にともはやありふれている。
さて、一方網膜上の像から、物体の形状を復元したり、それを過去に見た物体のリストの中にidentifyするような処理を光学過程の逆ということで「逆光学」と呼ぶ。 順光学を物体oから網膜像iへの写像fだと考えると、fの内容は物理学がきれいに教えてくれるのに対して、逆光学のiからoへの写像f^{-1}については全く分かっていない。
f^{-1}は視覚的な知覚のメカニズムそのものであり、人工知能の問題であると考えられてさえいた。
しかしここでは単純に、何も考えていない「ベイズ推定*」の方法をそのまま視覚的知覚のモデルとして考えてよいと主張してみる。
物体の存在から網膜上の視細胞の神経インパルスまでは 以下のようなカスケード過程として理解できる。 だとすれば一般的な認知の機構はこの逆過程だと考えればいいのではないだろうか。
象の存在 -> 目が存在する、鼻が存在する、耳が存在する、尻尾が存在する、・・・
目が存在する -> 黒目、まぶた、睫毛
鼻が存在する -> 長い形態の存在、灰色である、動く
耳が存在する -> 動く、うちわの様な形、灰色
尻尾が存在する -> ・・・
黒目 -> 黒い、ハイライト
まぶた -> ・・・
睫毛 -> ・・・
このように階層的に分解されていき、最後に「黒い」とか「ハイライト」などはさらに複数のピクセル状の光の状態にまで分解される。象の存在が因果律に従い百万ものピクセルという結果につながる。この階層的な分解は図に書けば典型的なツリー状になるだろう。
このような因果のカスケードによるツリーの末尾側の事象(非常に多数)から頭の側の事象(この場合は象の存在)を抽出する理論は存在する。 単にいわゆる「ベイズ推定」である。(ま、先験的確率じゃないんで厳密にはベイズかどうかしらんけど。)
実は、このような確率論的推定法は逆光学そのものではない。 始めて見るものの形を視覚像だけから再構成できないという点で、 確率論的な最適推定(ベイズもその一種)は逆光学にくらべて劣っている。
一方、逆光学に対して経験からの確率論的推定の方法が優れているのは、ノイズに強い事である。これはphoto receptorノイズのような物から、例えば物体の部分的遮蔽のような物まで、特段いちいち特別な方法を用意する事なく自然に処理できる点が優れている。 また確率論的方法は ill-posedでないという点でも優れている。 また、確率論的方法は視覚に限らず、全てのmodalityに共通に使えるアルゴリズムであるという点で優れている。
そして、すべてのmodalityで使えると言う事は実際の脳の使っているアルゴリズムの候補として有望であるという事である。
で、実際に細胞のスパイクを200msくらいで指数関数的に減衰する関数 θ(t) e^{-t/200} とconvolutionをとった物が、ある事象 e が起こっている確率p(e)と起こっていない確率 p(~e)の比の対数 log p(e)/p(~e)の であると考えるといろいろ現実にあうような感じがする。 最近、そう考えるとあれがこうなるとか、これがこうなるとか考えていた。
事象 e は網膜状のpixelから複雑な認識までいろいろあり得る。 神経細胞の階層に従って単純な事象から複雑な事象が階層的に順に構成されていく、確率論的なinferenceの法則に従って。
さてこの仮説は、前から言っている「新皮質の機能は情報の圧縮された符号を生成すること」とconpatibleだろうかというのが問題だ。
多分大丈夫じゃないかな。圧縮は要するに連続確率分布を各軸 y_i が独立になるようにmapすることだし、そうすると y_i は確率密度の関数になるわけだけど、これを適当な一次元非線形変換すればlog p(e)/p(~e) に写像できるわけだから。 (確率の分離した「島」どうしの関係がどうなるかは分からないけど。)
▼ 今後の個人的研究をどのように進めるか考える
脳の機能の本質は確率論的な最適化問題を解くことである。特に大脳新皮質は符号圧縮、基底核は報酬を最大化する行動の選択である。これに教師あり学習を行う小脳を加えればほぼ全ての事実を説明できる。 さて、この考えに従って今後研究をすすめるにあたってまずは周辺を調べてこれを自分の考えに引き寄せて体系化する必要がある。そのためにする事は:
▼ C++のテンプレートは私には一種のマクロ展開に見える。マクロ展開とはようするにパターンマッチングによる静的なコード置換だ。C++のテンプレートはlispなどに見られる「本当のマクロ」にくらべれば限定されたものに過ぎないけれど、それでもBoostなどをみれば分かるように、C++のプログラミングの世界を非常に拡大した。 どんな言語にとってもマクロとは凄い物なのだ。
(8月26日追記:どうも自分のテンプレートについての理解に間違いがあるような気がしてきた。とりあえず一度取り下げます。)
▼ Numerical Recipies in C++を買った。配列がゼロベースになっているのは喜ばしい。しかしC++の機能をそれほど使い込んでいないようなので、それならNumerical Recipies in Cの新版にすれば良かったと思う。
あとNR C++の翻訳したら、かなり確実なお小遣い稼ぎが出来るだろうになぜ誰もやらないのだろう?
▼ 生態系全体や生き物の体は、なにか知的な存在が設計して作ったのではないかという考えがあるらしい。
人間の網膜は光の当たる方に配線がなされている。もう、アホかとバカかと。そこらの技術者に設計させても必ず裏から配線するだろう。そういうことだから、盲点なんかが出来たりするんだってば。
中枢神経系の設計も根本から間違っている。CRAY-Iとかを出すまでもなく、素子を外側、配線を内側にするのが、配線の総延長を最低にするデザインであることは常識だと思う。しかし、脊椎動物の神経系は最初から素子を内側、配線を外側にする最低のデザインを採用している。もうアホかとバカかと。ほ乳類になってからやっと新皮質ができて外側に素子を配置するデザインになったけど、まだ基底核とかは内側に残ってるしね。
そもそも脳が二つに別れていて左右対称になっているのも間違っている。例えてみれば「会社の頭脳といえる本社ビルを建てました。ツインタワーで左右対称に部課を配してみました」みたいな話しだよね。人事部も左右に均等に分けて配置、総務部もそうみたいな話で、一つの部課のなかで頻繁に渡り廊下を渡って行き来しなきゃならないみたいな不便さ。常識的に一つの機能はどっちかのビルにまとめるべきだよね。バカだね。
いや、もっと壮大なのもある。全ての生態系を支えているもっとも基本的なエネルギー源である光合成。植物って緑色してるでしょ?あれが根本的な間違い。太陽光は緑のスペクトルに最大のエネルギーを持っているけど、緑の光を反射しているということは、これを使ってないということなのだ。もうアホかと。だから光合成の効率は6%くらい。人間の作った太陽電池(十数%)にすら劣る。
他にも、ひざの向きは逆の方が効率がよいらしい(良く知らんけど、確かに猫はかかとを使って実質的に逆向きの関節で歩いてるよね)とか、私が知らない事も含めて人体や生物や生態系のデザインで手酷い間違いはきりがないらしい。
ハッキリ言って、人間や生物や生態系を設計したやつは余程のバカだね。
▼ でも物理法則を設計した者がいたとしたら、そいつはスゴいかも。
▼ " Passion for the Future" 経由で「神々の沈黙―意識の誕生と文明の興亡」の孫引き
しかし、話を先に進めよう。意識が心の営みに占める割合は、私たちが意識しているよりははるかに小さい。というのも、私たちは意識していないものを意識することができないからだ。これは言うのはたやすいが、十分理解するのはなんと難しいことか。暗い部屋で、まったく光の当たっていない物を探してほしいと、懐中電灯に頼むようなものだ。懐中電灯はどの方向にあろうと自分が向く方向には光があるので、どこにでも光があると結論づけるに違いない。これと同じように、意識は心のどこにでも行き渡っているように思えてしまう。実際にはそうではないのに、だ意識というのは脳の活動の全体が見えている訳でもないし、脳の活動の全体を支配できているわけでもない。 にもかかわらず、意識自体は全体を掌握しているという思い込みをしやすいものだ。 で、 前に(西洋)外国の外国から来たお客さんも、そういう勘違いをしている人で、彼にそのことを説明しようとして苦労したことがある。 うえの引用部分は、この問題についての今までみた中でいちばんうまい説明になっているとおもう。
しかし、西洋人と言うのは、というより西洋哲学は、いつも手酷い間違いをわざとやってそれをマッチポンプ的に解決しているとしか思えない。意識に関わる哲学的問題なんかもみなそんな感じ。意識については西洋哲学はかなり酷いドグマの集合だし。
外国の脳研究者と話すためにはその辺りの勘違に満ちた哲学の知識を前提にしないと話が通じないから勉強する必要があるんだけど、 科学と分離して以後の哲学は勉強するには余りにもアホらし過ぎてやる気がしないで困ってる。
▼ Q、人間は慣れたことを考えずに自動的にやる機能、いわば「ロボット」のような物を内蔵している。これは何のためにあるのか?
A、「ロボット」があるおかげで意識は楽ができ、さらに新しい事に処理資源を集中できるからである。
---というようなやり取りをどこかで見た。
しかしこれは論理がまるで倒錯しているのではないかと思う。
意識を助けるために自動機構(「ロボット」)があるのではない。
それは、意識があらわれる以前から、動物でさえも、普通にあったものだ。
意識を助けるために「ロボット」が現れたのではなく、
「ロボット」に出来ないことを助けるために意識が生まれたのだ。
そして、意識自体も多数の「ロボット」が組み合わさってできた機能であり、意識自身は自らについてはその表層しか理解していない。
▼ どうも知能について考える時、「屋根から家を建てはじめる」ような人が多くて困る。屋根とは意識のことだ。意識の側から知能を説明しようとすると、あらゆる問題が倒錯して解決不能になる。
▼ サールの「中国語の部屋」つうのは変な例え話だと思う。 あれは機械的な演算過程が理解や知能には繋がらないということを言うための例え話なのだけど、そもそもこっち側の人間は最初から機械的な演算過程の集積が理解や知能を構成しうると考えているわけだから、つまり「中国語の部屋」の例え話がうまれる前から「中国語の部屋」のような物は知能を構成しうると考えているわけで、我々に対しては何の説得力もない。 どっちかと言うと「こっちは最初からそう言っているのに、機械的演算過程とはなにかまるで理解してなかったんすか?」という感じ。
▼ 「ひつまぶし」がしばしば「ひまつぶし」に見えるのは私だけではないだろう。
これは視覚的認識の仕組みについて重要な事を意味していると思う。
複雑な形の認識においては、単純な形を識別するユニット(いわゆる電気生理業界のジャーゴンではない)からの信号を幾つも組み合わせて、さらに複雑な形を識別するユニットをつくり出し、それをくり返しているのだろうと考えられている。
しかし、ここで問題は複雑な形を構成する単純な形状のあいだの空間的位置関係である。 脳の中で空間的な位置を示すために実数を使えなくて、単に受容野があるユニットがあるだとする。 すると複雑な形を表すユニットが空間並進不変性を持つためには、 位置を変えて同じような単純形状を表すユニット群と膨大なand-or型の結線を形成しなくてはならない。
しかし、もし、単純な形状の間の位置関係をそれ程気にしなくていいのなら結線の量は大幅に減らす事ができる。ただし、この場合は一つの複雑な形状に含まれる単純な形状間の位置関係が狂った時にそれと気がつかない危険性がある。
だから、位置関係の処理を手抜きしているという後者の可能性はあまりありそうもないと皆が思っていると思う。 しかし、「ひつまぶし」の例は構成要素の位置関係の処理を脳が手抜きしている可能性をある程度支持しているように思う。 だから実際はこの二つの可能性の中間当たりにあるのだと私は思っている。
▼
メモ:ハッシュ関数について
効率的にbestでなく9割くらいでもいいから簡単な実装。
1、文字列をキーとしたハッシュ
unsigned int hash(char *s){ unsigned int h=0; for (int i = 0; s[i]; i++) { h = h * 37 + (unsigned int)(s[i]); } return h; }
2、数字をキーとしたハッシュ関数(乗算法)
h(k) = [m(A k mod 1)]
[x]はxをこえない最大の整数(つまり切り捨て)。 mはハッシュ表の大きさ。 Aは定数だが、A=(sqr 5 - 1)/2が良いらしい。
乗算法ではハッシュ表の大きさは2^nのような、きりのいい数でもよい。
▼ 人間には二種類いる。自然を操作して糧を得るものと、人間を操作して糧をえるものだ。
たとえるなら、お腹が減った時自分で狩りに行く人と、お腹が減った時に前者に持ち物を差し出さざるを得なくするよう企む人だ。
わたしゃ後者の人間が大嫌いで、連中に対してぎくりと来るような短い皮肉の効いた名前を与えてやろうと考えているが、なかなか思い付かない。
▼ プログラミングの傲慢なる美学と世界観 (山形浩生による「ハッカーと画家」評、@kinokuniya)
的確な評だと思う。さてそれはともかくとして、以下の部分が面白かった。
世界にある種の美学が貫徹しているはずだ、というのは人間の勝手な思いこみなのだもの。全物理法則を統合するのではないかと言われている超ひも理論/M理論に対して「連中は神様が自分にフェラチオしてくれると思ってやがる」と批判したのは可変光速理論を唱えるマゲイジョだった。私ならここまで酷いことは言わないけど、自然が人間のチンケな美意識で計りきれるような物ではないというのは賛成。相対論だって量子力学の革命だって、美意識などをこえた恐ろしさと力がある。自然は美意識では始末しきれないからこそ、アインシュタインでさえ量子力学からは振り落とされたわけで。
▼ 最近映画をみてもドラマを見ても、あんなに好きだった漫画もほとんど楽しめない。 もう、あういう物にリアルさを感じない。
▼ C++で疎行列演算ライブラリを書こうとしていたけど、Boostにそれがある事を知る。良かった、書く前に分かって。
▼ 江戸時代には土日はなかった代わりに労働時間は短かったらしい。大体3時には仕事を終えてあとは遊んだりしていたようだ。古代ローマ人なんかも昼には仕事を終えていたらしい。
で、年間総労働時間が同じだとして土日があって一日あたり労働時間が長いのと、なくて労働時間が短いの一体どっちが楽なんだろう。 あと、どっちが社会の効率がいいんだろう。なんか、土日に仕事が止まってしまうのは非効率な感じもするし。これが長らくの疑問だ。
普通の慣習ならば、大抵はその方が効率が良いからそうなっているものなんだけど、こればかりはキリスト教絡みなので分からない。
▼ 朝霞市の方で花火大会をやっているのを窓から見る。 眼鏡をして花火を見たのは初めてだったので、その輝きに驚いた。
▼ 論文投稿に合わせて夏休みを一週間とちょっと取ることが出来ました。いまその真っただ中。
▼ はてなアンテナのおとなりアンテナは共通の項目の数が多い順に表示をしているようだ。(確証はないけど。) これは文系の人のセンスだと感じる。 最低でも、項目数ではなく、相手側のアンテナの登録数で割り算して共通性の割合を出してその順序でなくてはならない。
ほかにも、日記の関連度マップはJavaのアプレット見本を改造したものだけど、あれの動作を見ているとどうも関連度の低い日記同士はrepulsionが働いているようだけど、これもセンスが変。関連度が低いものと言ってもマップに出てくるのはネガティブな関連度ではなくて弱いポジティブな関連というだけだ。理系の人のセンスならアフィニティに応じた引力を与えてあとは全体のコラプスを防ぐ膨張項を全体にいれるという感じになるんじゃないかと思う。
はてなにはこのほかにも「アレっ」て感じることが多い。(はてな以外はもっと多いけど。)
で、社長がいちいち仕様に関与してないかもしれないとは思ったけど、近藤社長は文系かどうか調べてみた。そしたら、地球物理出身だった。