• 카테고리

    질문 & 답변
  • 세부 분야

    딥러닝 · 머신러닝

  • 해결 여부

    미해결

cartpole_dqn 중 def train_mini_batch(self,Q):에서 Q[0,0,action]의 0,0의 의미는?

21.06.30 23:17 작성 조회수 127

0

 Q함수 4개의 states가 0행 0열에 있다는 의미입니까?

답변 1

답변을 작성해보세요.

0

안녕하세요 이석헌님.

강의를 수강해 주셔서 감사합니다.

저도 처음에 공부할 때 이해가 쉽지 않았던 지점입니다.

먼저 위 그림을 살펴보시는게 좋을 것 같습니다.

인공신경망 모델을 생성할 때 입력을 (1,4) 배열로 생성합니다. self.state_size가 4이기 때문입니다. 하지만 에피소드 동안 데이터를 쌓아 배치(여러 개의 데이터를 한 번에 입력)로 학습하기 때문에 모델에 입력되는 데이터는 실질적으로 (n, 1, 4)가 됩니다. 하나의 차원이 더 생기는 것이죠.

텐서플로우 버전에 따라 입력을 (1,self.state)가 아닌 self.state로만 선언해도 되기도 합니다. 하지만 이 강의에서 사용한 텐서플로우 버전에서는 (1,self.state)와 같이 사용해야 합니다.

이제 인공신경망의 출력을 살펴보겠습니다.

여기에서 출력의 크기를 4로 지정합니다. self.action_size가 4이기 때문입니다. 인공신경망은 내부에 Q를 저장하고 있습니다. 상태(state)를 입력하면 Q(행동별 가치)를 출력합니다. 행동을 선택할 때 Q가 가장 큰 행동을 선택하는것이 Q러닝입니다.

입력은 명시적으로 (1,4)로 지정했지만, 출력은 단순히 4로만 지정했습니다. 내부적으로 (1,4)로 변경되어 사용됩니다. 이것은 텐서플로우의 동작 특성이라 생각하시면 됩니다. 배치학습을 하기 때문에 출력 또한 입력과 마찬가지로 (n,1,4)가 됩니다. 

train_mini_batch 함수 내부에서 사용하는  Q는 모델의 출력을 저장하고 있습니다.  take_action_and_append_memory 함수 내부에서 Q = self.model.predict(state_t)와 같이 Q값을 계산합니다. 따라서 하나의 Q값만을 반환하는 시점에서는 Q의 shape(모양)은 (1,1,4)가 됩니다.

따라서 Q값을 지정하기 위해서는 Q[0,0,n]과 같이 사용해사 값이 있는 위치를 지정할 수 있습니다.

다음 코드를 실행해 보면 좀 더 이해가 쉬울 것 같습니다.

감사합니다.

-------------------------------

import numpy as np

a = np.array([[[0.2, 0.3, 0.4, 0.1]]])

print(a.shape) #(1)배열의 모양

a[0,0,1] = 0.9 #2번째 항목에 0.9를 입력

print(a) #(2)

-------------------------------

(1, 1, 4) --> (1)
[[[0.2 0.9 0.4 0.1]]] -->(2)
-------------------------------

이석헌님의 프로필

이석헌

질문자

2021.07.01

친절한 답변 고맙습니다. 앞으로도 많은 지도 편달 바랍니다.