ベクトルの加法とスカラー倍 — 幾何学的視点

ベクトル加法:2つの変位をつなぎ合わせる

ベクトルは、原点から出る1本の矢として理解できる——長さと方向を持つ。

2つのベクトルを加えることは、2つの変位を「つなぎ合わせる」ことである。

三角形の法則

2番目のベクトル b の始点を、1番目のベクトル a の終点につなげる。

a の始点から b の終点までの線が、a + b である。

直感:「まず a を進み、次に b を進む」

平行四辺形の法則

a と b を2つの隣り合う辺として、平行四辺形を描く。

始点から出る対角線が、a + b である。

直感:2つの法則の結果は完全に同じ

スカラー倍:ベクトルを伸ばす、または縮める

スカラー(普通の数)でベクトルを掛けると、結果はベクトルの長さを変えるが、それが乗っている直線の方向は変わらない。

|c| > 1

伸長

例: 2v:長さ ×2

0 < |c| < 1

短縮

例: 0.5v:長さ ÷2

c < 0

方向の反転

例: -v:方向が逆

c = 0

1つの点に縮む

例: 0v = ゼロベクトル

スカラー倍はベクトルの「長さ」だけを変え、それが乗っている直線の方向は変えない(負の数は方向を反転させるが、同じ直線上にある)。

この性質を共線性——スカラー倍の前後の2つのベクトルは常に同じ直線上にある。


身近な例

ベクトル加法:ナビゲーションにおける複数区間の旅程

家を出発し、まず東へ300メートル進む(ベクトル a = (300, 0))、次に北へ400メートル進む(ベクトル b = (0, 400))。

最終的に家の北東方向、距離500メートルの地点にいる——これが a + b = (300, 400) である。

スカラー倍:動画の再生速度

通常速度で5歩進むのに5秒かかる。2倍速なら——同じ方向、同じ歩数で、わずか2.5秒しかかからない。

変位ベクトルの方向は変わらないが、「1歩の大きさ」が2倍になる——これが 2v の効果である。

逆方向:引き返す

東へ100メートル進んだ(v = (100, 0))、そして原点に戻りたい——西へ100メートル進む必要がある(-v = (-100, 0))。

負号はベクトルの方向を「Uターン」させる命令である。


数学的定義

ベクトル加法

同じ次元の2つのベクトルを加えるとは、対応する位置の要素をそれぞれ加算することである。

\[ \mathbf{a} + \mathbf{b} = \begin{bmatrix} a_1 \\ a_2 \\ \vdots \\ a_n \end{bmatrix} + \begin{bmatrix} b_1 \\ b_2 \\ \vdots \\ b_n \end{bmatrix} = \begin{bmatrix} a_1 + b_1 \\ a_2 + b_2 \\ \vdots \\ a_n + b_n \end{bmatrix} \]

前提条件:2つのベクトルの次元が同じでなければならない、そうでなければ加法は無意味である。

ベクトル減法

ベクトル減法 = 逆方向のベクトルを加えること:\( \mathbf{a} - \mathbf{b} = \mathbf{a} + (-\mathbf{b}) \)

ベクトルのスカラー倍

スカラー c をベクトルに掛けることは、ベクトルの各要素を c で掛けることである:

\[ c \cdot \mathbf{v} = c \cdot \begin{bmatrix} v_1 \\ v_2 \\ \vdots \\ v_n \end{bmatrix} = \begin{bmatrix} c \cdot v_1 \\ c \cdot v_2 \\ \vdots \\ c \cdot v_n \end{bmatrix} \]

演算性質の早見表

性質公式直感
交換法則\( \mathbf{a} + \mathbf{b} = \mathbf{b} + \mathbf{a} \)どちらを先に進んでも同じ
結合法則\( (\mathbf{a}+\mathbf{b})+\mathbf{c} = \mathbf{a}+(\mathbf{b}+\mathbf{c}) \)どのようにグループ分けして進んでも同じ
分配法則\( c(\mathbf{a}+\mathbf{b}) = c\mathbf{a} + c\mathbf{b} \)先に加えてから伸ばす = 先に伸ばしてから加える

Python で試してみる

例

import numpy as np

# 2つのベクトルを作成
a_サンプル = np.array([3, 1])    # a = (3, 1)
b_サンプル = np.array([1, 2])    # b = (1, 2)

# ベクトル加法:対応する位置を加算
add_result = a_サンプル + b_サンプル
print("a + b =", add_result)    # [4, 3]

# ベクトル減法
sub_result = a_サンプル - b_サンプル
print("a - b =", sub_result)    # [2, -1]

# スカラー倍:各要素にスカラーを掛ける
c = 2.5
scale_result = c * a_サンプル
print(f"{c} * a =", scale_result)  # [7.5, 2.5]

# 負ベクトル:方向が完全に逆
neg = -a_サンプル
print("-a =", neg)              # [-3, -1]

