書籍「原論文から解き明かす生成AI」の演習問題の設計


TL;DR

  • 演習問題は自力で論文を読み解く力を高めたり書籍では扱いきれなかった部分をカバーするために提供している
  • 演習問題も色々と工夫しているので、興味があったら解いてみてほしい
  • 問題の粒度や難易度の整理などうまくやり切れなかったところも多々ある

書籍「原論文から解き明かす生成AI」が発売から1ヶ月ほど経った。 本書の執筆に際して工夫したことや考えたことをブログに残しておこうと思っており、今回は演習問題について書く。

本書では演習問題(全 62 問)とそのすべての解答を提供している。 演習問題は本書の文中、解答はサポートページ https://github.com/yoheikikuta/support-genAI-book に載せている。 これらの演習問題と解答を設定した目的や工夫したところについて紹介する。

演習問題の目的

本書のコンセプトは原論文を読み解いて理解していくことであり、そのためには式展開のギャップを埋めたり参照している論文を深掘りしたりすることが不可欠である。 基本的には本書の中でこれらのことを経験できるようになっているが、やはり自分自身で取り組まないと面白さや難しさが実感しづらい部分もある。

演習問題はそのギャップを埋め、自分自身で取り組むことでより理解を深めたり面白さを味わうことを目的としている。 その目的に沿って問題を選定しており、本文で解説した内容の具体例の構築・本文における式展開のギャップを埋める・実装を読んで理解を深める・関連する論文の内容を理解する、などが典型的な問題となっている。

いくつか実際の問題をピックアップして見てみよう。

次の問題は、多くの人が目にしたことはあるであろう命題を、具体例を構成して理解せよというものである。 概念的になぜこうなるかを理解している人もいるだろうが、最小の具体例を構成しようとすると学びがある(かもしれない)問題である。 これを問題にしているのはもちろんこの命題がある論文の内容を理解するために必要だからである。

次の問題は、Transformer Decoder 部分の実装を読むべしというものである。 公式実装を読んで実装を理解しつつ、本文の内容と対応づけることで、自然言語や数式だけでは表現するのがややこしい内容の理解を深めることを狙いとしている。

次の問題は、他の論文で使われている可視化手法を調べて説明せよというものである。 注意重みの可視化と書かれるとまあ何かしらの方法で可視化してるんだろうなと読み飛ばすこともあるだろうが、何かしらの方法って具体的にはどうやるんだろうと気になることもあるだろう。 後者の場合には参照論文を読みにいって理解しよう、を実践する問題である。 解答では説明だけでなく実装も提供している。

ここで挙げたのは一例だが、こういう感じで色々な狙いを持って演習問題を準備したので、興味がある問題だけでも解いてみてほしい。

演習問題の解答をすべて提供するかどうかは少し迷ったが、すべて提供することにした。 迷った理由はもちろん大変だからで、問題を解くことはさほど苦ではないが、ちゃんとしたドキュメントにするのはかなり大変である。 労力は大きいがこういう本の演習問題を解く読者は少ない(感覚でしかないが数パーセント以下とか?)ことを考えると腰が重いところもあったが、必要とする人もいるだろうということで歯を食いしばって頑張った。

演習問題で工夫したところ

演習問題の目的や狙いについては説明したが、設計として工夫したところについても書いておく。

まず、コーディングに関するものを演習問題に寄せているが、これは本よりも GitHub 上の方が扱いやすいと考えているためである。 本文でもコードを記載して読んで理解を深める部分はあるが、「はじめに」にも書いたように本書のコンセプトを際立たせるためにコードに関してはかなり取り扱いが少ない。 一方で、やはりコードを読んだり書いたりした方が理解が進むものがあり、それは GitHub 上(もしくは実行可能なコードという意味では Colaboratory など)の方が扱いやすいので、演習問題として扱うことで本文と相補的な関係になるようにしている。

次に、演習問題の解答を GitHub のように更新しやすい場所で管理することで時間変化にある程度対応しやすくしている。 例えば、本文に旧 Chatbot Arena のランキングの情報を載せて、演習問題では現時点でのランキングを確認せよという問題を設定している。 生成 AI は進化が激しい分野であり、執筆時点の情報が古くなっていることは避けられない(本書は意識してそういう影響が少ないトピックを取り扱ってはいるが評価の章はそれが難しい)ので、その差分を演習問題で吸収できるようにしている。 これにより、読者が演習問題を解くことで執筆当時からどれくらい進化したのかを感じられるようにもなっている。

最後に、本書を理解し演習問題を解くことによって、最後にちょっとした感動が得られるようにしている。 以下が最後の演習問題で、これ自体は好きな問題を選んで難易度を体感してもらえばいいが、解答では Humanity’s Last Exam の中からとある問題を選んで解説している。

そのとある問題は、初見では解くのが難しいと思われるが、本書の内容を理解して演習問題を解いていけば自分の力で完璧に解ける問題であり、Humanity’s Last Exam のとある問題が解けるようになっていた!という感動を味わえるものになっている。

演習問題でうまく設計しきれなかったところ

うまくやりきれなかったところも書いておく。

演習問題の粒度や難易度を整理して提供するというのは全然できなかった。 この辺りが整理できていれば読者が取捨選択して取り組みやすくなったと思うが、うまく設計しきれなかったので、筆者が大事もしくは面白いと思うトピックがピックアップされたものという域を出なかった。 これは明確に筆者の力不足である。

GitHub 上でマークダウンとして解答を準備したというのはあまり良い方法ではなかった。 GFM でも数式は扱えるし .md ファイルで管理すれば読者が間違いを見つけた時に PR で直接修正提案ができる、という考えでこの形にしたが、数式がうまくレンダリングできない部分がある(例えば太字がうまく表示されないなど)し、そもそも PR が何度も来るものでもない(現状はゼロ)ので、これはもうちょっと見やすい方法で提供できたらよかったかもと思う。 ただ、数式とテキストがメインなら PDF を置いとけばいい気がするけど、コードもあるので PDF にしとけばいいというものでもなくて、なかなか良いソリューションがないなという印象。 良いソリューションを知っている人がいたら教えてください。

全体的に、演習問題は本文と比べるといい感じだなという自信が持てない時間が長かった。 最初の企画の段階では演習問題があるとめちゃいいだろうなと考えていて、いざある程度書いてみたら全然効果的に思えなくてこれ無い方がよくね?となり、いやでもコンセプト的にあった方がいいはずと頑張って一通り準備したら結構いいじゃんとなって、上がったり下がったりという感じだった。 うまく設計しきれなかったところはあるが、最終的にはまあまあ良いところに着地したのではないかと思う。

興味ある人はぜひ演習問題も解いてみてね

せっかく演習問題と解答を準備したので、このブログエントリを読んで興味を持った人はぜひ取り組んでみてください。