본문 바로가기

AI

[AI] NumPy reshape() 완벽 이해 - AI에서 왜 중요한가?

reshape란?

reshape()배열(Array)의 모양(Shape)을 변경하는 함수이다.

중요한 점은 데이터를 변경하는 것이 아니라 데이터를 바라보는 구조(Shape)만 변경한다는 것이다.

예를 들어 1차원 배열이 있다고 가정해 보자.

import numpy as np

a = np.array([1,2,3,4,5,6])

print(a)
print(a.shape)

실행 결과

[1 2 3 4 5 6]
(6,)

현재 배열은 총 6개의 원소를 가진 1차원 배열이다.

이를 reshape()를 이용해 2행 3열의 구조로 변경할 수 있다.

b = a.reshape(2,3)

print(b)
print(b.shape)

실행 결과

[[1 2 3]
 [4 5 6]]

(2,3)

여기서 중요한 점은 숫자의 순서는 그대로이고 배열을 바라보는 방식만 변경되었다는 것이다.


reshape의 규칙

reshape()를 사용할 때 반드시 기억해야 할 규칙이 있다.

전체 원소의 개수는 반드시 동일해야 한다.

예를 들어

a = np.array([1,2,3,4,5,6])

총 원소의 개수는 6개이다.

가능한 reshape

a.reshape(2,3)   # 2 × 3 = 6
a.reshape(3,2)   # 3 × 2 = 6
a.reshape(1,6)   # 1 × 6 = 6

불가능한 reshape

a.reshape(4,2)

왜냐하면

4 × 2 = 8

인데 원래 데이터는 6개뿐이기 때문이다.


reshape는 복사(Copy)가 아니다

많은 사람들이 reshape()를 사용하면 새로운 배열이 생성된다고 생각한다.

하지만 대부분의 경우 reshape()같은 메모리를 다른 모양으로 바라보는 View를 반환한다.

import numpy as np

a = np.array([1,2,3,4,5,6])

b = a.reshape(2,3)

b[0,0] = 100

print(a)

결과

[100   2   3   4   5   6]

b를 수정했는데 a도 함께 변경되었다.

그 이유는 ab가 같은 메모리를 바라보고 있기 때문이다.


AI에서는 왜 reshape가 중요한가?

AI 모델은 데이터를 다양한 형태로 변환하며 계산한다.

예를 들어 문장 4개를 임베딩하면 다음과 같은 구조가 된다.

(4,768)

의미

  • 4개의 문장
  • 문장 하나당 768개의 숫자(임베딩)

Transformer에서는 이를 다시 여러 개의 Attention Head로 나누기 위해 reshape()를 사용한다.

예를 들어

(32,768)

↓

(32,12,64)

처럼 데이터를 재구성한다.

즉, reshape()는 데이터를 변경하는 것이 아니라 모델이 계산하기 좋은 형태로 구조를 변경하는 핵심 기능이다.


핵심 정리

  • reshape()는 배열의 모양만 변경한다.
  • 데이터의 개수는 절대 변하지 않는다.
  • 대부분 View를 반환하므로 원본 데이터와 메모리를 공유한다.
  • 딥러닝과 Transformer에서는 거의 모든 모델에서 reshape()를 사용한다.