💻
機械学習の実装:教科書は縦ベクトルなのに、なぜPythonでは横ベクトルが一般的なの?
🔹 教科書では「縦ベクトル」が一般的な理由
-
線形代数の標準的な表記に従っているから
数学の教科書では、\mathbf{x} = \begin{bmatrix} x_1 \\ x_2 \\ \vdots \\ x_n \end{bmatrix} のように**縦ベクトル(列ベクトル)**で表現するのが一般的です。
-
行列積と一致する形だから
重み行列 を使った入力との線形結合も、W Wx + b と自然な形で書けるためです。
(このとき、 は出力次元×入力次元の行列)W
🔹 Python(特にNumPyやPyTorch)で「横ベクトル」が多い理由
-
1次元配列は「横ベクトル」のように扱われる
- NumPyやPyTorchでは、
np.array([1, 2, 3])は1次元配列(shape: (3,))ですが、これは見た目上横ベクトル的に動作します。 - 一方、縦ベクトルとして扱うには
np.array([[1], [2], [3]])(shape: (3,1))が必要で、記述がやや面倒。
- NumPyやPyTorchでは、
-
バッチ処理で行ベクトルが都合がよい
多くのディープラーニングライブラリでは、複数データ(バッチ)の入力をまとめて扱うため、以下のような行列を使います:[[x11, x12, x13], ← 1つ目のデータ(行ベクトル) [x21, x22, x23], ← 2つ目のデータ ... ]→ つまり、**1データ = 1行(横ベクトル)**で表現される
-
行優先の言語文化(CやPython)
PythonやC系の言語では、行優先(row-major)の配列処理が基本なので、処理的にも行ベクトルの方が効率的なことが多いです。
🔸実際どうすればよい?
- 数学的に考えるときは「縦ベクトル」を前提に。
- 実装で困ったら、
shapeを確認してx.T(転置)やx.reshape(-1, 1)を使えば、縦ベクトル的に扱えます。 - PyTorchなどでは、
nn.Linearは横ベクトル(行入力)を想定しているため、特に意識が必要です。
🔽 まとめ
| 項目 | 教科書(数学) | Python実装(NumPy/PyTorch) |
|---|---|---|
| ベクトルの形 | 縦ベクトル(列) | 横ベクトル(行)または1次元 |
| 行列積 |
|
|
| バッチ | 各列 | 各行が1データ |
Discussion