第1章 なぜディープラーニングに線形代数が必要なのか

こんにちは。ゆうせいです。

本記事から、全16章にわたって、ディープラーニングに線形代数が必要な理由を解説していきます。ディープラーニングを学び始めると、必ずと言っていいほど「線形代数を勉強してください」と言われます。しかし、書店で線形代数の本を開くと、行列式、余因子展開、固有値といった言葉が並び、これがニューラルネットワークとどう関係するのか、まったく見えてきません。数学の勉強をしているうちに、当初の目的だったディープラーニングから、どんどん遠ざかっていく。そんな経験をした方も多いのではないでしょうか。第1章では、個々の計算の説明に入る前に、そもそも線形代数がディープラーニングの中でどのような役割を果たしているのかを、大きな地図として示します。

結論を先に述べます

ディープラーニングの計算は、その大半が行列の掛け算と足し算です。線形代数とは、この計算を書き表し、実行するための言語です。

もう少し具体的に言うと、次の三つを実現するために、線形代数が使われています。

第一に、画像、文章、音声といったあらゆるデータを、数値の並びとして表現するためです。

第二に、何千、何万という個々の計算を、たった一行の式としてまとめて書くためです。

第三に、その計算を、コンピュータが高速に並列処理できる形に落とし込むためです。

この三つを、順に見ていきます。

役割1:データを数値の並びに変える

コンピュータは、猫の写真を「猫の写真」として理解しているわけではありません。数値の集まりとして処理しています。

猫の写真は、縦横に並んだ画素の明るさの数値です。日本語の文章は、単語に割り当てられた番号と、その番号から変換された数値の並びです。音声は、時間ごとの振幅の数値です。

これらは、見た目も性質もまったく異なるデータですが、いったん数値の並びに変換してしまえば、同じ道具で扱えるようになります。

その「数値の並び」を扱うための道具立てが、線形代数です。ベクトル、行列、テンソルという用語は、この数値の並びを、並び方の複雑さに応じて呼び分けたものにすぎません。

画像認識のモデルと、文章生成のモデルが、同じような構造で作れるのは、この共通化のおかげです。データの種類が違っても、数値の並びになってしまえば、後の計算は同じ形で書けるのです。

役割2:膨大な計算を一行にまとめる

ここが、線形代数の最も強力な点です。

ニューラルネットワークの1つの層には、多数のニューロンが並んでいます。GPT-2という言語モデルでは、一つの層に3072個のニューロンが並ぶ箇所があります。

素朴に考えると、3072個のニューロンそれぞれについて、計算を書く必要があります。プログラムで書けば、3072回のループです。

しかし、線形代数を使うと、この計算は次の一行で書けます。

\mathbf{y} = W\mathbf{x} + \mathbf{b}

たった一行です。

この式が意味しているのは、「3072個のニューロンが、それぞれ768個の入力を受け取って計算する」という処理の全体です。掛け算と足し算を合わせると、およそ470万回の計算が、この一行に含まれています。

さらに、複数のデータをまとめて処理する場合も、式の形はほとんど変わりません。

Y = XW + B

100件のデータを同時に処理しても、10000件のデータを同時に処理しても、書き方は同じです。

論文や技術文書で、ニューラルネットワークの構造がわずか数行の数式で説明されているのを見たことがあるかもしれません。あれは、内容が単純だからではありません。線形代数という記法が、膨大な計算を圧縮して書けるからです。

逆に言えば、線形代数を知らないと、この数行を読み解けません。読めなければ、新しい技術の解説記事や論文が、そこで壁になってしまいます。

役割3:高速な並列計算を可能にする

三つ目の役割は、実務に直結します。

ディープラーニングの学習には、GPUという装置が使われます。もともとは画像処理のための装置ですが、なぜディープラーニングに使われるのでしょうか。

答えは、行列の掛け算が、並列計算に非常に適しているからです。

行列の掛け算では、出力の各要素が、互いに独立に計算できます。1番目の要素の計算と、2番目の要素の計算は、まったく関係がありません。したがって、同時に計算しても問題ありません。

GPUは、数千個の計算コアを持ち、多数の計算を同時に実行できる装置です。行列の掛け算という形に落とし込まれた計算は、この装置の性能を最大限に引き出せます。

