다차원 배열의 계산
다차원 배열은 숫자의 집합으로, 여러 차원으로 구성된 데이터를 다룰 수 있다. 이를 이용하면 신경망과 같은 복잡한 계산을 효율적으로 수행할 수 있다. 본 글에서는 다차원 배열의 개념과 행렬 연산, 그리고 이를 신경망에서 어떻게 활용하는지에 대해 살펴본다.
다차원 배열
다차원 배열은 여러 개의 숫자를 특정한 구조로 배치한 것이다. 파이썬에서는 numpy 라이브러리를 이용해 쉽게 다룰 수 있다.
배열의 차원과 형태(shape)
배열의 차원은 np.ndim() 함수로 확인할 수 있고, 배열의 형태는 shape 속성으로 알 수 있다. shape는 튜플 형태로 반환되며, 배열이 몇 개의 차원을 가지고 있는지를 나타낸다.
1차원 배열
1차원 배열은 단순히 숫자가 나열된 리스트와 유사하다. 예를 들어:
import numpy as np
A = np.array([1, 2, 3, 4])
print(A.shape) # (4,)
위와 같이 배열의 길이가 4인 1차원 배열이 생성된다.
2차원 배열 (행렬)
2차원 배열은 행(row)과 열(column)로 이루어진 구조로, 일반적으로 행렬(matrix) 이라고 부른다.
B = np.array([[1, 2], [3, 4], [5, 6]])
print(B.shape) # (3, 2)
위 코드에서 B는 3×2 크기의 행렬이다. 즉, 3개의 행과 2개의 열을 가진다.
행렬의 곱
행렬 곱(matrix multiplication)은 수학적으로 중요한 연산이며, numpy에서는 np.dot()을 사용해 쉽게 계산할 수 있다.
행렬 곱의 개념
행렬 곱은 왼쪽 행렬의 행(row) 과 오른쪽 행렬의 열(column) 을 원소별로 곱한 후 합산하는 방식으로 수행된다. 예를 들어, 다음과 같은 2×2 행렬 A와 B의 곱을 구하면:
\[
A = \begin{bmatrix} 1 & 2 \\ 3 & 4 \end{bmatrix}, \quad
B = \begin{bmatrix} 5 & 6 \\ 7 & 8 \end{bmatrix}
\]
\[
AB = \begin{bmatrix} (1\times5 + 2\times7) & (1\times6 + 2\times8) \\
(3\times5 + 4\times7) & (3\times6 + 4\times8) \end{bmatrix}
= \begin{bmatrix} 19 & 22 \\ 43 & 50 \end{bmatrix}
\]
np.dot()을 이용한 행렬 곱 연산
위 행렬 곱을 numpy로 구현하면 다음과 같다.
A = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])
C = np.dot(A, B)
print(C)
# 출력: [[19 22]
# [43 50]]
np.dot(A, B)를 사용하면 간단하게 행렬 곱을 수행할 수 있다.
행렬 곱에서 주의할 점
행렬 곱을 수행할 때는 행렬의 크기(형태)가 맞아야 한다.
즉, 왼쪽 행렬의 열(column) 개수와 오른쪽 행렬의 행(row) 개수가 같아야 한다.
예를 들어, \( 2 \times 3 \) 행렬과 \( 3 \times 2 \) 행렬은 곱할 수 있지만,
\( 2 \times 3 \) 행렬과 \( 2 \times 2 \) 행렬은 곱할 수 없다.
A = np.array([[1, 2, 3], [4, 5, 6]]) # (2,3) 행렬
B = np.array([[1, 2], [3, 4], [5, 6]]) # (3,2) 행렬
C = np.dot(A, B)
print(C)
# 출력: [[22 28]
# [49 64]]
신경망에서의 행렬 곱
신경망에서는 행렬 연산을 이용하여 다수의 입력 데이터를 한 번에 처리할 수 있다. 행렬 곱을 활용하면 연산 속도를 크게 향상시킬 수 있다.
신경망에서 행렬 연산이 필요한 이유
신경망의 기본 단위인 뉴런(neuron)은 입력값과 가중치(weight)의 곱을 통해 출력을 계산한다. 이를 벡터와 행렬 연산으로 표현하면 다음과 같다.
Y=XWY = XW
여기서:
- \( X \) : 입력 데이터 행렬 (\( m \times n \))
\( W \) : 가중치 행렬 (\( n \times p \))
\( Y \) : 출력 데이터 행렬 (\( m \times p \))
예를 들어, \( X \) 가 \( 2 \times 2 \) 행렬이고 \( W \) 가 \( 2 \times 3 \) 행렬이라면:
X = np.array([1, 2]) # (2,)
W = np.array([[1, 3, 5], [2, 4, 6]]) # (2,3)
Y = np.dot(X, W)
print(Y)
# 출력: [ 5 11 17]
이처럼 np.dot()을 사용하면 신경망의 계산을 매우 효율적으로 수행할 수 있다.
퀴즈 1
다음 중 numpy에서 다차원 배열의 차원을 확인하는 함수는 무엇인가?
1️⃣ np.shape()
2️⃣ np.size()
3️⃣ np.ndim()
4️⃣ np.array()
퀴즈 2
\( A \) 가 \( 2 \times 3 \), \( B \) 가 \( 3 \times 4 \) 행렬일 때,
행렬 곱 \( AB \) 의 크기는?
1️⃣ \( 3 \times 3 \)
2️⃣ \( 2 \times 4 \)
3️⃣ \( 4 \times 2 \)
4️⃣ \( 3 \times 4 \)
'Miscellaneous' 카테고리의 다른 글
[2025-1] 장인영 - 밑바닥부터 시작하는 딥러닝 리뷰, (CH 3.4) 3층 신경망 구현하기 (0) | 2025.03.05 |
---|---|
[2025-1] 임준수 - 밑바닥부터 시작하는 딥러닝 리뷰, (CH 3.2) 활성화 함수 (0) | 2025.03.05 |
[2025-1] 윤선우 - 밑바닥부터 시작하는 딥러닝 리뷰, (CH 3.5) 출력층 설계하기 (0) | 2025.03.05 |
[2025-1] 윤선우 - 밑바닥부터 시작하는 딥러닝 리뷰, (CH 2.1, 2.2) 퍼셉트론과 단순한 논리 회로 (0) | 2025.03.04 |
[2025-1] 임재열 - Playing Atari with Deep Reinforcement Learning (0) | 2025.03.01 |