벡터: 크기와 방향을 가진 숫자 묶음

벡터를 숫자의 목록이자 공간의 화살표로 함께 이해하고, 덧셈과 스칼라배, 길이와 거리, 내적과 코사인 유사도를 익혀요. 데이터와 단어와 사용자가 어떻게 벡터가 되어 검색과 추천에 쓰이는지 넘파이 코드로 확인해요.

초급강의 1 / 6약 7분

AI가 사진을 알아보고, 문장의 뜻을 이해하고, 내 취향에 맞는 영상을 추천하는 비결은 의외로 단순해요. 사진도, 문장도, 사람도 모두 숫자의 목록으로 바꿔 놓고 계산하는 거예요. 그 숫자의 목록을 벡터라고 해요. 선형대수는 벡터와 행렬을 다루는 수학이고, 현대 AI의 거의 모든 계산이 선형대수 위에서 돌아가요. 이번 강의에서 그 첫 단추를 끼워요.

벡터의 두 얼굴

숫자의 목록

벡터는 순서가 있는 숫자 묶음이에요.

v=[32],house=[843125.2]\mathbf{v} = \begin{bmatrix} 3 \\ 2 \end{bmatrix}, \qquad \mathbf{house} = \begin{bmatrix} 84 \\ 3 \\ 12 \\ 5.2 \end{bmatrix}

두 번째 벡터는 집 한 채를 "면적 84㎡, 방 3개, 지은 지 12년, 역까지 5.2분"으로 나타낸 거예요. 숫자의 개수를 벡터의 차원이라고 해요. 집 벡터는 4차원이에요. 이렇게 데이터 하나를 여러 특징의 숫자로 나타낸 것을 머신러닝에서는 특징 벡터라고 불러요.

공간의 화살표

2차원 벡터 (3,2)(3, 2)는 원점에서 오른쪽으로 3, 위로 2만큼 간 화살표로 그릴 수 있어요. 화살표는 방향과 크기를 가져요. 물리학에서 힘이나 속도를 벡터로 나타내는 이유예요.

두 관점은 같은 대상의 두 얼굴이에요. 숫자로 보면 계산이 쉽고, 화살표로 보면 뜻이 보여요. 4차원, 1000차원 벡터는 그림으로 그릴 수 없지만, 2차원과 3차원에서 길러 둔 화살표 감각이 고차원에서도 그대로 통해요. 수학자들이 "고차원을 상상하는 법"을 물으면 "3차원을 떠올리고 마음속으로 'n차원'이라고 말하라"고 농담하는 이유예요.

벡터 연산

덧셈

같은 자리끼리 더해요.

[32]+[14]=[46]\begin{bmatrix} 3 \\ 2 \end{bmatrix} + \begin{bmatrix} 1 \\ 4 \end{bmatrix} = \begin{bmatrix} 4 \\ 6 \end{bmatrix}

화살표로 보면 첫 화살표 끝에 두 번째 화살표를 이어 붙인 거예요. "동쪽으로 3, 북쪽으로 2 걸은 뒤 동쪽으로 1, 북쪽으로 4 걸으면" 처음 위치에서 (4,6)(4, 6)에 도착해요.

스칼라배

벡터에 숫자 하나(스칼라)를 곱하면 모든 성분에 곱해져요.

2[32]=[64],−1[32]=[−3−2]2 \begin{bmatrix} 3 \\ 2 \end{bmatrix} = \begin{bmatrix} 6 \\ 4 \end{bmatrix}, \qquad -1 \begin{bmatrix} 3 \\ 2 \end{bmatrix} = \begin{bmatrix} -3 \\ -2 \end{bmatrix}

화살표는 같은 방향으로 늘어나거나 줄어들어요. 음수를 곱하면 방향이 뒤집혀요.

선형 결합

스칼라배와 덧셈을 섞은 것을 선형 결합이라고 해요.

au+bva\mathbf{u} + b\mathbf{v}

"선형"대수의 "선형"이 바로 이 연산이에요. 놀랍게도 현대 신경망의 대부분은 거대한 선형 결합의 연속이에요. 입력 숫자들에 각각 가중치를 곱해 더하는 것, 그게 신경망 한 층이 하는 일의 핵심이에요.

넘파이로 벡터 다루기

파이썬 리스트에 +를 쓰면 이어 붙이기가 돼요. 수학적 벡터 계산은 넘파이(NumPy)를 써요. 데이터 과학과 AI의 기본 라이브러리예요.

