その本の「はじめに」には、著者の「伝えたいこと」がギュッと詰め込まれています。この連載では毎日、おすすめ本の「はじめに」と「目次」をご紹介します。今日は赤石雅典さんの『 最短コースでわかるディープラーニングの数学 増補改訂版 』です。「まえがき」と「増補改訂版の発行に寄せて」をお届けします。

【まえがき】

 2012年の画像認識のコンテストで驚異的な認識率をひっさげて登場した「ディープラーニング」は、その後すさまじい勢いで進歩をとげ、大ブームとなりました。
 人工知能(AI)のブームは、第1次、第2次と過去にもありましたが、第3次となる今回とこれまでとの最大の相違点は、今まで解けなかった実際の問題に対して次々と結果を出している点です。どのような形になるかはわかりませんが、今後も社会に不可欠な技術として定着することは間違いないと筆者は考えています。
 このように大きなインパクトを示したディープラーニングに対して、多くの人が「その動作原理を理解したい」と考えます。筆者もその一人でした。幸いにして基礎的なところは本を出せるレベルまでは理解できるようになりました。
 そこで感じたのは「これって結局のところ数学だな」ということです。もう1つ感じたことがあります。それは世の中に大量に出回っている「ディープラーニング」や「機械学習」をタイトルとしている書籍が

  • 初心者を意識する余り、ディープラーニングの本質までたどり着けずに終わっている
  • ちゃんと書かれているが、出だしからハードルが高すぎて、最初からわからない

の2つのパターンに分かれてしまい、その中間のレベルのものがほとんど見当たらないことです。初心者向けの本でありがちなパターンとして

 「初心者」=「数学が苦手」という前提を基に、「数学の話になるとすぐ例え話で代用しようとする」→「結局なんだかわからなくなる」

という傾向も感じました。

 今回、筆者が本書を執筆しようとした最大の思いは、まさにこの現状のギャップを埋めたかったということになります。そして本を出すにあたって真っ先に考えたのは、従来の初心者向け書籍と逆の発想で「数学から逃げない」形にすることでした。
 数学の解説の出発点をどこに置くかについては、いろいろと検討した結果「高校1年(数Ⅰ)の復習から」というレベルに設定しました。必要な数学の一番上のレベルは大学の教養課程です。具体的には多変数関数の微分や行列1などがこのレベルに該当しています。
 ちょっと考えると相当険しそうな道です。だからこそ、今までの初心者向けの本はこの道を避けて通ったものと思われます。しかし、筆者はここで諦めず、ディープラーニングのアルゴリズムを理解する上で本当に必要な概念は何かを洗い出し、それを理解するためにはどの概念がわかっていればよいかを数Ⅰレベルに達するまで逆にたどっていったのです。そうやって必要な概念を洗い出してみると、書籍1冊の半分程度の分量で解説できそうでした。残りの半分で機械学習・ディープラーニングのアルゴリズムの解説を加えれば、筆者が欲しいと思う本になるのでは、というのが、本書の基本的なアイデアとなりました。

 本書は「導入編」「理論編」「実践編」「発展編」の4部構成となっています。
 冒頭の「導入編」は、この本全体の見取り図になっています。当初は、基礎概念の説明にとどめるつもりだったのですが、編集者より「高校1年の数学の範囲で解ける簡単な例題を入れられないか」という無理な注文がありました。そこで、微分を一切使わずに解く方法をひねり出しました2。結果的に、最初の段階でこの問題を解くことで、

  • 機械学習・ディープラーニングとは結局「予測関数」から「損失関数」を導出し、「損失関数の最小化」という数学モデルを解くことで最適なモデルを作る方式である点
  • しかし、より一般的な問題を解こうとすると、指数関数、対数関数、偏微分といった高校1年の数学ではカバーしきれない概念が多数出てくるため、数学を知らずして先に進めない点

