行列計算(内積)の着目ポイント
人工知能(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学習用データセットのいろいろな入手方法』 を参照してください。
「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」に変化する
- 行列計算により形状が変化する
以上
