내적이란? AI가 두 벡터의 관계를 하나의 숫자로 계산하는 원리

지난 글에서는 행렬이 입력 벡터를 새로운 출력 벡터로 바꾸는 변환 규칙이라는 점을 살펴봤습니다. 그런데 행렬의 한 행과 입력 벡터가 만나 출력 숫자 하나를 만드는 순간에는 정확히 어떤 계산이 일어날까요? 그 핵심이 내적(Dot Product)입니다.

내적은 두 벡터의 같은 위치에 있는 성분끼리 곱하고, 그 결과를 모두 더해 하나의 숫자로 만드는 연산입니다. 계산법은 단순하지만 행렬곱, 신경망의 가중합, Attention 점수, 임베딩 검색으로 이어지는 중요한 연결점입니다. 이번 글에서는 공식만 외우지 않고, 내적의 결과가 왜 두 벡터의 방향과 관계를 반영하는지까지 알아보겠습니다.

내적이란?

같은 차원의 두 벡터 a = [a₁, a₂, …, aₙ]과 b = [b₁, b₂, …, bₙ]이 있을 때 내적은 다음과 같이 정의합니다.

a · b = a₁b₁ + a₂b₂ + … + aₙbₙ

핵심은 두 단계입니다. 첫째, 같은 위치의 성분끼리 곱합니다. 둘째, 만들어진 곱을 모두 더합니다. 벡터 두 개를 입력으로 받지만 결과는 벡터가 아니라 숫자 하나입니다. 이런 하나의 숫자를 스칼라(Scalar)라고 합니다.

두 벡터의 차원은 같아야 합니다. [2, 3]과 [4, −1]은 모두 2차원이므로 내적할 수 있지만, [2, 3]과 [4, −1, 5]는 성분을 일대일로 짝지을 수 없어 그대로는 계산할 수 없습니다. NumPy 공식 문서도 1차원 배열의 내적을 같은 위치의 곱을 합산하는 연산으로 설명하며, 마지막 차원의 크기가 맞지 않으면 오류가 발생한다고 명시합니다. NumPy inner 공식 문서

숫자로 직접 계산해 보기

a = [2, 3], b = [4, −1]이라고 해 보겠습니다. 첫 번째 성분끼리 곱하면 2×4 = 8이고, 두 번째 성분끼리 곱하면 3×(−1) = −3입니다. 두 결과를 더하면 8 + (−3) = 5이므로 a · b = 5입니다.

내적은 단순한 전체 합과 다릅니다. a의 첫 번째 성분은 반드시 b의 첫 번째 성분과, 두 번째 성분은 두 번째 성분과 짝을 이룹니다. 각 차원이 같은 특징을 나타낸다는 전제가 있기 때문입니다. 예를 들어 [수학 점수, 영어 점수]와 [수학 가중치, 영어 가중치]를 내적하면 과목별 점수에 중요도를 적용한 하나의 종합 점수를 만들 수 있습니다.

학생의 점수가 [80, 90, 70]이고 세 과목의 반영 비율이 [0.5, 0.3, 0.2]라면 내적은 80×0.5 + 90×0.3 + 70×0.2 = 81입니다. 입력은 점수 벡터이고 두 번째 벡터는 각 특징의 중요도를 담은 가중치입니다. 내적은 세 과목의 정보를 하나의 가중 점수로 압축합니다. 신경망의 뉴런도 규모가 훨씬 클 뿐 이와 비슷한 형태의 계산을 수행합니다.

내적은 교환해도 값이 같습니다. 즉 a · b = b · a입니다. 같은 성분 쌍을 곱하므로 순서를 바꿔도 합은 달라지지 않습니다. 하지만 이것을 행렬곱 전체의 순서를 자유롭게 바꿔도 된다는 뜻으로 확대하면 안 됩니다. 행렬곱 A×B와 B×A는 일반적으로 다르거나 한쪽만 계산 가능할 수도 있습니다.

내적은 방향을 어떻게 나타낼까?

내적은 성분별 계산뿐 아니라 기하학적인 의미도 가집니다. 두 벡터 사이의 각도를 θ라고 하면 다음 관계가 성립합니다.

