不確定な世界

科学の話題を中心に、勉強したことや考えたことを残していきたいと思います

「ゼロからつくるPython機械学習プログラミング入門」;八谷大岳著 読書感想

本日紹介するのは、八谷大岳著「ゼロからつくるPython機械学習プログラミング入門」。
私はこれまで機械学習の本を何冊か読んできたが、古典的な機械学習に関する入門書は、実質的にscikit-learnのチュートリアルで終わっていることも多い。機械学習の中身をもう少し踏み込んで理解したいと思い、本書を読んでみた。

書名からはコーディング中心の本という印象を受けるが、本書の性格はどちらかと言えば「サンプルコード付きの理論書」である。「理屈はともかく写経しろ」という内容を想定していると面食らうことになるが、そもそも昔ながらの機械学習は深層学習以上に数学そのものであり、その中身を理解するうえで数学は避けて通れない。一方、理論さえ理解してしまえば、アルゴリズムのコアはたった数行程度のコードでスクラッチ実装できてしまうということが、本書を読めば分かる。本書では純理論の本を読んでいるとありがちな、式の意図やイメージの掴みづらさに悩まされることがない。本文中の数式に沿ったコードが掲載されているので、例えばテンソルの形状だとか総和の対象(軸)などもコードを確認すれば誤解なく理解することができる。

章ごとの感想

第3章

まず勉強になったのは第3章の数学の復習。本書では特に最適化数学の解説に力が入っており、ラグランジュの未定乗数法が機械学習アルゴリズムのベースにあることが理解できた。私は最適化数学になじみがなく、特にベクトルの内積をベクトルで微分するような表記は苦手意識を持っていたので、本書で多少なりともこの分野に慣れることができたのは良かったと思う。本書を読む中で、この章は何度も読み返すことになった。

第4章

回帰アルゴリズムとして線形回帰とロジスティック回帰を学ぶ。線形回帰について、本の方針によっては単回帰(y=ax+b)に限定して係数を表す式を直接導く場合も多いが、本書のように線形代数に基づく表記では、重回帰に拡張したときに式に一切変更がないという圧倒的メリットがあることに気が付いた。また、ロジスティック回帰が実質的に分類モデルであるにも関わらず回帰と呼ばれるのは、交差エントロピー誤差の最小化がロジットを回帰していることに対応するため、という記述には目からウロコが落ちた。

第5章、第6章

分類モデルの章では、線形判別分析(LDA)、サポートベクトルマシン、ナイーブベイズ、決定木が扱われている。この章では特に、サポートベクトルマシンの理論から逃げていないことに好感を持った。ある程度のレベルの数式を扱っている本でも、サポートベクトルマシンの理論については「難解すぎる」としてscikit-learnやLIBSVMといったライブラリの使い方を説明するだけで終わってしまう場合が多い。本書では第6章のカーネルトリック*1まで含めて、サポートベクトルマシンの数式&スクラッチ実装を学ぶことができる(ただし、ここだけは行列の計算にcvxoptライブラリを用いている)。

第7章、第8章

 第7章はニューラルネットワーク、第8章は強化学習がテーマである。ニューラルネットワークについては他書で十分に学んでいるという人は、ここは飛ばしてもいいだろう。ただ、Adamをきちんと実装している点は参考になるかもしれない。強化学習に関しては、ページ数も少ないし、本書全体のテーマからはやや外れている印象を受けた。同じ機械学習スタートアップシリーズから強化学習も出ているようなので、強化学習に興味があるならそちらを読んだ方がいいだろう。

第9章

教師なし学習アルゴリズムとして、主成分分析と因子分析、k-means法が扱われている。PCAは分散を最大化する軸を見つけると説明されることが多いが、その根底には残差の二乗和の最小化があるという意味で、線形回帰に似ているということが理解できた。k-means法はアルゴリズムの概念はわかりやすいが実装は面倒くさそうという印象を持っていたが、重心からデータ点の距離を計算→データ点をクラスタに割り当て→クラスタの平均値を重心に再設定の流れがあまりに簡潔で驚いた。特に、カーネル法のところでも使われていた、np.tile関数を用いてデータの全ペアの計算を一度の行列演算で行うトリックは自分では絶対に思いつきそうにない。応用範囲が広そうなので、ぜひ自分のレパートリーに加えたいテクニックである。

