이번 글에서 다룰 내용
이 글에서는 선형대수의 가장 작은 출발점인 스칼라와 벡터를 구분합니다.
- 스칼라와 벡터가 무엇이 다른지 설명합니다.
- 벡터를 화살표 그림과 좌표 표현 두 관점에서 함께 봅니다.
- 좌표, RGB, 특성 벡터(feature vector), 임베딩(embedding) 같은 프로그래밍 예시로 연결합니다.
- 숫자 배열이 언제 벡터로 읽히고, 언제 그냥 숫자 목록에 머무는지도 구분합니다.
이번 글에서 새로 나오는 용어
- 스칼라 (scalar): 하나의 수로 표현되는 양입니다.
- 벡터 (vector): 같은 종류의 축 위에 놓인 여러 값을 함께 표현하는 대상입니다.
- 기저 (basis): 벡터 공간을 설명하는 최소 축 집합입니다.
- 차원 (dimension): 그 축이 몇 개인지를 나타내는 값입니다.
핵심 아이디어
스칼라는 하나의 수입니다. 길이, 온도, 확률, 손실값처럼 한 숫자로 표현되는 양을 떠올리면 됩니다. 반면 벡터는 여러 개의 수가 순서와 축의 의미를 가진 채 묶여 있는 대상입니다.
예를 들어 5는 스칼라입니다. 하지만 (3, 4)는 두 개의 수가 묶인 벡터가 될 수 있습니다. 다만 여기서 중요한 것은 숫자가 두 개 있다는 사실 자체가 아닙니다. 더 중요한 것은 각 숫자가 같은 세계 안의 서로 다른 축(axis) 을 뜻해야 한다는 점입니다.
(x, y)좌표는 2차원 공간의 두 축을 뜻하므로 자연스러운 벡터입니다.(r, g, b)는 색의 세 채널을 뜻하므로 벡터로 볼 수 있습니다.- 사용자 특성(feature)
(클릭수, 체류시간, 구매횟수)도 잘 정리하면 벡터가 됩니다.
반대로 다음처럼 단위와 맥락이 뒤섞이면 바로 선형대수의 벡터로 해석하기 어렵습니다.
(키 175cm, 이름 길이 3글자, 좋아하는 색 파랑)
숫자가 있다는 것만으로는 충분하지 않습니다. 벡터는 더하기와 스칼라배가 의미 있게 정의될 수 있는 대상이어야 합니다.
벡터는 화살표이기도 하고 좌표표현이기도 하다
선형대수 입문에서는 벡터를 종종 화살표로 그립니다. 이 그림은 방향과 크기를 설명할 때 매우 유용합니다. 한편 프로그래머는 벡터를 배열이나 튜플(tuple)처럼 읽는 경우가 많습니다. 이 두 관점은 서로 경쟁하는 것이 아니라 서로 보완합니다.
- 화살표 관점은 방향과 크기 직관을 줍니다.
- 좌표 관점은 실제 계산과 코드 표현에 강합니다.
조금 더 엄밀하게 말하면, 벡터는 벡터공간(vector space)의 원소이고, (3, 4) 같은 표기는 어떤 기저를 기준으로 그 벡터를 적어 놓은 좌표표현입니다. 초반에는 이렇게 엄밀하게까지 붙잡지 않아도 되지만, 나중에 기저가 바뀌면 같은 벡터도 다른 숫자열로 표현될 수 있다는 점은 기억해 두면 좋습니다.
축(axis)이란 무엇인가
축은 단순히 숫자가 놓이는 자리 번호가 아닙니다. 각 성분이 무엇을 뜻하는지 정해 주는 기준입니다.
- 좌표 벡터에서 축은 공간의 방향입니다.
- 사용자 특성 벡터에서 축은 클릭 수, 체류 시간 같은 측정 항목입니다.
- 임베딩에서는 각 축이 사람이 바로 이름 붙이기 어려운 잠재 특징(latent feature)일 수 있습니다.
즉 축은 "몇 번째 값인가"보다 "그 값이 어떤 의미를 갖는가"에 더 가깝습니다.
벡터를 화살표 그림으로만 이해하면 부족한 이유
프로그래머가 다루는 데이터는 대부분 3차원을 넘어갑니다. 문장 임베딩은 수백 차원이고, 이미지 한 장도 수천에서 수만 차원의 벡터처럼 볼 수 있습니다. 이때는 화살표 그림보다 축이 있는 수의 묶음이라는 관점이 더 중요합니다.
즉 벡터는 그림으로 이해할 수도 있지만, 본질은 다음에 가깝습니다.
벡터 = 같은 종류의 특성(feature)을 순서 있게 담은 표현
이 관점을 잡아 두면 뒤에서 생성 범위(span), 기저 (basis), 차원 (dimension)을 배울 때도 덜 흔들립니다.
단계별 예시
이제 프로그래밍에서 자주 보는 예시를 하나씩 벡터 관점으로 읽어 보겠습니다.
예시 1) 게임 좌표
2D 게임에서 캐릭터 위치를 (10, 5)라고 합시다. 여기서 첫 번째 값은 x축, 두 번째 값은 y축을 뜻합니다. 두 축은 모두 위치라는 같은 세계 안에 있고, 두 위치 벡터를 더하거나 빼는 연산도 자연스럽게 해석됩니다.
예를 들어 현재 위치가 (10, 5)이고 이동량이 (2, -1)이면 새 위치는 다음처럼 계산할 수 있습니다.
(10, 5) + (2, -1) = (12, 4)
이 계산이 자연스러운 이유는 두 벡터가 모두 같은 좌표축 체계 안에 있기 때문입니다.
예시 2) RGB 색상
웹에서 색을 (255, 120, 80)처럼 표현할 수 있습니다. 이 세 값은 각각 빨강(red), 초록(green), 파랑(blue) 채널 강도입니다. 이 역시 벡터처럼 볼 수 있습니다.
color = (255, 120, 80)
만약 두 색을 섞을 때 단순 평균을 낸다면, 두 색 벡터의 평균 벡터를 계산하는 셈입니다. 다만 실제 색 표현에서는 감마(gamma) 보정과 사람의 지각 특성이 함께 작동하므로, RGB를 벡터로 보는 것은 유용한 수학적 단순화라고 이해하는 편이 정확합니다.
예시 3) 사용자 특성 벡터(feature vector)
추천 시스템이나 분석 시스템에서는 사용자를 여러 수치 특성(feature)으로 나타냅니다.
user = (최근 7일 클릭 수, 평균 체류 시간, 구매 횟수)
이때 각 좌표는 사용자의 서로 다른 행동 특성을 뜻합니다. 이렇게 표현하면 사용자 사이의 거리, 유사도, 군집 구조를 벡터 연산으로 다룰 수 있습니다.
다만 여기서는 주의할 점이 있습니다. 클릭 수와 체류 시간은 단위가 다르므로, 바로 비교하거나 더하면 왜곡될 수 있습니다. 실무에서 정규화(normalization)나 표준화(standardization)를 자주 하는 이유가 바로 여기에 있습니다.
예시 4) 문장 임베딩
자연어 처리에서는 한 문장을 수백 차원 벡터로 바꿉니다. 예를 들어 어떤 문장이 다음처럼 표현될 수 있습니다.
sentence = (0.18, -1.02, 0.44, ..., 0.73)
이 경우 각 차원은 사람이 직접 이름 붙인 축이 아닐 수 있습니다. 그래도 모델은 이 벡터를 사용해 문장 간 의미적 유사성을 계산합니다. 즉 벡터의 각 축에 사람이 쉬운 이름을 붙일 수 없어도, 같은 공간에서 일관되게 비교 가능한 표현이라면 여전히 벡터로 다룰 수 있습니다.
예시 5) 범주형 데이터는 벡터가 될 수 없을까
초심자는 "문자열이나 범주형 값은 벡터가 아니지 않나?"라고 자주 묻습니다. 원래 범주형 데이터 자체는 선형대수의 벡터처럼 바로 다루기 어렵습니다. 하지만 적절한 표현을 만들면 벡터로 바꿀 수 있습니다.
- 원-핫 인코딩(one-hot encoding): 카테고리를 0과 1의 벡터로 바꿉니다.
- 임베딩(embedding): 카테고리를 더 작은 실수 벡터로 학습해 표현합니다.
즉 "범주형 데이터는 벡터가 아니다"보다, 원래 형태 그대로는 어렵지만 적절한 표현으로 바꾸면 벡터화(vectorization)할 수 있다고 이해하는 편이 좋습니다.
수학 주석
- 벡터의 핵심은 숫자 개수가 아니라, 같은 벡터공간 안에서 연산 가능한 대상이라는 점입니다.
- "같은 벡터공간에 있다"는 말은 더하고 스칼라배를 해도 여전히 같은 종류의 대상으로 남는다는 뜻입니다.
- 스칼라는 보통 벡터를 조절하는 계수 역할로 등장합니다. 이후 나오는 스칼라배가 바로 이 관계를 보여 줍니다.
- 길이, 각도, 유사도 같은 개념은 뒤에서 노름 (norm)과 내적 (dot product)을 도입해야 더 정확히 말할 수 있습니다.
기호로는 보통 스칼라를 a, b, c처럼 쓰고, 벡터를 x, v, w처럼 씁니다. 예를 들어 v = (v1, v2, v3)는 세 축을 가진 벡터입니다. 여기서 v1, v2, v3는 각 성분(component)입니다.
자주 하는 오해
숫자가 여러 개면 다 벡터라고 생각하기
아닙니다. 숫자 목록이 벡터가 되려면 축의 의미가 맞아야 하고, 연산 결과도 자연스럽게 해석돼야 합니다. 예를 들어 (나이, 키, 회원등급번호)를 그대로 더한다고 해서 항상 의미 있는 벡터 연산이 되는 것은 아닙니다.
화살표 그림만 벡터라고 생각하기
게임 좌표처럼 화살표로 그릴 수 있는 벡터도 있지만, 임베딩처럼 수백 차원인 벡터는 그림으로 그릴 수 없습니다. 벡터는 그림이 아니라 표현 형식입니다.
튜플(tuple)만 보면 벡터라고 생각하기
(3, 4) 같은 표기가 자주 나오다 보니 벡터를 숫자 묶음 자체로 오해하기 쉽습니다. 하지만 더 엄밀하게는 벡터는 공간의 원소이고, 튜플은 그 벡터를 특정 기저에서 적어 놓은 좌표표현입니다.
축의 스케일 문제를 무시하기
사용자 특성(feature)에서 클릭 수는 수백 단위인데 체류 시간은 분 단위이고 구매 횟수는 한 자리 수일 수 있습니다. 이 상태로 거리나 유사도를 계산하면 어떤 축은 지나치게 크게 작용합니다.
예를 들어 평균이 mu, 표준편차가 sigma인 특성값 x를 표준화(standardization)하면 다음처럼 씁니다.
z = (x - mu) / sigma
또 벡터 자체의 길이를 1로 맞추는 정규화(normalization)는 보통 다음처럼 씁니다.
v_normalized = v / ||v||
이 둘은 비슷해 보이지만 목적이 다릅니다. 표준화는 특성 분포를 맞추는 것이고, 정규화는 벡터 크기를 맞추는 것입니다.
연습 또는 확장
아래 데이터를 벡터로 보는 것이 자연스러운지 직접 판단해 보세요.
(x, y, z)위치 좌표(국어 점수, 영어 점수, 수학 점수)(이름 길이, 좋아하는 색 번호, 오늘 기분 점수)(R, G, B)- 문장 임베딩 768차원 벡터
- 상품 카테고리를 원-핫 인코딩(one-hot encoding)한 벡터
그리고 각 경우에 다음 질문을 붙여 보세요.
- 각 축은 같은 종류의 정보를 담고 있는가?
- 두 대상을 더하는 연산이 의미 있는가?
- 스칼라배를 했을 때 해석이 가능한가?
이 질문이 익숙해지면 "벡터처럼 보이는 데이터"와 "진짜 벡터로 다뤄도 되는 데이터"를 구분하는 감각이 생깁니다.
마무리
이번 글에서는 스칼라와 벡터를 구분하고, 벡터를 프로그래밍 데이터 표현과 연결해 봤습니다.
- 스칼라는 하나의 수입니다.
- 벡터는 같은 종류의 축을 가진 수의 묶음입니다.
- 좌표, 색상, 특성(feature), 임베딩(embedding)은 모두 벡터로 볼 수 있습니다.
- 다만 축의 의미와 스케일을 무시하면 잘못된 해석으로 이어질 수 있습니다.
- 범주형 데이터도 적절한 표현을 거치면 벡터화(vectorization)할 수 있습니다.
다음 글에서는 벡터 덧셈과 스칼라배를 통해, 여러 벡터를 섞고 크기를 조절한다는 것이 정확히 무엇인지 설명합니다.
💬 댓글
이 글에 대한 의견을 남겨주세요