の2つが実感として持てる形になったかと思います。

 本書前半部分を構成する「理論編」は数学の解説書になっています。理論編において特に意識したことが3つあります。

 1つ目は「出てくる公式・定理はできる限り直感的にわかる(ないしはわかった気になれる)ようにする」ことです。本書を執筆するにあたって、高校数学の参考書もいろいろ見てみたのですが、重要な公式・定理が天下り的に出てきて、いきなり演習問題から入る本がすごく多くありました。これでは納得できなくて先に進めない人も多いのではないかと考えました。
 そこで本書では新しい公式を導入する場合は、「なぜこの公式が出てくるかの説明3をできる限り丁寧に、また図形で表現できる場合は図形的な説明をできるだけ取り入れて行いました。「この公式は要するにこういうことだな」というイメージさえ持てれば、その公式をすぐに使いこなせると筆者は考えています。例えば、2章で解説するように微分とは結局「関数のグラフをどんどん拡大していくと最後は直線と見なせる」という話にすぎません。この性質をうまく使うと、他のもっと複雑な微分公式を簡単に導出できたりするのです。具体的には2章を読んでいただければわかると思います。

 2つ目に注意した点は「取り扱う概念はできる限り必要最小限なものに絞り込む」という点です。ディープラーニングを理解するということが読者の目的であるとするなら、それに関係ない概念は知らなくてよいことになります。このような取捨選択をすることで高くなりがちな「数学」のハードルをできる限り低くするよう工夫したつもりです。筆者としては、「三角関数の微分とπの関係の話」とか、「行列の固有値・固有ベクトル」のような話も書きたかったのですが、ディープラーニングでは使用しない概念なので涙をのんで落としています。

 3つ目は「概念間の関係性」を重視した点です。こうやって絞り込んだ数学の概念の間では、概念間の関係性・依存性があります。高校1年の数学を出発点として、ある概念の解説の中に定義・解説をしていない新しい概念が出てこないようにするため、理論編の章の順番は何度も見直しました。この概念間の関係性を反映した本書の構成については、1章の1.6節で図表を使ってわかりやすく解説しています。ある概念の理解につまずいたとき、それは、どこがわかっていないせいなのか、1章の1.6節を読み返すことで簡単に見えてきますので、ぜひご活用ください。

 本書後半部分の「実践編」は、簡単にいうとディープラーニングのアルゴリズムの解説です。実践編に関しては、以下のことを特に意識しました。

 1つ目は、「スモールステップで一歩ずつ先に進める」ということです。基本となる「線形回帰」から出発してディープラーニングに至るまでのいくつかの機械学習モデルは、生物の進化の系統図のような関係にあります。進化の順にモデルを並べて、モデル間でどこに違いがあるかを洗い出してみると、モデルを1つ進化させるのに必要な新しい概念の数は非常に少なくなることがわかりました。個々のモデルと必要な概念の関係も、1章の1.6節にまとめていますので、読み返していただければわかると思います。
 一歩先の新しいモデルになるたびに、章も新しくして、その章で新たに出てきた概念に集中して詳しい解説を加えるということで「一歩ずつ着実にディープラーニングに近づいていく」というアプローチが可能になりました。例えば、ディープラーニングは10章で解説しますが、その前の9章(多値ロジスティック回帰)に加えて出てくる新しい話は実はほとんどありません。少しずつ理解を深めながらディープラーニングにたどり着けるのです。

 実践編で2つ目に配慮したのは、「PythonコードのJupyter Notebook化」です。筆者はPythonに限らずコンピュータ・プログラムというのは、自分の理解したことを確認するための道具だと思っています。そこで、本書ではできる限り読者にPythonコードを実行して確認しながら読み進めてもらうため、プログラムの作成と実行、実行結果の確認を同時に進められるツールであるJupyter Notebook対応としました。

 巻末の付録では、Google Colaboratory(Google Colab)を前提としたNotebook(Python実習コード)の利用手順も記載しました。読者はぜひ章ごとのNotebookを読み込み、Pythonの動きを確認しながら本書を読み進めてください。Jupyter Notebookなので、いっぺんにすべてのコードを流すのではなく、セルごとに実行させて、必要に応じて変数の中身を確認したり、あるいはパラメータの値を変えて再度セルを実行したりすることが可能です。こういう確かめ方を繰り返すと、コードに対する理解もより深まります。

 Python に関しては、アルゴリズムの前提となる数式との対応づけも意識しました。Pythonの言語の特徴として4、行列やベクトルが1つの変数でまとめて表現でき、行列・ベクトル間のかけ算も簡単に表現できるということがあります。本書ではその特徴を極力生かして、特に予測・学習に関するアルゴリズムの根幹にかかわる数式はループ処理を一切使わず、数式とPythonのプログラムの式が一対一に対応するようにしました。こうすることでアルゴリズムの実装イメージをより持ちやすくできたかと考えています。
 Pythonの実習に関しては、もう1つちょっとした工夫をしました。それはところどころで失敗するのがわかった上で、わざとそのコードを流すような進め方にした点です。ここで出てくるトラブルは読者が自分で機械学習のコーディングで進める上で実際に出てきそうなことばかりです。トラブルがなぜ起きたのか、それに対してどうすればいいのかを身をもって経験することで、より理解を深めてもらえばと思います。

 本書を締めくくる「発展編」では、本編で説明しきれなかった、ディープラーニングにおける重要な手法・概念をまとめて紹介しました。かなり高度な内容をコンパクトに紹介しているのですが、実践編まで読み終えられた読者は、その記述内容がすらすらと頭に入ってくることに驚くと思います。これがものごとを基礎から理解することの強みだと筆者は考えています。

 それでは、いざ、数学とPythonを道しるべに、ディープラーニングへの登山に出発してください。山頂までたどり着いたとき、今まで見たことのない景色が開けていると思います。

