magattacaのブログ

日付以外誤報

GW読書感想文

GW10連休、皆様いかがお過ごしでしょうか?充実したお休みでしたでしょうか? GW期間中もお仕事だった皆様はお疲れ様です。ありがとうございました。

さて、とりあえず創薬レイドバトルがひと段落ついたので関連記事をGithubにまとめなおしました。 レポジトリはこちらです。 ノートブック形式ですが中身はMarkdownというよくわからないファイルですがご笑覧いただければ幸いです。

で、やはりどうにも自分には基本的な知識が足りていない(何がわからないかもわからない状態)ということが分かったので、 とりあえず専門用語を拾うべくいくつか本を読んでみました。 以下、とりとめもない備忘録です。

1冊目:コンピュータシステムの理論と実装

コンピュータシステムの理論と実装 ―モダンなコンピュータの作り方

コンピュータシステムの理論と実装 ―モダンなコンピュータの作り方

あれ?そもそもパソコンってどうやって動いているんだろう??みたいなレベルなので、とりあえずコンピューターサイエンスっぽい本を読んでみました。

最も基本的なユニット(電子ゲート)からはじめて、最終的にコンピュータシステムをつくるに至る過程を、一つずつ段階を踏みながら実践していこう!という内容です。 「イントロダクション」に引用されている言葉がこの本のスタンスを最も明確に示していると思うので引用します。

「人に重要な影響を与える唯一の学びは、自己発見・自己本位による学び、つまり、経験によって理解された真実のみである」 by カール・ロジャーズ(心理学者)

実際に作り上げるという経験を通して「コンピュータの動く仕組み」を理解しよう、というのが本書の目的ですが、では具体的にどうすればよいのか? 著者は「抽象と実装」を繰り返すことで可能になると述べています。 複雑なプロジェクトを成し遂げるためには、「抽象化」によりモジュールに分割し、それを組み立て直すというアプローチを取るべきだというのがその主張です。

「どのようにおこなうか(how)」という詳細を無視して、「この要素が何をするのか(what)」だけを考えて抽象化すること。 この段階が重要かつ実例に触れて学ぶべきものなので、「抽象化」は著者が解説・提供し、その実装の経験を読者が積む、という構成になっています。 そのために本書では解くべき課題とともに、導入の容易な実行環境、手順が提供されています。

特に私のような初学者にとって親切だと感じた点は、本書全体としては「ボトムアップでコンピュータをつくりあげる」という構成になっているものの、 最初のイントロダクションで「これから何をおこなおうとしているのか?」トップダウン的にプロジェクト全体の俯瞰を提供してくれている点です。 読み進めていくうちに何度も「あれ?いま何やってんすかね??」と迷子になりかけてましたが、その度にイントロに戻ることで全体の中での位置付けを確認することができました。

と、まるで理解したかのように書いていますが私は1章の論理回路で実装をあきらめました(知的体力が無さすぎる・・・)

とりあえず本書の中の図を切りはりすると以下のような話です。たぶん・・・

f:id:magattaca:20190506232548p:plain

NANDからスタートして作って行く話が、パーセプトロンの組み合わせと重み変えていろんな関数表現できるよ、みたいなDeepなお話に繋がっている気がしてちょっと賢くなった気分。(違うか・・・)

2冊目: StanとRでベイズ統計モデリング、3冊目: Pythonで体験するベイズ推論

Pythonで体験するベイズ推論 PyMCによるMCMC入門

Pythonで体験するベイズ推論 PyMCによるMCMC入門

お正月に「データ解析のための統計モデリング入門」という本をよみました(緑本?)。 統計モデリングについて、簡単なモデルから徐々に複雑なモデルへと、非常にわかりやすく解説されており、各所でオススメされている素敵な本なのですが、 後半、ベイズ統計モデルの話になったところで私は理解があやふやになりました。

  1. モデルが複雑化し、パラメータが増えるに従ってパラメータの推定が困難になる。(なるほど)
  2. 多数のパラメータの推定方法としてMCMCサンプリングがある。(・・・ほう)
  3. MCMCサンプリングで得られる定常分布はパラメータの確率分布(・・・はあ)
  4. だが頻度主義では「真の値」が1つあるという考えだから分布はあり得ない(・・・それはまた)
  5. でもベイズ統計モデルは確率分布としてあつかう枠組み(・・・ふーん)
  6. だから、今考えている統計モデルはベイズ統計モデルだったと見直そう(・・・・・・えっ?)

っていう感じの流れでした。4番目くらいで頭がついていかなくなりました。(3段階が思考の限界なのです。)  

しかしベイズという名前はあちこちで見かけるので、やはりお勉強しなければならないのではないか、ということで2冊ほどパラパラめくってみました。

今回読んだ2冊はいずれも実践的な面を重視しており、ベイズモデリングのためのソフトウェアとしてそれぞれ「RとStan」、「PythonとPyMC」が使われています。 コード例が多数記載されていて、特に「グラフの描画」がこまめに挿入されている点が実際の解析過程をなぞっているようで面白いと思いました。

