2023 Final Quarter 振り返り

さて、いよいよ遅いですが2023年10月〜12月、Final Quarterの振り返りを書きたいと思います。

2023年10月~12月で何をしていたか

Final Quarterではベイズ統計学の学習にのみ専念しました。

使用した教科書は前回の振り返りでも紹介した『標準 ベイズ統計学』です!

目次は以下の通りです:

1.導入と例
  1.1 導入
  1.2 なぜベイズか
  1.3 本書の構成
  1.4 補足と文献案内
2.信念,確率,交換可能性
  2.1 信念関数と確率
  2.2 事象,分割,ベイズルール
  2.3 独立性
  2.4 確率変数
  2.5 同時分布
  2.6 独立な確率変数
  2.7 交換可能性
  2.8 デ・フィネッティの定理
  2.9 補足と文献案内
3.二項モデルとポアソンモデル
  3.1 二項モデル
  3.2 ポアソンモデル
  3.3 指数型分布族と共役事前分布
  3.4 補足と文献案内
4.モンテカルロ近似
  4.1 モンテカルロ法
  4.2 任意の関数に対する事後推測
  4.3 予測分布からのサンプリング
  4.4 事後予測分布によるモデルのチェック
  4.5 補足と文献案内
5.正規モデル
  5.1 正規モデル
  5.2 分散所与の下での平均に関する推測
  5.3 平均と分散の同時推定
  5.4 バイアス,分散,平均二乗誤差
  5.5 期待値に基づく事前分布の特定
  5.6 非正規なデータに対する正規モデル
  5.7 補足と文献案内
6.ギブスサンプラーによる事後分布の近似
  6.1 準共役な事前分布
  6.2 離散近似
  6.3 条件付き分布からのサンプリング
  6.4 ギブスサンプリング
  6.5 ギブスサンプラーの一般的な性質
  6.6 MCMCの収束診断法
  6.7 補足と文献案内
7.多変量正規モデル
  7.1 多変量正規分布の密度関数
  7.2 平均に関する準共役事前分布
  7.3 逆ウィシャート分布
  7.4 平均ベクトルと共分散行列のギブスサンプリング
  7.5 欠測データと代入法
  7.6 補足と文献案内
8.グループ比較と階層モデリング
  8.1 二つのグループを比較する
  8.2 複数のグループを比較する
  8.3 階層正規モデル
  8.4 例:米国公立学校における数学試験
  8.5 平均と分散の階層モデリング
  8.6 補足と文献案内
9.線形回帰
  9.1 線形回帰モデル
  9.2 回帰モデルにおけるベイズ推定
  9.3 モデル選択
  9.4 補足と文献案内
10.非共役事前分布とメトロポリス・ヘイスティングスアルゴリズム
  10.1 一般化線形モデル
  10.2 メトロポリスアルゴリズム
  10.3 ポアソン回帰に対するメトロポリスアルゴリズム
  10.4 メトロポリス,メトロポリス・ヘイスティングス,ギブス
  10.5 メトロポリスとギブスの組み合わせ
  10.6 補足と文献案内
11.線形・一般化線形混合効果モデル
  11.1 階層回帰モデル
  11.2 完全条件付き分布
  11.3 数学試験データの事後解析
  11.4 一般化線形混合効果モデル
  11.5 補足と文献案内
12.順序データに対する潜在変数法
  12.1 順序プロビット回帰と順位尤度
  12.2 正規コピュラモデル
  12.3 補足と文献案内

学習の内容、というよりかは書評

このQuarterではch.5 ~ ch.9まで読みました。とはいってもその後続けて読んだので、現時点で読了しています。

読了後の感想としては、まず素晴らしいベイズ統計学の教科書であり大変感銘を受けました!

  • 理論と実践のバランスの良さ:
    • 各章の多くで具体的な統計の事例 (社会学的なもの、生物的学もの) などを取り上げており、その後取り上げられる理論について具体的な動機 (これができると何が嬉しい?) を持ちながら取り組むことができるので大変知的好奇心を刺激されました。
  • 教科書全体を通した明確なストーリー構成
    • この教科書では以前の章で学習したものをさらに拡張・発展していくのような話の展開が多く、ストーリーのようなものを感じました。例えば階層モデルをch.8で導入するのですが、これの拡張として正規階層回帰モデルがch.11で扱われています。
  • 手を動かしながらも適度な行間の構成、計算力
    • 個人の好みかもしれませんが、分布のパラメータの計算過程などが無理のない適切な行間であり、自分で読みながら計算を追いかけることができたので実践の楽しみがあり面白かったです。
  • コンピュータでの計算の応用への充実

