코드 예시: RNN에서의 히든 스테이트 구현
다음은 PyTorch를 사용한 RNN 클래스 구현 예시입니다:
import torch.nn as nn
import torch.nn.functional as F
class RNN(nn.Module):
def __init__(self, input_size, hidden_size, output_size):
super(RNN, self).__init__()
self.hidden_size = hidden_size
self.i2h = nn.Linear(input_size, hidden_size) # 입력->히든 변환
self.h2h = nn.Linear(hidden_size, hidden_size) # 이전 히든->현재 히든 변환
self.h2o = nn.Linear(hidden_size, output_size) # 히든->출력 변환
self.softmax = nn.LogSoftmax(dim=1)
def forward(self, input, hidden):
# 히든 스테이트 계산: 현재 입력과 이전 히든 스테이트 조합
hidden = F.tanh(self.i2h(input) + self.h2h(hidden))
output = self.h2o(hidden)
return output, hidden
이 코드에서 forward 메서드는 현재 입력(input)과 이전 히든 스테이트(hidden)를 받아 새로운 히든 스테이트를 계산합니다. 계산된 히든 스테이트는 출력값을 생성하는 데 사용되고, 다음 시점의 계산을 위해 전달됩니다.
히든 스테이트의 실제 동작 예시
RNN의 동작을 의사 코드(pseudocode)로 표현하면 다음과 같습니다:
hidden_state_t = 0 # 초기 은닉 상태를 0(벡터)로 초기화
for input_t in input_length: # 각 시점마다 입력을 받음
output_t = tanh(input_t, hidden_state_t) # 입력과 은닉 상태로 연산
hidden_state_t = output_t # 계산 결과는 현재 시점의 은닉 상태가 됨
이 과정에서 각 메모리 셀은 각 시점마다 input_t와 hidden_state_t(이전 상태의 은닉 상태)를 입력으로 받아 활성화 함수(tanh)를 통해 현 시점의 hidden_state_t를 계산합니다.
nn.Linear 클래스는 PyTorch에서 선형 변환(linear transformation)을 수행하는 층으로, 입력에 가중치 행렬을 곱하고 편향(bias)을 더하는 연산을 수행합니다. RNN에서 사용되는 self.i2h, self.h2h, self.h2o는 모두 nn.Linear를 사용하지만 서로 다른 목적과 차원을 가진 별개의 선형 변환입니다.
nn.Linear의 계산 방식
nn.Linear(input_size, hidden_size)는 다음과 같은 수학적 연산을 수행합니다:
y=xWT+b
여기서:
- x는 입력 벡터 (크기: input_size)
- W는 가중치 행렬 (크기: hidden_size × input_size)
- b는 편향 벡터 (크기: hidden_size)
- y는 출력 벡터 (크기: hidden_size)
구체적인 예시
예를 들어, input_size=3이고 hidden_size=2인 경우:
이 선형 층은 다음과 같은 파라미터를 가집니다:
linear = nn.Linear(3, 2)
- 가중치 행렬 W: 크기 (2, 3)의 행렬
- 편향 벡터 b: 크기 (2)의 벡터
만약 W와 b가 다음과 같다고 가정해 봅시다:
W = [[0.1, 0.2, 0.3],
[0.4, 0.5, 0.6]]
b = [0.1, 0.2]
nn.Linear(3, 2)의 경우, 3차원 입력 벡터가 2차원 출력 벡터로 변환됩니다. 이것은 차원 축소(dimension reduction)의 한 형태로 볼 수 있습니다.
RNN의 맥락에서 설명하자면:
- i2h (입력→은닉): input_size=3, hidden_size=2인 경우
- 3차원 입력 데이터(예: 단어 임베딩, 센서 데이터 등)가
- 2차원 은닉 상태 공간으로 압축/변환됩니다
- 이 과정에서 입력 데이터의 중요한 특징들이 더 작은 차원의 은닉 공간에 인코딩됩니다
- h2h (은닉→은닉): hidden_size=2인 경우
- 이전 시점의 2차원 은닉 상태가
- 다시 2차원 은닉 상태로 변환됩니다 (차원 유지)
- 이 변환은 시간에 따른 정보 흐름을 제어합니다
- h2o (은닉→출력): hidden_size=2, output_size가 다른 값(예: 4)인 경우
- 2차원 은닉 상태가
- 다른 차원(예: 4차원)의 출력으로 변환될 수 있습니다
이러한 차원 변환은 신경망에서 매우 중요한 역할을 합니다:
- 데이터의 중요한 특징을 추출하고 압축하는 데 도움을 줍니다
- 계산 효율성을 높입니다
- 과적합을 방지하는 데 기여할 수 있습니다
실제 RNN 모델에서는 보통 hidden_size가 더 크게 설정되어(예: 128, 256, 512 등) 복잡한 패턴을 학습할 수 있는 충분한 표현력을 갖게 합니다. 하지만 개념적으로는 제가 설명한 3→2 변환과 동일한 원리가 적용됩니다.
'AI' 카테고리의 다른 글
[Pytorch] 반지도 학습 구현해보기 - PyTorch 주요 함수 이해하기 (0) | 2025.03.20 |
---|---|
[인최기] Semi-supervised learning (준지도학습) (0) | 2025.03.12 |
Residual Block 이해하기 (0) | 2025.02.21 |
Batch, Step, Epoch 이해하기 (1) | 2025.02.20 |
[논문] A Survey of Resource-efficient LLM and Multimodal Foundation Models (0) | 2025.02.13 |