まとめ

ここまで紹介したように、本書はかなり数式が多い本なので、想定読者は大学生や研究者、または研究寄りのエンジニアになるだろう。アルゴリズムの中身をきちんと勉強したいが、純理論の本にはハードルを感じるという人にお勧めである。機械学習の仕組みはもちろんであるが、もう少し一般化して、理論や数式をプログラムに実装するということも学ぶことができる。

全体として、非常に読み応えのある良い本であるが、一つ不満点を挙げるとすると、コードが書籍中で完結しないことだろうか。もちろんアルゴリズムのコア部分のコードは載っているのだが、グラフのプロットや性能評価などの補助的なコードは書籍中には載っていない。本書はかなり分厚いので、これ以上コードを載せることは現実的ではないのかもしれないが、「ゼロからつくる」と銘打っている以上は、もう少し読者に自分でコードを打ち込ませるように誘導する構成の方が良かったのではないかと感じた*2

*1:まったくの余談だが、データを写像することでモデルが非線形に対応するという話は、量子力学において状態ベクトルを回転させてから測定するのは測定器を回転させるのと同じ、という議論を連想した。

*2:例えばオライリー本はそういう思想で書かれていることが多いと思う

「量子コンピュータが本当にわかる!」;武田俊太郎著 読書感想

本日紹介するのは、武田俊太郎著「量子コンピュータが本当にわかる!」。
著者の武田先生は量子テレポーテーションで有名な古澤研のOBで、最近独立した研究室を立ち上げた若手研究者である。以前紹介した藤井先生が理論の専門家であるのに対し、武田先生は光を用いた実験(コンピュータの文脈ではハードウェア)の専門家だ。理論家と実験家、読み比べてみると面白い。

本書では波の重ね合わせと干渉によって計算を行う量子コンピュータの概念を、二重スリット実験のアナロジーを用いて一貫したイメージで説明している。その点だけでも分かりやすくておすすめなのだが、本書の見どころは何と言っても第5章「量子コンピュータの実現方法」と第6章「光量子コンピュータ開発現場の最前線」である。
第5章では、超伝導回路方式、イオン方式、半導体方式、光方式の量子コンピュータについて解説されている。使われている模式図は一般書としては比較的詳しく描かれていて、モノを重視する実験家らしさを感じた。特に光方式については第6章で実際の実験装置の写真とともに詳述されている。研究室の見取り図まで載っているのには笑ってしまったが、この手の本で著者自身の独自の研究成果を知ることができるのは貴重である*1

また、第3章は量子ビット量子論理回路の話なのだが、ここで一つ気付いたことがある。本書ではいわゆる制御NOTゲートのことを「量子版XOR」と説明しているのだ。制御NOTを実験物理学の観点から見ると、二量子間の相互作用により生じるエネルギー準位の微細構造により「制御ビットが特定の状態の時だけターゲットビットが電磁波に対して反応(共鳴)して状態が反転する」という操作である*2。制御NOTとはまさにその言葉の通りの操作であり、私はこれを専門用語としてそのまま受け入れていた。恥ずかしながら、この操作が数式的にはXORに相当すること自体は認識していたにもかかわらず「普通のコンピュータの論理回路と対比させて量子版XORということができる」という点にまでは気が回っていなかったのだ。些細なことではあるが、個人的には盲点、目から鱗であった。

最後に全体を通して感想だが、やはり実際に装置を組み立ててデータを取っている人が書く内容というものは説得力がある。写真も豊富で、概念的なたとえ話やポンチ絵だけではなくモノがないと納得できない人には本書は非常にお勧めできる。一方、本書の解説があまりにも優しすぎて、すんなり読み終わってしまった感も否めない。科学の本としての知的興奮度に関しては、藤井先生の方に軍配を上げたい。

