空想犬猫記

※当日記では、犬も猫も空想も扱っておりません。(旧・エト記)

報酬系について

高校生の頃、親に勧められてリチャード・ドーキンスの『利己的な遺伝子』を読んだ。生物界では、遺伝子があたかも利己的に振る舞っているかのように、自然淘汰が進むという話だった(もちろん、遺伝子に「己」はないため、この表現は機知に富む一方で誤解を招きやすい)。本の内容は、その理論モデルの正当性を裏付ける多くの事例を紹介する構成だったと記憶している。この理論モデルの優れた点は、①複製、②変異、③選択という条件がそろった系において、ミクロな単位である遺伝子の振る舞いから、マクロな進化の結果を説明できる点にある。
利己的な遺伝子」の理論モデルは、一見すると多くの生物的・文化的現象を巧みに説明しているように見える。しかしその説明の多くは、事後的(事後合理化的)であり、どんな結果が生じても「それは遺伝子にとって有利だったからだ」と言えてしまう。そのため、現象に当てはまるだけで、予測する力や新しい仮説を生む力に乏しいように感じられる。これは、いわゆる「人間原理」に似ていて、「そうでなければ我々は存在していない」という説明になっていない説明と同様の無力感をもたらす。
時は流れて、世に放たれた私は、あれこれとやりたいことをさせてもらってきたのだが、自分に与えられた時間を多く見積もっても半分は過ぎたところで、際限のないヒトの欲望や、世代間での同じ過ちの繰り返しを目の当たりにし、人間の行動を駆動する根本的な欲求とは何なのだろうかと考えることが多くなった。
現代では、人間の思考、意識、感情、運動の制御など、あらゆる生命活動の中枢は脳という臓器にあると広く認識されている。脳はおよそ860億個のニューロン神経細胞)から構成され、それらが数百兆個に及ぶシナプス(神経接続)を介して相互に情報を伝達しあっている。このようなニューロン同士の高度に組織化されたネットワークが、思考、学習、記憶、意識といった高次の脳機能を支えていることは、近年の神経科学の研究によって明らかにされつつある。
したがって、人間の行動を駆動する根本的な欲求もまた、こうしたニューロンシナプスから成る神経回路網の構造と動態によって実装されていると考えるのが自然である。さらに、多くの人類に共通する行動傾向が見られることから、これらの回路には種全体に共有された普遍的な特徴が備わっている可能性も高い。
人間の神経回路網の構造を進化的ゲーム理論の枠組みに当てはめて考えると、①複製および②変異 は、生物学的な再生産や遺伝的突然変異によって説明できる。
では、③選択はどのようなメカニズムによって実現されるのだろうか。
この問いに対する一つの仮説として、私は最近とある「報酬系(reward system)」に注目している。人間にとっての報酬とは、端的に言えば「快感」として知覚されるものである。もう少し正確に表現すれば、報酬には正負の二方向があり、正の報酬は「快」、負の報酬は「苦(あるいは痛み・不快)」として主観的に経験される。こうした報酬系は、神経回路網の中で選択を駆動する内部的な基準として機能し、進化的に形成された行動傾向の選別・強化に関与していると考えられる。
報酬系にどのような化学物質が関与しているかといった詳細なメカニズムは、ここでは脇に置いておこう。要するに——そして率直に言えば——ヒトは「キモチイイ」と感じることを、人生という時間軸に沿って積分した総量が最大になるように行動している、ただそれだけなのではないか。そう思ったのが、この話を書き始めた動機でもある。
では、もう少し踏み込んで考えてみよう。人間を人間たらしめるその「報酬系」は何か、どのような特徴を持っているのだろうか。ここからが、本題である。

予測とその的中