ただ他の方に推薦するときは以下に注意したいと思います:

  • 数学的厳密性
    • 先にも述べましたが数学専攻で扱うような数学的厳密性は担保されていません。
  • 統計学の前提知識
    • 入門程度の統計学は読者の知識に仮定されていると思います。少なくとも微積分は当たり前に使います。

今後の方向性

候補としては取り敢えず統計学の勉強を更に深めるために

他にも大学院時代に (一応) やっていたトロピカル幾何の書籍が年末に出たので

などを考えています。 あと少しは手を動かして実装するような活動もしたいですね!

2023 Third Quarter 振り返り

さて11月に入ってしまいました!7月 ~ 9月なのでだいぶ遅くなってしまいましたがThird Quarterの振り返りです。

2023年7月~9月で何をしていたか

OS自作 (というかUEFIとの格闘)

結局未完成のch.2のbranch: github.com

さてSecond Quarterで始めたといっていた通り、OS自作としてミカン本をRustに移植するということを続けていたのですが…

これはなかなか苦労しました、そもそもch.2にあるメモリマップの保存もすんなりとはいかないのです。 uefi-rs配下にあるuefi-rawを使用して実装を進めていたのですが、何分用意されていないものも多く、例えば必要なProtocolがないということがあり困ってしまいました。

github.com

具体的にはch.2で取得したメモリマップをファイルに保存するのですが、本の通りCで書くと次のようなコードになります:

EFI_STATUS OpenRootDir(EFI_HANDLE image_handle, EFI_FILE_PROTOCOL** root) {
  EFI_LOADED_IMAGE_PROTOCOL* loaded_image;
  EFI_SIMPLE_FILE_SYSTEM_PROTOCOL* fs;

  gBS->OpenProtocol(image_handle, &gEfiLoadedImageProtocolGuid,
                    (VOID**)&loaded_image, image_handle, NULL,
                    EFI_OPEN_PROTOCOL_BY_HANDLE_PROTOCOL);

  gBS->OpenProtocol(loaded_image->DeviceHandle,
                    &gEfiSimpleFileSystemProtocolGuid, (VOID**)&fs,
                    image_handle, NULL, EFI_OPEN_PROTOCOL_BY_HANDLE_PROTOCOL);

  fs->OpenVolume(fs, root);

  return EFI_SUCCESS;
}

上のOpenRootDir()の実装にもあるようにSimple File System Protocolが必要ですが、そもそもこれがuefi-rawにない。 そこで自前で用意しようといろいろ調査して格闘しました:

zenn.dev

結局のところ、進捗が全く出ないというわけではないですが、速度の割にはリソースの時間をほとんど使ってしまう上、そもそもの目標であったOSの機能にあまり集中できていないではないか…ということでいったんRustでのMikanOSの移植プロジェクトはpendingにしようと思います。😢

次のQuarter以降では、まずは基礎としてC/C++でOSの機能を実装することに注力します。

追記: あとCHAR16の扱いに困った!

sksat.hatenablog.com

ベイズ統計学

Third Quarterから新規にベイズ統計学の学習を始めました。

買って積んでいた下の『標準ベイズ統計学』を読み進めてみたところ、ちょうど自分の興味の方向性と予備知識がマッチした感じがあり結構楽しんでいます!

1.導入と例
  1.1 導入
  1.2 なぜベイズか
  1.3 本書の構成
  1.4 補足と文献案内
2.信念,確率,交換可能性
  2.1 信念関数と確率
  2.2 事象,分割,ベイズルール
  2.3 独立性
  2.4 確率変数
  2.5 同時分布
  2.6 独立な確率変数
  2.7 交換可能性
  2.8 デ・フィネッティの定理
  2.9 補足と文献案内
3.二項モデルとポアソンモデル
  3.1 二項モデル
  3.2 ポアソンモデル
  3.3 指数型分布族と共役事前分布
  3.4 補足と文献案内