量子コンピュータの計算部分は現在は超電導方式が主流だが、通信をしようとすると光を使わざるを得ないだろうから、武田先生の研究の重要性は今後さらに増してくるだろう。今後の発展が楽しみである。

*1:個人的には、実験データや信号の波形なんかが載っていると嬉しいのだが。もちろんデータは大切な知的財産だし、この手の分野の実験データは重力波の波形のように見た目だけで簡単に解釈できるものでもないのも理解できる。が、やはりラビ振動くらいは載せてあると、量子ビットを制御しているという説得力が増すと思うのだが。

*2:制御ビットが0と1の重ね合わせ状態だった場合、制御NOTによって「制御ビットが0のためターゲットが反応しなかった状態」と「制御ビットが1のためターゲットが反応した状態」の重ね合わせが生じる。これが量子もつれである。

「驚異の量子コンピュータ」;藤井啓祐著 読書感想

本日紹介するのは、藤井啓祐著「驚異の量子コンピュータ」。
著者の藤井先生は量子誤り訂正の理論を専門とする研究者であり、量子コンピュータの理論分野では日本を代表するトップランナーである。

本書は主に「ゲート型」とか「万能型」と呼ばれるタイプの量子コンピュータについて書かれている。”物理”と”情報”の研究分野が融合するまでの歴史の話から始まり、量子コンピュータの仕組みの説明に話が進む。ここまでは類書でもよくある流れだが、その後に実現への壁であるノイズとの闘いと、量子誤り訂正理論の発展によるブレイクスルーについてページ割かれているのは、専門家ならではであり類書には見られない特徴だろう。後半にはGoogleによる量子超越性の実証やNISQマシンの話など最新の話題もあり、これだけの内容がわずか160ページほどでコンパクトにまとめられている。一方で、本書はあくまでも学問的な視点で書かれており、ビジネスへの利用やライブラリの使用方法といった実践的なことはあまり述べられていない。とはいえ、そういった目的を持つ人に対しても、量子コンピュータへの入門書として非常にお勧めできるのは間違いない。

私が本書を読んで、個人的にさすが!と思った点が2つある。
一つは量子もつれの説明の部分。本書では量子もつれを「2つの粒子をそれぞれ箱に入れて、粒子が箱の仕切りの右側にあるか左側にあるか」というたとえ話で説明している。メディアや入門書でよくあるのは、「片方が右にあることが確定すると、もう片方も右にあることが同時に確定する」という部分だけを取り上げて、「(離れた位置にある)2つ粒子の状態が同時に確定する」ことが量子もつれの不思議さである、とする説明だ。しかし本書ではこのような相関は古典でも説明できてしまうことを指摘したうえで、さらに「箱の仕切り方を”上下”に変えても、片方が上にあれば片方も上にある」というところまで説明している*1。これこそがまさに本質的に量子特有の現象であり、例えばベルの不等式などもこの性質を利用している。

もう一つは、量子コンピュータの仕組みについて、すべてのパターンを並列に計算するだけでは意味がなく、干渉を用いて特定の答えが出る確率を増幅するステップを組み合わせることが重要である点に言及している点だ。
「重ね合わせによりすべてのパターンを超並列に計算するから速い」。これもメディアなどでよく見かける説明だ。普通のパソコンでさえマルチコアによる並列計算が当たり前になった現代において、この説明は直感的で理解しやすい。確かに量子アルゴリズムではアダマールゲートによって重ね合わせ状態をつくって利用する。しかし本書で述べられているように、単にすべてのパターンを並列に計算するだけでは、最終的に測定をする段階で正解が得られる確率が小さくなってしまう。量子アルゴリズムの肝はむしろ、いかに可能性をうまく絞り込んでいくかというところにあるのだ。例えば量子もつれも、このような絞り込みの手段の一種である。2ビット4パターンの組み合わせのうち、CNOTゲートによって「右右」や「左左」が出現する確率が増幅し、「右左」や「左右」のような組み合わせを取る確率が抑制されているわけだ。重ね合わせによる並列性だけでなく、干渉による絞り込みもセットで知ってると、量子コンピュータに対するイメージが変わってくるのではないだろうか。

