機械学習の鬼門「行列の積」を攻略!データを一括処理する魔法の箱
こんにちは。ゆうせいです。
前回は、データ同士の相性を測る「内積」について解説しました。
「掛けて、足す」。このシンプルな計算が機械学習の基礎でしたね。
さて、今回はその内積をさらにパワーアップさせた「行列の積」についてお話しします。
数学の授業で「行列」が出てきた瞬間、黒板が数字だらけになって眠くなってしまった経験はありませんか。
実は、行列の掛け算こそが、AIが大量のデータを一瞬で処理できる秘密なのです。
これを理解すれば、ニューラルネットワークがどうやって画像を認識したり、言葉を翻訳したりしているのか、その「データ処理工場の裏側」が見えてきます。
少しだけルールが複雑になりますが、基本は「内積の繰り返し」です。
リラックスして一緒に見ていきましょう。
行列の積ってなに?
一言で言うと、行列の積とは大量の内積計算を一度にまとめて行うための表記法であり、データを別の形に「変換」する装置です。
データの「まとめ計算」
想像してみてください。
前回、ある「お客さん」と「商品」の相性を内積で計算しましたね。
でも、実際のお店にはお客さんが何百人もいて、商品も何千種類とあります。
「お客さんAと商品1」「お客さんAと商品2」……「お客さんBと商品1」……と、一つひとつ計算していたら日が暮れてしまいます。
そこで登場するのが「行列」です。
全てのお客さんのデータをまとめた「お客さん行列」と、全ての商品データをまとめた「商品行列」を用意します。
この二つを「行列の積」で掛け合わせると、なんと全員分の相性診断結果が一発で算出できるのです。
これが、機械学習で行列が使われる最大の理由です。
どうやって計算するの?
ここが最大の難関です。
行列の掛け算は、普通の数字の掛け算( )とは少しルールが違います。
キーワードは「左は横、右は縦」です。
計算のルール
例として、次のような の行列同士を掛けてみましょう。
行列A
行列B
この計算 をするとき、以下の手順で行います。
- 左の行列(A)の一行目と、右の行列(B)の一列目で「内積」をします。Aの横
と Bの縦
です。
これが、答えの行列の「右上(1行1列目)」になります。
- 次に、左の行列(A)の一行目と、右の行列(B)の二列目で「内積」をします。Aの横
と Bの縦
です。
これが、答えの行列の「右下(実際は1行2列目)」に入ります。
- 同じように、Aの二行目についても計算します。
どうでしょう。「横」と「縦」を組み合わせて、ひたすら内積をしているだけだと気づきましたか。
行列の積とは、内積の詰め合わせセットなのです。
なぜ機械学習で重要なのか
エンジニアにとって、行列の積がなぜこれほど大切なのでしょうか。
1. ニューラルネットワークそのものだから
AIの脳みそである「ニューラルネットワーク」は、層(レイヤー)を何重にも重ねた構造をしています。
データがこの層を通過するたびに、情報が加工されていきます。
実は、データが層を通過するという処理は、数学的には「入力データ(ベクトル)」に「重み(行列)」を掛けるという計算そのものなのです。
つまり、AIを作るということは、適切な行列の掛け算を設計することと言っても過言ではありません。
2. 計算の高速化(GPUの出番)
ここが重要です。
「内積を100回繰り返すプログラム(for文)」を書くよりも、「行列の積を1回行うプログラム」を書く方が、コンピュータは圧倒的に速く計算できます。
特に、ゲームグラフィックなどで使われる「GPU」というパーツは、この行列計算を並列で行うのが得意です。
行列の形にしてあげることで、GPUのパワーをフル活用して、何万枚もの画像学習を一瞬で終わらせることができるのです。
メリットとデメリット
強力な行列の積ですが、注意点もあります。
メリット
記述が非常にシンプルになります。数千個のデータ処理も、数式上ではたった数文字 で表現できます。
そして何より、ライブラリを使った時の処理速度が桁違いに速いです。
デメリット
最大の注意点は「掛ける順番を変えてはいけない」ことです。
普通の数字なら も
も同じですが、行列は
と
が全く違う結果(あるいは計算不可能)になります。
また、左の行列の「列数」と右の行列の「行数」が一致していないと計算できないという「サイズ合わせ」の制約があり、初心者が最もエラーを出しやすいポイントです。
Pythonで確認してみよう
Pythonでは、行列の積を表すために @ という専用の記号(演算子)が使えます。
これを使うと、コードがとても直感的になります。
import numpy as np
# 行列の定義
A = np.array([[1, 2],
[3, 4]])
B = np.array([[5, 6],
[7, 8]])
# 行列の積(ドット積)
# np.dot(A, B) と書いても同じです
result = A @ B
print(result)
# 出力:
# [[19 22]
# [43 50]]
手計算だと面倒な作業も、Pythonなら一瞬ですね。
@ マークを見るたびに、「あ、ここで行列の変換が行われているんだな」と思い出してください。
まとめ
いかがでしたか。
行列の積とは、たくさんの内積を一括で行い、データを変換したり、まとめて処理したりするための強力なツールでした。
最初は「横・縦」のルールに戸惑うかもしれませんが、
「AIは巨大な行列計算機なんだ」というイメージを持つことが、理解への第一歩です。
さて、ここまで「ベクトル」「内積」「行列」と学んできました。
これらは全て、データを「線形(まっすぐ)」に変換する処理でした。
次回は、これらに少しスパイスを加えて、AIに複雑な表現力を与える「活性化関数(シグモイド関数など)」について学んでいきましょう。
だんだんと本格的なAIの中身に近づいてきましたね。
もし計算でつまずいたり、イメージが湧かないときは、いつでも聞いてください。
あなたのペースで進んでいきましょう。
セイ・コンサルティング・グループの新人エンジニア研修のメニューへのリンク
投稿者プロフィール
- 代表取締役
-
セイ・コンサルティング・グループ株式会社代表取締役。
岐阜県出身。
2000年創業、2004年会社設立。
IT企業向け人材育成研修歴業界歴20年以上。
すべての無駄を省いた費用対効果の高い「筋肉質」な研修を提供します!
この記事に間違い等ありましたらぜひお知らせください。
学生時代は趣味と実益を兼ねてリゾートバイトにいそしむ。長野県白馬村に始まり、志賀高原でのスキーインストラクター、沖縄石垣島、北海道トマム。高じてオーストラリアのゴールドコーストでツアーガイドなど。現在は野菜作りにはまっている。