4.モンテカルロ近似
  4.1 モンテカルロ法
  4.2 任意の関数に対する事後推測
  4.3 予測分布からのサンプリング
  4.4 事後予測分布によるモデルのチェック
  4.5 補足と文献案内
5.正規モデル
  5.1 正規モデル
  5.2 分散所与の下での平均に関する推測
  5.3 平均と分散の同時推定
  5.4 バイアス,分散,平均二乗誤差
  5.5 期待値に基づく事前分布の特定
  5.6 非正規なデータに対する正規モデル
  5.7 補足と文献案内
6.ギブスサンプラーによる事後分布の近似
  6.1 準共役な事前分布
  6.2 離散近似
  6.3 条件付き分布からのサンプリング
  6.4 ギブスサンプリング
  6.5 ギブスサンプラーの一般的な性質
  6.6 MCMCの収束診断法
  6.7 補足と文献案内
7.多変量正規モデル
  7.1 多変量正規分布の密度関数
  7.2 平均に関する準共役事前分布
  7.3 逆ウィシャート分布
  7.4 平均ベクトルと共分散行列のギブスサンプリング
  7.5 欠測データと代入法
  7.6 補足と文献案内
8.グループ比較と階層モデリング
  8.1 二つのグループを比較する
  8.2 複数のグループを比較する
  8.3 階層正規モデル
  8.4 例:米国公立学校における数学試験
  8.5 平均と分散の階層モデリング
  8.6 補足と文献案内
9.線形回帰
  9.1 線形回帰モデル
  9.2 回帰モデルにおけるベイズ推定
  9.3 モデル選択
  9.4 補足と文献案内
10.非共役事前分布とメトロポリス・ヘイスティングスアルゴリズム
  10.1 一般化線形モデル
  10.2 メトロポリスアルゴリズム
  10.3 ポアソン回帰に対するメトロポリスアルゴリズム
  10.4 メトロポリス,メトロポリス・ヘイスティングス,ギブス
  10.5 メトロポリスとギブスの組み合わせ
  10.6 補足と文献案内
11.線形・一般化線形混合効果モデル
  11.1 階層回帰モデル
  11.2 完全条件付き分布
  11.3 数学試験データの事後解析
  11.4 一般化線形混合効果モデル
  11.5 補足と文献案内
12.順序データに対する潜在変数法
  12.1 順序プロビット回帰と順位尤度
  12.2 正規コピュラモデル
  12.3 補足と文献案内

Third Quarterでch.1 ~ ch.4まで読みました。断片的で中途半端になっていた自分の統計学の知識がつながっていくような感じもあって、なかなかに充実した学習になっています。

印象に残っているのはデ・フィネッティの定理と共役事前分布についての議論とそれの指数型分布族への一般化です。デ・フィネッティの定理は下のスライドが更に踏み込んだ話題になっていて面白かったです:

どこへ向かうか

さて2023年もFinal Quarterですね!

次のQuarterではベイズ統計学の教科書の続きとC/C++でOS自作がメインになりそうです。ただ年末ということもあり、時間に余裕がなければベイズ統計学に集中するのがいいかもしれません。

あとちょうどベイズ統計学の面白そうな本が新しく出版されたのでさっそく買いました、やっててよかった代数幾何学!😎

2023 Second Quarter 振り返り

さて、2023年第2四半期の振り返りです。なかなか仕事が忙しい時期だったりして思うようには進まなかったな〜

2023年4月~6月で何をしていたか

暗号理論

まずは暗号理論での進捗です。暗号理論の勉強をちょうどGWから開始しました。

自分の知識としては、数論などについての数学的な内容はそれなりに知識があったものの、暗号そのものについては疎かったこともあり、目標としてまず暗号の基礎・一般的なところを理解するという点に注力しました。

使用したテキストは次の書籍です:

第1章 現代暗号の誕生:公開鍵暗号の発見と暗号標準化
第2章 現在のネットワークで使われている暗号
第3章 現代暗号の理論
第4章 ビットコインの誕生:電子マネー革命
第5章 ポスト量子暗号
第6章 新しい暗号:進化発展する公開鍵暗号

この本の第1章から第3章までを読みました。