2019年3月
赤石 雅典

1「高校で行列はやった」と思われた方は最新の高校数学の教育課程を見てみてください。比較的最近のことですが、今は全くなくなっています。
2「線形単回帰」の問題を座標系の平行移動で単純な平方完成の問題に帰着させました。
3 ここが「証明」でなく「説明」であることが本書のミソの1つです。公式を使いこなすためには「要するにこういうことだよね」というイメージを持つことが重要で、数学者でない限り厳密な証明は必ずしも必要ないと筆者は考えています。
4 正確にいうと「Python で標準的に使われるライブラリであるNumPyの特徴として」ということになります。

【増補改訂版の発行に寄せて】

 早いもので、「ディープラーニングの数学」の初版を発行して6年が経過しました。幸いにして、この本は多くの読者にお読みいただいているのですが、一部見直すべき点も出てきました。そこで出版社の日経BP様とも相談し、このタイミングで増補改訂版を執筆・発行させていただくこととしました。初版と比較して増補改訂版の特徴をまとめると次のような点になります。

理論編

●演習問題の追加
 初版でいただいた書評の多くでご指摘いただいたのは、「数学本」と謳っているのに演習問題がないという点でした。筆者は、本書を教科書に関西の大学院で講義を持っているのですが、そのシラバスを検討するときにも同じ指摘を受けています。
 これらの指摘を受け、授業で出題している演習問題も参考にしながら、理論編各章の最後に簡単な演習問題を追加しました。それぞれの章の理解度を確認できる簡単な問題ですので、ぜひ、皆様も解いてみてください。正解については巻末に紹介しているサポートページに記載していますので、そちらを参照してもらえればと思います。

実践編

●「理解のツボ」の追加
 筆者の悪いクセとして、ある概念を説明するときに全体感を示さずに、いきなり各論から入ってしまうところがあります。この本の実践編は、その点が特に顕著というのが、出版から6年後に自分で本書を読み直しての感想です。
 この課題をカバーするため、実践編の各章の冒頭に「理解のツボ」の項目を追加しました。このパートには、「モデルの進化図」も含めるようにしました。こうした工夫で、この本の最終目的である「ディープラーニングの学習アルゴリズムの理解」に向けて、読者が現在、どういうところにいるのかが、わかりやすくなったのではないかと考えています。

●サンプルの実習コードの全面改定
 初版を今、読み直して気になる点の1つとして、用意したサンプルの実習コードがわかりにくいことが挙げられます。この課題に対応するため、7章以降のサンプルの実習コードに関して全面的に見直しをかけました。この見直しにより、繰り返し計算の本質的な処理も流れがわかりやすくなりましたし、学習率などのパラメータを変更して、結果がどうなるかの実験もやりやすくなりました。

●実習コードの利用手順の簡略化
 増補改訂版では、実習コードの実行環境についても見直し、Google Colaboratory(Google Colab)を前提としました。GitHubとGoogle Colabの連携機能を活用することで、初心者も最低限の操作で実習コードを動かすことが可能となりました。その具体的な手順は、付録の「実習コードの利用法」に説明がありますが、初版の付録と見比べると、どれほど手順が簡略化されたかが実感できると思います。

