검수요청.png검수요청.png

"DDPG"의 두 판 사이의 차이

위키원
이동: 둘러보기, 검색
9번째 줄: 9번째 줄:
  
 
== 이론 ==
 
== 이론 ==
 +
=== 큐 러닝 ===
 +
먼저 최적의 동작-값 함수를 기술하는 벨만(Bellman) 방정식 <math>Q^*(s,a)</math>를 재점검해 보자. 이는 다음 식에 의해 주어진다.
 +
:<math>Q^*(s,a) = \underset{s' \sim P}{E} \left [ r(s,a) + \gamma \underset{a'}{max} Q^* (s', a') \right ]</math>
 +
 +
여기서 <math>s' \sim P</math>는 다음 상태인 <math>s'</math>가 <math>P(\cdot|s,a)</math>의 분포로부터 환경에 의해 샘플링된다고 말하는 속칭이다. 이 벨만 방정식은 <math>Q^*(s,a)</math>의 근사치를 배우기 위한 출발점이다. 근사치가 신경 네트워크 <math>Q_{\pi}(s,a)</math>이고 매개 변수 <math>\phi</math>가 있으며, 전환 세트 <math>{\mathcal D}(s,a,r,s',d)</math>를 수집했다고 가정하자. 여기서 <math>d</math>는 상태 <math>s'</math>가 터미널인지 여부를 나타낸다. 평균 제곱 벨먼 오차(MSBE) 함수를 설정할 수 있는데, 이 함수는 <math>Q_{\pi}</math>가 벨먼 방정식을 만족하는 데 얼마나 근접하게 도달하는지 대략 알려준다.
 +
:<math>L(\phi, {\mathcal D}) = \underset{(s,a,r,s',d) \sim {\mathcal D}}{{\mathrm E}}\left[
 +
    \Bigg( Q_{\phi}(s,a) - \left(r + \gamma (1 - d) \max_{a'} Q_{\phi}(s',a') \right) \Bigg)^2
 +
    \right]</math>
 +
 +
여기서는 <math>(1-d)</math>를 평가할 때 <math>True</math>를 1로, <math>False</math>를 0으로 평가하는 파이썬 규약을 사용했다. 따라서 <code>d==True</code> (즉, <math>s'</math>가 말단 상태일 때)가 되면 <math>Q</math> 기능은 대리인이 현재 상태 이후 추가 보상을 받지 못한다는 것을 보여줘야 한다. 이러한 표기법 선택은 나중에 코드에서 구현하는 것에 해당한다. DQN, DDPG와 같은 기능 근사치에 대한 큐-러닝 알고리즘은 주로 이 평균 제곱 벨만 오차 손실 기능을 최소화하는 것에 기초한다.
 +
 +
*'''리플레이 버퍼'''(Replay Buffer): <math>Q^*(s,a)</math>의 근사치를 위해 [[심층신경망]]을 훈련하기 위한 모든 표준 알고리즘은 경험 리플레이 버퍼를 사용한다. 이것은 이전 경험의 <math>D</math>의 집합이다. 알고리즘이 안정적인 동작을 갖기 위해서는 리플레이 버퍼의 크기가 커야 다양한 경험을 담을 수 있지만, 모든 것을 유지하는 것이 항상 좋은 것은 아닐 수 있다. 만약 가장 최근의 데이터만을 사용한다면, 그것에 지나치게 적합하게 될 것이고 상황은 깨질 것이다. 또한 만약 너무 많은 경험을 사용한다면, 학습 속도를 늦출 수 있다. 이 작업을 제대로 하려면 약간의 조정이 필요하다.
 +
 +
*'''타겟 네트워크'''(Target Network): 큐-러닝 알고리즘은 타겟 네트워크를 활용한다.
 +
:<math> r + \gamma (1 - d) \max_{a'} Q_{\phi}(s',a')</math>
 +
 +
:위의 식을 타겟이라고 하는데, 평균 제곱 벨만 오차 손실을 최소화했을 때 큐-기능을 이 타겟과 더 유사하게 만들려고 하기 때문이다. 문제는 우리가 훈련시키려 하는 것과 같은 변수인 <math>\pi</math>에 따라 대상이 달라진다. 그리고 이것은 평균 제곱 벨만 오차 최소화를 불안정하게 만든다. 해결책은 <math>\phi</math>에 가깝지만 시간 지연, 즉 1차보다 뒤처지는 타겟 네트워크라고 불리는 두 번째 네트워크를 사용하는 것이다. 대상 네트워크의 파라미터는 <math>\phi_{\text{targ}}</math>로 표시된다. DQN 기반 알고리즘에서 대상 네트워크는 몇 가지 고정된 단계마다 주 네트워크로부터 복사될 뿐이다. DDPG 스타일 알고리즘에서 대상 네트워크는 폴리아크 평균화에 의해 주 네트워크 업데이트당 한 번 업데이트된다.
 +
:<math>\phi_{\text{targ}} \leftarrow \rho \phi_{\text{targ}} + (1 - \rho) \phi</math>
 +
:여기서 <math>\rho</math>는 0과 1 사이의 하이퍼 파라미터이다. 일반적으로 1에 가깝다.<ref name="오픈에이아이"> Deep Deterministic Policy Gradient  OpenAI Spinning Up - https://spinningup.openai.com/en/latest/algorithms/ddpg.html#id5 </ref>
 
=== 구현 ===
 
=== 구현 ===
 
   <math>\mathrm{{\color{OrangeRed}import}\ gym}</math>   
 
   <math>\mathrm{{\color{OrangeRed}import}\ gym}</math>   
51번째 줄: 70번째 줄:
 
           <math>\mathrm{x = ( }</math>
 
           <math>\mathrm{x = ( }</math>
 
               <math>\mathrm{self.x}</math>_<math>\mathrm{prev} </math>
 
               <math>\mathrm{self.x}</math>_<math>\mathrm{prev} </math>
               <math>\mathrm{ + self.theta\ * (self.mean - self.x}</math>_<math>\mathrm{prev) * self.dt }</math>
+
               <math>\mathrm{ +\ self.theta\ * (self.mean - self.x}</math>_<math>\mathrm{prev) * self.dt }</math>
               <math>\mathrm{ + self.std}</math>_<math>\mathrm{dev * np.sqrt(self.dt)\ * np.random.normal(size=self.mean.shape) }</math>
+
               <math>\mathrm{ +\ self.std}</math>_<math>\mathrm{dev * np.sqrt(self.dt)\ * np.random.normal(size=self.mean.shape) }</math>
 
           <math>\mathrm{ ) }</math>
 
           <math>\mathrm{ ) }</math>
 
           <math>\mathrm{self.x}</math>_<math>\mathrm{prev = x}</math>
 
           <math>\mathrm{self.x}</math>_<math>\mathrm{prev = x}</math>
 
           <math>\mathrm{{\color{BlueGreen}return}\ x}</math>
 
           <math>\mathrm{{\color{BlueGreen}return}\ x}</math>
 
   <math></math>
 
   <math></math>
 +
      <math>\mathrm{{\color{BlueGreen}def}\ {\color{Green}reset}(self):} </math>
 +
          <math>\mathrm{{\color{BlueGreen}if}\ self.x}</math>_<math>\mathrm{initial\ is\ not\ None:} </math>
 +
              <math>\mathrm{self.x}</math>_<math>\mathrm{prev = self.x}</math>_<math>\mathrm{initial} </math>
 +
          <math>\mathrm{{\color{BlueGreen}else}}:</math>
 +
              <math>\mathrm{self.x}</math>_<math>\mathrm{prev = np.zeros}</math>_<math>\mathrm{like(self.mean)}</math>
 +
 +
버퍼 클래스는 경험 반복을 구현한다.
 +
 +
=== 알고리즘 ===
 +
  <math>\mathrm{Input:\ initial\ policy\ parameters\ \theta,\ Q-function\ parameters\ \phi,\ empty\ replay\ buffer\ D}</math>
  
 
{{각주}}
 
{{각주}}
  
 
== 참고자료 ==
 
== 참고자료 ==
 +
* Deep Deterministic Policy Gradient  OpenAI Spinning Up - https://spinningup.openai.com/en/latest/algorithms/ddpg.html#id5
 
* 생각많은 소심남, 〈[https://talkingaboutme.tistory.com/entry/RL-Policy-Gradient-Algorithms (RL)Policy Gradient Algorithms]〉,  《티스토리》, 2019-06-17  
 
* 생각많은 소심남, 〈[https://talkingaboutme.tistory.com/entry/RL-Policy-Gradient-Algorithms (RL)Policy Gradient Algorithms]〉,  《티스토리》, 2019-06-17  
 
* amifunny, 〈[https://keras.io/examples/rl/ddpg_pendulum/ DDPG (Deep Deterministic Policy Gradient)]〉,  《Keras》, 2020-06-04
 
* amifunny, 〈[https://keras.io/examples/rl/ddpg_pendulum/ DDPG (Deep Deterministic Policy Gradient)]〉,  《Keras》, 2020-06-04

2020년 8월 31일 (월) 15:58 판

DDPG(Deep Deterministic Policy Gradient)는 인공신경망강화학습을 사용하여 학습하는 알고리즘이다. DDPG 알고리즘은 모델 프리 오프-폴리시로 학습하기 때문에 잘못된 행동이 누적되어 학습에 영향을 미치는 경우를 방지하는 장점이 있다.

개요

DDPG는 DPG(Deterministic Policy Gradient)에 DQN을 결합시킨 모델 프리 오프 폴리시 액터 크리틱 알고리즘이다. DQN의 경험 반복(Experience Replay)과 저속 학습 대상 네트워크를 활용하며, 연속 액션 공간에서 동작이 가능한 DPG를 기반으로 한다.[1] 원래의 DQN은 별개의 공간에서 동작하지만, DDPG는 액터-크리틱 프레임워크(actor-critic framework)를 통해서 결정론적 정책을 학습하면서 효과를 연속 공간까지 확장시켰다. 좀 더 나은 탐색을 하기 위해서 탐색 정책은 을 추가함으로써 만들 수 있다.[2]

DDPG는 원래 DQN에는 없는 두 가지 기법을 더 사용한다. 첫째, 두 개의 대상 네트워크를 사용한다. 왜냐하면 훈련에 안정성을 더해 주기 때문이다. 간단히 말해서, 우리는 추정 대상으로부터 배우고 있고 대상 네트워크는 천천히 업데이트되므로 추정 대상의 안정성이 유지된다. 이는 개념적으로 이것을 어떻게 잘 할 것인가, 더 좋은 것을 찾을 때까지 잠시 시험해 보겠다고 말하는 것과 같은 것으로, 모든 동작 끝에 이 게임 전체를 어떻게 하는지 다시 배우겠다고 말하는 것과는 배치된다. 둘째, 경험 반복을 사용한다. 튜플 리스트(state, action, reward, next_state)를 저장하고, 최근의 경험으로부터만 배우는 대신에 지금까지 축적된 모든 경험을 샘플링하여 배운다.[1]

이론

큐 러닝

먼저 최적의 동작-값 함수를 기술하는 벨만(Bellman) 방정식 를 재점검해 보자. 이는 다음 식에 의해 주어진다.

여기서 는 다음 상태인 의 분포로부터 환경에 의해 샘플링된다고 말하는 속칭이다. 이 벨만 방정식은 의 근사치를 배우기 위한 출발점이다. 근사치가 신경 네트워크 이고 매개 변수 가 있으며, 전환 세트 를 수집했다고 가정하자. 여기서 는 상태 가 터미널인지 여부를 나타낸다. 평균 제곱 벨먼 오차(MSBE) 함수를 설정할 수 있는데, 이 함수는 가 벨먼 방정식을 만족하는 데 얼마나 근접하게 도달하는지 대략 알려준다.

여기서는 를 평가할 때 를 1로, 를 0으로 평가하는 파이썬 규약을 사용했다. 따라서 d==True (즉, 가 말단 상태일 때)가 되면 기능은 대리인이 현재 상태 이후 추가 보상을 받지 못한다는 것을 보여줘야 한다. 이러한 표기법 선택은 나중에 코드에서 구현하는 것에 해당한다. DQN, DDPG와 같은 기능 근사치에 대한 큐-러닝 알고리즘은 주로 이 평균 제곱 벨만 오차 손실 기능을 최소화하는 것에 기초한다.

  • 리플레이 버퍼(Replay Buffer): 의 근사치를 위해 심층신경망을 훈련하기 위한 모든 표준 알고리즘은 경험 리플레이 버퍼를 사용한다. 이것은 이전 경험의 의 집합이다. 알고리즘이 안정적인 동작을 갖기 위해서는 리플레이 버퍼의 크기가 커야 다양한 경험을 담을 수 있지만, 모든 것을 유지하는 것이 항상 좋은 것은 아닐 수 있다. 만약 가장 최근의 데이터만을 사용한다면, 그것에 지나치게 적합하게 될 것이고 상황은 깨질 것이다. 또한 만약 너무 많은 경험을 사용한다면, 학습 속도를 늦출 수 있다. 이 작업을 제대로 하려면 약간의 조정이 필요하다.
  • 타겟 네트워크(Target Network): 큐-러닝 알고리즘은 타겟 네트워크를 활용한다.
위의 식을 타겟이라고 하는데, 평균 제곱 벨만 오차 손실을 최소화했을 때 큐-기능을 이 타겟과 더 유사하게 만들려고 하기 때문이다. 문제는 우리가 훈련시키려 하는 것과 같은 변수인 에 따라 대상이 달라진다. 그리고 이것은 평균 제곱 벨만 오차 최소화를 불안정하게 만든다. 해결책은 에 가깝지만 시간 지연, 즉 1차보다 뒤처지는 타겟 네트워크라고 불리는 두 번째 네트워크를 사용하는 것이다. 대상 네트워크의 파라미터는 로 표시된다. DQN 기반 알고리즘에서 대상 네트워크는 몇 가지 고정된 단계마다 주 네트워크로부터 복사될 뿐이다. DDPG 스타일 알고리즘에서 대상 네트워크는 폴리아크 평균화에 의해 주 네트워크 업데이트당 한 번 업데이트된다.
여기서 는 0과 1 사이의 하이퍼 파라미터이다. 일반적으로 1에 가깝다.[3]

구현

    
  
 
 
 

OpenAIGym을 사용하여 환경을 만든다. 이 upper_bound 매개 변수를 사용하여 나중에 작업을 확장할 것이다.

  ""
 
 
 _ _ 
  " " _
 _ _ 
  " " _
 
 __
 __
 
  " " _
  " " _
 Size of State Space ->  3
 Size of Action Space ->  1
 Max Value of Action ->  2.0
 Min Value of Action ->  - 2.0

액터(Actor) 네트워크에 의한 더 나은 탐색를 구현하기 위해, 우리는 잡음 발생을 위한 올슈타인-울렌벡(Ornstein-Uhlenbeck) 프로세스를 사용한다. 상관된 정규 분포에서 소음을 샘플링한다.

 
     ____
         
         
         __
         
         __
         
 
     ____
         
             _
             _
             _
         
         _
         
 
     
         _
             __
         
             __

버퍼 클래스는 경험 반복을 구현한다.

알고리즘

 

각주

  1. 1.0 1.1 amifunny, 〈DDPG (Deep Deterministic Policy Gradient)〉, 《Keras》, 2020-06-04
  2. 생각많은 소심남, 〈(RL)Policy Gradient Algorithms〉, 《티스토리》, 2019-06-17
  3. Deep Deterministic Policy Gradient OpenAI Spinning Up - https://spinningup.openai.com/en/latest/algorithms/ddpg.html#id5

참고자료

같이 보기


  검수요청.png검수요청.png 이 DDPG 문서는 인공지능 기술에 관한 글로서 검토가 필요합니다. 위키 문서는 누구든지 자유롭게 편집할 수 있습니다. [편집]을 눌러 문서 내용을 검토·수정해 주세요.