더북(TheBook)

namedtuple에는 상태 전이와 관련된 정보들을 포함합니다. 현재의 상태와 행동(state, action)은 다음 상태와 보상(next_state, reward)으로 매핑됩니다. 즉, 현재의 상태에 대해 행동을 하게 되면 그것에 대한 보상이 주어지고 다음 상태를 보여 주기 때문에 현재 상태, 행동, 다음 상태, 보상('state', 'action', 'next_state', 'reward')에 대한 정보들을 관리합니다.

② 리플레이 메모리(버퍼)에는 최근에 관찰된 전이(transition), 현재 상태, 행동, 다음 상태, 보상 정보들이 담기게 됩니다. 또한, .sample() 메서드는 리플레이 메모리에 저장된 데이터 중 랜덤하게 배치 크기(batch_size)만큼 반환합니다.

CartPole 예제는 통제된 상황(에이전트의 모든 행동이 예측 가능한 상황)을 가정합니다. 하지만 현실에서는 완벽하게 통제된 상황은 존재하지 않습니다. 따라서 DQN 신경망을 이용하여 Q(action-value) 함수와 유사하도록 네트워크를 생성합니다. 또한, 모델 학습의 목표는 누적 보상이 최대가 되는 것입니다.

코드 12-4 DQN 모델 네트워크

class DQN(nn.Module):
    def __init__(self, h, w, outputs):
        super(DQN, self).__init__()
        self.conv1 = nn.Conv2d(3, 16, kernel_size=5, stride=2)
        self.bn1 = nn.BatchNorm2d(16)
        self.conv2 = nn.Conv2d(16, 32, kernel_size=5, stride=2)
        self.bn2 = nn.BatchNorm2d(32)
        self.conv3 = nn.Conv2d(32, 32, kernel_size=5, stride=2)
        self.bn3 = nn.BatchNorm2d(32)

        def conv2d_size_out(size, kernel_size=5, stride=2):
            return(size - (kernel_size-1)-1) // stride + 1

        convw = conv2d_size_out(conv2d_size_out(conv2d_size_out(w)))
        convh = conv2d_size_out(conv2d_size_out(conv2d_size_out(h)))
        linear_input_size = convw * convh * 32 ------ ①
        self.head = nn.Linear(linear_input_size, outputs)

    def forward(self, x):
        x = F.relu(self.bn1(self.conv1(x)))
        x = F.relu(self.bn2(self.conv2(x)))
        x = F.relu(self.bn3(self.conv3(x)))
        return self.head(x.view(x.size(0), -1)) ------ 함수의 반환값은 [[left0exp,right0exp]...]와 같으며 다음 행동을 결정하기 위해 사용
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.