a · b = ||a|| ||b|| cos θ

||a||와 ||b||는 각 벡터의 크기이고, cos θ는 두 방향의 관계를 나타냅니다. 두 벡터가 비슷한 방향을 향해 각도가 90도보다 작으면 cos θ가 양수이므로 내적도 양수입니다. 정확히 직각이면 cos 90° = 0이어서 내적은 0이 됩니다. 90도보다 큰 둔각으로 서로 반대쪽을 향하면 cos θ가 음수이므로 내적도 음수가 됩니다.

따라서 내적의 부호만 보아도 두 벡터가 대체로 같은 쪽을 향하는지, 서로 직각인지, 반대쪽을 향하는지 알 수 있습니다. 내적이 0인 두 벡터를 직교한다고 표현합니다. 예를 들어 [1, 0]과 [0, 1]의 내적은 1×0 + 0×1 = 0이며, 좌표평면에서도 서로 직각입니다.

벡터를 자기 자신과 내적하면 특별한 관계가 나타납니다. a · a는 각 성분의 제곱을 모두 더한 값이며, 이는 벡터 크기 ||a||의 제곱과 같습니다. 예를 들어 a = [3, 4]라면 a · a = 3² + 4² = 25이고 ||a|| = √25 = 5입니다. 따라서 내적은 두 벡터 사이의 관계뿐 아니라 벡터 하나의 크기를 계산하는 데도 연결됩니다.

투영으로 이해하면 더 선명하다

내적은 한 벡터가 다른 벡터의 방향으로 얼마나 뻗어 있는지를 측정한다고도 볼 수 있습니다. 손전등을 비스듬히 비췄을 때 물체의 그림자가 특정 방향으로 드리워지는 모습을 떠올려 보세요. 벡터 a를 b의 방향에 내려놓은 ‘그림자 길이’에 b의 크기를 곱한 값이 a · b와 연결됩니다.

b가 단위벡터, 즉 크기가 1인 벡터라면 a · b는 a가 b 방향으로 가진 성분의 크기가 됩니다. 값이 양수면 b와 같은 방향으로, 음수면 반대 방향으로 투영된다는 뜻입니다. 이 관점은 내적이 단순히 숫자를 섞는 계산이 아니라 특정 방향의 정보를 뽑아내는 연산임을 보여줍니다.

벡터 크기가 결과에 미치는 영향

내적이 크다고 해서 항상 방향이 더 비슷한 것은 아닙니다. 공식에 두 벡터의 크기 ||a||와 ||b||도 함께 들어가기 때문입니다. 방향이 같아도 한 벡터의 크기가 열 배가 되면 내적도 열 배가 됩니다. 반대로 방향이 매우 비슷해도 두 벡터의 크기가 작으면 내적값은 작을 수 있습니다.

이 때문에 내적을 관계 점수로 사용할 때는 목적을 확인해야 합니다. 벡터의 크기까지 신호로 반영하고 싶다면 내적이 적합할 수 있습니다. 방향만 비교하고 싶다면 두 벡터를 크기 1로 정규화한 뒤 내적하거나, 다음 글에서 다룰 코사인 유사도를 사용할 수 있습니다. Google의 머신러닝 자료도 임베딩 관계를 측정하는 방법으로 유클리드 거리, 코사인, 내적을 구분하며 크기 효과를 고려해야 함을 설명합니다. Google의 임베딩 유사도 설명

정규화(Normalization)는 벡터의 방향은 유지하면서 크기를 1로 맞추는 과정입니다. 두 벡터가 모두 정규화되어 있다면 ||a|| = ||b|| = 1이므로 a · b = cos θ가 됩니다. 이때 내적은 크기의 영향을 제거한 방향 비교 점수가 됩니다. 단, 모든 성분이 0인 영벡터는 크기가 0이어서 크기로 나눌 수 없으므로 별도 처리가 필요합니다.

행렬곱의 한 칸도 내적이다

직전 글에서 행렬 W와 입력 벡터 x를 곱해 출력 y를 만드는 과정을 보았습니다. 여기서 W의 첫 번째 행과 x를 내적하면 y의 첫 번째 성분이 되고, 두 번째 행과 x를 내적하면 y의 두 번째 성분이 됩니다. 행렬의 행 수만큼 이 계산을 반복하면 출력 벡터 전체가 완성됩니다.

