機械学習は、コンピュータがデータからパターンや洞察を抽出し、新しいデータに対して予測や判断を行うための技術です。このような複雑なタスクを実行するためには、数学の概念と手法が不可欠です。数学は、機械学習の基盤となり、アルゴリズムの理解やモデルの設計において重要な役割を果たしています。
今回は,機械学習に必要な数学の一つである「スカラー」「ベクトル」「テンソル」という言葉について説明します。これらの言葉は全て数値のまとまりを表す便利なものですが、数学が苦手な方にとっては「行列Aと行列Bの積を~」などの文章を見ただけで嫌になってしまう方もいるかもしれません。この記事を読んで、意外と簡単なものだとわかっていただけると幸いです。
Contents
スカラーとは
スカラーは、単一の数値を表すものです。具体的な数値を持ち、大きさや値を持つだけで方向はありません。例えば、気温、身長、重さなどがスカラーの例です。機械学習においては、損失関数や評価指標などにスカラーがよく使われます。
スカラーの計算
スカラーの計算はみなさん触れたことがあると思いますが、加減乗除が行えます。スカラー同士の計算結果はスカラーになります。
行列とは
行列は、数値を格子状に並べた2次元の数学的構造です。行列は「行」と「列」からなり、それぞれの要素が数値で構成されています。行列は大量のデータを効率的に表現するために使用される一般的な手段です。行列はしばしば大文字で表記され、太字やイタリック体などで強調されることがあります。
行列の計算
行列は、加算(減算)と乗算といった演算を通じて操作できます。行列の加算は、同じ位置にある要素同士を足し合わせる操作です。行列の乗算は、行列同士の内積を計算する操作であり、要素ごとの掛け算と加算を組み合わせたものです。これらの演算を利用することで、データの変換や特徴の抽出、変換行列の計算などが行われます。行列同士の計算結果は行列の形になります。
行列の加算
行列の積
行列の積は左側の列と右側の行が一致する必要があります。積の結果は(左側の行×右側の列)の形になります。具体的にA(l×m)×B(m×n)=C(l×n)の行列積を行うとき、Cのi行目j列目の要素は以下の計算式で求められます。言葉で表すと、i行j列目の積の結果の値は左のi行目と右のj列目の内積となります。
Pythonでの行列計算
実際にPythonを用いて行列計算をしてみましょう。PythonにはNumPyという行列計算を得意とするライブラリが用意されています。このNumPyを用いて先ほどの図で示した加算、積を実際に実行してみてください。
テンソルとは
テンソルは、スカラーやベクトル、行列のような数学的な概念を一般化した多次元のデータ構造です。スカラーは0次元テンソル(0階テンソル)と見なせますし、ベクトルは1次元テンソル(1階テンソル)、行列は2次元テンソル(2階テンソル)、さらにはn次元データ構造ではn次元テンソル(n階テンソル)となります。より高次元のデータを扱う際には、テンソルが非常に便利です。データが2つ以上の次元を持つ場合、それはテンソルとして表現できます。
実際に機械学習で用いられるテンソルの例としてはカラー画像が挙げられます。R, G, Bの3層に対して画素値が行列の形で表現されるため、3階のテンソルとなります。
Pythonでのテンソル
それでは、テンソルの形をPythonを用いて確認してみましょう。
テンソル積
機械学習において、テンソルは多次元のデータを表すための重要な概念です。テンソル積は、2つのテンソルを組み合わせて新しいテンソルを生成する演算です。これは線形代数や多変数のデータを操作する際に非常に有用です。テンソル積は、特にニューラルネットワークや画像処理などの分野でよく利用されます。特に2階テンソルと2階テンソルのテンソル積は「外積」と呼ばれます。
今回はNumpyのnumpy.tensordot
を用いて3階テンソル同士のテンソル積を学びましょう。
具体的にどのような計算が行われているかをみていきましょう。
大まかな流れはA, Bそれぞれについて指定した次元について中間行列を作成し、それらのアダマール積の和を計算しています。
まず、中間行列の作成方法を見てみましょう。C = np.tensordot(A, B, axes = ([1, 0], [0, 1]))
以上のコードでは、A, Bそれぞれに対してaxesを指定しています。Aに対しては[1, 0]が指定されています。中間行列を作る上ではこの指定したaxisの順番に、すなわちaxis1, axis0の順番に要素を抽出します。
行列Aから中間行列を作成
必ず左上の要素から抽出します。指定した通り、まずaxis1の方向に注目します。axis1の方向に要素を辿ると、0, 2, 4となります。最後まで辿ったら次にaxis0の方向に注目するため、axis0の二つ目の行列について考えます。この行列についてもaxis1の方向に要素を辿ることによって6, 8, 10を抽出できます。よって中間行列が一つ作成できました。
同様にして、指定していないaxisの方向の要素全てに対して中間行列を作成します。行列Aでは、axis2を指定していないため、0の要素の次に1の要素でスタートしてもう一つの中間行列を作成します。
行列Bから中間行列を作成
Aと同様にBについてもaxis0, axis1の順に要素を抽出して中間行列を作成します。
作成した中間行列からテンソル積を計算
AとBのテンソル積Cの要素はAのi個目の中間行列とBのj番目の中間行列のアダマール積をとり、要素の和を計算します。例として、を計算してみましょう。
図のようにAの1番目の中間行列とBの2番目の中間行列でアダマール積を取ります。アダマール積とは要素ごとに積を取ります。
次に、得られた行列の要素和を求めます。これがの値となります。
同様に全てのC要素について計算すると、テンソル積が得られます。
テンソル積でしていること
A = np.arange(12).reshape(2,3,2)
B = np.arange(12).reshape(3,2,2)
C = np.tensordot(A,B, axes=([1,0], [0,1]))
はAのaxis1,0 Bのaxis0,1を利用して演算を行い情報を担保しつつ、axis2同士の次元すなわち2,2の形の行列に縮約する作業となっています。
まとめ
今回の記事では、スカラー・行列・テンソルについてそれがどのようなものかを学び、さらにそれらを用いた代表的について触れました。機械学習を学んでいく上ではこれらの知識は必要不可欠ですので、何度も見直して身につけましょう。