pip install numpy
import numpy as np

u = np.array([3, 2])
v = np.array([1, 4])
print(u + v)        # [4 6]
print(2 * u)        # [6 4]
print(u * v)        # [3 8]  자리끼리 곱 (내적과 다름)
print(u @ v)        # 11     내적

넘파이는 C로 짜인 빠른 반복을 내부에서 돌려서, 파이썬 for문보다 수십에서 수백 배 빨라요. 숫자 100만 개를 더해도 순식간이에요. 이처럼 반복문 대신 배열 연산 한 번으로 처리하는 것을 벡터화라고 하고, AI 코드의 기본 습관이에요.

길이와 거리

노름: 벡터의 길이

피타고라스 정리로 화살표의 길이를 구해요.

∥v∥=v12+v22+⋯+vn2\|\mathbf{v}\| = \sqrt{v_1^2 + v_2^2 + \cdots + v_n^2}

(3,4)(3, 4)의 길이는 9+16=5\sqrt{9 + 16} = 5예요. 차원이 늘어도 공식은 그대로예요. 이 길이를 L2 노름이라고 해요. 성분의 절댓값을 그냥 더한 L1 노름도 있는데, 바둑판 같은 도시에서 건물을 피해 가로세로로만 걷는 거리라서 맨해튼 거리라고도 불러요.

단위 벡터와 정규화

길이로 나누면 방향은 그대로이고 길이가 1인 단위 벡터가 돼요.

v^=v∥v∥\hat{\mathbf{v}} = \frac{\mathbf{v}}{\|\mathbf{v}\|}

크기는 무시하고 방향만 비교하고 싶을 때 써요. 이 과정을 정규화라고 해요.

두 점 사이의 거리

두 벡터의 차를 구해 그 길이를 재면 거리예요.

d(u,v)=∥u−v∥d(\mathbf{u}, \mathbf{v}) = \|\mathbf{u} - \mathbf{v}\|
a = np.array([84, 3, 12])
b = np.array([79, 3, 20])
print(np.linalg.norm(a - b))   # 두 집이 얼마나 다른가

"비슷한 집 찾기"는 거리가 가장 가까운 벡터 찾기와 같아요. 머신러닝의 k-최근접 이웃 알고리즘이 바로 이 생각이에요.

주의: 단위가 다른 특징 면적(수십수백)과 방 개수(15)를 그대로 거리 계산에 쓰면 면적 차이가 거리를 거의 다 결정해요. 특징마다 범위를 비슷하게 맞추는 스케일링이 필요해요. 머신러닝 트랙의 특징 공학 강의에서 다뤄요.

내적: 얼마나 같은 방향인가

계산

자리끼리 곱해서 모두 더해요. 결과는 벡터가 아니라 숫자 하나예요.

u⋅v=u1v1+u2v2+⋯+unvn\mathbf{u} \cdot \mathbf{v} = u_1 v_1 + u_2 v_2 + \cdots + u_n v_n

(3,2)⋅(1,4)=3+8=11(3, 2) \cdot (1, 4) = 3 + 8 = 11이에요.

뜻

내적에는 기하학적인 뜻이 있어요.

u⋅v=∥u∥ ∥v∥cos⁡θ\mathbf{u} \cdot \mathbf{v} = \|\mathbf{u}\| \, \|\mathbf{v}\| \cos\theta

θ\theta는 두 화살표 사이의 각도예요. 그래서 내적의 부호만 봐도 관계가 보여요.

내적각도뜻
양수90도보다 작음대체로 같은 방향
0정확히 90도서로 무관(직교)
음수90도보다 큼대체로 반대 방향

"직교"는 선형대수에서 아주 중요한 개념이에요. 직교하는 두 벡터는 서로의 정보를 전혀 담고 있지 않아요. 동쪽으로 아무리 걸어도 북쪽으로는 한 걸음도 안 간 것과 같아요.

가중합으로서의 내적

내적은 "점수 계산"이기도 해요. 학생의 점수 벡터 (90,80,70)(90, 80, 70)과 과목 가중치 (0.5,0.3,0.2)(0.5, 0.3, 0.2)의 내적은 45+24+14=8345 + 24 + 14 = 83, 즉 가중 평균 점수예요. 신경망의 뉴런 하나가 하는 계산이 정확히 이거예요.

출력=w⋅x+b\text{출력} = \mathbf{w} \cdot \mathbf{x} + b