예를 들어 가중치 행이 [0.5, −1, 2]이고 입력이 [4, 3, 1]이라면 출력 하나는 0.5×4 + (−1)×3 + 2×1 = 1입니다. 각 가중치는 입력 성분을 얼마나 강하게 반영할지 정하고, 내적은 그 영향을 합쳐 뉴런 하나의 가중합을 만듭니다. 여기에 편향을 더하고 활성화 함수를 적용하면 신경망 한 뉴런의 기본 계산이 됩니다.

NumPy에서 두 1차원 배열에 np.dot(a, b)를 적용하면 내적 스칼라를 얻습니다. 두 입력이 2차원 행렬이면 np.dot은 행렬곱으로 동작하지만, 공식 문서는 2차원 행렬곱에는 matmul이나 @ 사용을 권장합니다. 입력 차원에 따라 의미가 달라질 수 있으므로 코드에서는 배열의 shape를 함께 확인하는 편이 안전합니다. NumPy dot 공식 문서

AI에서는 내적을 어디에 사용할까?

1. 신경망의 가중합

앞서 본 것처럼 입력 벡터와 가중치 벡터의 내적은 뉴런 하나의 입력값을 만듭니다. 학습은 오차를 줄이는 방향으로 가중치를 바꾸며, 그 결과 같은 입력도 학습된 가중치와 어떤 관계를 가지는지에 따라 다른 점수를 얻게 됩니다.

2. Attention 점수

Transformer의 Attention에서는 Query와 Key 사이의 관계를 계산할 때 내적이 사용됩니다. 두 벡터의 내적이 클수록 현재 Query가 해당 Key와 강하게 관련된 후보로 평가될 수 있습니다. 실제 Scaled Dot-Product Attention은 내적값을 차원 크기의 제곱근으로 나눈 뒤 Softmax에 전달합니다. 이 세부 과정은 이후 Attention 심화 편에서 숫자 예제로 다시 다루겠습니다.

3. 임베딩 검색

문장이나 이미지의 임베딩을 비교할 때도 내적을 점수로 사용할 수 있습니다. 다만 내적은 방향뿐 아니라 벡터 크기의 영향도 받습니다. 따라서 모델이 어떤 방식으로 임베딩을 만들었는지, 벡터가 정규화되어 있는지, 검색 시스템이 어떤 점수를 기대하는지 확인해야 합니다. 내적값 하나만 보고 모든 상황에서 ‘의미가 비슷하다’고 단정하면 안 됩니다.

자주 헷갈리는 점

  • 내적의 결과는 스칼라입니다. 같은 차원의 벡터 두 개를 넣어 숫자 하나를 얻습니다.
  • 원소별 곱과 내적은 다릅니다. 원소별 곱은 [a₁b₁, a₂b₂, …]라는 벡터를 남기지만, 내적은 그 값들을 더합니다.
  • 내적이 크다고 무조건 더 비슷한 것은 아닙니다. 벡터의 방향과 크기가 모두 영향을 줍니다.
  • 내적 0은 관계가 전혀 없다는 일상적 표현과 같지 않습니다. 수학적으로 두 벡터가 직교한다는 뜻이며, 데이터에서의 해석은 표현 방식과 문맥에 따라 달라집니다.

한눈에 정리하기

내적은 두 벡터의 같은 위치끼리 곱한 뒤 모두 더해 스칼라 하나를 만드는 연산입니다. 성분 관점에서는 가중합이고, 기하학 관점에서는 두 벡터의 크기와 방향 관계를 담습니다. 행렬곱의 출력 한 칸, 신경망 뉴런의 계산, Attention과 임베딩 검색에 같은 원리가 반복해서 등장합니다.

다음 글에서는 내적을 포함해 AI가 두 벡터의 ‘비슷함’을 숫자로 판단하는 여러 방법을 비교하며 유사도(Similarity)의 의미를 살펴보겠습니다.

댓글

이 블로그의 인기 게시물

AI의 학습 과정

AI란 무엇일까?

머신러닝과 딥러닝이란?