もしディープラーニングの計算が、行列積として書けない形だったら、GPUによる高速化は成立しませんでした。現在のディープラーニングの発展は、計算が線形代数の形に整理されていたからこそ実現した、という側面があります。

学習に何日もかかっていた処理が、GPUを使うと数時間で終わる。この違いを生んでいるのは、突き詰めれば「計算が行列積の形をしている」という事実です。

線形代数を知らないと、具体的に何に困るか

抽象的な話が続きましたので、実務で直面する困りごとを、三つ挙げます。

困りごと1:エラーメッセージの意味が分からない

ディープラーニングのコードを書き始めると、最も頻繁に遭遇するのが、次のようなエラーです。

RuntimeError: mat1 and mat2 shapes cannot be multiplied (32x128 and 256x64)

これは、掛け合わせようとした二つの行列の形が合っていない、というエラーです。

線形代数を理解していれば、このメッセージを見た瞬間に、「128と256が一致していないから掛けられない」と分かります。どちらかを直せばよい、という判断ができます。

理解していなければ、何が起きているのか分からず、数値を適当に変えて試すという、当てずっぽうの修正に陥ります。

この種のエラーは、ディープラーニングの実装で最も頻出するものです。第10章で、これを専門に扱います。

困りごと2:解説や論文が読めない

新しいモデルの解説記事には、必ず数式が登場します。

Attention(Q, K, V) = softmax\left(\frac{QK^T}{\sqrt{d_k}}\right)V

これは、現在の言語モデルの中核となる仕組みを表した式です。

線形代数を理解していれば、この式から「QとKの転置を掛けて、ある値で割って、確率に変換し、Vと掛ける」という処理の流れが読み取れます。

理解していなければ、記号の羅列にしか見えません。解説記事を読んでも、数式の部分を飛ばして読むことになり、肝心の仕組みが理解できません。

技術の進歩が速い分野では、新しい情報を自分で読み解けるかどうかが、そのまま実力の差になります。

困りごと3:モデルの構造を自分で設計できない

既存のモデルをそのまま使うだけであれば、線形代数の理解は必須ではないかもしれません。

しかし、自社のデータに合わせて構造を変えたい、層の数や次元数を調整したい、といった場面では、話が変わります。

入力の次元数がいくつで、この層を通すと何次元になり、次の層に渡すには何次元でなければならないか。この計算ができなければ、モデルを組み立てられません。

また、パラメータ数がどれくらいになるか、必要なメモリはどれくらいかという見積もりも、行列のサイズから計算されます。

この連載で扱う範囲と、扱わない範囲

ここで、方針を明確にしておきます。

この連載では、大学の線形代数の講義で中心的に扱われる話題のうち、いくつかを意図的に扱いません。

行列式、余因子展開、逆行列の計算、固有値と固有ベクトル、対角化といった話題です。

理由は、これらがディープラーニングの基礎的な理解には、ほとんど登場しないからです。全結合層の計算にも、自己注意の計算にも、誤差逆伝播の基本にも、行列式は出てきません。

もちろん、より進んだ話題では必要になります。主成分分析、特異値分解、モデルの圧縮といった領域では、これらの知識が生きてきます。この連載の最終章で、次に何を学ぶべきかとして触れます。

まずは、ディープラーニングを理解し、実装し、エラーに対処するために必要な範囲に絞ります。数学の完全性より、目的への最短距離を優先する方針です。

この連載の構成

全16章の構成を示します。

第I部:データを数値で表す

タイトル
1なぜディープラーニングに線形代数が必要なのか
2スカラーとベクトル
3行列とテンソル
4画像も文章も数値の並びになる

第II部:計算の正体を知る

タイトル
5ベクトルの足し算とスカラー倍
6内積:似ている度合いを測る
7ニューロンをまとめるという考え方
8行列とベクトルの積:全結合層の正体
9行列と行列の積:バッチ処理
10形を合わせる:転置、reshape、ブロードキャスト

第III部:計算の意味を理解する

タイトル
112次元で見る線形変換:回転、伸縮、射影
12次元の拡大と縮小の意味
13線形だけでは足りない理由

第IV部:学習の仕組みとのつながり