が、しかし、ここまで多数の例を懇切丁寧に紹介されても私の理解力ではしっくりこない。ぼんやりとネットをうろうろしていたところ、以下の解説記事を見つけました。

下の本の著者の方が書かれているブログのようです。(著書は未読です。すみません。ちらっと見たら数式が多そうで手がでませんでした。)

機械学習スタートアップシリーズ ベイズ推論による機械学習入門 (KS情報科学専門書)

機械学習スタートアップシリーズ ベイズ推論による機械学習入門 (KS情報科学専門書)

上記のブログ記事の「ベイズ学習における基本的な流れ」を読み、やっと書籍で行われていたコードの流れが少しわかるようになりました。引用させていただきます。

  1. 尤度関数(観測データの表現方法)を定義する
  2. 事前分布(パラメータの散らばり具合)を設定する。
  3. ベイズの定理を使って事後分布を更新する。(=学習)
  4. 事後分布から予測分布を計算し、未知の値の確率分布を求める。(=予測)

こちらを見るまでは、一つ一つのコードを見ているうちに全体として何をやっているか追えなくなる、ということを繰り返していました。*1

流れがわかるようになったところで、改めてベイズ推論についてです。
考え方の導入としては③「Pythonで体験するベイズ推論」の「第1章 ベイズ推論の考え方」が「気持ち」を理解する上でわかりやすかったです。

曰く、ベイズ主義とは「信念」であり、さらに「人によって信念が異なっていることも定義が許している」点が、我々が日常で行なっている推論と類似しており自然な考え方、とのこと。(何を言っているかよくわからないと思うので気になった方は書籍の1章の最初だけでもご覧になっていただければと思います。)

②「StanとRでベイズ統計モデリング」2章のとても簡潔にまとめられた特徴と合わせると以下のような感じです。

f:id:magattaca:20190506233025p:plain

もう一つのキーワードMCMCですが、こちらは事後分布を求めるところで出てきます。 複雑なモデルではデータの得られる確率(p(D))を求める計算の難易度が高いため、 事後分布(p(θ|D))に比例する分布 p(D|θ)xp(θ)から乱数サンプルを多数発生させて事後分布の代わりとするそうです。*2

以上のような導入を踏まえて、読者の理解が進むよう、書籍②、③ともに豊富な事例を提供してくださっています。

  • 「実際にモデルを作成するにははどのような分布を選択すれば良いのか?」
  • MCMCの短所として、時間がかかったり収束しないということがあるけど、そんな時どうすればよいのか?」

といった話題に踏み込んで解説してくださっていますので、「頭のいい人はそう言う考え方でアプローチするのか」と非常に興味深かったです。

といってもほとんど理解できていないのでもう一回読んだ方が良さそう・・・。

4冊目:はじめてのパターン認識

はじめてのパターン認識

はじめてのパターン認識

機械学習 教科書」で検索すると必ず出てくる「はじパタ」こと「はじめてのパターン認識」・・・。

重い腰をあげて漸く購入したのですが、私には難しすぎました。本当に皆さんここからはじめているのでしょうか? 分厚すぎず教科書として無駄がない良い本なのだろうなあ、ということは印象ですが、はじめっからハードル高すぎでは・・・???*3

個人的には 第5章 k最近傍法で

がピークでした。

ただ、分からないなりに読み進めていく中で、雰囲気として「統計モデリングのお話と機械学習ではちょっと重点のおいている場所が違う」というのを感じました。

先に読んだベイズ関連の書籍では、背後にあるモデルを意識していることを前提としていました。 一方で「パターン認識」では「今あるデータを分析し、新しいデータの予測を当てること」に重点があり、なんなら 「現実の理由がわからないならそれでもいいんじゃない」くらいの雰囲気を感じました。

これも数式のもつ意味合いを理解できない私の力不足のせいでしょう。いつか理解できる日が来るのでしょうか???

5冊目:カーネル多変量解析

カーネル多変量解析―非線形データ解析の新しい展開 (シリーズ確率と情報の科学)

カーネル多変量解析―非線形データ解析の新しい展開 (シリーズ確率と情報の科学)

はじパタ「第8章 サポートベクトルマシン」で「カーネルトリック」という言葉を目にし、 「なんか知らんけど響きが格好いい!!」となったので購入しました。(安直)

結論としてこちらの本、門外漢にとってはとても楽しかったのです。なぜかというと全7章のうち、最初の4章が 「カーネル法すごいぞ!」「こんなことできてしまうぞ!」という「ご利益」の説明に重点がおかれており、 証明や理由の込み入った部分については適宜飛ばしつつでも読める、というように書かれているからです。

もちろん残りの後半の章で、前半で触れられなかった数学的な話が展開されています(・・・つまり私は後半を飛ばした)。

第1章ではまず現代の多変量解析においてカーネルがどのような役割を果たすか、その位置づけが語られます。