脳が「ヒト(=意識)」に対して報酬を与える挙動とは何か。 言い換えれば、私たちは何に踊らされて生きているのか。これを一言で表すなら——それは「予測とその的中」である。
たとえば、「夢がかなった瞬間」というのは、単に願望が実現したというだけでなく、「夢」というかたちで将来を予測し、それが現実に的中した」という構造を持っている。報酬は、この予測が的中したという一致感(コンシステンシー)に対して与えられているのである。
では、車の運転の場合はどうだろうか。運転が好きな人の中には、ドリフト走行を楽しむ人もいる。なぜ、人はわざわざ危険を冒してまでドリフトをするのだろうか。その理由のひとつは、ドリフトには単なる一次的な制御、つまり「進行方向にハンドルを切る」といった単純な操作だけでなく、加速度やその変化率(加速度の加速度)といった高次の動的パラメータを予測・制御する複雑なスキルが求められるからである。つまり、ドリフトとは高度な運動予測とその的中によって成り立っている。ドライバーは、車体の挙動を瞬間ごとに予測し、それを制御によって思い通りの軌道に乗せることで、予測の的中という快感(=報酬)を得ているのだ。
車の運転の例からも分かるように、どうやら脳は、現状からの距離が遠い予測であればあるほど、その的中によって得られる報酬を大きく評価する傾向があるようだ。たとえば、「空を自由に飛びたい」という夢を叶える手段として、「リチウムイオンバッテリーを用いたドローンで地上から3メートルの高さを20分間飛行する」よりも、「未知のエネルギー源Xと謎の物理法則Yを利用して、地球全土を超音速で飛び回る」といったほうが、より非現実的=より遠い予測であるがゆえに、実現したときの報酬が飛躍的に大きくなる。このように、人間の報酬系は、予測が困難であればあるほど、それが的中したときに大きな報酬を与えるよう設計されている。
この仕組みを、音楽をはじめとする芸術の分野にも当てはめてみよう。たとえば、コード進行やリズム、旋律といった構造から快感が得られるのは、脳が次に来る音や展開を予測し、それが的中するというサイクルが繰り返されているからだと考えられる。しかしどうだろう、そうだとすれば、予測が容易な単純な童謡こそが至高の音楽ということになりそうだが、実際はそうではない。むしろ、予測が裏切られ、しかもその裏切りが意外性と納得感を両立する形で「解決」されたときにこそ、脳はより強い快感を覚える。どうやら、報酬系のモデルには「意外性とその再構成」という要素を組み込む必要がありそうだ。

意外性とその再構成

音楽への適用を試みて、報酬系は「予測の的中」によって駆動される仕組みであることが見えてきたと同時に、それ以外の報酬回路が存在していることが分かってきた。それは「意外性とその再構成」である。この回路は予測が破綻したときの保護回路として機能していて、予測が外れても、元の予測を書き換えて結果を再構成して一致解決させたときに、通常的中時以上の報酬を与えるというものである。
たとえば、漫才の「ボケとツッコミ」に見られるような笑いは、予定調和を裏切る意外性に根ざしている。「こう来るだろう」という予測が裏切られたとき、脳は一瞬混乱する。しかしその直後に、「ああ、そういうことか」と再構成されると、むしろより大きな快感を伴って笑いが生じる。このような報酬の構造は、「予測の的中」だけでなく、「予測の破綻→再構成」という流れに対しても快を与えるように設計されていることを示している。
このように、脳は「予測と的中」だけでなく、「予測のずれと再統合」にも報酬を与える。予測不能なものに対しては恐れや不快を覚えることもあるが、そのズレが知覚可能な範囲内で起こり、かつ再構成可能である場合、人間はそれをむしろ積極的に楽しむ傾向がある。意外性とは、広い意味での「予測とその失敗」から生まれる学習と再構築のチャンスであり、それこそが芸術や物語、ユーモアの根源になっている。

因果性への欲求

