(深層学習で大切な内積。)内積、外積、ドット積、numpyのdot関数の関係について。スカラー積とかも。。


概要

深層学習で内積は、かなり重要。
内積、外積、ドット積、numpyのdot関数の関係について、若干、ややこしいので記事にする。

内積、外積、ドット積、numpyのdot関数

ここで示したい結論は、

  • まず、図示すると、大まかには、以下のようになると思う。(緑の矩形は、すべて、同じものを指す)。  ここで、「同じ」とは、深層学習のアルゴリズム説明とかで、dot product, inner product, scalar productという用語が出て場合に、違うものと考えなくて良いという程度の意味。

  • numpyのdot関数は、ドット積という意味では少し、ずれた内容のものが含まれている。

  • あえて、狭い範囲で考えて、dot関数、ドット積、内積は、同じものを指すことができる。
    (numpyのdot関数は、別の意味、機能もあるので、ご注意。)

  • 外積は、なんというか、別途、広がりのあるものなので、、、、深層学習には直接は影響なし、
    だと思う。

  • 深層学習において、内積がどう重要かは、この記事の対象外。

とりあえず、Wikiの記載で、内積、外積、ドット積の関係を示す。

内積(wikiより)

以下から引用。
https://ja.wikipedia.org/wiki/%E5%86%85%E7%A9%8D

線型代数学における内積(ないせき、英: inner product)は、(実または複素)ベクトル空間上で定義される非退化かつ正定値のエルミート半双線型形式(実係数の場合には対称双線型形式)のことである。二つのベクトルに対してある数(スカラー)を定める二項演算であるためスカラー積(スカラーせき、英: scalar product)ともいう。

 

「内積」(inner) という語は「外積」(outer) の反対という意味での名称だが、外積は(きっちり反対というよりは)もう少し広い状況で考えることができる。

外積(wikiより)

以下から引用。
https://ja.wikipedia.org/wiki/%E3%82%AF%E3%83%AD%E3%82%B9%E7%A9%8D

ベクトル積(英語: vector product)とは、ベクトル解析において、3次元の向き付けられた内積空間において定義される、2つのベクトルから新たなベクトルを与える二項演算である。2つのベクトル a, b (以下、ベクトルは太字で表記)のベクトル積は a×b や [a,b] で表される。演算の記号からクロス積(cross product)と呼ばれることもある。2つのベクトルからスカラーを与える二項演算である内積に対して外積(がいせき)とも呼ばれるが、英語でouter productは直積を意味するので注意を要する。

ドット積(wikiより)

以下から引用。
https://ja.wikipedia.org/wiki/%E3%83%89%E3%83%83%E3%83%88%E7%A9%8D

数学あるいは物理学においてドット積(ドットせき、英: dot product)あるいは点乗積(てんじょうせき)とは、ベクトル演算の一種で、2つの同じ長さの数列から一つの数値を返す演算。代数的および幾何的に定義されている。幾何的定義では、(デカルト座標の入った)ユークリッド空間 Rn において標準的に定義される内積のことである。

上記より、「標準内積」を意味する。

dot関数

numpyのhelpより

dot(...)
    dot(a, b, out=None)

    Dot product of two arrays. Specifically,

    - If both `a` and `b` are 1-D arrays, it is inner product of vectors
      (without complex conjugation).

    - If both `a` and `b` are 2-D arrays, it is matrix multiplication,
      but using :func:`matmul` or ``a @ b`` is preferred.

    - If either `a` or `b` is 0-D (scalar), it is equivalent to :func:`multiply`
      and using ``numpy.multiply(a, b)`` or ``a * b`` is preferred.

    - If `a` is an N-D array and `b` is a 1-D array, it is a sum product over
      the last axis of `a` and `b`.

    - If `a` is an N-D array and `b` is an M-D array (where ``M>=2``), it is a
      sum product over the last axis of `a` and the second-to-last axis of `b`::

        dot(a, b)[i,j,k,m] = sum(a[i,j,:] * b[k,:,m])

Google翻訳

-abの両方が2次元配列の場合、それは行列の乗算です。
ただし、:func: matmulまたはa @ bを使用することをお勧めします。

-aまたは bのいずれかが0-D(スカラー)の場合、:func:multiplyと同等です。
numpy.multiply(a、b)または a * bを使用することをお勧めします。

入力によっては、dotとmatmul(行列の積)が同じ意味であることを示す。

>>> import numpy as np
>>> c = np.array([[1,2],[3,4]])
>>> d = np.array([[10,100],[1000,10000]])
>>>
>>> e = np.dot(c,d)
>>> e
array([[ 2010, 20100],
       [ 4030, 40300]])
>>>
>>> f = np.matmul(c,d)
>>> f
array([[ 2010, 20100],
       [ 4030, 40300]])
>>>

まとめ

深層学習では内積が重要であることを別途記事にしたいと思います。
コメントなどあれば、お願いします。