はじめに
新冨です。 以前、続・会津大学のすすめで、会津大学のカリキュラムの問題点を指摘しました。
それはカリキュラム通りに勉強した場合、一通りの基礎科目を学び終わる前に研究室選択をしなければならない、という問題です。 この問題に対処するためには、カリキュラムの進行よりも早く独学で基礎科目を勉強する必要があります。 そうは言っても、学部1、2年生の間は授業科目が多く詰まっており、自主学習の時間を捻出するのも一苦労です。 貴重な自主学習の時間を下手な資料(Webの記事や本)に費やすのは本望ではないはずです。 そこで本記事では、私がコンピュータサイエンスの各分野で良さそうだと思う資料をいくつか紹介したいと思います。 本記事が、意欲的な学生の一助になれば幸いです。
前提条件
紹介する資料は、すべて流し読みをしたことはあります。 しかし、すべての資料を熟読した訳ではありません。
私は、大学ではコンピュータやコンピュータシステムの設計と構築を学ぶSYフィールドに所属しながら、研究では3次元再構成のアルゴリズムや深層強化学習による自動運転というソフトウェアの設計に取り組んでいました。 そのため授業はコンピュータアーキテクチャ寄りの授業を多く履修し、研究では画像処理、CG (Computer Graphics)、深層学習の分野に取り組んでいました。 研究用のコンピュータを設定する過程で、ネットワーク、Linuxの知識もつきました。 このような背景から、私は画像処理、CG、深層学習、ネットワーク、Linux、CPUが多少知識があります。 一方で、私はセキュリティ、データベース、アルゴリズムに関しては疎いという自覚があります。
本記事は次のような構成になっています。
- はじめに
- 前提条件
- コンピュータアーキテクチャ
- CPUを作る
- OSを作る
- Linux
- コンパイラー
- コンピュータシステムの理論と実装
- ネットワーク
- 画像処理
- コンピュータグラフィックス
- 深層学習
- 深層学習の研究の最前線を知りたい人向け
- 3次元再構成とSLAM
- おわりに
コンピュータアーキテクチャ
コンピュータアーキテクチャは、コンピュータの仕組みや設計に関わる分野で、学部3年生のQ1に取り組む内容です。 命令セット、CPUの仕組み、アセンブリなどを学ぶことができます。
性能の高いソフトウェアを構築するためには、コンピュータアーキテクチャの理解が欠かせません。 私は、C言語のポインターの仕組みは、コンピュータアーキテクチャを学んでから初めて腑に落ちました。 最近話題のNVIDIAのGPUが凄さを理解するには、この分野をある程度理解している必要があります。
このコンピュータアーキテクチャを学ぶ上で金字塔とも言える本は「コンピュータの構成と設計」通称「パタヘネ本」です。 この本は、コンピュータアーキテクチャの授業の教科書でもあるので、早めに買っておいて損はないと思います(数年おきに版が更新されるので注意。英語版は既に第7版があるので、日本語版もいずれ第7版が出るはずです)。
この本の発展的な内容を扱う、大学院生向けのコンピュータアーキテクチャの本として「ヘネパタ本」もあります。 こちらの本も会津大学の大学院のAdvanced Computer Architectureの教科書となっています。
どちらの本も会津大学の図書館にあるはずなので、気になる方は閲覧してみてください。
CPUを作る
コンピュータアーキテクチャをさらっと眺めた後に、実際にCPUを作ってみましょう。
手を動かしてICでCPUを作りたい方はこの本がおすすめ
手を動かしてソフトウェア上でCPUを作りたい方はこの本がおすすめ
OSを作る
CPUの仕組みがわかったら、OSを作るのもいいかもしれません。 通称「みかん本」
Linux
一般的なOSの仕組みがわかったら、実用的なLinuxの仕組みを知るのもいいかもしれません。
コンパイラー
LinuxはC言語で書かれているので、C言語のコンパイラーも作りたくなるかもしれません。
コンピュータシステムの理論と実装
これまでの紹介を読んで、「コンピュータアーキテクチャからコンパイラーまで全部学びたいけど、それぞれの本を読む時間なんてないよ」という方に朗報です。 コンピュータアーキテクチャからコンパイラーまで全てがこの1冊で学べます。 通称「Nand2Tetris」。
NANDという電子素子からスタートし、論理ゲート、加算器、CPUを設計します。そして、オペレーティングシステム、コンパイラ、バーチャルマシンなどを実装しコンピュータを完成させて、最後にその上でアプリケーション(テトリスなど)を動作させます。 O'Reilly Japan - コンピュータシステムの理論と実装より引用
ネットワーク
コンピュータ単体の仕組みはわかったから、次は複数のコンピュータを繋いで通信したくなるかもしれません。 それではTCP/IPを学びましょう。
この辺りで得た知識を使い、自分でSSHサーバーを建てると、インターネットの怖さがわかります(私はSSHサーバーを建てて5分でインドネシアから22番ポートへ攻撃がきたことがあります)。
インターネットは分かったから、Webを知りたいと思った方はこの本です。
画像処理
画像処理を知りたいと思った方は、まずは画像処理の分野の広さを理解しましょう。 画像処理の教科書的な本です。
実践的な内容をやりたければ、OpenCVやscikit-learnでググると良いでしょう。
コンピュータグラフィックス
コンピュータグラフィックスと一言で言っても、かなり広い分野です。 まずは、この本で分野の広さを実感しましょう。 先ほどの画像処理の本と姉妹本です。
「線形代数ってなのためにやるの?」という方には、この本がおすすめです。 少し古いですが、コンピュータグラフィックスと線形代数を絡めた本です。
コンピュータグラフィックスを学んでいくにつれて並列計算の重要を理解してきたあなたにはGPUが必要です。 GPUを学びましょう。 GPUを理解するためには、先述のコンピュータアーキテクチャなど低レイヤーの知識があると理解が深まります。
深層学習
GPUを理解したあなたは、コンピュータグラフィックス以外にGPUが使えることに気づいたかもしれません。 そう、一般的な並列計算もGPUで扱えるのです、GPGPUです。 GPGPUは、GPUをコンピュータグラフィックス以外の分野にも使おうという応用技術のことです。 NVIDIAは、2006年にCUDAというGPGPU用のソフトウェアや実行環境のことを構築しました。 深層学習にNVIDIAのGPUが多用されているのもGPGPUの環境が既に構築されていたためです。
深層学習の分野は、凄まじい速度で発展をし続けています。 最先端の研究では、毎週のように革命的な発表がなされています。 そのため、今日学んだ知識は明日には無用の長物になっている可能性がある分野です。 この分野を学ぶ気があるのであれば、それを理解した上で進んだ方がいいと思います。
深層学習をやりたいのであれば、まずは画像を分類するCNN (Convolutional Neural Network) を作りましょう。
画像や音楽を生成したくなったら生成Deep Learningを読みましょう。
この次あたりにTransformerを学ぶと良いと思いますが、Transformerに関する良書を知らないので、ここでは推薦できないです。 深層学習に関するトピックを網羅的に扱っているCVMLエキスパートガイドも読んでおくと良いかもしれません。
Transformerを学んだらGPT (Generative Pre-trained Transformer) 周りも気になり始めるはずです。 そしたら大規模言語モデルに入門しましょう。
ここまで来たら、2024-03-22時点での最先端の研究領域まであと一歩です(多分)。
深層学習の研究の最前線を知りたい人向け
コンピュータビジョン関連で、最先端の研究内容を日本語で知りたい方は、コンピュータビジョン最前線がおすすめです。 この本は、各シーズンに1冊出版されており、毎回非常に興味深いトピックが比較的わかりやすく書かれています(少なくとも論文を読むよりマシ)。
本来、1本の論文を読むのに、その分野の背景知識をある程度持っている必要があり、その背景を知るためには更に何本も論文を読む必要があります。 そのため1本の論文を読むために、読むべき論文は芋蔓式に増えていきます。 それに対して、コンピュータビジョン最前線は、そのような背景を簡潔にまとめ、最先端の研究内容までシームレスに解説している記事が多いです。 最先端の研究を簡潔に知りたい方には、特におすすめです。
最先端の研究成果をリアルタイムに知りたいという方は、Twitterを確認することです。 こちらのAKという方は、おそらく本人が興味を持った深層学習関連の研究内容を簡潔にまとめ、ツイートしています。
Meta, Google, Microsoft, NVIDIAといった大企業の研究部門のアカウントや著名な研究者のアカウントのフォローでも最先端の研究を追うことができます。
他に最先端の研究を知るためには、arXivがあります。 arXivの立ち位置はあまり理解していないので、ここでは説明を省略します(この辺に興味がある人間は、勝手に調べられるでしょう)。
3次元再構成とSLAM
実は「画像処理とコンピュータグラフィックスどちらもやりたい!」という欲張りな方のための分野があります。 3次元再構成とSLAMです。 3次元再構成とは、カメラなどのセンサーから得られたデータを用いて3次元モデルを作成する技術のことです。 この3次元再構成と関連している分野として、NeRFや3D Gaussian Splattingがあります。 SLAMとは、Simultaneous Localization and Mapping、つまり自己位置推定と環境地図の作成を同時に行う技術のことで、ロボットの制御に使用されることがあります。
3次元再構成は、私が卒論で取り組んでいたテーマであり、思い入れのある分野です。 Open3Dと呼ばれる3次元データ処理に特化したOSSのライブラリがあります。 そのOpen3Dに含まれる3次元再構成ソフトウェアに関する私が書いた解説が下記の記事になっています。
卒論でOpen3Dに触れるにあたり、当時は日本語の解説記事が全くなく、非常に苦労した記憶があります(仕方ないから英語で読んでた)。 私が卒論を書いた翌年の秋に出版されたこちらの本があれば、私はそのような苦労をする必要がなかったでしょう。
SLAMは、3次元再構成と共通して使われる技術がいくつかあり、親戚みたいなものです。 SLAMに興味を持ったのであれば、入門本をおすすめします。
3次元再構成もSLAMも、常に誤差と計算量との戦いを強いられます。 誤差をいい感じに丸め込むためには、統計的な知識が必要です。 また計算量をやりくりするためには、様々な仮定を置くことで理論的に導出される近似式を用いたり、C++でソフトウェアを書くことでコンピュータの性能を最大限に発揮する必要があります。 結局のところ、計算負荷が高い処理をやるためには、ある程度コンピュータの仕組みを理解している必要があります。
おわりに
本記事を読み、コンピュータアーキテクチャを理解して、コンピュータの性能を最大限発揮し、htop
コマンドで全てのコアの使用率を100%もしくはnvidia-smi
コマンドでGPU使用率を100%にする人材が増えることを期待しています。
また「この本が、この記事が入っていないぞ!」という方がいれば、どうぞご自分で紹介記事を書いてください。
別の方の視点ということで、その紹介記事のURLを本記事に貼りたいと思います。