そもそもカーネル法とは、「カーネル関数の重み付きの和で表したモデルを正則化付きで最適化するデータ解析手法」と言えるそうです。
カーネル法のご利益は以下のような感じです。

  1. 線形モデルと異なり入力データとして非線形なもの(文字列やグラフ構造でもOK)を取ることができる
  2. カーネル関数の重み付きの和」を扱うので決めるべきパラメータ自体には線形性がある
  3. サンプル数(入力データ)と同じだけの自由度があるため複雑な関数を表現できる ⇄ 汎化能力が問題となる(正則化で解決を試みる)
  4. カーネルの計算とその後の処理を分離できるので、計算をモジュール化できる。

次いで第2章では、カーネル法で使われるカーネル関数はどのようなもので、どうやって導入することができるのか、複数の観点から定義が試みられています。
注目の「カーネルトリック」は、「正定値性からの導入」で取り上げられています。

曰く、「正定値性をカーネル関数の定義とすれば」、「内積計算が不要」となり、「計算量をぐっと減らすことができる」そうな・・・。    この一つ前に語られている「特徴抽出からの導入」ではカーネル関数が「特徴ベクトルΦ(x)どうしの内積」として定義されていました。
これに対して「正定値性を満たすことがわかっている関数」を利用すれば、内積計算で導く必要なくカーネル関数を用意できることになるそうです。(・・・???)*4

ここまでの例示は回帰の話題が取り扱われているのですが、第3章、第4章と、より複雑な問題へ話題が移ります。
第3章では固有値問題の例として「カーネル主成分分析」や「カーネル正準相関分析」が、
第4章では凸計画問題の例として「サポートベクトルマシン」や「スパース性」について触れられています。

私はそもそも「カーネル」が接頭語としてついていない「主成分分析」「正準相関分析」もあやふやな段階だったので、「そんなお話もあるのね」程度にしかわかりませんでしたが、だいたい第3章の手順としては、繰り返し

が行われていました。

第4章 SVMの解説はとても面白く、「はじパタ」ではいまいち理解できなかった部分についてもう少し追うことができました。
まず、そもそもの出発点として、クラス分類の識別関数誤差に対するペナルティの考慮からスタートしています。

問題意識として、

  1. 損失関数に2乗誤差を用いると外れ値の影響が大きくなる(ロバスト
  2. サンプル数が多すぎる場合計算量が大きくなりすぎる(スパース性

という点があげられています。これに対して

  1. 「最小2乗ではない物」を使いたい + 「凸関数」をつかいたい、と言うことで損失関数に「区分線形損失」を導入
  2. これを解いた解は、サンプルの一部分しか使わないため(スパース)、計算量が節約できる

という解説がなされています。より具体的には、

といった流れです。この中で、

  • KKT条件の相補性条件から解のスパース性(サポートベクトルが全体のサンプルに比べてスパースになる)

が導かれるという説明がなされます。書き写しておきながら全然理解していませんが、未来の自分のためのメモです。ご容赦ください。

「それでは、具体的なカーネル関数の中身はどのようなものなのか?」「どう設計すれば良いのか?」という話題は第5章以降に展開されていますが、またしても私の能力では追いきれませんでした。

6冊目:岩波データサイエンス vol.5 スパースモデリングと多変量データ解析

岩波データサイエンス Vol.5

岩波データサイエンス Vol.5

GW読書感想文、最後ははじめての「岩波データサイエンス」です。 これはもう単純に「スパース性」の話題を知りたかった、というだけです。

結論・・・「えるわん」

なんだかすごくL1でlassoでした。めっちゃ0になるらしいです。

明治大学 データ化学工学研究室 金子先生のページに、 「Lassoの回帰係数がなぜ0になりやすいのか?」について解説が記載されていました。 「係数が0になりやすい」というのを目にし、吝嗇家としては「もったいない・・・」となりましたが、 見方を変えて「特徴選択」という観点からは、「0になることにこそ価値がある」という話になるようです。

その発想はなかった・・・。

フィンガープリントを計算して見た際に、「立っているビットの数が少ない」という印象をうけ、「なんだかスパースを考えないといけないのでは!!!」というのが興味をもったきっかけだったのですが、とりあえずL1正則化項を入れれば解決、ということでしょうか???

まとめ

以上、いつにもましてとりとめもない備忘録でした。 理解できないとはわかっていましたが、ここまでわからないとは・・・。 そもそももっと腰を落ち着けて時間をかけて読むべき本ばかりなのでしょうが、如何せん計画を立てて勉強できない自分の性格をなんとかしないといけなさそうです。

カリキュラムがある大学はいいなあ。

*1:薄々感じていましたがどうやら私は物事の全体像、大きな流れを把握する能力がとても低いようです! まさしく先の「コンピュータシステムの理論と実装」で言及されていた「抽象化」の能力が欠けてるってやつですね!

*2:※ p(θ|D) = p(D|θ) x p(θ) / p(D) を想定

*3:そもそも「添字のある式は読めない」のに機械学習の理論を勉強しようと言うのが間違ってる???

*4:例としてはガウスカーネルが挙げられています。SVMみかけるRBFカーネルもこれのことでしょうか??