본문 바로가기
강화학습

Dueling Network Architectures for Deep Reinforcement Learning

by 미스터탁 2018. 2. 24.

이번에 포스팅 할 논문은 "Dueling Network Architectures for Deep Reinforcement Learning" 이며 Google DeepMind 팀에서 낸 논문입니다. 2016년 4월에 나온논문으로 비교적 오래된(?) 논문입니다.



Abstract

 강화학습이 발전하면서 대부분 기존의 NN의 구조를 변형해가는 형태로만 발전해오고 있는데 (CNN LSTM, AE 등), 이 논문에서는 새로운  NN의 구조를 제시하면서 model - free 한 강화학습 구조를 제안합니다. Dueling Network는 아래그림(밑에 그림)처럼 두개의 분리된 Stream을 가집니다.  아래 그림의 위그림은 일반적인 Network구조이고 두번째 그림이 Dueling Network 구조 입니다. 두개의 stream이 나눠서 싸워서?(Duel : 대결, 투쟁, 다툼) 제목이 Dueling Network인것 같은데, 논문을 쭉 읽고 코드를 봐도 왜 싸우는 의미인지는 잘 모르겠네요 .ㅠㅠ 투쟁보다는 협업이 더 맞는 느낌인것 같은데...


두개의 stream중 위의 stream은 State Value function을 Approx하게 되고, 그 아래의 Stream은 state-dependent action advantage function을 Approx하게 됩니다. 본 논문에서는 이 구조가 다른 state-of-art 모델에 비해 Atari 2600 domain에서 우수한 성능을 내었다고 서술하고 있습니다. 



Model  

abstract에서 서술 한 것처럼 이 모델은 두개의 Stream으로 분리된게 가장 큰 특징입니다. 모델에 들어가는 Input과 최종적으로 나오는 Output은 각 Action에 대한 Q value로서 일반적인 강화학습모델과 동일한 구조를 지닙니다만, 최종 Output 이전에 Stream이 갈라진다는게 특징입니다. 아래그림의 위 stream은 State-value function으로서 scalar 값을 받게 됩니다. 즉, State s가 얼마나 좋냐를 측정하게 되는데 이는 Environment내에서 상대적인 값으로 보셔야합니다. 7.8이니까 좋다, 라고 말할 수 없고, 이전 상태에서는 5이고 지금 상태는 7이니 이전 상태보다 state value가 높다 라고 해석해야 합니다. 아래 stream은 advantage function으로서 state에 dependent합니다. 즉 state s에 따라 어떤 action을 취하는게 좋은지 판단하는 역할을 합니다. 두개의 stream은 각각, 현재 state가 어떤지 판단하고, 그 state에 따라서 action을 취하게끔 하도록 하는 역할을 지닙니다. 



아래 그림의 마지막 부분은 V(s) + A(s, a)로 계산이 됩니다. V(s)는 Scalar이고 A(s, a)의 action에 대한 vector인데, V(s) + A(s, a)를 계산할때에 V(s) 를 action수 만큼 동일하게 복사하여 더해줍니다. 







아래 그림은 Value function과 Advantage function이 활성화 되어있는 그림인데, 첫번째 그림을 보시면 자동차(?) 앞에 는 장애물이 없고 수평선 부근(목표지점)과 Score부분이 활성화 되어있는 것을 알 수 있습니다. 반면 Advantage function은 어느부분도 활성화가 되어있지 않죠. 그 아래그림을 보시면 자동차 앞에 여러 장애물이 있는 것을 보실 수 있는데, 위 그림에 비하여 Value function 이 장애물 쪽과 Score부분에 활성화가 많이 되어있는 것을 알 수 있고, Advantage function도 장애물 쪽으로 활성화가 되어있습니다. 


다시 위 그림부터 해석해보자면, 현재 자동차는 앞에 장애물이 먼 위치에 있습니다. Value function은 점수를 높이기 위해(reward를 높이기 위해) 어느 부분을 집중해야할까요? 당연히 가까운 장애물이 아니라 먼곳에 있는 장애물과 내가 앞으로 가야할 곳, 그리고 Score 부분입니다. 현재 상태에서 어떤 action을 취하는것이 좋을까요? 사실 가만히 있어도 됩니다. 가많이 있어도 현 그림에서 목표지점까지는 자동으로 가기 때문이죠. 가만히 있어도 된다라는 의미는 아무런 action을 취해도 상관없다라는 의미이기도 합니다. 그렇기 때문에 Advantage function부분을 보면 어느 부분도 활성화되어 있지 않는 것입니다. 이 논문을 읽다 보면 (또는 이글을 읽다 보면) 궁금한점이 생기게 되는데, 네트워크는 Q(s, a) = V(s) + A(s, a)  를 통해서 Action을 취합니다. 그런데 V(s)를 동일하게 복사해서 A(s , a)를 더해서 Q(s, a)를 만들게 된다면, A(s, a)에서 action을 취하는것과 동일하게 됩니다. 그래서 굳이 왜 V(s) 를 더하는거지 ? 라는 의문이 들었습니다. 당연히 V에 대하여 Back Propagation하기 위해서는 더하거나 빼주는게 맞긴한데, 이게 action을 취하는데 어떤 역할을 하는건지 이해가 잘 되지 않았습니다. 제 생각에는 이 상황(어떤 action을 취하든 상관없는 상황)에서는 Back propagation하는 Error의 양을 줄이기 위함이고, 그럼으로 인해 Network의 학습을 빠르게 하기 위함이 아닐까 싶습니다. 