# NumPy ブロードキャスト:スカラーとベクトルの各要素を直接演算
print("a + 10 =", a_サンプル + 10)   # 各要素に10を加える
print("a * 3  =", a_サンプル * 3)    # 各要素に3を掛ける
a + b = [4 3]
a - b = [2 -1]
2.5 * a = [7.5 2.5]
-a = [-3 -1]
a + 10 = [13 11]
a * 3  = [9 3]

例

import numpy as np
import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ['Arial Unicode MS', 'SimHei', 'DejaVu Sans']
plt.rcParams['axes.unicode_minus'] = False

example_a = np.array([3, 1])
example_b = np.array([1, 2])
example_sum = example_a + example_b

fig, axes = plt.subplots(1, 2, figsize=(12, 5))

# 左の図:三角形の法則
for ax, title in zip(axes, ['三角形の法則', '平行四辺形の法則']):
    ax.set_xlim(-1, 6); ax.set_ylim(-1, 5)
    ax.axhline(y=0, color='gray', lw=0.5); ax.axvline(x=0, color='gray', lw=0.5)
    ax.set_aspect('equal'); ax.grid(True, alpha=0.3); ax.set_title(title)

# 三角形の法則を描画
ax = axes[0]
ax.arrow(0, 0, example_a[0], example_a[1], head_width=0.2, head_length=0.2,
         fc='#e74c3c', ec='#e74c3c', lw=2, label='a')
ax.arrow(example_a[0], example_a[1], example_b[0], example_b[1],
         head_width=0.2, head_length=0.2, fc='#3498db', ec='#3498db', lw=2, label='b')
ax.arrow(0, 0, example_sum[0], example_sum[1], head_width=0.2, head_length=0.2,
         fc='#2E7DCC', ec='#2E7DCC', lw=2, ls='dashed', label='a+b')
ax.legend()

# 平行四辺形の法則を描画
ax = axes[1]
ax.arrow(0, 0, example_a[0], example_a[1], head_width=0.2, head_length=0.2,
         fc='#e74c3c', ec='#e74c3c', lw=2, label='a')
ax.arrow(0, 0, example_b[0], example_b[1], head_width=0.2, head_length=0.2,
         fc='#3498db', ec='#3498db', lw=2, label='b')
ax.arrow(example_a[0], example_a[1], example_b[0], example_b[1],
         head_width=0.2, head_length=0.2, fc='#3498db', ec='#3498db', lw=1.5, ls='dotted', alpha=0.6)
ax.arrow(example_b[0], example_b[1], example_a[0], example_a[1],
         head_width=0.2, head_length=0.2, fc='#e74c3c', ec='#e74c3c', lw=1.5, ls='dotted', alpha=0.6)
ax.arrow(0, 0, example_sum[0], example_sum[1], head_width=0.2, head_length=0.2,
         fc='#2E7DCC', ec='#2E7DCC', lw=2, ls='dashed', label='a+b')
ax.legend()
plt.tight_layout(); plt.show()

インタラクティブなベクトル加法デモ

下の赤いベクトル a と青いベクトル b の端点をドラッグして、緑色の和ベクトル a+b がリアルタイムで変化するのを観察しよう。三角形の法則と平行四辺形の法則を体感しよう:


AI での応用シーン

単語ベクトルの意味的演算

Word2Vec や GloVe などの単語埋め込みモデルで最も有名な発見:ベクトルの加減法には意味的な含意がある。

\[ \text{vec}(\text{王}) - \text{vec}(\text{男}) + \text{vec}(\text{女}) \approx \text{vec}(\text{女王}) \]

減法は「男性」の特徴成分を取り除き、加法は「女性」の特徴成分を加えることである。結果のベクトルは埋め込み空間において「女王」に最も近くなる。

このような意味的演算は性別に限らない——「パリ - フランス + イタリア ≈ ローマ」も同じ原理である。ベクトルの加法と減法はここで「特徴編集」の役割を果たしている。

ニューラルネットワークにおけるバイアス

各ニューロンの計算 \( y = Wx + b \) において、+b はベクトル加法である——バイアスは wx の結果を全体として平行移動させる。

もしバイアス b がなければ、モデルは x=0 のときに出力が必ず 0 になり、これはモデルの表現力を著しく制限する。バイアスは各ニューロンに「デフォルトの活性化値」を与えることに相当する。

勾配の更新

トレーニング時のパラメータ更新 \( \theta_{new} = \theta_{old} - \eta \nabla J \) は、スカラー倍(学習率 × 勾配)とベクトル減法の組み合わせである。

スカラー倍は毎回の更新の大きさを制御し(学習率が大きいほどステップ幅が大きい)、減法はパラメータを損失が減少する方向へ移動させる。

データ前処理:平均中心化

ニューラルネットワークをトレーニングする前に、通常データに対して「平均を引く」操作を行う:\( x_{norm} = x - \mu \)。これはベクトル減法であり——データの中心を原点に平行移動させ、勾配降下法の収束を速めるのに役立つ。


その他の拡張