ここまで見てきたように、脳は「未来を予測し、それが的中したとき」に快を感じる報酬回路を持っている。では、その予測対象が未来ではなく「過去」であった場合、同じような報酬は得られるのだろうか?
この問いに対する興味深い答えは、科学者の行動様式に見いだすことができる。たとえば、物理学者がある自然現象を観察し、そこに潜む「法則性」や「因果関係」を解明しようとする行為。これは、現時点に存在する結果に対して、過去の構造や原因を仮定し、それが整合的であるかどうかを確かめるという意味で、「逆向きの予測」として捉えることができる。
物理法則の発見は、単なるデータの整理ではない。観測された現象に対して、「このような初期条件と法則があれば、現在の観測結果が必然的に導かれるはずだ」と考える。その「説明が的中した瞬間」に、強い知的快感がもたらされる。つまり、「なるほど、そうだったのか」という納得は、報酬系が駆動する一致検出の一形態にほかならない。
これは、単に「予測が合った」ことの快感ではない。むしろ、「無秩序に見えた事象群の背後に、単純で普遍的な原理が存在していた」という整合性の発見=因果性の回復に対する報酬である。過去の出来事が、「それ以前の構造から自然に導かれていた」と理解されたとき、脳はそれを「的中」として処理し、報酬を与える。
この種の快は、個人的な体験の再評価とは異なり、世界の秩序そのものを再構成する試みによって生まれる。つまり、物理学者が「世界を理解した」と感じる瞬間には、進化的に形成された報酬系の一種のピークがある。
こうして見ると、人間は未来に対して予測を行うだけでなく、過去に対しても「説明可能性=予測可能性」を求めていることが分かる。すなわち、我々の認知装置は、「現在という結果」に整合する「過去という原因」を見いだすことで、安心感や快感を得るように設計されているのである。

まとめ

この構造は、決して自然科学の営みにとどまらない。たとえば歴史学では、膨大な出来事の連なりから意味ある因果を抽出し、物語として再構成することが中心的な作業である。推理小説はその縮図であり、読者は無数の伏線や矛盾のなかに「真相」——つまり一本の因果線——を見いだしたとき、知的な快感を得る。そして陰謀論ですら、この報酬系の構造と無関係ではない。事実が断片的で複雑であるとき、人はその空白を「意味のある因果」で埋めたくなる。たとえその意味が誤っていたとしても、「説明がついた」という感覚それ自体に、報酬が与えられる。
このように、人間は未来に対しては希望と予測の一致を求め、過去に対しては因果と整合の発見を求める。前者は「これから何が起こるか?」という問いに対し、後者は「なぜこうなったのか?」という問いに応える営みであり、そのどちらもが、報酬系という神経回路のメカニズムに根ざしている。
重要なのは、これらが単に知的な興味や趣味嗜好ではなく、生存戦略として神経系に埋め込まれたメカニズムであるという点だ。未来を予測する能力は、捕食者や自然環境に対して先手を打つために不可欠だった。一方、過去の因果を理解する力は、同じ失敗を繰り返さず、パターンを学習するために必要だった。だからこそ、人間の脳はこのふたつの「一致」に快を与えるように進化してきたと考えられる。
そして私たちは今、科学や芸術、宗教やフィクションといった多様な文化的形式の中で、依然としてこの快感を追い求めている。予測とその的中、秩序の発見、意外性と納得感の両立——これらすべてが、人間の知的活動を内側から駆動している燃料なのだ。
詳らかに言ってしまえば、「理解」したことや「意味」なんて本当は存在しない。ただ報酬系が、いつも通り淡々と仕事をしているだけだ。
ヒトの意識は、制限時間内に報酬を最大化するための、ただの踊り子なのかもしれない。
あなたが「この世のすべてには意味がある」と感じたその瞬間も、クスリと笑った瞬間も、音楽で高揚したその時も、予測とその的中に報いる報酬系は、今日も、遺伝子のヴィークルの中で、静かに、淡々と、あなたの行動を報い続ける。

Schubert - Impromptu No. 3, Op. 90

いろんな小品をつまみ食いしつつ、最近取り組み始めた。指のウォームアップ用に毎日の練習のルーティーンに取り入れたいと思っている、今年の個人的課題曲の一つ。

変ト長調の美しい主旋律が印象的なこの曲だが、実際に弾いてみると、その魅力はただの優雅さにとどまらない。途中、長く変ロ短調へと「闇落ち」し、そこから主題へと戻るまでの過程は、まるで劇的な旅路のようだ。そして傷を負ったまま主旋律をかすめて終焉を迎えるのである。幸福は決して永続せず、常に影のような不安がつきまとう——そんな人生の儚さが、この音楽には凝縮されている。シューベルトの心の揺らぎが、時空を超えて音符を通じてこちらに語りかけてくるようだ。