다시 그림으로 돌아가, 아래그림을 보시면 Value function은 위그림처럼 먼 곳(목표지점)과 Score부분도 활성화 되어있지만, 자동차의 바로 앞부분도 활성화 되어있는 것을 보실수 있습니다. 현재 점수를 최대화 하기 위해서 먼곳과 동시에 바로 앞부분도 집중할 필요가 있다고 Agent에 알려주고 Advantage function은 그에 dependent 하여 action을 취하게 끔하게 합니다. Advantage function은 자동차의 바로 앞부분이 활성화 되어 있습니다. 바로 앞부분에 초점을 둬서 action을 취하게 하는 것으로 해석할 수 있습니다.






그런데, Q (s, a)를 구할 때, 학습속도의 향상을 위해 다음과 같은 트릭(??) 을 사용합니다. 올바른 action이 취해졌을때 advantage function이 0이 되게 하기 위함이라고 합니다. 






Dueling 네트워크 소스코드를 보시면(https://gist.github.com/ishuca/6e2fd4c2cc6e49733249856f74c726ff#file-double-dueling-dqn-tutorial-ipynb) input을 convolution layer를 통해 feature를 뽑고 분할해서 Value Stream과 Advantage Stream으로 들어가게 되는데, 아래 빨간색으로 칠해진 부분을 보시면  convolution layer를 통해 나오는 feature가 512 인데 이를 256으로 분할해서 Value/Advantage Stream으로 들어가는 것을 알수 있습니다. 당연히 동일한 Feature가 들어가야하는게 아닌가 라는 생각이 들었는데, 이 소스코드의 예제도 논문에서 예를든 카레이싱(?) 아타리 게임과 비슷한 게임입니다. (위에서 내려오는 벽돌을 피하는?? 게임). 즉 화면을 위/아래로 분할해서 Value function이 먼 미래를 중점적으로 보게하고 Advantage function이 가까운 미래에 초점을 맞춰 action을 취하도록 하게끔 하는 것 같습니다. 제 생각에는 굳이 분할하지 않아도 학습이 될것 같기는 합니다. 만약 쿠키런이나 슈퍼마리오 같이 왼쪽에서 오른쪽으로 게임이 진행 되는 거면, 가로로 분할하면 될것 같습니다. Dueling Network는 레이싱 같은 먼 미래가 화면에서도 (State내에서도) 추정이 어느정도 가능해야 잘되지 않을까 싶습니다.   

       self.conv4 = tf.contrib.layers.convolution2d( \
            inputs=self.conv3,num_outputs=512,kernel_size=[7,7],stride=[1,1],padding='VALID', biases_initializer=None)
        
        # 마지막 콘볼루션 레이어의 출력을 가지고 2로 나눈다.
        # streamAC, streamVC 는 각각 1x1x256
        self.streamAC,self.streamVC = tf.split(3,2,self.conv4)
        # 이를 벡터화한다. streamA 와 streamV는 256 차원씩이다.
        self.streamA = tf.contrib.layers.flatten(self.streamAC)
        self.streamV = tf.contrib.layers.flatten(self.streamVC)
        # 256개의 노드를 곱해서 각각 A와 V를 구하는 가중치
        self.AW = tf.Variable(tf.random_normal([256,env.actions]))
        self.VW = tf.Variable(tf.random_normal([256,1]))
        # 점수화 한다.
        self.Advantage = tf.matmul(self.streamA,self.AW)
        self.Value = tf.matmul(self.streamV,self.VW)


논문에서는 Dueling Network 구조가 Atari game에서 다른 알고르짐 대비 우수한 성능을 냈다고 서술하고 있으며, 더불어 중복된 Action이 있는 문제에서도 효율적이라고 얘기하고 있습니다. 아래 Corridor Environment는 사실 네가지 action만 있으면 되는데 임의로 중복되는 여러 action을 추가해서 실험한결과 Single 모드 보다 더 학습이 잘된다고 합니다. 이는 앞서 제가 언급한, 어떤 action을 취해도 상관없는 상황에 대하여 학습을 빠르게 한다 라는 글과 일맥 상통하는 것 같습니다.





R로 쉽게 배우는 강화학습   (할인쿠폰코드) 334-7a52bf639841

https://www.inflearn.com/course/R-%EA%B0%95%ED%99%94%ED%95%99%EC%8A%B5-%EA%B8%B0%EC%B4%88#


R로 하는 웹 크롤링 - 입문편(할인쿠폰코드) 236-69fc51d93a53 
https://www.inflearn.com/course/R-crawling# 

R로 하는 웹 크롤링 - 실전편 (할인쿠폰코드) 237-55c672aeb038 
https://www.inflearn.com/course/R-crawling-2# 

R로 하는 텍스트마이닝 (Top keyword부터 감성분석까지) (할인쿠폰코드) 238-c86096730061 
https://www.inflearn.com/course/R-text-mining#


R로 무작정 해보는 data science (할인쿠폰코드) 310-c6164f3d9be9 
https://www.inflearn.com/course/R-%EB%8D%B0%EC%9D%B4%ED%84%B0%EC%82%AC%EC%9D%B4%EC%96%B8%EC%8A%A4-%EB%9D%BC%EC%9D%B4%EB%B8%8C%EC%BD%94%EB%94%A9#

반응형

댓글