第1章と第2章とで暗号理論の基礎的な知識がコンパクトにまとまっており、 公開鍵暗号ディジタル署名といった基礎の基礎を学習しました。これら主要な概念が明確かつシンプルに書かれておりとても勉強しやすかったです。公開鍵の歴史的な発展の流れなどもありその点も楽しかったです。

暗号理論では初等数論から群論、有限体、楕円曲線などが重要な基礎として登場します。 多くの本では代数学や数論などの入門から扱っているものが多く(もちろんその方が本来好ましいのですが)一方それら必要な数学を既に知っていると冗長でかえって読みづらかったりします… この本で特に暗号理論のエッセンスとなる要点にだけに集中できました。

またいったんこの本で公開鍵基盤 (PKI) まで読み進めれば、SSL/TLSの詳細な本を見たときに理論として必要なことをどう実装に落とし込むかが見えてきて面白かったです!

一方、第3章は主に暗号の安全性についての議論なのですが、こちらは助けになる知識もなくなかなか難しかったです。扱われていたのはだいたいゼロ知識証明、汎用的結合可能性といったトピックになります。

ゼロ知識証明もいわゆる数学における厳密な”証明”とは違い、あくまで確率的な話なのが以外でした。自分のしっかりとした理解のためには、ここの細かい議論は別途改めてより詳しいものを当たらないといけないようです。

また汎用的結合可能性は「諸々の暗号機能を組合せたときの安全性を保証したい」ということはわかりましたが、そのシミュレーションの定式化から安全性の証明まで多くのことが消化不良で終わりました…こちらはまた別の機会に深めたほうがよさそうですね。実際のコンピュータでの実装などを見ることになったらもう少し具体性を帯びるかもしれません。

OS・カーネル

前半は次の書籍でLinuxカーネルについて学んでいました:

第1章 Linux カーネルの基礎
第2章 Linux カーネルのモジュール管理
第3章 Linux カーネルのビルド方法
第4章 タスクスケジューラの仕組み
第5章 仮想メモリーを実現する仕組み
第6章 コンテキストスイッチの仕組み
第7章 物理メモリー管理の仕組み
第8章 ファイルシステムの仕組み

この内当四半期で読んだのは第1章と第2章のみです。

カーネルモジュールなどまだLinuxカーネルの話題としては基礎で自分が知らないことでありとても勉強になりました。 将来的にモジュールの自作などしてみると面白そうですね。

ただ前四半期からこの分野の勉強は理論・座学がほぼ全てとなっており、そろそろ実際に手を動かして試行錯誤しないとだんだん要点や知識的な地理感がわからなくなってきていました。

そこで座学は一旦休みにして、6月頃からOS自作をスタートさせました。 有名なOS自作本『ミカン本』をもとに、本書でC言語で書かれているものをRustに移植するというものです:

さてRustで書くにあたりUEFIまわりの実装をどうするかですが、以下の面白い記事を読みました:

engineers.ntt.com

UEFIのRust wrapperはすでによく知られたものがあるようですね:

github.com

確かにUEFIのRust wrapperがあれば実装はスムースかもしれませんが、UEFI自体に深入りせず結果として肝となるようなところを素通りしてしまえば、せっかくのOS自作なのにCS修行としてはいまひとつ足りないものになりそうです。

しかしだからといって、今の自分にUEFIを実装しながらさらにOS自作のいろいろなことを吸収・実装するのは到底無理があるように思えました。

折衷案としてuefi-rs配下にuefi-rawという、UEFI Specificationをそのまま実装したのではないかと見えるcrateがありました。こちらどれくらいの完成度かわからないのですが、現在このuefi-rawを使いながらMikanOSを実装しています。

とはいえなかなか難しいですね、結局UEFI Specificationとuefi-rsのコードの両方とにらめっこしながら実装しています。四苦八苦ですがこういうのはなかなか好きで楽しいです!

uefi.org

アルゴリズム演習

当四半期ではLeetCodeなどの演習自体は特にやりませんでした。

そういえばZennではじめて記事を書きました:

zenn.dev

どこへ向かうか

さて2023年も折返しです。今後の動きについてはまず

OS・カーネルはOS自作を原則継続

になります。これが半年で完了するかどうか自信がありません… (悲しいけど普段は労働者なのよね)とはいえある程度概算で見通しを立てたいですね。