このように、本書は数式を使わずに例え話とイラストでわかりやすく説明する一般向け書でありながら、学問的正確性も高い。それだけでも入門書として優れていると言えるが、加えて所々で著者の知的興奮が伝わってきて、読者の向学心を煽るのも良い。最後に、本書で私が最も感動した部分を引用させていただこう。

量子コンピュータは確率振幅というある種のアナログな量を使うことによって計算を加速しているが、量子情報に発生するアナログエラーについてはデジタル化して訂正することができるのだ。量子力学は、デジタルとアナログが両立するように、奇跡的に美しい構造をとっている。まさに、量子コンピュータを作り上げろと言わんばかりである。(p103)

サイコロ遊びが好きな神様は、どうやら人類が「宇宙をハッキングする」手段も用意してくれていたようだ。今後の量子コンピュータの発展と、藤井先生のご活躍に期待である。

なお、アニーリング型の量子コンピュータに関する同レベル帯の入門書としては、以下が読みやすいのでお勧めする。

*1:このことを専門用語では「測定基底を変えても相関を保っている」と表現する。

「Pythonによる数値計算とシミュレーション」;小高知宏著 読書感想 

本日紹介するのは、小高知宏著「Pythonによる数値計算とシミュレーション」。
元々はC言語版が古くから出版されていて、本書はそのPython版である。読者層は情報系が想定されているが、小高先生の本はサンプルプログラムの実装が素朴でわかりやすく、プログラミングを専門としない方でも理解や改造が容易である。また、本書はあくまで数値計算アルゴリズムを自分で実装することを趣旨とする本であるが、ScipyなどPythonのライブラリを用いる方法についても簡単ではあるが記述がある。

内容は6章構成で、1章で数値計算の基礎と誤差の問題を扱い、2章・3章で微分方程式の数値解法、4章でセルオートマトン、5章で乱数によるモンテカルロシミュレーション、6章でエージェントベースの手法を学ぶ。
私は物理系の数値計算の講義を受けた経験があり、微分方程式と乱数の部分は懐かしい気持ちで読み進めた。学生時代は特にオイラー法がお気に入りで、ロトカ・ヴォルテラ方程式レプリケータ方程式などを解いて遊んでいたことを思い出した*1
一方で、オートマトンやエージェントベースの手法は方程式ベースの手法とは毛色が違い、社会現象のシミュレーションに有用である。特に第6章で扱われる「感染」シミュレーションは、現在のコロナ禍を彷彿とさせ、非常に興味深く読ませていただいた。章末問題にも言及があるが、例えば飛沫の拡散などの物理シミュレーションと組み合わせて、「密」のシミュレーションなどをやってみたりすると面白いのではないかと思った。

ニュースなどでよく、「シミュレーションによれば何十年後の気温が何度上がる」とかいう話が出てくる。また、製造業のエンジニアをやっていると、CADソフトでシミュレーションを行う機会も多いだろう。本書を読むことで、「現実の物理現象や社会現象をコンピュータでシミュレーションするとはどういうことか」という概念が理解できる。数式ではなくコードがメインの本であるため、意欲的な高校生にもおすすめである。自分が高校生の頃にこういう本を読んでいれば、物理の勉強が捗ったのになぁ、と思う。

バグ情報?

第6章のマルチエージェントのプログラム、例えばP174の48行目などで、この実装ではカテゴリ0のエージェントだけ、1ターンに何度も移動することになる。
サポートサイトに正誤表が見当たらないので確認できないが、控えめに言っても本文に記述のない仕様である。カテゴリ0の移動はfor文の外に記述するのが正しいと思う。

def cat0(self):
    for a in agents:
        if a.category == 1:
            c0x = self.x
            c0y = self.y
            ax = a.x
            ay = a.y
            if ((c0x-ax)**2+(c0y-ay)**2) < R:
                self.category = 1
    if self.category == 0:
        self.x += random.random() - 0.5
        self.y += random.random() - 0.5