●ディープラーニングモデルの処理時間短縮
 初版の課題の1つは10章のディープラーニングの実習で、繰り返し計算に約1時間程度の時間がかかっていた点です。
 この課題に対応するため、10章の実習では、PyTorchを高速のNumPy計算器として使う実装にしました。この結果、繰り返し計算は5分程度で終わるようになり、10章の実習でも、パラメータの値を変えたときにどのような結果になるか、簡単に確認することが可能となりました。
 また、初版ではミニバッチ学習法の実装を独自クラスで行ったため、プログラムの見通しが悪かったのですが、PyTrochの機能を利用することで、わかりやすいミニバッチ学習法の実装とすることができました。

●7章の例題の改定
 初版の7章の実習では、機械学習の定番である「ボストン・データセット」を用いて回帰モデルの構築を行っています。その後、「ボストン・データセット」は差別を助長する恐れがあるということで、使ってはいけない流れになっています。この流れを受けて、7章の例題では、差別問題のリスクのない「カリフォルニア・データセット」を使った実習シナリオに差しかえました。

発展編

●フレームワーク(PyTorch)との接続性
 初版に対する書評でいただいているコメントの1つに、「学習アルゴリズムの数学的な説明はカバーできているがフレームワークとの接続性が不十分」というものがありました。この課題に対応するため、11章は全面的な見直しを行いました。基本的な方針として、従来は抽象的なレベルの説明にとどめていた11章各節の説明を、すべてPyTorchによる実習コード付きの具体的なレベルまで落とし込むようにしています。こうすることにより、本書と、研究分野で代表的なフレームワークであるPyTorchとの接続性は格段によくなりました。
 増補改訂版の11章を理解し、実習コードを一通り試していただくことで、例えば筆者が執筆している姉妹版の書籍『最短コースでわかるPyTorch&深層学習プログラミング』にスムーズに進むことも可能です。

●最新技術要素(Transformer)の導入
 昨今大ブームとなっている生成AIは、技術要素としてはTransformerという仕組みから成り立っています。少し欲張りではありますが、11章最後の節に、実習コードもセットにした形でTransformerの紹介も追加しました。読者は、この節の実習コードを動かすことで、生成AIの仕組みの一端に触れることができるようになったと考えています。

 これらの変更点を加えることにより、初版の読者の方が改めてご購入いただいても十分意味のある本にすることができたと考えております。初版をご購入いただいた読者の方も、改めて、書店で本書を手に取ってご確認いただければと思います。
 また、本書も初版と同様、サンプルの実習コードはすべてGitHubで公開しています。本書の購入前にサンプルの実習コードをお試しいただき、面白そうなら本書をご購入いただくことも可能なので、関心のある方はぜひお試しください。

 最後に個人的な話を書かせていただきます。筆者は高校時代「数学オタク」ともいうべき存在で、授業時間中に先生の話を無視して「大学への数学」の「学力コンテスト」の問題を解いていて、時折優秀者の欄に自分の名前を出すことを一番の楽しみにしていた人間でした。社会に出てからは数学から離れた世界にいたわけですが、この歳になって、当時の趣味である「数学」が役立っていることに、今さらのように驚いています。
 今回増補改訂版を出せたのは、出版社の皆様のご協力もありますが、なにより、自分の数学への「思い」を込めたこの本にご支持いただいた多くの読者のおかげです。このことに対して改めて感謝の意を表したいと思います。
 初版は、日経BPの安東様の全面的なサポートで出版できたのですが、今回は、バトンタッチする形で、加藤様にご支援いただきました。編集者の立場でいうと、思い付きですぐ「あれをやりたい」「これをやりたい」と言い出すわがままでやりにくい筆者であったと想像します。しかし、加藤様は、そのわがままの一つひとつに1回も苦言をいうことなく、真摯にお付き合いいただきました。その結果が今回の本になっていることを考えると、加藤様には感謝の言葉もありません。この場を借りて、厚く御礼申し上げます。

2026年1月
赤石 雅典


【目次】

画像のクリックで拡大表示
画像のクリックで拡大表示
画像のクリックで拡大表示
画像のクリックで拡大表示