暗号理論についてはこの後ネットワークとの関連性を深めようと思います、つまりSSL/TLSです。

SSL/TLSについては次の有名な本の前半から入ろうと思っています:

さてこちらも最終的には何か自作的なものになるのでしょうか?

では2023年後半も励んでまいります!

2023 First Quarter 振り返り

こんにちは、データエンジニアのJanosです。 これから4半期ごとに主に自分の勉強やアウトプットを振り返る場としてブログにまとめていこうと思います。 仕事のことは上場していることもあり守秘義務などありますのであまり書きません。

2023年1月~3月で何をしていたか

アルゴリズム演習

アルゴリズムの演習として現時点ではLeetCodeのmedium問題を解いていくということを行っています。

leetcode.com

もともと昨年春ごろから始めて昨年の終わりには400問ほど解いていました。

なぜ始めたかというと主な動機は次の2点です:

  • もともと競プロなどで出題されるようなオーソドックスな基礎的なアルゴリズムの知識と、それらを実際に実装できるという能力を確保しておきたかったため。
  • リモートワークなどで海外の会社への参画の敷居が低くなったこともあり、将来的にグローバルな就活でのコーディングテストに備えておきたかったため。

LeetCodeでは問題のジャンル分けがタグ付けでなされており、またUIなども使いやすくなかなかいいコーディング教育サービスだと思います。私は主にPythonで問題を解きたかったためTLE判定が言語別になされるところもgood pointでした。

このquarterでは主に動的計画法などの問題を中心に解いていました。動的計画法は去年の春頃に一度集中攻略をしたのですが、比べて格段に解けるようになっているとはいえ、まだまだ解けないケースがままあり熟練には距離があるように感じました。

LeetCode、2023年4月2日のstatus

Linuxカーネルの学習

この期間ではまたLinuxカーネルについて基礎的な知識を勉強しました。 具体的には昨年10月に購入した『Linuxのしくみ』という本をch.1 ~ ch.9まで読みました。

目次は次のとおりです:

第1章  Linuxの概要
第2章  プロセス管理(基礎編)
第3章  プロセススケジューラ
第4章  メモリ管理システム
第5章  プロセス管理(応用編)
第6章  デバイスアクセス
第7章  ファイルシステム
第8章  記憶階層
第9章  ブロック層
第10章 仮想化機能
第11章 コンテナ
第12章 cgroup

あとコンテナ、仮想化機能、cgroupといった内容を読み残しています。本書を読むことでプロセスやメモリ、デバイスアクセスといったソフトウェアエンジニアなら全く知らないわけはないものの、それらを雰囲気でやってきた自分のようなエンジニアにはとてもよい知見になったと思います。

もともとの動機は以前Dockerについて学習した際、Dockerfileの書き方はまあ理解できるのですが、実際に内部・システムの詳細についてさっぱりわかっていないという自覚があったためです。

重ねて調査するとUnionFSやcgroupsといった技術を応用していることはわかりましたが、詳しい文献には当時当たれませんでした…

いつかこのあたりを理解しないと”Dockerfile書けるマン”以上にならないなあと思っていました。この本を読むことで、だいぶどういった情報を狙っていけばいいのかわかるようになり、コンテナの技術文書でも見覚えがある用語・概念が増えました。

次の4半期でやることの展望

アルゴリズム演習

LeetCodeではmediumを500題は解きたいと思っています。そのためまた次のquarterでも4,50問ほど進めることを予定しています。 またそろそろ解けなかった問題の再演習を組み込んでいきたいと思っています。 今年の後半でhard問題への攻略も予定していますのでだんだん切り替えていく感じになるのかな。

またLeetCodeはもともとあくまで就活のためのサービスなので、どうしてもグラフ、ネットワークフロー、計算幾何といったジャンルの問題はかなり手薄になります。これを補うためにAtCoder Problemsの利用を検討しています。となると競プロに足りるだけのC++をできるようにする必要があり、こちらも対応しなくてはなりませんね…

OS / カーネル

Linuxのしくみ』の残りはもちろん、継続してさらに難易度の高い方向へ進みたいと考えています。まだ具体的には決まっていませんが次のテキストあたりを当たっています:

その他

あと直近で興味があるのは