밑바닥부터 시작하는 딥러닝 1 - 다차원 배열과 순전파
뉴런이 몇 개 없을 때는 하나씩 계산해도 된다. 하지만 뉴런이 수십 개, 수백 개로 늘어나면 매번 식을 하나씩 쓰는 방식은 금방 무너진다.
신경망에서 행렬 곱을 쓰는 이유는 복잡해 보이는 여러 뉴런의 계산을 하나의 배열 연산으로 묶기 위해서다.
이번 글에서 잡을 것
- 1차원 배열은 벡터, 2차원 배열은 행렬로 볼 수 있다.
- 행렬 곱은 앞 행렬의 열 수와 뒤 행렬의 행 수가 맞아야 한다.
- 신경망의 한 층 계산은 보통 `A = XW + B`로 정리된다.
- 순전파는 입력에서 출력 방향으로 계산을 진행하는 과정이다.
shape를 먼저 봐야 한다
| 기호 | 예시 shape | 뜻 |
|---|---|---|
| X | (1, 2) | 입력 데이터 1개, 특징 2개 |
| W | (2, 3) | 입력 2개를 다음 층 뉴런 3개로 연결 |
| B | (3,) | 다음 층 뉴런 3개에 더할 편향 |
| A | (1, 3) | 다음 층으로 넘어갈 가중합 |
행렬 곱 규칙
`X(1,2)`와 `W(2,3)`를 곱하면 안쪽 숫자 2가 맞으므로 계산할 수 있고, 결과는 바깥 숫자인 `(1,3)`이 된다.
한 층의 계산
import numpy as np
X = np.array([1.0, 0.5])
W = np.array([[0.1, 0.3, 0.5],
[0.2, 0.4, 0.6]])
B = np.array([0.1, 0.2, 0.3])
A = np.dot(X, W) + B
print(A)
3층 신경망의 순전파
3층 신경망도 특별한 새 계산이 아니다. `행렬 곱 -> 편향 더하기 -> 활성화 함수`를 층마다 반복한다. 마지막 출력층에서는 문제 종류에 따라 항등 함수나 소프트맥스 함수를 사용한다.
은닉층
입력 신호를 중간 표현으로 바꾼다.
출력층
문제에 맞는 최종 값을 만든다.
순전파
입력에서 출력 방향으로 계산하는 전체 흐름이다.
헷갈리기 쉬운 부분
행렬 곱은 일반 곱셈처럼 순서를 마음대로 바꿀 수 없다. `np.dot(X, W)`와 `np.dot(W, X)`는 의미도 shape도 달라질 수 있다. 신경망에서는 shape를 맞추는 일이 곧 층 사이 연결을 맞추는 일이다.
숫자로 한 번 따라가보기
행렬 곱이 추상적으로 보이면 실제 숫자 하나를 따라가면 된다. 결과의 첫 번째 원소는 입력 벡터와 W의 첫 번째 열을 곱해 더한 값이다.
| 계산 대상 | 계산식 | 결과 |
|---|---|---|
| A[0] | 1.0*0.1 + 0.5*0.2 + 0.1 | 0.3 |
| A[1] | 1.0*0.3 + 0.5*0.4 + 0.2 | 0.7 |
| A[2] | 1.0*0.5 + 0.5*0.6 + 0.3 | 1.1 |
왜 행렬이 필요한가
이 세 계산을 뉴런마다 따로 쓰지 않고 `np.dot(X, W) + B` 한 줄로 묶는 것이 행렬 계산의 장점이다.
행렬 곱이 없으면 코드가 어떻게 보일까
뉴런이 3개뿐이면 직접 계산해도 버틸 수 있다. 하지만 다음 층 뉴런이 100개가 되면 같은 모양의 계산식을 100번 써야 한다. 행렬 곱은 이 반복을 배열 연산 하나로 접는 방식이다.
# 직접 쓰면 뉴런마다 계산식을 따로 만들어야 한다.
a0 = x0*w00 + x1*w10 + b0
a1 = x0*w01 + x1*w11 + b1
a2 = x0*w02 + x1*w12 + b2
# 행렬 곱으로 쓰면 뉴런 수가 늘어도 코드 모양은 유지된다.
A = np.dot(X, W) + B
| 방식 | 뉴런이 늘어날 때 | 실수 위험 |
|---|---|---|
| 직접 계산식 작성 | 코드 줄이 계속 늘어남 | 인덱스 실수 가능 |
| 행렬 곱 | `W`의 열 수만 바뀜 | shape만 맞추면 구조 유지 |
이 예시의 출력
[0.3 0.7 1.1]
배치 처리는 왜 shape가 하나 더 붙나
데이터 하나가 아니라 여러 개를 한 번에 넣으면 입력 X의 shape가 `(데이터 수, 입력 특징 수)`가 된다. 예를 들어 5개 데이터를 한 번에 처리하면 `X(5,2) · W(2,3) = A(5,3)`이 된다.
스스로 점검
- `XW+B`에서 X, W, B가 각각 무엇인지 설명할 수 있는가?
- 행렬 곱에서 안쪽 차원이 같아야 하는 이유를 말할 수 있는가?
- 순전파가 어떤 방향의 계산인지 설명할 수 있는가?
이번 글에서 기억할 것
- 1차원 배열은 벡터, 2차원 배열은 행렬로 볼 수 있다.
- 행렬 곱은 앞 행렬의 열 수와 뒤 행렬의 행 수가 맞아야 한다.
- 신경망의 한 층 계산은 보통 `A = XW + B`로 정리된다.
- 순전파는 입력에서 출력 방향으로 계산을 진행하는 과정이다.
다음 글로 이어지는 질문
다음 글에서는 출력층에서 항등 함수와 소프트맥스 함수를 언제 쓰는지 본다.
한 줄 정리: 행렬 곱은 신경망의 많은 뉴런 계산을 한 번에 처리하기 위한 압축된 표현이다.