ただし、これだけだとカテゴリ0の移動量がサンプルプログラムより減ってしまうので、移動量は適当に調節するのがよいだろう。

Pythonによる数値計算とシミュレーション

Pythonによる数値計算とシミュレーション

*1:本書にも記述があるが、オイラー法は単純故に精度が悪く、実用的にはルンゲ・クッタ法が用いられる

「Pythonによる機械学習入門」;株式会社システム計画研究所編 読書感想 

本日紹介するのは、、株式会社システム計画研究所編、「Pythonによる機械学習入門」。
私は深層学習から入ってきたクチなので、ニューラルネットワーク以外の機械学習手法にはほとんどなじみがない。とりあえずscikit-learnの使い方でも覚えるかと手に取ったのが本書だ。本書は理論やアルゴリズムの実装は置いといてとにかくscikit-learnを使って機械学習を体験したい、という人をメインターゲットとしている。とはいえ、付録として理論的な部分の解説もあり、結構本質的なことが書いてある印象を受けた。

本書の前半の基礎編では、scikit-learnを使って決定木・ランダムフォレスト・サポートベクターマシン・線形回帰・k-means法などをどんどん試していく。名前だけはどこかで聞いて知っていたが、実際やってみるとやはり面白い。しかしながら良くも悪くもfitメソッドを呼ぶだけなので、正直身についている感はそれほどない。これだけの内容ならば、わざわざ書籍を購入しなくてもネット上でサンプルコードを探すだけで十分だろう。

本書の中で特徴的だと思ったのは後半の実践編、特に第6章の「画像による手形状分類」だ。この章では、著者であるシステム計画研究所が独自に用意したハンドジェスチャー画像を分類するモデルを学習する。オリジナルなデータセットを使い、データを増やしたりクレンジングしたりしながら、徐々に精度を上げていくことで、機械学習プロジェクトを追体験することができる。画像の撮影風景の様子も写真で載っており、機械学習のためのデータ準備の大変さが伝わってくる。mnistやirisを使っているだけではわからないことだ。
さらに、個人的に有益だったのは、HOG特徴量による特徴抽出が扱われていたことだ。別にHOG特徴量自体が詳しく解説されているわけではない。だが冒頭で述べた通り、私はほとんどニューラルネットワークしか扱ったことがなかったので、そもそも「人が頑張って設計した特徴量」というものを使ったことがなかったのだ。よく、「深層学習は自動で特徴量を見つけ出すのが凄い」といわれるが、当然ピンと来ていなかった。しかし、HOG特徴量を使うことで分類器の精度が向上することを目の当たりにすることで、何となく腑に落ちるものがあった。きっとCNNで畳み込むという操作も、本質的にはHOG特徴量を計算するという操作と同じなのだろう。HOG特徴量は人間が「こういう計算をして算出した値は画像の分類に役立つはずだ」という理論があって構築したものだが、CNNの場合は実際に正解を見ながら、こういう数値でフィルタ処理すれば(なぜか)精度が上がるよと、そういう計算方法を獲得するわけだ。この辺りの気づきが本書を読んだことでの最大の収穫だった。
なお、最後の第7章では四国電力のセンサデータを用いた回帰問題を扱うが、こちらは駆け足感が否めなかった。コードを載せずに結果だけ見せている部分も目立ち、消化不良で終わってしまった。こっちも第6章と同じように丁寧に進めてくれていれば、もう少し本書のおすすめ度が上がったのであるが…。

最後にまとめると、本書は主にscikit-learnを使って機械学習を体験してみたい初心者におすすめである。一方、理論やアルゴリズムの実装はほとんど扱っていない。ネット上にサンプルコードが無数に存在する中で、わざわざ本書で学ぶ必要があるかと言われると正直微妙なところではあるが、オリジナルデータセットを使った第6章は一読の価値があると思うので紹介させていただいた。

Pythonによる機械学習入門

