行列計算(内積)の着目ポイント

 人工知能(AI)には行列計算が使われます。(2×2)行列同士の内積計算AxBは手計算でも簡単です。(5×5)行列同士の内積計算となると、手計算では大変ですがNumpyを使えば簡単に計算できます。しかし、AI開発に利用するNumpyは計算する道具というイメージはありません。AI開発に必要な視点はどういったものかを説明します。

機械学習ライブラリ(入門編)

『機械学習ライブラリ(入門編)』に戻る>>

計算結果より線形代数の性質に注目です

はじめに

 行列の形を考えます。形とは(2,2)や(2,3)で表す「行」と「列」です。行列を作成し、形状と各方向の数値を取り出します。

import numpy as np
a = np.array([[2,3], [1,4], [3,1]]) #作成
print(a)                            #表示
print('shape:' + str(a.shape))      #形状確認
print('row:' + str(a.shape[0]))     #行方向の数
print('col:' + str(a.shape[1]))     #列方向の数
print('dimension:' + str(a.ndim))   #次元

[[2 3]
 [1 4]
 [3 1]]
shape:(3, 2)
row:3
col:2
dimension:2

行列の形状は、行(row)と列(col)の2つです。この数を「dimension=次元」と呼びます。Numpyでは3次元以上も扱えます。一般に「テンソル(Tensor)」と呼ばれます。

別名テンソル(Tensor)Numpyで
スカラー0次元テンソル扱えない
ベクトル1次元テンソル扱える
行列2次元テンソル 扱える
(なし)3次元、4次元…テンソル 扱える

間違った見方に気づく

 次の2つの例はどちらも内積計算です。1つ目は計算が正しいか確認できそうですが、2つ目は電卓でも大変そうです。両者を比べると計算自体の難しさに着目してしまいます。

◆1つ目

import numpy as np
a = np.array([[2,3], [3,1]]) #(2,2)行列
b = np.array([[3,4], [2,5]]) #(2,2)行列
c = np.dot(a, b) #内積
print(c)
print(c.shape)
[[12 23]
 [11 17]]
(2, 2)

◆2つ目

import numpy as np
np.random.seed(100) #乱数の固定
a = np.random.randn(2,3) #(2,3)行列
b = np.random.randn(3,5) #(3,5)行列
c = np.dot(a, b) #内積
print(c)
print(c.shape)
[[-0.85047584  2.85965694  0.10630469 -1.50512546  2.63240397]
 [ 0.09800688  0.22693149  0.624127    0.02072304  0.84567257]]
(2, 5)
--
seedをを設定すると、乱数の結果が固定されます。

登場する数値より、行列の持つ特性に着目すべきです。

イメージを膨らませる

 機械学習に当てはめて考えるため、MNISTデータセットを使います。「x_train」への読み込みは、 『AI学習用データセットのいろいろな入手方法』 を参照してください。

MNISTデータセット
  • 手書き数字の画像が格納されている
  • 1枚当たりの画素数は、28×28=784(ピクセル)
  • 100万画素単位のスマホ写真と比べるとずいぶん粗い画像
  • 画像データ数は60,000枚
MNISTデータの表示例

 「x_train」の形状(shape)は(60000, 784)です。1枚の画像データ(784ピクセル)を列方向に並べたものが、行方向に60,000枚積み重なっています。

#MNISTデータの読み込みは割愛
print(x_train.shape)
(60000, 784)

 画像1枚(1行)だけデータを取り出してみると次の通りです。「x_train」には、このようなデータが60,000行入っています。数値に着目して「x_train」の行列計算考えると気が遠くなります。

print(x_train[0])
[  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
   0   0   0   0   0   0   0   0   3  18  18  18 126 136 175  26 166 255
 247 127   0   0   0   0   0   0   0   0   0   0   0   0  30  36  94 154
 170 253 253 253 253 253 225 172 253 242 195  64   0   0   0   0   0   0
   0   0   0   0   0  49 238 253 253 253 253 253 253 253 253 251  93  82
  82  56  39   0   0   0   0   0   0   0   0   0   0   0   0  18 219 253
 253 253 253 253 198 182 247 241   0   0   0   0   0   0   0   0   0   0
   0   0   0   0   0   0   0   0  80 156 107 253 253 205  11   0  43 154
   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
   0  14   1 154 253  90   0   0   0   0   0   0   0   0   0   0   0   0
   0   0   0   0   0   0   0   0   0   0   0   0   0 139 253 190   2   0
   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
   0   0   0   0   0  11 190 253  70   0   0   0   0   0   0   0   0   0
   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0  35 241
 225 160 108   1   0   0   0   0   0   0   0   0   0   0   0   0   0   0
   0   0   0   0   0   0   0   0   0  81 240 253 253 119  25   0   0   0
   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
   0   0  45 186 253 253 150  27   0   0   0   0   0   0   0   0   0   0
   0   0   0   0   0   0   0   0   0   0   0   0   0  16  93 252 253 187
   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
   0   0   0   0   0   0   0 249 253 249  64   0   0   0   0   0   0   0
   0   0   0   0   0   0   0   0   0   0   0   0   0   0  46 130 183 253
 253 207   2   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
   0   0   0   0  39 148 229 253 253 253 250 182   0   0   0   0   0   0
   0   0   0   0   0   0   0   0   0   0   0   0  24 114 221 253 253 253
 253 201  78   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
   0   0  23  66 213 253 253 253 253 198  81   2   0   0   0   0   0   0
   0   0   0   0   0   0   0   0   0   0  18 171 219 253 253 253 253 195
  80   9   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
  55 172 226 253 253 253 253 244 133  11   0   0   0   0   0   0   0   0
   0   0   0   0   0   0   0   0   0   0 136 253 253 253 212 135 132  16
   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
   0   0   0   0   0   0   0   0   0   0]

着目するポイント

最初の2つの例で挙げた行列計算で着目すべきところは、(2,2)x(2,2)=(2,2)行列や(2,3)x(3,5)=(2,5)行列になるところです。2つ目の例で言えば、元の(2,3)行列が、ある作用を受けて(2,5)行列に変化します。
着目するポイント
  • データ数である「2」は変化しない
  • 列数が「3」→「5」に変化する
  • 行列計算により形状が変化する

『機械学習ライブラリ(入門編)』に戻る>>

以上