この曲は壮大な人生そのものがテーマになっていると思われる。誰が弾いてもそれぞれに意味を持ち、それぞれに美しく響き、聴いていて飽きない。

www.youtube.com

Beethoven Sonata # 14 "Moonlight" Op. 27 No. 2

先ずは第一楽章から。

2週間くらいで大体音は出せるようになるが、旋律の輪郭の描き方は無限にあるような気がしていて、弾いていて飽きない。

www.youtube.com

第二楽章、変ロ長調スケルツォ形式。フラットが5つ付いた楽譜を譜読みをして鍵盤上の動作に変換する場合、まだリアルタイムに処理することができないため、自分にとっては一番難解。どうやって頭の中で符号化して暗譜するかを模索中

第三楽章、一般的には一番難しく聴こえるけれども、音階の繰り返しなので、暗譜はそれほど問題ではないかも。指は毎日弾いていれば動くようになるはず。あと4か月くらい練習すれば弾けるようになる、鴨。

Chopin - Largo in E flat major , Op. posth.

ショパン 2 曲目は、昨年のショパンコンクールで反田さんも弾いていた Largo in E flag major。今の自分の楽譜の処理能力が追いつくと思われたので挑戦。

www.youtube.com

最初の Prelude Opus 28, No 4 が左手の和音の練習だとしたら、この曲は右手の旋律にも和音が加わる。最初の2音目で既に重厚な和音がグワッと響いて泣きそうになる。曲と言えそうな曲はブルグミュラー師の練習曲しか弾いたことがないので、新しい和音の、ピアノから出る生音の響きが新鮮である。

Chopin - Prelude Opus 28, No 4

ピアノを始めた動機のひとつは、ショパンの曲を弾きたいというものだった。そのための最短経路として選んだのがブルグミュラーの25、そして18の練習曲であった。未だに18の練習曲の最後の曲は完成していないものの、少しずつ弾きたかった曲に挑戦していこうと思っている。Largo で、自分の譜読みの速度でも初見である程度弾けそうな感触だったので、ショパンの Prelude Opus 28, No 4 を最初に選曲した。

www.youtube.com

私のレベルで気をつけたのは

  • 左手の3ないし4和音を1つの音として(各音がずれないように)弾くこと
  • 左手の音量は右手の旋律よりも遥かに小さくすること
  • 和音が切り替わる際に、音の連続性を保ちつつ、濁りを最小に抑えるように sustain pedal のタイミングを意識すること

ゆっくり丁寧に弾くことで、和音の連打の良い練習になると思われる。

Rust独学メモ3

テストの書き方

Unit テストと Integration テストで、書く場所が異なる

We create a tests directory at the top level of our project directory, next to src. Cargo knows to look for integration test files in this directory. We can then make as many test files as we want, and Cargo will compile each of the files as an individual crate.

  • Unit テストはモジュール内に、#[cfg(test)] というアノテーションを付けたモジュールを作成する
    • Unit テスト用のモジュールからは、publish されていない private なメンバにもアクセスできる
    • 関数に #[test] アノテーションを付けておくと test runner にピックアップされて実行される
  • Integration テストは src ディレクトリの並びの tests ディレクトリに、.rs ファイル(=クレート・ルート)を作成する

Integration テストのサブモジュールを .rs 形式で作ると、クレートとしても、サブモジュールとしても参照されそうだなーというのが第一感。それの疑問に対する回答は

Having common appear in the test results with running 0 tests displayed for it is not what we wanted. We just wanted to share some code with the other integration test files.

To avoid having common appear in the test output, instead of creating tests/common.rs, we’ll create tests/common/mod.rs.