タイトル
14勾配ベクトルとは何か
15誤差逆伝播に現れる行列の転置
16なぜGPUで速くなるのか、そして次の一歩

第II部の第7章と第8章が、この連載の山場です。線形代数とニューラルネットワークが、直接つながる箇所になります。

学習を進めるうえでの心構え

心構え1:計算そのものは難しくない

線形代数の計算は、掛け算と足し算だけです。微分積分のような、新しい概念の飛躍はありません。

難しく感じる原因は、計算の難しさではなく、記号の抽象度にあります。W\mathbf{x} と書かれたとき、それが実際には何千回もの掛け算と足し算を表していると気づかなければ、意味がつかめません。

この連載では、記号が実際に何をしているのかを、小さな数値例で毎回確認していきます。

心構え2:手を動かすことが最短の道

読むだけでは、線形代数は身につきません。

3行3列程度の小さな行列で、実際に紙の上で計算してみてください。時間はかかりますが、一度でも手で計算すると、記号が何を表しているかが体に入ります。

そのうえで、同じ計算をPythonで実行し、結果が一致することを確認してください。この連載では、各章に手計算とプログラムの両方の演習を用意します。

心構え3:完璧を目指さない

すべてを理解してから先に進もうとすると、いつまでも進めません。

まずは通読し、実装しながら、必要になったときに該当章に戻る。この使い方を想定して構成しています。

特に第10章の「形を合わせる」は、実務で困ったときに何度も参照することになる章です。最初は流し読みでも構いません。

理解度を確認する問い

第1章の内容を、次の問いで確認してみてください。

ディープラーニングにおいて、線形代数が果たしている役割を三つ挙げてください。

\mathbf{y} = W\mathbf{x} + \mathbf{b} という一行の式が、実際にはどれほどの量の計算を表しているか、自分の言葉で説明してみてください。

GPUがディープラーニングの高速化に有効なのは、計算がどのような形をしているからでしょうか。

線形代数を知らないことで、実務上どのような困りごとが生じるでしょうか。自分の経験と照らし合わせて考えてみてください。

まとめ

ディープラーニングの計算は、その大半が行列の掛け算と足し算です。線形代数は、この計算を記述し、実行するための言語です。

線形代数が果たしている役割は、三つあります。画像、文章、音声といった異なる種類のデータを、共通の数値の並びとして表現すること。何百万回もの計算を、わずか数行の式にまとめて書けるようにすること。そして、その計算をGPUで並列に高速処理できる形に落とし込むことです。

線形代数を理解していないと、形が合わないというエラーに対処できず、解説記事や論文の数式が読めず、モデルの構造を自分で設計できないという困りごとが生じます。

この連載では、大学の線形代数で中心的に扱われる行列式や固有値といった話題を、あえて扱いません。ディープラーニングを理解し、実装し、エラーに対処するために必要な範囲に絞り、ディープラーニングの処理の流れに沿った順序で解説していきます。

次の第2章では、最も基本となるスカラーとベクトルを扱います。数値1個と、数値が並んだものの違い。そして、ベクトルという概念が、ディープラーニングのどこに現れるのかを解説します。

第2章に進む前に、一つだけ準備をしておいてください。PythonとNumPyが動く環境を用意することです。Google Colaboratoryを使えば、インストール不要で、ブラウザだけで始められます。この連載の演習は、すべてその環境で実行できるようにします。手を動かせる状態を作っておくと、第2章以降の理解が、格段に速くなります。

セイ・コンサルティング・グループでは新人エンジニア研修のアシスタント講師を募集しています。

投稿者プロフィール

山崎講師
山崎講師代表取締役
セイ・コンサルティング・グループ株式会社代表取締役。
岐阜県出身。
海外放浪の末、2000年創業、2004年会社設立。
IT企業向け人材育成研修歴業界歴20年以上。
すべての無駄を省いた費用対効果の高い「筋肉質」な研修を提供します!
この記事に間違い等ありましたらぜひお知らせください。

学生時代は趣味と実益を兼ねてリゾートバイトにいそしむ。長野県白馬村に始まり、志賀高原でのスキーインストラクター、沖縄石垣島、北海道トマム。高じてオーストラリアのゴールドコーストでツアーガイドなど。現在は野菜作りにはまっている。