Pythonによる機械学習入門

  • 作者:
  • 出版社/メーカー: オーム社
  • 発売日: 2016/12/01
  • メディア: 単行本(ソフトカバー)

「スッキリわかるJava入門 第2版」;中山清喬・国本大悟著 読書感想

本日紹介するのは、中山清喬・国本大悟著、「スッキリわかるJava入門 第2版」。
私は学校ではC言語を習い、仕事では主にPythonを使っている。今までJavaを学ぶ機会はなかったのだが、存在はもちろん知っていたし興味もあったので、軽く入門してみようと元旦から読み始めた。

main関数(正確にはmainメソッド)もクラスの中に書かなくてはいけないことに最初は面食らったが、まあプログラミング言語なんてどれも同じようなもので、for文だのif文だの配列だの、一通り書けるようになるのに時間はそれほどかからなかった。いちいち学習過程を書いたりはしないが、本書を読んで最も良かった点を一つ選ぶとすると、オブジェクト指向(特に多様性)について理解が深まったことだ。

Pythonを学ぶときに一応オブジェクト指向の勉強はした。もちろん多様性もその中に含まれていたが、正直「異なるクラスでも同名のメソッドを定義しておくと同じように使えて便利」というようなイメージしかもっていなかった。本書の表現を使うと、多様性の本質は「ザックリ捉える」ことなのだが、Pythonは元々型の扱いがザックリしているため、この「ザックリ」のメリットが理解しにくいのが原因だったのだろう。
Javaでは型を厳密に扱うため、例えば勇者*1がモンスターに攻撃するときには、attack(Slime s)やattack(Goblin g)のようにモンスターの種類ごとにメソッドを用意する必要がある。ここで、スライムやゴブリンのインスタンススーパークラスであるモンスター型の変数に格納することで、「スライムもゴブリンもザックリ言えばモンスター」とみなすことができ、モンスターに攻撃するメソッドattack(monster m)を1つだけ用意すればよくなる。
さらに、ザックリとモンスターと扱うことで、スライムやゴブリンをリストや配列に一緒に格納して、for文で同一のメソッドを連続して呼ぶようなこともできる。ここで重要なのが、抽象メソッドの仕組みにより、子クラスでのメソッドのオーバーライドを強制できることと、スーパークラス型の変数に格納されていても、実際に呼び出されるのは子クラスのメソッドである点だ。これにより、ザックリとモンスターと扱って同じように命令を出しても、各モンスターはスライムならスライム、ゴブリンならゴブリンのやり方で行動する。これこそが多様性なのだ。
このような説明は、私にとっては目から鱗だった。Pythonでは関数の仮引数に型を指定する必要はないし、リストにはあらゆるオブジェクトが格納できてしまう。だから多様性のメリットや思想に気付かなかったわけだ。この部分だけでも、本書を読んだ甲斐があった。こういう点で、本書はJavaの文法を勉強したい人だけでなく、オブジェクト指向という概念について勉強したい人にもおすすめできる。単なる文法解説ではなく、「現実を模倣する」というオブジェクト指向の思想を前面に押し出して解説しているため、文法部分を読み飛ばしたとしても得るものはあるだろう。

それにしても、自然言語にも言えることだが、異なる言語を学ぶということは異なる文化や思想を学ぶことだ。今回Javaを学ぶことで、Pythonを使っていては気づきにくいオブジェクト指向本来の思想に触れることができた。いつもついだらけてしまう正月休みだが、本書のおかげで今年は有意義に過ごせたと思う。

さて、本書には続編(実践編)がある。さらに踏み込んだ文法はもちろん、開発現場での仕事の仕方のようなことまで学べるようだ。私はJavaに関しては仕事で使うわけではないので今すぐ読む予定はないが、本書を読み終わって、さらに現場で本当に使える知識を身に着けたい方は続けて読んでみるといいだろう。


*1:本書ではサンプルプログラムとしてRPGを題材にしている箇所が多い。

「眼の誕生」;アンドリュー・パーカー著 読書感想