まさかのノーガード戦法だった。しかもここだけなぜ「running 0 tests」が出てしまうのかの説明を省いてリンクを張ってお茶を濁していて誠意を感じない。クレートとモジュールの恣意的な扱い(おそらくコンパイラの実装の都合)のしわ寄せがここに来て、足の小指をぶつけてる。要は運用で回避してねという方針。結論:クレートとしても、サブモジュールとしても参照される。そして、インテグレーションテスト用の .rs ファイルで書かれたサブモジュールは、サブモジュールを利用する .rs ファイルの数の回数分、再コンパイルされてしまう。これは、設計者からしたら誤用の範囲であると思うが、サブモジュールとして利用された .rs ファイルに書かれたテストは、サブモジュールとしてインポートされた回数と、自分自身がクレートとしてコンパイルされた+1回だけ実行される。インテグレーションテストを書いていて、とあるファイルに書いたユーティリティをインポートして使うというのは、やりがちなことなので、意外と侮れない落とし穴だと思う。例えば、ひとつのファイルにユーティリティとテストを書き溜めて、サイズが大きくなってきたので、新しいファイルを追加して、元のファイルをインポートしてヨシ!続きを書くぞー…なんてことをすると、一気に流れるテストの数が2倍になるわけである。

知らなくてハマったら発狂しそうな仕様である。

Rust独学メモ - 空想犬猫記 できっちりとクレートはコンパイル単位、ファイルはモジュール、コンパイラに最初に渡されるファイルがクレート・ルートで、それがクレートのルートモジュールになり、以下芋づる式にサブモジュールがコンパイルされていく、という理解を固めて置かないとかなり置いてきぼりになりそう。現実的な解決策を出している点では文句の付けようは無いのだけれど。

Rust独学メモ2

モジュール

Rustにおけるモジュールは、C++における名前空間のようなもの。アクセス指定子を付けることによって公開・非公開をコントロールできる。

Start from the crate root: When compiling a crate, the compiler first looks in the crate root file (usually src/lib.rs for a library crate or src/main.rs for a binary crate) for code to compile.

コンパイルはクレート・ルートから始まり、クレート内の階層化されたモジュールの宣言はこのファイルに書く。

Declaring modules: In the crate root file, you can declare new modules; say, you declare a “garden” module with mod garden;. The compiler will look for the module’s code in these places:

  • Inline, within curly brackets that replace the semicolon following mod garden
  • In the file src/garden.rs
  • In the file src/garden/mod.rs

モジュールの定義の仕方は1+2=3通りから選べる

  • mod garden { ... } のようにモジュール宣言の直後に括弧でスコープ作って、インラインで定義する方法
  • あるいは、mod garden; のように、forward declaration した場合、コンパイラ
    • モジュールと同名の .rs ファイル(src/garden.rs )か、
    • モジュールと同名のフォルダ内の mod.rs ファイル(src/garden/mod.rs)に、定義を探しに行く

⇒ Rust のソースファイルは1つのモジュールに対応している(大胆!)
⇒ モジュールとして提供する機能が複数ファイルに及ぶような場合はサブモジュールを作って、use キーワードでインポートする運用(つらい)

クレート・ルート以外のモジュール内でも同様にサブモジュールを定義出来て、

  • mod vegetables { ... } のように、モジュール内にインラインで書くか
  • サブモジュールと同名の .rs ファイルをサブフォルダに置く(src/garden/vegetables.rs)か、
  • サブモジュールと同名のサブフォルダのサブフォルダに mod.rs を置く(src/garden/vegetables/mod.rs)とのこと

⇒ ファイル・ディレクトリの構造以上にモジュールの構造が散らからない。クレート全体がコンパイル単位なので、クレート内では自由に相互依存ができる。スコープ演算子によるモジュールパスの解決、pub、use は、特筆することはなさそう

まとめ
  • Rust のモジュール階層は、クレート・ルートから芋づる式に定義される
  • ファイル、あるいはフォルダ + mod.rs を見たら、それがモジュールの定義
  • use を使って適度にモジュールを統合しないと :: だらけの悲惨なコードになりそう。どれくらい :: を使うか、どのように使わせるかという塩加減は、おそらく長期的には重要なスキルになると思う
感想

1ファイルをモジュールに対応させたり、root のモジュールを crate と呼んだり、言語の内部実装に利用者が付き合わされて(振り回されて)いる感じがするものの、インクルードパスとか気にしなくても良いし、実用には耐えそう。