0. 시작하기 전에: ndarray가 도대체 무엇일까요?
파이썬에서 NumPy 라이브러리를 불러와 아래 코드를 실행해 보겠습니다.
python
import numpy as np
a = np.array([1, 2, 3])
print(type(a))
코드를 사용할 때는 주의가 필요합니다.
[실행 결과]
text
<class 'numpy.ndarray'>
코드를 사용할 때는 주의가 필요합니다.
여기서 출력된 ndarray는 N-Dimensional Array의 약자입니다. 우리말로 번역하면 'N차원 배열'이라는 뜻입니다.
쉽게 말해, 우리가 다룰 데이터가 1차원 선 형태인지, 2차원 면 형태인지, 아니면 그 이상으로 겹겹이 쌓인 고차원 형태인지를 나타내는 기본 단위입니다. 실제로 AI와 LLM 모델을 만들 때는 숫자 한두 개가 아니라 2차원, 3차원, 심지어 4차원의 거대한 텐서(Tensor) 형태로 데이터를 처리하게 됩니다.
1. 차원(Dimension)의 변화 이해하기
우리가 다루는 데이터는 차원에 따라 구조가 완전히 달라집니다. 각각 어떻게 생겼는지 코드를 통해 살펴보겠습니다.
① 1차원 배열 (Vector)
가장 단순한 한 줄짜리 데이터 배열입니다. 가로로 긴 선 모양으로 데이터가 나열되어 있습니다.
python
a = np.array([1, 2, 3])
코드를 사용할 때는 주의가 필요합니다.
- 실제 데이터 형태: [1 2 3]
② 2차원 배열 (Matrix)
1차원 선들이 위아래로 쌓여서 만들어진 '면(표)' 형태의 데이터입니다. 가로(행)와 세로(열)가 존재합니다.
python
a = np.array([,
[4, 5, 6]
])
코드를 사용할 때는 주의가 필요합니다.
- 실제 데이터 형태:
text
1 2 3 4 5 6코드를 사용할 때는 주의가 필요합니다.
③ 3차원 배열 (Tensor)
2차원 면(표)들이 여러 장 겹겹이 쌓여서 만들어진 '입체 상자' 형태의 데이터입니다.
python
a = np.array([
[,
[3, 4]
],
[,
[7, 8]
]
])
코드를 사용할 때는 주의가 필요합니다.
이처럼 차원이 올라갈수록 데이터의 깊이가 깊어집니다. 실무 LLM 모델에서는 거의 2차원, 3차원, 4차원 텐서(Tensor) 데이터를 사용하여 연산을 수행합니다.
2. Shape의 진짜 의미: "2행 3열"로 끝내면 안 되는 이유
다음 2차원 코드를 보고 출력되는 결과를 확인해 보겠습니다.
python
import numpy as np
a = np.array([,
[4, 5, 6]
])
print(a.shape)
코드를 사용할 때는 주의가 필요합니다.
[실행 결과]
text
(2, 3)
코드를 사용할 때는 주의가 필요합니다.
학교 수학 시간에 행렬을 배우신 분들은 이를 보고 단순히 "음, 2행 3열이군." 하고 넘어갑니다. 하지만 우리는 단순히 수학 문제를 푸는 것이 아니라, AI 모델을 설계할 사람입니다. 그렇기 때문에 관점을 조금 바꾸어야 합니다.
AI 분야에서 Shape의 진짜 의미는 '데이터의 구조(Structure)'이자 '의미적 설계도'입니다. 메모리 안에는 행과 열의 형태로 데이터가 정렬되어 있으며, 이 숫자들이 데이터의 본질적인 의미를 담고 있습니다.
📊 왜 구조로 이해해야 할까? (학생 성적표 예시)
실제 데이터를 대입해 보면 이해가 훨씬 빠릅니다. 두 명의 학생이 각각 국어, 영어, 수학 시험을 봤다고 가정해 보겠습니다.
- 학생 1: 국어 90점, 영어 80점, 수학 70점
- 학생 2: 국어 60점, 영어 50점, 수학 40점
이 성적표 데이터를 NumPy 배열로 만들면 다음과 같습니다.
python
scores = np.array([,
[60, 50, 40]
])
print(scores.shape)
코드를 사용할 때는 주의가 필요합니다.
[실행 결과]
text
(2, 3)
코드를 사용할 때는 주의가 필요합니다.
여기서 출력된 (2, 3)을 보고 우리는 데이터의 의미를 완벽하게 읽어낼 수 있어야 합니다.
- 앞의 숫자 2: 학생의 수 (데이터의 개수 / 행)
- 뒤의 숫자 3: 각 학생별 시험 과목의 수 (특징의 개수 / 열)
즉, 우리가 코드를 한 줄씩 다 열어보지 않아도 "Shape가 (2, 3)이니까 학생 2명의 3개 과목 성적이 들어있겠구나!" 하고 데이터의 구조를 파악할 수 있어야 합니다. 이 때문에 AI 개발에서 Shape를 확인하는 작업은 매우 중요합니다.
3. AI와 LLM으로 확장하기: 문장을 숫자로 바꾸는 원리
이제 본격적으로 AI 모델 내부로 들어가 보겠습니다. ChatGPT 같은 LLM은 인간이 사용하는 언어(텍스트)를 있는 그대로 이해하지 못합니다. 컴퓨터가 계산할 수 있도록 문장을 수많은 숫자의 묶음(벡터)으로 변환해야 하는데, 이를 임베딩(Embedding)이라고 합니다.
예를 들어 컴퓨터에게 "안녕하세요"라는 문장을 주면, 인공지능 내부에서는 아래처럼 아주 긴 숫자의 1차원 배열로 변환됩니다.
- "안녕하세요" ➡️ [0.21, 0.52, 0.14, ... 총 768개의 숫자]
언어가 가진 복잡한 문맥과 의미를 담아내기 위해, 보통 768개나 되는 숫자를 사용해 하나의 문장을 표현합니다.
📝 만약 처리해야 할 문장이 3개라면 데이터는 어떻게 될까요?
- "안녕하세요" ➡️ 768개의 숫자 벡터
- "반갑습니다" ➡️ 768개의 숫자 벡터
- "AI 공부" ➡️ 768개의 숫자 벡터
이 3개의 문장을 한데 묶어서 모델에 입력하면, 데이터 구조(Shape)는 다음과 같이 결정됩니다.
- 가로 방향: 각 문장의 벡터 차원 크기 ➡️ 768
- 세로 방향: 입력된 문장의 개수 ➡️ 3
따라서 최종 데이터의 Shape는 (3, 768)이 됩니다.
Shape만 보고도 "768차원짜리 문장 데이터 3개가 깔끔하게 정렬되어 들어있구나" 하고 파악할 수 있는 것입니다.
Shape만 보고도 "768차원짜리 문장 데이터 3개가 깔끔하게 정렬되어 들어있구나" 하고 파악할 수 있는 것입니다.
4. 실무 필수 개념: 배치(Batch)란 무엇인가?
AI 관련 논문을 읽거나 현업 개발자들의 코드를 보면 절대 빠지지 않고 등장하는 단어가 있습니다. 바로 "배치 사이즈(Batch Size)"입니다.
컴퓨터 하드웨어(특히 GPU)는 엄청나게 똑똑해서, 연산을 하나씩 따로 처리하는 것보다 여러 개의 데이터를 한 번에 묶어서 병렬로 처리할 때 압도적으로 빠른 속도를 냅니다.
- 비효율적인 방법: 학생 100명의 데이터를 1명씩 컴퓨터에 넣어서 총 100번 계산합니다. (시간이 오래 걸립니다.)
- 효율적인 방법 (Batch): 데이터를 32명씩 묶어서 한 번에 계산하고, 이를 덩어리째 넘깁니다. (속도가 엄청나게 빨라집니다.)
이때 '한 번에 묶어서 처리하는 데이터 덩어리의 크기'를 Batch Size라고 부릅니다. 실무에서는 보통 컴퓨터 메모리 효율에 맞춰 batch_size = 32 또는 64 같은 형태로 지정하여 사용합니다.
만약 문장 32개를 한 번에 묶어서 AI 모델에 학습시킨다면, 그때의 데이터 Shape는 (32, 768)이 됩니다.
- 32: 한 번에 처리하는 문장의 개수 (Batch Size)
- 768: 문장 하나당 들어있는 임베딩 숫자의 차원 크기
5. ChatGPT 내부 들여다보기: 토큰(Token) 단위의 계산
실제 ChatGPT 같은 대형 언어 모델은 우리가 입력한 문장을 통째로 계산하기보다, 문장을 더 작은 단위인 '토큰(Token)'으로 쪼개서 계산을 수행합니다.
우리가 "안녕하세요"라고 질문을 던지면 AI 내부에서는 다음과 같은 단계별 연산이 일어납니다.
- 텍스트 입력: 사용자가 "안녕하세요"라는 문장을 입력합니다.
- 토큰화(Tokenization): 문장을 인공지능이 이해하는 최소 단위로 쪼개어 고유한 숫자 번호를 매깁니다.
- 예를 들어 단어가 3개로 쪼개졌다고 가정하면 ➡️ [4215, 9823, 17] (토큰 3개 생성)
- 임베딩 변환(Embedding): 고유 번호 하나를 다시 768개의 밀집 숫자 벡터로 길게 확장합니다.
- 토큰1 ➡️ [0.13, 0.28, ... 768개의 숫자]
- 토큰2 ➡️ [0.45, -0.11, ... 768개의 숫자]
- 토큰3 ➡️ [-0.02, 0.67, ... 768개의 숫자]
- 최종 Shape 결정: 토큰이 총 3개이고 각 토큰마다 768개의 숫자가 매핑되므로, 최종 구조는 (3, 768)이 됩니다.
6. 실무 PyTorch & LLM 코드의 Shape 완벽 해석하기
이제 여러분은 현업에서 사용하는 딥러닝 프레임워크(PyTorch) 코드를 해석할 수 있는 아주 강력한 무기를 얻으셨습니다. 실제 코드 예시 3가지를 함께 해독해 보겠습니다.
① x = torch.randn(32, 768)
- 해석: 무작위 숫자로 가득 찬 2차원 텐서 데이터입니다.
- 진짜 의미: 32개의 문장 데이터(Batch Size)를 한 번에 묶어서 처리하는 중이며, 각 문장 데이터는 768차원의 벡터로 표현되어 있다는 뜻입니다.
② Transformer 모델의 기본 구조: (32, 128, 768) ⭐️ (3차원 텐서)
LLM의 뼈대가 되는 트랜스포머 모델에서는 데이터를 이 3차원 형태로 주고받습니다. 숫자의 의미를 앞에서부터 차례대로 읽어내면 됩니다.
- 첫 번째 숫자 32: Batch Size (한 번에 묶어서 처리할 문장의 개수)
- 두 번째 숫자 128: Sentence Length (한 문장 안에 들어있는 최대 토큰/단어의 개수)
- 세 번째 숫자 768: Embedding Dimension (토큰 하나를 표현하는 숫자의 차원 크기)
💡 한 줄 요약: "최대 128개의 단어로 이루어진 문장 32개를 동시에 계산하는 중인데, 단어 하나는 768개의 숫자로 정밀하게 표현되어 있습니다!" 라는 뜻입니다.
③ 고성능 GPT 모델의 예시: (1, 4096)
- 첫 번째 숫자 1: 지금은 배치 처리를 하지 않고, 딱 1개의 문장만 입력하여 테스트(추론)하고 있는 상태입니다.
- 두 번째 숫자 4096: Embedding Size가 무려 4,096차원입니다. 이 숫자가 크면 클수록 문맥을 훨씬 더 깊고 풍부하게 이해할 수 있는 초대형 고성능 모델임을 의미합니다.
✍️ 요약 및 결론
오늘 배운 내용을 핵심만 한 줄로 요약하면 다음과 같습니다.
"NumPy와 PyTorch에서 Shape는 단순한 수학적 행렬 크기가 아니라, AI 모델 안에서 데이터가 어떤 의미를 가지고 흘러가는지 보여주는 설계도이다!"
앞으로 인공지능 코드를 작성하거나 분석하실 때 괄호 안의 숫자들을 마주친다면, 당황하지 마시고 [데이터 묶음(Batch), 길이(Length), 표현 차원(Dimension)]의 구조를 차근차근 대입해 보시기 바랍니다. 데이터의 흐름이 한눈에 보이기 시작할 것입니다.
'AI' 카테고리의 다른 글
| [AI] AI는 어떻게 '비슷한 의미'를 이해할까? - Cosine Similarity(코사인 유사도) 완벽 이해 (0) | 2026.07.03 |
|---|---|
| [AI]NumPy와 PyTorch의 차이 - AI 개발자는 왜 둘 다 배울까? (0) | 2026.07.03 |
| [AI] NumPy reshape() 완벽 이해 - AI에서 왜 중요한가? (0) | 2026.07.03 |
| [AI] 개발 로드맵 - NumPy 시작 (0) | 2026.07.03 |