입력 x\mathbf{x}에 가중치 w\mathbf{w}를 내적하고 편향 bb를 더해요. 학습이란 이 가중치를 좋은 값으로 찾아가는 과정이에요.

코사인 유사도: 방향만 비교하기

두 벡터의 크기는 무시하고 방향이 얼마나 비슷한지만 보고 싶을 때 내적을 길이로 나눠요.

cos_sim(u,v)=u⋅v∥u∥ ∥v∥\text{cos\_sim}(\mathbf{u}, \mathbf{v}) = \frac{\mathbf{u} \cdot \mathbf{v}}{\|\mathbf{u}\| \, \|\mathbf{v}\|}

값은 -1(정반대)부터 1(같은 방향)까지예요.

예: 영화 취향 비교

사용자가 장르별로 본 영화 수를 벡터로 나타내 볼게요. (액션, 로맨스, 공포)

def cos_sim(u, v):
    return (u @ v) / (np.linalg.norm(u) * np.linalg.norm(v))

minji  = np.array([10, 2, 0])
junhyuk = np.array([30, 5, 1])
seoyeon = np.array([1, 12, 0])

print(cos_sim(minji, junhyuk))   # 약 0.998  취향이 거의 같아요
print(cos_sim(minji, seoyeon))   # 약 0.27   취향이 달라요

준혁은 민지보다 영화를 세 배 많이 봤지만, 취향의 방향은 거의 같아요. 거리로 비교했다면 둘이 멀다고 나왔을 거예요. 이것이 추천 시스템이 코사인 유사도를 즐겨 쓰는 이유예요.

예: 의미 검색

요즘 AI는 문장을 수백에서 수천 차원의 벡터(임베딩)로 바꿔요. 뜻이 비슷한 문장은 비슷한 방향의 벡터가 되도록 학습돼 있어요. 그래서 "환불 받는 법"을 검색하면 "돈 돌려받는 방법"이 적힌 문서도 찾을 수 있어요. 글자가 하나도 안 겹쳐도 벡터의 방향이 가깝기 때문이에요. LLM 트랙의 임베딩과 RAG 강의에서 직접 만들어 봐요.

실습

  1. 넘파이로 a = [2, -1, 3], b = [1, 4, 2]의 내적, 각 길이, 코사인 유사도를 구해 보세요.
  2. 세 사람의 영화 취향 예시에 장르를 하나 더 추가하고, 나와 가장 비슷한 사람을 찾는 함수를 만들어 보세요.
  3. 반복문으로 내적을 구하는 함수를 직접 짜고, 길이 100만인 벡터로 넘파이의 @와 속도를 비교해 보세요. time.perf_counter()로 재면 돼요.

자주 하는 실수

  • 파이썬 리스트로 벡터 계산하기. [1, 2] + [3, 4]는 [1, 2, 3, 4]예요. 넘파이 배열을 쓰세요.
  • *를 내적으로 착각하기. 넘파이에서 *는 자리끼리 곱, 내적은 @나 np.dot이에요.
  • 차원이 다른 벡터끼리 계산하기. 3차원과 4차원 벡터는 더하거나 내적할 수 없어요.
  • 단위가 다른 특징으로 거리 재기. 스케일링 없이 재면 큰 숫자의 특징이 결과를 독차지해요.

점검 문제

  1. (1,2,2)(1, 2, 2)의 길이는?
  2. (2,1)(2, 1)과 (−1,2)(-1, 2)의 내적은? 두 벡터의 관계는?
  3. (1,0)(1, 0)과 (5,0)(5, 0)의 코사인 유사도는? 거리는?
  4. 신경망 뉴런 하나의 계산을 벡터 연산으로 쓰면?

정답

  1. 1+4+4=3\sqrt{1 + 4 + 4} = 3
  2. −2+2=0-2 + 2 = 0이에요. 내적이 0이니 서로 직교해요.
  3. 코사인 유사도는 1(같은 방향), 거리는 4예요. 방향은 같지만 크기가 달라요.
  4. 입력 벡터와 가중치 벡터의 내적에 편향을 더한 값 w⋅x+b\mathbf{w} \cdot \mathbf{x} + b예요(뒤에 활성화 함수가 붙어요).

다음 강의

다음 강의에서는 벡터를 여러 개 쌓은 행렬과 행렬 곱을 배워요. 내적을 수천 번 해야 하는 계산을 행렬 곱 한 번으로 해치우는 것, 그게 GPU가 AI를 빠르게 돌리는 비밀이에요.