本日紹介するのは、アンドリュー・パーカー著「眼の誕生」。
日本におけるディープラーニングの第一人者である松尾豊先生が、著書や講演などでディープラーニングのことを「機械が眼を獲得した」と表現し、本書をよく参考文献として挙げている。そのため、本書のことを知っている方も多いだろう。私が本書を手に取ったのも松尾先生の影響だ。もっとも、本書はあくまでも古生物学の本であるため、これを読んだからと言ってAIや画像処理について学ぶことはできないが、純粋に自然科学の本として面白いのでお勧めである。

本書の目的は、カンブリア紀に起きた進化の大爆発がなぜ起こったのかを探ること。そして、著者であるパーカーがその疑問への解答としてたどり着いた「光スイッチ説」を読者に紹介することだ。そのため、本書はまずカンブリア爆発とは何かが解説されるのだが、私はここで驚いてしまった。
カンブリア爆発はよく、生物種が爆発的に増加したことだといわれるし、私もそう思っていた。進化の樹形図がすごいスピードで枝分かれしていくようなイメージだ。
しかしそれは誤解だったらしい。パーカーによれば、生物の内的体制の進化による動物門の増加はカンブリア紀より前から着々と進んでおり、カンブリア爆発とは「5億4300万年前から5億3800万年前に、現生するすべての動物門が、体を覆う硬い殻を突如として獲得した出来事」のことに過ぎない。樹形図の枝分かれはカンブリア紀より前にすでに終わっており、枝がもう1ステップ伸びるときに、突如としてすべての枝が硬質化し、殻を持った(それによって化石が残りやすくなった)ということらしいのだ。
つまり、「カンブリア爆発はなぜ起こったのか」という疑問は「なぜ枝分かれが起こったのか」ではなく、「なぜ殻を獲得したのか」という意味になる。そして、その疑問への解答としてパーカーがたどり着いた答えが、「眼を持った捕食者から身を守るため」だった。このように「眼の誕生」がすべての始まりだとするのが光スイッチ説であり、「ではいつ、どのように眼が進化したのか」を紐解いていくのが、本書の流れである。

本書では化石の分析だとか体色だとか、色々な話が出てくるが、一番印象に残ったのはニルソンとペンゲルの研究だ。
進化論に対する疑問の一つとして「眼のような奇跡的に複雑な器官が突然変異の積み重ねで生まれるのか?」というものがある。これに対する回答として、ニルソンとペンゲルの研究が、単なる感光細胞がカメラ眼まで進化しうることをシミュレーションで示している(文献[1])。しかも、この研究によると突然変異率を0.005%と控えめに見積もっても、(実時間換算で)50万年ほどで眼が生まれるらしい。
また、「中間段階の眼が何の役に立つのか」という疑問もよく見るが、シアノバクテリアやオウムガイのような現生生物は、原始的な眼でも実際に適応している。中途半端な眼でも、ないよりはマシというわけだ。
それにしても、この手の本を読むと、改めて生命の巧みさを思い知らされる。バイオインスピレーションという分野もあるが、人間はまだまだ他の生命から学ぶべきことがありそうだ。

ディープラーニングの成果は主に畳み込みニューラルネットワークによる画像認識の世界で著しい。松尾先生の言う「機械が眼を獲得した」というのはもちろん文字通りの意味でもあるのだろうが、わざわざ本書を推薦する意図を深読みするのであれば、「あなたも殻を進化させないと淘汰されるよ」ということではないだろうか。

参考文献

[1] Dan-E. Nilsson and Susanne Pelger, A pessimistic estimate of the time required for an eye to evolve, Proc. R. Soc. Lond. B 256, 53-58 (1994)

なお、本書を読むにあたり以下の書籍も参考にした。通読していないので個別には紹介しないが、興味のある方はぜひ。
[2] 土屋健著、「古生物たちのふしぎな世界」、講談社ブルーバックス出版社ページ)(Amazon
[3] 伊庭斉志著、「進化計算と深層学習」、オーム社出版社ページ)(Amazon