[E資格] 文系でもわかる!線形代数の歴史とAIとの意外な関係
【第1回:起源編】
新人エンジニアのみなさん、こんにちは!
AIや機械学習の勉強を始めると、必ずと言っていいほど「線形代数」という壁にぶつかりますよね。
「行列? ベクトル? 高校の時にやった気もするけど、AIとなんの関係があるの?」
そう感じるのも無理はありません。でも、実は線形代数は、特定の天才が突然ひらめいたものではなく、人類が数千年かけて「面倒な計算を楽にするため」作り上げてきた道具なんです。
今回は全3回にわたって、線形代数の歴史を紐解きながら、E資格のシラバス(出題範囲)にある線形代数の基礎を、Pythonコードを交えて解説していきます。歴史を知れば、数式がただの記号ではなく、意味のある「言葉」に見えてきますよ。
1. 全ては「買い物の計算」から始まった
まずは、時計の針を紀元前まで戻してみましょう。線形代数のルーツ、それは「連立方程式」です。
古代中国の数学書『九章算術』には、既に現代の行列計算に近い考え方が記されていました。当時はAIのためではなく、税金の計算や土地の測量といった、生活に直結する問題を解くために使われていたのです。
例えば、こんな状況を想像してください。
- リンゴを2個、ミカンを1個買ったら、合計で400円でした。
- リンゴを1個、ミカンを3個買ったら、合計で450円でした。
これを数式にすると、中学生で習った連立方程式になりますね。
ここで重要なのは、この計算が「複数の条件を同時に満たす答えを探す」作業だということです。
実はAIの学習も、これと非常によく似ています。AIは、何万、何億という膨大なデータ(条件)を読み込み、それら全ての辻褄が合うような「最適なパラメータ(答え)」を探しているのです。
つまり、線形代数とは「大量の連立方程式を、効率よく解くための技術」と言い換えることができます。そう考えると、少し親近感が湧いてきませんか?
2. デカルトの革命:数字を「空間」に置く
次に時代は飛んで17世紀。フランスの哲学者であり数学者のルネ・デカルトが登場します。彼の最大の功績の一つは、「座標」を発明したことです。
それまでの幾何学(図形の問題)と代数学(数式の問題)は、別の学問でした。しかしデカルトは、「空間上の点は、数字のペア(x, y)で表せる」ことに気づきました。
これがなぜAIにとって重要なのでしょうか?
AIの世界では、画像や音声、言葉など、あらゆるものを「数字の羅列(ベクトル)」に変換して扱います。
例えば、縦100ピクセル、横100ピクセルの画像データがあったとします。これはコンピュータにとっては、1万個の数字が並んだデータに過ぎません。
しかし、デカルトの考え方を使えば、この画像データは「1万次元の空間にある、たった1つの点」として捉えることができます。
- 似ている画像同士は、空間の中で距離が近い。
- 全く違う画像は、空間の中で距離が遠い。
このように、データを「空間上の点(ベクトル)」として扱うことで、AIは「似ている」「似ていない」を数学的に計算できるようになるのです。距離計算という概念も、この座標の考え方がベースになっています。
3. Pythonで「ベクトル」を作ってみよう
さて、歴史の話ばかりでは退屈してしまいますよね。ここで少し、エンジニアらしくコードを書いてみましょう。
AI開発で標準的に使われるライブラリ NumPy を使って、データを「ベクトル(数値の列)」として表現してみます。
Pythonには標準の list がありますが、AI開発では計算速度や機能の面から NumPy の配列(ndarray)を使うのがお作法です。
import numpy as np
# リンゴとミカンの価格(これを1つのベクトルとみなす)
# [リンゴの価格, ミカンの価格]
prices = np.array([150, 100])
print("価格ベクトル:")
print(prices)
# 買い物かごの中身(個数)
# [リンゴの個数, ミカンの個数]
basket_a = np.array([2, 1])
basket_b = np.array([1, 3])
print("\n買い物かごA:")
print(basket_a)
このように np.array を使うことで、複数の数字をひとまとまりの「ベクトル」として扱えます。
ここでのメリットは、計算が直感的になることです。
例えば、「買い物かごA」の合計金額を出したい時、普通のプログラミングなら for 文を使って一つずつ掛け算して足し合わせますよね?
でも、線形代数の考え方(ベクトルの内積)を使えば、一瞬で計算できます。
Python
# 合計金額の計算(内積)
total_a = np.dot(prices, basket_a)
print(f"\n買い物かごAの合計金額: {total_a}円")
この np.dot という操作こそが、線形代数の基本中の基本であり、AIのニューラルネットワークの中で何億回と繰り返されている計算の正体です。行列・テンソルの積や勾配計算の基礎となります。
4. 今日のまとめ
今回は、線形代数の歴史のスタート地点である「連立方程式」と「座標」についてお話ししました。
- 起源: 複数の条件を解く「連立方程式」がルーツ。
- 座標の発見: デカルトのおかげで、データを「空間上の点」として扱えるようになった。
- Python:
NumPyを使えば、データのまとまり(ベクトル)を簡単に計算できる。
私たちが扱っているデータは、単なる数字の羅列ではありません。それは空間の中に浮かぶ「点」であり、その点同士の関係性を探ることがAI開発の第一歩なのです。
次回の予告
次回は、いよいよ「行列」が本格的に登場します。
ガウスという天才が整理した計算手法が、どのようにして現代のAIの高速処理に繋がっているのか? そして、行列を使えばデータを自由自在に変形できる理由とは?
行列演算の核心に迫る第2回、どうぞお楽しみに!
【第2回:行列編】
前回は、データを「空間上の点(ベクトル)」として捉えるデカルトの革命についてお話ししました。
しかし、AIが扱うデータは、1つや2つではありません。何千、何万というデータを一度に扱わなければならないのです。
そこで登場するのが、今回のテーマである「行列」です。
「行列って、数字が四角く並んでいるあれでしょ?計算が面倒くさそう…」
そう思ったあなた。実はその直感、歴史的にも正しいのです。かつての数学者たちも、面倒な計算をなんとか楽にしようと必死でした。その結果生まれたのが、現代のAIを支える最強の武器「行列」なのです。
今回は、その歴史的な背景と、Pythonを使った行列計算の威力を体験してみましょう。
1. ガウスの悩み:連立方程式を解くのが大変すぎる
19世紀前半、「数学の王」と呼ばれたカール・フリードリヒ・ガウスが登場します。彼は天文学の観測データなど、複雑な計算と格闘していました。
前回のリンゴとミカンの例を思い出してください。あれは変数が2つ(リンゴとミカン)だけでした。しかし、もしこれが「リンゴ、ミカン、ブドウ、バナナ…」と10種類あったらどうでしょう?式も10本必要になり、これを手計算で解くのは悪夢です。
ガウス(正確にはその前の時代からの積み重ねですが)は、こう考えました。
「式の中にある x や y といった文字を書くのが面倒だ。数字だけをきれいに並べて計算すればいいんじゃないか?」
これが「行列」の原型です。
つまり、行列とは「数字を表(テーブル)のように並べて整理したもの」です。皆さんが普段使っているExcelのスプレッドシートをイメージしてください。あれこそが、まさに巨大な行列そのものです。
AIにとって行列が重要な理由の1つ目はここにあります。
「大量のデータを、一つの表(行列)としてまとめて管理できる」からです。
2. ケーリーの発見:行列は「数」のように計算できる
ガウスの時代、行列はまだ「連立方程式を解くための便利な書き方」に過ぎませんでした。
これを一変させたのが、19世紀半ばのアーサー・ケーリーです。
彼は驚くべき発見をします。
「この四角く並んだ数字の塊(行列)は、普通の数字と同じように足したり、引いたり、掛けたりできるぞ!」
これが何を意味するか、少し想像してみましょう。
もし行列計算がなかったら、AIのプログラムは for 文(繰り返し処理)だらけになります。
「データ1を計算して、次はデータ2を計算して…」と、1万人のデータがあれば1万回の繰り返し処理を書かなければなりません。
しかし、ケーリーが体系化した「行列の積」などのルールを使えば、1万人のデータを「ひとつの行列 」として扱い、たった1行の式で全員分の計算を一気に終わらせることができるのです。
これこそが、AIが行列を使う最大の理由。「超高速な一括処理(バッチ処理)」です。
3. Pythonで「行列計算」の魔法をかける
それでは、この「一括処理」の凄さをPythonで体験してみましょう。
前回は、1つの買い物かごの計算をしました。今回は、Aさん、Bさん、Cさんという3人分の買い物かごを一度に計算してみます。
まずは、NumPyを使って行列を作ります。
import numpy as np
# リンゴとミカンの単価ベクトル
# [リンゴ150円, ミカン100円]
prices = np.array([150, 100])
# 3人の買い物かご(これが行列!)
# 行が人、列が商品を表します
# Aさん: リンゴ2, ミカン1
# Bさん: リンゴ1, ミカン3
# Cさん: リンゴ5, ミカン0
baskets = np.array([
[2, 1],
[1, 3],
[5, 0]
])
print("買い物かご行列(3人分):")
print(baskets)
この baskets という変数は、3行2列の行列です。
ここからが魔法の瞬間です。3人分の合計金額を出すために、for文を回す必要はありません。行列とベクトルを掛け合わせる(ドット積をとる)だけです。
# 行列(baskets)とベクトル(prices)の積を計算
totals = np.dot(baskets, prices)
print(f"\n3人分の合計金額を一括計算: {totals}")
実行結果を見ると、 [400 450 750] のように、3人分の答えが一瞬で表示されるはずです。
これがAIの内部で起きていることです。
Deep Learning(深層学習)では、画像データなどを巨大な行列に変換し、重みと呼ばれる別の行列と掛け合わせることで、何百万枚もの画像を一気に学習・判定しているのです。
この計算のことを、E資格のシラバスでは「行列・テンソルの積」というキーワードで呼んでいます(テンソルは、行列をさらに多次元に拡張した概念だと今は思ってください)。
4. 行列はデータを「変換」する装置
行列にはもう一つ、非常に重要な役割があります。それは「線形変換」です。
先ほどの計算を別の視点で見てみましょう。
「リンゴとミカンの個数」というデータを入力したら、「合計金額」という別のデータに変換されて出力されましたね。
- 入力:個数の世界(2次元)
- 処理:行列による掛け算
- 出力:金額の世界(1次元や別の次元)
このように、行列は「あるデータを、別の意味を持つデータに変換する装置」として働きます。
画像認識AIが、入力された「ピクセル(点)の集まり」を、「猫である確率」というデータに変換できるのも、内部で何層もの行列計算(変換)を行っているからなのです。
5. 今日のまとめ
今回は、計算革命の歴史と行列の役割について解説しました。
- ガウスの整理: 複雑な連立方程式を、数字の表(行列)に整理した。
- ケーリーの定義: 行列そのものを計算対象とし、一括計算のルールを作った。
- AIとの関係: 行列を使えば、大量のデータをfor文なしで一気に処理・変換できる。
行列は、単なる数字の羅列ではありません。データを効率よく運び、加工するための「ベルトコンベア」のようなものだとイメージしてください。
次回の予告
さて、ここまでで「データを並べる(ベクトル)」「一気に計算する(行列)」ことができるようになりました。
しかし、AI開発では「データのどこが重要なのか?」を見抜く力が必要です。
次回、最終回は「固有値と固有ベクトル」。
名前を聞くだけで難しそうですが、実はこれ、データの「特徴」を抽出するための鍵なのです。100年前の抽象数学が、現代のデータ分析にどう繋がるのか?
データの本質に迫る第3回、お楽しみに!
【第3回:抽象化編】
E資格インストラクターです。ついに最終回となる第3回です!
第1回ではデータを「空間の点(ベクトル)」とし、第2回ではそれを一気に操る「行列」について学びました。
ここまで来れば、単なる計算はコンピュータに任せることができます。
しかし、AIエンジニアには計算以上のことが求められます。それは、「大量のデータの中から、何が重要なのかを見抜くこと」です。
「データの特徴をつかむ」
口で言うのは簡単ですが、数学的にはどうやるのでしょうか?
ここで登場するのが、20世紀に完成された抽象線形代数の概念、「固有値」と「固有ベクトル」です。
名前がいかめしいので身構えてしまうかもしれませんが、大丈夫です。これは言い換えれば、データの「背骨」を見つけるための道具なのです。
1. 20世紀の転換:計算から「構造」の理解へ
19世紀まで、数学者たちは方程式を「解く」ことに必死でした。しかし20世紀に入ると、ダフィット・ヒルベルトらによって、数学はより抽象的な「空間の構造」を研究する学問へと進化しました。
彼らはこう考えました。
「個々の数字を細かく見るのではなく、空間全体がどう歪んでいるか、その『クセ』を見抜けば、本質がわかるのではないか?」
これをAIの現場に置き換えてみましょう。
例えば、身長と体重のデータが1万件あるとします。個々のデータ(Aさんは170cm、Bさんは160cm...)を見るだけでは、全体像はわかりません。
しかし、データをグラフにプロットすると、なんとなく「右上がりの楕円形」に分布していることが多いはずです。
この「データがどちらに向かって伸びているか(分布の向き)」こそが、そのデータセットの「構造」であり「特徴」です。これを見つける手法が、今回学ぶテーマです。
2. 固有値・固有ベクトルって何?
ここで、少しだけ数式を出しますが、怖がらないでくださいね。
ある行列 (変換装置)を、あるベクトル
に掛け算したとき、不思議なことが起きるケースがあります。
通常、行列を掛けるとベクトルは回転したり向きが変わったりします。
しかし、稀に「向きが変わらず、長さだけが (ラムダ)倍になる」特別なベクトルが存在します。
- 固有ベクトル(
): 変換しても向きが変わらない、その変換の「軸」となるベクトル。
- 固有値(
): その軸方向にどれだけ伸び縮みするかを表す「倍率」。
わかりやすい例え:ラグビーボール
丸い風船に点を描いて、それをグニューっと引っ張ってラグビーボールのような形に歪める変換を想像してください。
ほとんどの点は位置がずれますが、「引っ張った方向(先端と先端を結ぶ軸)」にある点だけは、一直線上に留まっていますよね?
この「引っ張った軸」が固有ベクトルで、「どれくらい長く伸びたか」が固有値です。
AI(特に画像処理やデータ分析)において、固有値分解や特異値分解(SVD)は次のように使われます。
- 固有ベクトル: データが一番散らばっている方向(=データの特徴が最もよく表れている「主成分」)を示す。
- 固有値: その特徴がどれくらい重要か(情報の大きさ)を示す。
つまり、固有値を調べることで、AIは「この画像のどの部分が重要で、どの部分はノイズ(無視していい情報)なのか」を数学的に判断しているのです。
3. Pythonでデータの「軸」を見つけてみよう
それでは、Pythonの NumPy ライブラリにある linalg (線形代数モジュール)を使って、実際に固有値と固有ベクトルを求めてみましょう。
ここでは、「横方向に2倍、縦方向に3倍」に引き伸ばす単純な行列を例にします。
import numpy as np
# 変換行列 A
# [[2, 0],
# [0, 3]]
# これはx座標を2倍、y座標を3倍にする変換です
A = np.array([
[2, 0],
[0, 3]
])
# 固有値と固有ベクトルを計算
# linalg.eig という関数一発で求まります
eigenvalues, eigenvectors = np.linalg.eig(A)
print("固有値 (重要度):")
print(eigenvalues)
print("\n固有ベクトル (軸の向き):")
print(eigenvectors)
実行すると、固有値として [2. 3.] が表示されるはずです。
これは、「ある軸方向にはデータが2倍に伸び、別の軸方向には3倍に伸びている」ことを示しています。AIにとっては「3倍に伸びている方向(固有値3の方向)の方が、データの変化が大きくて重要だな!」と判断する材料になります。
この技術を応用したのが、E資格のシラバスにある「主成分分析(PCA)」や「特異値分解(SVD)」です。
これらは、何千次元もある複雑なデータから、固有値の大きい(重要な)軸だけを残して、データを圧縮したりノイズを除去したりするために使われます。
いわば、「情報のお片付け術」ですね。
4. 全3回のまとめと、これからの学習指針
お疲れ様でした!3回にわたって、線形代数の歴史とAIとの関係を駆け足で見てきました。
- 第1回: データは「空間上の点(ベクトル)」である。(デカルトの座標)
- 第2回: 行列を使えば、大量のデータを一括で「変換」できる。(ガウスとケーリー)
- 第3回: 固有値・固有ベクトルを使えば、データの「重要な軸」を抽出できる。(抽象線形代数)
この3つのステップを理解していれば、E資格の数式を見ても「ああ、これはデータを変換しているんだな」「これは重要な特徴を探しているんだな」と、式のお気持ちが読めるようになっているはずです。
次のステップ:あなたは何をすべき?
線形代数の基礎イメージができたら、次は以下の分野に進んでみてください。これらもE資格の必須範囲です。
- 微分・積分(解析学): AIが「正解」に向かって学習を進めるために、グラフの傾き(勾配)を求めるのに使います。「誤差逆伝播法」の理解に必須です。
- 確率・統計: データに含まれる不確実性を扱うために必要です。「ベイズ推定」などがキーワードになります。
数学は、AIと対話するための言語です。
焦らず、歴史背景や意味を考えながら、少しずつ読み解いていってください。応援しています!
あなたへのアクションアイテム
今回のPythonコードの行列 A を [[1, 2], [2, 1]] のような斜めの成分がある行列に変えて実行してみてください。固有ベクトルが [0, 1] (真横や真縦)ではなく、斜めの数字になるはずです。それが「斜めに引き伸ばされたデータの軸」です!
セイ・コンサルティング・グループの新人エンジニア研修のメニューへのリンク
投稿者プロフィール
- 代表取締役
-
セイ・コンサルティング・グループ株式会社代表取締役。
岐阜県出身。
2000年創業、2004年会社設立。
IT企業向け人材育成研修歴業界歴20年以上。
すべての無駄を省いた費用対効果の高い「筋肉質」な研修を提供します!
この記事に間違い等ありましたらぜひお知らせください。
学生時代は趣味と実益を兼ねてリゾートバイトにいそしむ。長野県白馬村に始まり、志賀高原でのスキーインストラクター、沖縄石垣島、北海道トマム。高じてオーストラリアのゴールドコーストでツアーガイドなど。現在は野菜作りにはまっている。