왜 그래픽, 물리, 머신러닝은 모두 같은 화살표를 훔쳐 쓸까?
. 이것은 화면 위의 점인가, 움직임을 일러주는 화살표인가, 속도인가,
사과를 나타내는 특징 벡터인가? 답은 무엇을 하느냐에 달려 있다 — 바로 그래서
아래 위젯: 튜플 하나 , 튜플 하나 , 결과 . 역할 버튼을 누르면 — 기본/그래픽/물리/ML — 라벨만 바뀌고 그림은 그대로다. 그림은 바뀔 수 없다; 그 그림을 두고 풀어내는 이야기만 바뀐다.
한 튜플, 여러 일
표기 은 어딘가를 가리키는 손가락 — 하지만 그 끝에 놓이는 대상은 가지각색이다. 2D 평면 위의 위치로 읽으면, 오른쪽으로 3, 위로 4 떨어진 지점. *
벡터가 쓸모 있는 이유가 바로 이 모호함에 있다. “수 둘 이상을 묶어 하나로 다루고 싶다”는 모든 응용이 같은 도구 — 하나의 산술, 하나의 항등식 묶음 — 을 물려받고, 그것을 자기 영역의 방식으로 해석하는 일만 응용의 몫으로 남는다.
점: 어디인지
역할이 “위치”일 때, 튜플은 공간 속의 주소. 어디냐에는 답하지만, 어떻게 움직이느냐에는 답하지 않는다. 원점을 바꾸면 위치도 바뀐다 — 같은 물리적 점이 한 좌표계에선 이고, 그 점에 원점을 둔 좌표계에선 이 된다. 위치는 원점에 매달려 있다.
벡터: 어떻게 움직일지
역할이 “변위”일 때, 튜플은 이동 레시피: 어디 있든 x에 3, y에 4를 더하라. 핵심은 이것이 _원점에 무관하다_는 점이다 — 좌표계 원점을 옮겨도 두 점 사이의 변위는 그대로다. 포물선 운동 식과 경사하강법 갱신식이 축을 어디에 놓든 같은 모양으로 보이는 까닭이 여기 있다.
두 점을 빼면 벡터가 된다: 는 A에서 B로 가는 변위. 점에 벡터를 더하면 다른 점이 된다: . 두 점과 벡터 하나는 같은 그림 안에 살지만, 방향이라는 차원을 가진 건 벡터뿐이다.
# A vector is a tuple. Component-wise addition. Scalar multiplication.
# That's the whole arithmetic — every role uses these two operations.
def add(u, v):
return tuple(a + b for a, b in zip(u, v))
def scale(c, v):
return tuple(c * a for a in v)
A = (2, 1)
v = (3, 4)
add(A, v) # → (5, 5) (location → location)
scale(2, v) # → (6, 8) (twice the displacement)
scale(-1, v) # → (-3, -4) (the reverse)
add(A, scale(-1, v)) # → (-1, -3) (going backward from A)성분: 쪼개고, 계산하고, 합치기
2D 벡터는 x-, y-
분해-계산-재조립 패턴은 너무나 흔해서 의식조차 되지 않는다. 포물선 운동 페이지는 발사 속도를 로 쪼개 각 성분을 1D 운동으로 따로 돌린다. 경사하강법 갱신은 을 벡터 뺄셈으로 적지만, 실제 구현은 모두 그 밑의 배열을 성분별로 처리한다. 성분이란, _벡터 산술이 소프트웨어 안에서 스칼라 산술로 옮겨 앉는 자리_다.
# Same arithmetic, four roles. The tuple is the same; the application slot
# is what gives it meaning.
# graphics: shift one Bezier control point by v.
control = (200, 60)
new_control = add(control, v) # the curve translates with it.
# physics: a position-and-velocity update.
pos = (0.0, 0.0)
vel = (10.0, 14.0) # m/s
dt = 0.05 # s
new_pos = add(pos, scale(dt, vel)) # one Euler step.
# ML: one gradient-descent step on a 2-parameter weight vector.
weights = (0.0, 0.0)
grad = (-2.4, -1.8) # ∇L at current weights
lr = 0.1
new_weights = add(weights, scale(-lr, grad))
# In every block: add(point, scale(c, vector)). Same six characters of math.두 연산, 예외 없음
벡터 산술에 있는 연산은 단 둘이다 — 두 벡터를 더한다, 하나에 수를 곱해 키운다. 이 한 묶음이 이 수학 전반에서 “선형”이라 불리는 모든 것을 그려낸다. 이 둘로 무엇을 짓는가:
- 선형 보간. — 덧셈 한 번, 스칼라배 두 번. 베지에 곡선이 그 위에 올라앉는 바로 그 원시 연산이다.
- 평행 이동. 도형의 모든 점을 같은 벡터 로 옮긴다 — 좌표 를 모두 로 갈아 끼우는 일.
- 선형 결합. 꼴의 모든 식. 계수 합이 1인 볼록 결합은, 베지에 위젯이 제어점을 한 층씩 줄여 가는 방식 그대로다.
- 기저 분해. 2D 평면의 어떤 벡터든 . 기저를 다른 것으로 고르면 성분은 바뀌어도 벡터 자체는 그대로 — 포물선 운동 페이지가 가로/세로 운동의 독립성을 말할 때 암시한 게 정확히 이 상황이다.
약속은 이렇다: 성분별 덧셈과 스칼라배가 정의되는 양이라면 무엇이든 이 도구 상자를 그대로 가져다 쓸 수 있다. 수, 점, 색, 소리, 함수 공간, 신경망 매개변수 — 모두 해당된다. 튜플이 자기 역할에 침묵하기에, 이 도구가 영역을 가로질러 옮겨 다닐 수 있는 것이다.
이게 어디에 나타나나 — 한 대상, 네 얼굴
벡터는 그저 “화살표”가 아니다. 더하고 스케일할 수 있는 대상이다. 얼굴은 필러마다 달라지지만, 산술은 그대로다.
graphics : 좌표, 방향, 제어점 physics : 위치, 속도, 힘 ml : 특징 벡터, 임베딩, 기울기 finance : 포트폴리오 비중, 수익률, 위험 방향
Lemma에 올라온 모든 응용이 이 네 얼굴 중 하나로 벡터를 가져다 쓴다. 위젯의 역할 토글은 위의 네 줄짜리 표를 그대로 인터랙티브하게 옮긴 것 — 토글 하나하나가 정확히 그 산술을 돌리는 살아있는 응용과 짝지어진다.
- graphics — 베지에 곡선은
을 위치로 두고 그 볼록 결합을 사용한다; JPEG는 왜 픽셀을 버릴까는 8×8 픽셀 블록을 64차원 벡터 하나로 다시 보고 기저를 갈아 끼운다.제어점 - physics — 포물선 운동은 발사 속도를 로 성분 분해해 각각을 따로 굴린다; 낙하는 왜 계속 빨라지지 않을까는 서로 맞서는 두 힘 벡터(중력은 아래로, 저항은 위로)를 더해 어디서 상쇄되는지를 읽는다.
- ml — 경사하강법은 매개변수, 기울기, 한 걸음이 모두 벡터인 한 줄짜리 벡터 뺄셈 ; TF-IDF는 각 문서를 고차원 가중치 벡터로 나타내고, 검색어와의 거리는 두 벡터가 이루는 각도의 코사인으로 잰다.
- finance — 포트폴리오 위험은 제곱 길이 항등식 을 다시 꺼내 쓰는 일이다 — 공분산은 수익률 사이의 내적이고, 상관계수는 그 코사인, 그리고 교차항이 위험 자산 둘을 섞었을 때 각자보다 덜 위험하게 만드는 장본인이다.
이름은 달라져도 연산은 그대로다. 둘을 더할 수 있고 하나를 늘릴 수 있다면, 벡터 기계는 이미 돌기 시작한 셈이다.
튜플은 자기 역할에 침묵한다. 성분별로 더하라. 수로 키워라. 산술은 그대로 남고, 바뀌는 건 응용이 그 답에 입히는 옷뿐이다.
, . , , 를 계산하라. 셋을 모눈종이에 그린 뒤, 첫째가 왜 “내가 어디에 닿는가?”, 둘째가 “내가 어디서 왔는가?”, 셋째가 *“내 한 걸음이 두 배 길어지면?”*에 답하는지 한 문장으로 적어보라.
공을 수평에서 위로 기울여 로 던진다. 속도를 로 분해하라. , . 0.4 s 동안 날아간 뒤의 변위 벡터는? (이 문제에선 중력은 무시한다.)
제어점 로 그린 베지에 곡선에서, 일 때의 접선은 방향이다. 왜 그 벡터가 — 의 위치 자체가 아니라 — “출발 방향”이라 불릴 자격을 가지는가?
간단한 경사하강법 페이지에는 매개변수 하나와 기울기 하나가 있다 — 둘 다 스칼라다. 매개변수가 둘 이 되면, 손실은 편미분 둘 을 가진다. 하강 스텝 을 성분 형태로 적어보라. 이 모듈에 나온 어떤 산술을 쓰고 있는가?