18장 강화 학습
https://github.com/kimhwijin/HandsOnMachineLearing/blob/main/Reinforcement_Learning_18.ipynb
GitHub - kimhwijin/HandsOnMachineLearing
Contribute to kimhwijin/HandsOnMachineLearing development by creating an account on GitHub.
github.com
강화학습
강화학습 reinforcement learning(RL) 이 무엇인지와 어떤일을 잘하는지 알아보고,
심층 강화학습에서 가장 중요한 정책 그레디언트 policy gradient 와 심층 Q-네트워크 deep Q-network (DQN) 을 마르코프 결정 과정Markov decision process (MDP) 와 함께 소개한다.
또한 최신 알고리즘을 사용해 강력한 RL 시스템을 매우 간단하게 구축하는 TF-Agents 라이브러리로 브레이크아웃break out 을 플레이하는 에이전트를 훈련한다.
18.1 보상을 최적화하기 위한 학습
강화학습에서 에이전트agent 는 관측 observation 을 하고 환경 environment 에서 행동action 을 한다. 행동의 결과로 보상 rewrad 를 받는다.
에이전트의 목적은 보상의 장기간 기대치를 최대치로 만드는 행동을 학습하는 것이다.
에이전트의 종류들
- 에이전트는 로봇을 제어하는 프로그램으로, 환경은 실제세상, 카메라 센서 등으로 관찰하고, 모터를 구동하는 행동을 수행하고, 목적지에 도착할 때 양의 보상, 낭비하거나 잘못된 방향일 경우 음의 보상을 받는다.
- 에이전트는 바둑같은 게임을 플레이하는 프로그램일 수 있다.
- 에이전트는 미스 팩맨을 제어하는 프로그램으로, 행동은 아홉가지 조이스틱위치, 관측은 스크린샷, 보상은 게임의 점수이다.
- 에이전트는 목표온도를 맞추는 스마트 온도조절기일 수도 있다.
- 주식시장의 가격을 관찰하고 매초 얼마나 사고팔아야 할지 결정할 수 있다. 보상은 금전적 이익과 손실이다.
18.2 정책 탐색
에이전트가 행동을 결정하기 위해 사용하는 알고리즘을 정책 policy 이라고 합니다. 정책이 결정적일 필요는 없다. 무작위 확률적으로 행동을 결정할 수 있는 확률적 정책stochastic policy 도 있다. 중요한것은 보상이다. 보상을 최대화하기 위해서 변경가능한 정책 파라미터 policy parameter 을 최적화해가면서 정책 탐색 policy search 을 수행한다. 정책 공간 policy space 이 매우크면 최선의 파라미터를 찾는데 오래걸릴 수 있다.
정책 탐색방법으로 유전 알고리즘genetic algorithm 이 있다. 이는 랜덤한 1세대 정책을 수행하고, 성능높은 특정비율의 정책만 남기고 나머지는 버린다. 2세대 정책은 이 남은 정책에 조금의 무작위성을 더해서 생성한다. 이 과정을 반복해서 최선의 정책을 찾을 때까지 반복한다.
또 다른 방법으로 정책 파라미터에 대한 보상의 그레디언트를 구해 높은 보상의 방향을 따라 파라미터를 수정하는 경사 상승법인 정책 그레디언트 Policy gradient PG 가 있다.
18.3 OpenAI Gym
강화훈련의 어려운점으로 에이전트를 훈련하기 위한 작업환경구축을 마련해야한다는 점이다. 예를들어 실제환경에서 움직이는 로봇을 훈련시킬때, 훈련속도를 높이는 방법이 굉장히 제한적이기 때문에 최소한 시뮬레이션 환경을 필요로한다.
OpenAi Gym 을 설치하고, CartPole 환경을 만들어 시뮬레이션 해본다.
env = gym.make("~") 으로 환경을 만들고,
obs = env.reset() 으로 환경을 초기화하고,
env.action_space 으로 가능한 행동을 조회하고,
obs, reward, done, info = env.step( action ) 으로 행동을 수행한후 이후 상황을 전달받는다.
obs : 새로운 관측값
reward : 보상값 , 여기선 어떤 행동에도 스텝마다 1.0의 보상을 받아 최대한 오래살아남도록한다.
done : 에피소드가 끝났는지 여부. 여기선 너무 기울어지거나 200 스텝이상이 끝나면 종료된다.
info : 딕셔너리에 디버깅이나 훈련에 유용한 추가적인 정보를 포함할 수 있다.
18.4 신경망 정책
신경망을 통해 관측을 입력받고 실행할 행동을 출력하도록한다. 각 행동을 수행할 확률을 추정한다. 그리고 확률에 따라 랜덤하게 행동하도록 한다.
확률이 가장높은 행동을 수행하게 하지않고 랜덤하게 행동을 선택하게하는 이유는 새로운 행동을 탐험 exploring 하는것과 잘 할수 있는 행동을 활용 exploiting 하는것 사이에 균형을 맞추게한다.
CartPole 같은경우 과거의 행동과 관측은 무시해도된다. 관측값에 과거의 상태를 담고있는 속도가 있기 때문이다. 만일 카트의 위치만 알려준다면 현재속도를 추정하기위해 과거의 관측도 고려해야한다. 또한 관측에 잡음이 있을경우 현재 상태를 추정하기 위해 과거 관측 몇개를 사용하는 것이 좋다.
18.5 행동 평가: 신용 할당 문제
각 스텝에서 가장 좋은 행동이 무엇인지 알 수 있다면 추정된 확률을 통해 타깃 확률사이 크로스엔트로피를 최소화하도록 훈련가능하지만, 강화학습에서 에이전트가 받는 가이드는 보상뿐이다. 100번의 행동뒤에 막대가 넘어졌다면 어떤 행동이 잘못되었는지 확신할 수 없는 문제가 있다. 이를 신용 할당 문제 credit assignment problem 이라고 한다.
이를 해결하기위해 행동이 일어난후 각 step 마다 할인 계수 discount factor gamma 감마 를 적용한 보상을 모두 합하여 행동을 평가한다. 예를들어 에이전트가 오른쪽으로 3번 행동한다고 하면 첫 스텝에서 +10, 두 번째 스텝에서 0, 세 번째 스텝에서 -50의 보상을 받았다. 이때 첫번째 행동의 이득은 10 + gamma * 0 + gamma^2 * (-50) = -22 으로 gamma 가 높을수록 미래의 ( 2번재 3번째 ) 행동의 보상이 중요하게 생각되고 낮을수록 미래의 행동이 중요하지 않게 된다. ( 현재의 행동이 더 중요하게 고려된다. )
보통 gamma 값은 0.9 ~ 0.999 로 지정하고 0.95이면 13스텝만큼 미래의 보상은 당장 보상에 절반정도의 가치를 가진다. ( 0.95^13 = 0.5 )
위와같이 좋은 행동이 나쁜 행동보다 더 낮은 보상을 받을 수 있지만, 게임을 충분히 많이 반복하면 평균적으로 좋은 행동이 나쁜행동보다 더 높은 보상을 가진다. 이렇게 많은 게임을 수행하고 평균적으로 다른 가능한 행동과 비교해서 각 행동이 얼마나 좋은지 나쁜지를 추정하는 것을 행동 이익 action advantage 라고 부른다. 많은 에피소드를 수행후, 모든 행동의 대가를 정규화해 행동 이익이 음수인 행동은 나쁜, 양수인행동은 좋은 행동이라고 가정한다.
18.6 정책 그레디언트
PG 알고리즘은 높은 보상을 향해 그레디언트를 따라 올라가도록 파라미터를 최적화하는 알고리즘이다.
이중 하나로 REINFORCE 알고리즘 이 있다.
- 신경망 정책이 여러 번에 게임을 플레이하고 매 스텝마다 선택된 행동이 더 높은 가능성을 가지도록 만드는 그레디언트를 계산하고 ( 모델의 출력을 그대로 타깃으로 설정하고 그레디언트를 계산한다. ), 그레디언트를 적용하지 않는다.
- 한 반복에 에피소드를 몇번 실행하고, 각 행동의 보상을 계산한다. 앞에서의 할인율을 적용한다.
- 행동의 보상이 양수이면 행동의 가능성이 높아지도록 그레디언트를, 음수이면 덜 선택되도록 반대의 그레디언트를 적용한다. 구현은 그레디언트 벡터와 각 보상값을 곱한다.
- 모든 결과 그레디언트를 평균 내서 경사 하강법 스텝을 수행한다.
이러한 알고리즘은 크고 복잡한 문제에는 잘 적용되지 않는다. 샘플 효율성sample efficiency 가 매우 떨어진다. 여러번 반복, 여러번의 에피소드, 여러번의 스텝동안 진행하는 아주 긴시간 동안 게임을 플레이해야 정책을 개선할 수 있다. 각 행동의 이익을 추정하기 위해서 많은 에피소드를 평균해야되기 때문이다.
액터-크리틱 actor-critic 알고리즘 같은 더 강력한 알고리즘도 있다.
18.7 마르코프 결정 과정
덜 직접적인 정책 최적화 방법으로 보상을 증가시키기 위해 에이전트가 각 상태에 대해 할인된 미래의 대가를 추정하도록 학습된다. 또는 각 상태에 각 행동에 대해 할인된 미래의 대가를 추정하도록 학습된다. 즉 현재 상태에 특정 행동이 미래에 어떤 영향을 끼칠지를 학습한다.
이 알고리즘을 구현하기위해서 마르코프 결정 과정 Markov decision process (MDP) 를 이해해야 한다.
메모리가 없는 확률 과정인 마르코프 연쇄 Markov chain 은 정해진 개수의 상태를 가지고, 각 스텝마다 한 상태에서 다른 상태로 확률 무작위적으로 전이된다. 각 상태에서 다른 상태로 전이되는 확률은 고정되고, 메모리가 없기때문에 과거 상태와 관계없이 ( s, s` ) 쌍에만 의존한다.
여러 상태를 랜덤하게 돌아다니다가 영원히 한 상태에 남게되는 상태를 종료 상태 terminal state 라고 한다.
마르코프 결정 과정은 마르코프 연쇄와 비슷하지만 조금 다르다.
- 각 스텝에서 에이전트는 여러 가능한 행동중 하나를 선택할 수 있고, 전이 확률 ( 에이전트가 행동을 취했을 때 특정 상태로 변화될 확률 )은 선택된 행동에 따라 달라진다.
- 어떤 상태는 전이 보상 ( 에이전트의 행동에 대한 보상 기대값 )을 반환한다.
- 에이전트는 시간이 지남에 따라 보상을 최대화하기 위한 정책을 찾는다.
위에서 최적의 보상을 갖기위한 방법은 각 상태에 따라 확실하지 않을 수 있다.
어떤 상태 s 의 최적의 상태 가지 state value V*(s) 를 추정하는 방법을 찾았다. 이 값은 상태 s 에서 최적으로 행동해서 평균적으로 얻을 수 있는 할인된 미래보상의 합이다. 에이전트가 최적으로 행동하면 벨먼 최적 방정식 Bellman optimality equation 이 적용된다.
- T(s, a, s') : 에이전트가 행동 a를 선택할 때 s -> s' 으로 전이될 확률
- R(s, a, s') : 행동 a 를 선택해서 s -> s' 으로 전이될 때 받는 보상
- gamma : 할인 계수
이 식은 알고리즘이 가능한 모든 상태에 대해서 최적의 상태 가치를 정확히 추정하도록 한다. 먼저 모든 상태 가치를 0 으로 초기화하고, 가치 반복 value iteration 알고리즘을 사용해서 업데이트한다. 충분한 시간이 주어지면 추정값이 최적의 장책에 대응되는 최적의 상태 가치에 수렴한다.
최적의 상태 가치를 아는 것은 정책 평가할때는 매우 유용한데, 에이전트를 위한 최적의 정책을 알려주지는 않는다.
이때 Q-가치 Q-value 라고 부르는 최적의 상태-행동 가치 state-action value 를 추정할 수 있는 알고리즘이 있다.
이 값은 상태-행동 (s, a) 쌍에 대한 최적의 Q-가치 Q*(s, a) 값은 s 상태에 도달후 a 행동을 선택하고 결과를 얻기전에 미래에 평균적으로 기대할 수 있는 할인된 미래 보상의 합이다. 이때 에이전트가 최적으로 행동할 것이라고 가정한다.
먼저 Q-가치의 추정을 모두 0 으로 초기화 하고 Q-가치 반복으로 업데이트한다.
최적의 정책 pi*(s) 는 에이전트가 상태 s 에서 가장 높은 Q-값을 가진 행동을 선택하면 된다.
여기서 gamma 가 높아질수록 미래 가치를 더 중요하게 생각한다고 하는이유는, 위 식의 max_a' Q_k ( s', a' ) 이 이번 행동 이후 도착할 상태의 최대 가치를 지니기 때문이다. 예를들어 상태 1 에서 행동 2를 통해 상태 2로 전이될 때, 상태 2 의 최대 기대 보상에 gamma 를 곱하기 때문이다. 여기서 에이전트가 최적으로 행동한다는 가정이 포함된다. 최대 기대보상이기 때문에 기대 보상이 적은 행동을 에이전트가 수행하지 않는 다는 뜻이다. 이 과정은 행동을 통해서 옮겨갈 상태에서 얻을 수 있는 기대 보상을 할인후 곱하는 과정이다. 그러니깐 gamma 가 높아지면 미래가치가 증가한다.
18.8 시간차 학습
위의 마르코프 결정 과정으로 모델링하기에는 초기에 에이전트는 전이 확률 T(s, a, s') 에 대해서 모르고, 그에 따른 보상 R(s, a, s') 이 얼마나 되는지 모르는 제한사항이 있다. 보상은 최소한 한번의 각 상태와 전이를 경험해야 알 수 있고, 전이 확률에 대한 신뢰할 만한 추정을 얻으려면 여러번 경험해야 한다.
전이 확률과 보상에 대한 모델을 알면, 모델-기반 강화학습, 아니면 모델-프리 강화학습 이라고한다.
시간차 학습 temporal difference learning ( TD 학습 ) 은 가치 반복 알고리즘과 매우 비슷한데, 일부 정보만 알고 있을 때를 목적으로 변형된 것이다. 에이전트를 초기에 가능한 상태와 행동만 알고 다른 것은 모른다고 가정한다. 에이전트는 탐험 정책 exploration policy ( 예를들어 완전 랜덤한 정책 ) 을 사용해 MDP를 탐험한다. TD 학습 알고리즘이 실제로 관측된 전이와 보상에 근거해서 상태 가치 추정값을 반복적으로 업데이트한다.
- alpha : 학습률
- r + gamma * Vk(s') : TD타깃
- delta_k (s, r, s') : TD오차
각 상태 s 에서 에이전트가 이 상태를 떠났을때 얻는 당장의 보상 r 과 나중에 기대할 수 있는 보상 gamma * V(s') 을 더한 이동 평균을 저장한다.
18.9 Q-러닝
Q-러닝 알고리즘은 전이 확률과 보상을 초기에 알지 못한 상황에서 Q-가치 반복 알고리즘을 적용하는 것이다.
Q-러닝은 에이전트가 초기에 플레이하는 것을 보고 점진적으로 Q-가치 추정을 향상하는 방식으로 작동한다. 정확한 ( 충분한 ) Q-가치 추정을 얻게되면 최적의 정책은 가장 높은 Q-가치를 가지는 행동을 선택한다. ( 그리디 정책 )
미래 보상의 합을 추정하기 위해 타깃 정책이 이후로 최적으로 행동한다고 가정하고, 다음 상태 s' 에 대한 최대 Q-가치 추정 값을 선택한다.
Q-러닝 알고리즘처럼 훈련된 정책 ( Q-value ) 를 탐험 정책 ( 랜덤 선택 )에 사용하지 않는 알고리즘을 오프-폴리시 off-policy 알고리즘이라고 하고, 정책 그레디언트 알고리즘과 같이 훈련된 정책을 통해 계속해서 환경을 탐험하는 알고리즘을 온-폴리시 on-policy 이라고한다.
Q-러닝의 단점은 탐험 정책이 랜덤하기때문에 수렴하는데 상당히많은 반복이 필요하다.
18.9.1 탐험 정책
Q-러닝은 탐험 정책이 MDP를 충분히 탐험해서 보상과 확률을 충분히 추정해야 작동한다. 완전 랜덤한 방식이 모든 상태와 전이를 경험하게 한다지만 극단적으로 오랜 시간이 걸릴 수 있다.
더 나은 방법으로 epsilon-그리디 정책 epsiln-greedy policy 을 사용한다. 각 스텝에서 epsilon 확률로 랜덤하게 행동하거나, 1 - epsilon 확률로 가장 최선인 ( 가장 높은 Q-value 를 선택해서 ) 행동을 수행한다. 이 정책의 장점은 Q-value 추정이 점점 향상 되기때문에 환경에서 높은 가치를 가진다고 생각하는 부분을 확인하는데 점점 더 많은 시간을 사용하지만, 알려지지 않는 지역을 방문하는데도 일정 확률로 탐험한다. epsilon 값은 높게 시작해서 점점 감소시키는 것이 일반적이다.
다른 방법으로 탐험의 가능성에 의존하는 대신 이전에 많이 시도하지않은 행동을 시도하도록 탐험 정책을 강조하는 방법도 있다.
- N(s', a') : 상태 s' 에서 행동 a'를 선택한 횟수
- f(Q, N) 은 Q + k / (1 + N) 과 같은 탐험 함수 이다. k 는 알려지지 않은곳에 어느정도의 흥미를 느끼는지 하이퍼파라미터 이다.
18.9.2 근사 Q-러닝과 심층 Q-러닝
Q-러닝의 주요 문제는 많은 상태와 행동을 가진 대규모 MDP 에 적용하기 어렵다. 팩맨게임과 같이 먹을수 있는 먹이가 150개 있으면 가능한 상태 개수는 2^150 개수가되고, 팩맨과 유령의 위치를 더하면 엄청나게 많은 상태수가 존재할 수 있다. 그래서 모든 Q-가치에 대한 추정값을 기록하는 게 불가능하다.
이에 대한 해결책으로 어떤 상태-행동 (s, a) 쌍의 Q-value 를 근사하는 함수 Q_theta(s, a)를 ( 파라미터 벡터 theta 로 주어진 ) 적절한 개수의 파라미터를 이용해서 찾는 것이다. 이를 근사 Q-러닝 approximate Q-learning 이라고 하고, 뽑아낸 특성의 선형 조합으로 근사하였는데, 2013년 Q-가치를 추정하기위해서 사용한 DNN인 심층 Q-네트워크 deep Q-network DQN 이 특히 복잡한 문제에서 가장 좋은 결과를 냈다. 이를 심층 Q-러닝 deep Q-learning 이라 한다.
DQN훈련 방법은 상태-행동 쌍 (s, a) 에 대해 벨맨 식을 통해서 approximate Q-value 는 상태 s 에 행동 a 를 수행할때 관측된 보상 r 과 이후에 최적으로 행동했을때, 할인된 가치를 더한 값이 가능한 가까워야 한다. 미래에 계산되는 할인된 가치는 다음 상태 s' 에 가능한 행동 a' 에 대해 DQN을 수행하면된다. ( 무슨뜻?, 상태와 행동을 입력받고 가치를 반환하는 신경망인듯 ) 그럼 모든 가능한 행동에 대해 Q-value를 얻을 수 있다. 이중 가장 높은 가치를 지니는 행동을 선택하고, 할인을 적용하면 미래 보상의 추정을 얻을 수 있다. 상태 s, 행동 a 에 대한 Q-value는 관측된 보상 r 와 위에서 미래에 할인된 추정가치를 더해서 얻을 수 있다. 이게 현재 Q-value 의 타깃 값이다.
이 타깃 값으로 DQN의 경사하강법을 수행할 수 있다. 즉 추정된 ( 상태 s, 행동 a 를 입력해서 얻은 Q(s, a) 값) Q-value 값과 타깃 Q-value 사이의 제곱 오차를 최소화한다. ( 또는 큰 오차에 민감하지 않도록 huber loss 를 사용한다. )
18.10 심층 Q-learning 구현하기
위에서 봤듯이 DQN은 이론적으로 상태-행동 쌍을 받아 Q-value를 출력하는 신경망이지만, 실용적으로 상태를 입력받아 가능한 모든 행동에 대해 모든 Q-value 값을 출력하는 것이 훨신 효율적이다.
CartPole-v1 에 DQN을 적용해서 학습시켜본다.
- DQN 생성 : Dense-Dense-output 으로 구성한다.
- epsilon-greedy-policy 를 정의한다. epsilon 확률로 랜덤선택한다.
- 입력으로 사용될 replay-buffer 을 구성한다. 스텝 수행결과를 저장하는 재생 버퍼 replay buffer (재생 메모리 replay memroy) 각 입력은 state, action, reward, next_state, done 으로 구성된다.
- 위의 relay buffer 에서 무작위로 sampling 하는 함수를 정의한다.
- state 를 입력으로 받아 한스텝 진행하는 play one step 함수를 정의한다.
- 각 Train Step : relay buffer 에서 샘플링하고, 현재 reward 에 다음 상태를 모델에 predict 최대 Q-value 를 골라서 target Q-value 를 만들고, tape 범위속에서 현재 상태를 모델에 입력후 모든 행동에 따른 Q-value 를 총합해서 target Q-value 와 loss (mse) 를 구하고, gradients를 적용한다.
- 에피소드 수행수와, 최대 스텝수를 지정해 반복한다. 모든 에피소드에서 최대 성능을 보이는 모델을 저장하고, 최대 스텝수만큼 랜덤 탐험 정책으로 게임이 종료될때까지 수행하면서 replay buffer 을 충분히 채운다. 그리고 적당히 채워졌다고 생각했을때, 각 에피소드에서 모든 스텝이 끝나고 training step 을 수행한다.
위와같이 최고성능 에피소드를 지나고 배운 것을 완전히 망각해서 성능이 급격히 떨어지는 현상은 모든 RL 알고리즘이 직면하는 큰 문제이다. 이후 환경에서 배운것이 이전에 학습한 것을 망가뜨릴 수 있기때문이다. 이를 최악의 망각catastrophic forgetting 이라고 한다..
경험은 크게 연관되어서 학습 환경이 계속바뀌어 경사하강법과 잘맞지않는다. 그래서 대부분 훈련이 불안정하고, 하이퍼파라미터 값과 랜덤 시드 값에 매우 민감하다. 또한 손실과 모델의 성능평가에 좋지않다. 손실이 적다고 에이전트가 엉망으로 행동할 수 있다. 예를들어 환경의 작은 부분에 갇혀 ( 충분한 탐험이 되지않음 ) DQN이 그 영역에 과대적합될 수 있다.
18.11 심층 Q-learning 의 변종
18.11.1 고정 Q-value 타깃
기존 심층 Q-learning 알고리즘에서는 모델은 예측을 만들고 타깃을 설정하는데 모두 사용된다. 이런 피드백 순환과정이 네트워크를 불안정하게 만들 수 있다. ( 타깃 자체가 오염됨 ) 발산, 진동, 동결 등의 문제가 생길 수 있다. 이를 해결하기 위해 두 개의 DQN 을 사용해서 하나는 각 스텝에서 학습하고 에이전트를 움직이는데 사용하는 온라인 모델online model 과 타깃을 정의하는데만 사용되는 타깃 모델 target model 을 사용하고 타깃모델은 단순한 온라인 모델의 복사본이다.
타깃을 만들때 생성하는 다음스텝 Q-values 을 target 으로 생성하면된다.
몇번의 에피소드반복마다 target 모델의 가중치를 clone 해서 사용한다. 이는 Q-value 타깃이 훈련에 덜 영향을 받아 안정적이고 앞서 언급한 피드백 반복을 완화시킬수 있다.
18.11.2 더블 DQN
타깃 네트워크가 Q-value 를 과대평가하기 쉽다는 관측에 의해서 ( 다음 상태에 대해 예측한 Q-values중 가장 큰 값을 선택해 새로운 행동을 찾는다. 이러면 예측한 평균 Q-value 보다 당연히 높기때문에 Q-value 를 과대평가한다는 소리이다.) 온라인 모델이 다음 상태에 대해서 새로운 행동을 찾는다. 그리고 새로운 상태에 대한 온라인 모델이 선택한 행동의 Q-value 를 타깃을 만드는데 사용한다.
18.11.3 우선 순위 기반 경험 재생
재생버퍼에서 무작위로 샘플링하는 것이아니라, 중요한 경험을 더 자주 샘플링하는 중요도 샘플링 importance sampling (IS) 또는 우선 순위 기반 경험 재생prioritized experience replay(PER) 이라고 한다. 경험의 중요도를 평가하는 방법으로 TD 오차 delta = r + gamma * V(s') - V(s) 의 크기를 통해 높으면 배울가치가 높다고 평가한다. 경험이 샘플링 버퍼에 저장될 때 매우 높은 우선순위 값으로 저장된다. 최소한 한번은 샘플링되어야 되기때문에, 그리고 한번 샘플링되면 TD 오차 값을 계산해 경험 우선순위 값 p = | delta | 으로 설정한다. (샘플링 확률이 0 이 되지않도록 상수를 더한다.) 우선순위 p 의 경험을 샘플링할 확률 P 는 p^zeta 에 비례한다. zeta 는 우선순위 샘플링을 얼마나 중요하게 생각할지의 하이퍼파라미터이다. 0 은 균등하게, 1 은 완전한 중요도 샘플링이고, 논문 저자는 0.6 을 사용했다.
이렇게 중요한 경험의 샘플링확률을 높이면, 중요한 경험에 편향되어 훈련하는 동안 적용하는 중요도에 따라 경험 가중치를 낮춰서 이 편향을 보상해줘야한다. 즉 중요한 경험이 더 자주샘플링되는건 좋지만, 자주 샘플링되면서 업데이트하는 가중치는 낮춰야 한다는 의미이다. 훈련할 때 각 경험의 훈련 가중치 w = (nP)^-beta 를 정의한다. n 은 재생버퍼의 경험수, P 는 각 경험의 샘플링확률, beta 는 중요도 샘플링 편향을 얼마나 보상할지 하이퍼파라미터이다. beta = 0 이면 편향 보상이없고, 1 이면 그 반대이다. 논문저자는 beta 를 0.4 ~ 1 까지 선형적으로 증가시켜서 사용하였다.
18.11.4 듀얼링 DQN
듀얼링 DQN dueling DQN 알고리즘은 (DDQN, 듀얼 DQN과는 다르다.) 듀얼링 DQN은 상태-행동 쌍 (s, a) 의 Q-value 는
Q(s, a) = V(s) + A(s, a) 이고 A(s, a) 는 상태 s 에서 다른 가능한 모든 행동들에 비교해서 행동 a 를 선택했을 때의 이득 advantage 값이다. 또한 상태의 가치 V(s) 는 최선의 행동 a*를 선택했을 때의 Q-value Q(s, a*) 값과 동일하다. 즉 상태 s 에 대한 최선의 행동 a* 를 선택했을 때 이득 값은 A(s, a*) = 0 을 의미한다.
듀얼링 DQN 모델은 상태의 가치 V(s) 와 각 행동에 대한 A(s, a_i) 이득을 추정한다. 최선의 행동은 이익이 0 이기 때문에, 각 행동의 이익을 0 으로 만들기위해서 각 행동 이익에 최대 이익을 빼서 이익을 만든다.
18.12 TF-Agents 라이브러리
TF-Agents 라이브러리는 텐서플로기반 강화학습 라이브러리로 많은 환경을 내장한다. (3D 물리시뮬레이션) PyBullet, (MuJoCo 물리엔진 기반) DM Control, (3D 환경 시뮬레이션) ML-Agents, REINFORCE, DQN, DDQN, 효율적인 재생버퍼, 측정지표, 환경 커스터마이징 가능 등 많은 기능들을 사용할 수 있다.
18.12.1 TF-Agents 설치하기
pip install -U tf-agents
pip install -U "gym[atari]"
18.12.2 TF-Agents 환경
from tf_agents.enviroments import suite_gym
env = suite_gym.load("Breakout-v4")
tf-agents 의 env.reset() 은 직접 관측을 반환하지않고, TimeStep 객체에 담아서 반환한다.
step_type : 처음 = 0, 중간 = 1, 마지막= 2 인 값을 담는다.
reward : 보상
discount : 할인 계수
observation : 관측 환경
current_time_step() 으로 언제든 현재 타임스텝 참조가능
18.12.3 환경 스펙
tf-agents 는 관측, 행동, 타임스텝크기, 데이터타입, 이름, 최소 최대값을 포함하는 스펙specification 을 제공한다.
env.observation_spec()
env.actioin_spec()
env.gym.get_action_meanings()
env.step_spec()
과 같은 메서드로 다양한 정보를 얻을 수 있다.
18.12.4 환경 래퍼environment wrapper 와 아타리 전처리
tf_agents.environments.wrappers 패키지에 여러 환경 래퍼를 제공한다. 환경 래퍼는 환경을 감싸 모든 호출을 환경으로 전달한다.
- ActionClipWrapper
행동 스펙에 맞게 행동을 클리핑한다. (스펙의 최대 최소 값으로 자른다.)
- ActionDiscretizeWrapper
연속적인 행동 공간 ( -1.0 ~ +1.0 ) 을 이산적인 행동 공간( -1.0, -0.5, 0.0, +0.5, +1.0) 으로 양자화한다.
DQN 같은 이산 행동공간만 지원하는경우 사용한다. discrete_env = ActionDiscretizeWrapper(env, num_actions=5)
- ActionRepeat
행동을 n 스텝동안 반복하면서 보상을 누적한다. 훈련속도 높이는데 도움이 된다.
- RunStats
스텝 개수와 에피소드 개수 같은 환경 통계를 기록한다.
- TimeLimit
최대 스텝 개수보다 오래 실행되면 환경을 중지한다.
OpenAI gym 환경을 래핑하기 위해서 gym.wrappers 패키지를 사용한다. TF-Agents 환경을 만들기 전에 gym 을 wrapper으로 감싸고 tf-agents 래퍼로 감싸야 한다.
from gym.wrappers import TimeLimit
limited_repeating_env = suite_gym.load(
"Breakout-v4",
gym_env_wrappers=[lambda env: TimeLimit(env, max_episode_steps=10000)],
env_wrappers=[lambda env: ActionRepeat(env, times=4)]
)
위 환경은 각 에피소드에서 최대 10000번의 스텝을 실행하고 각 행동이 4번 반복되는 브레이크 아웃 환경이다.
아타리 환경의 경우 대부분의 논문에서 적용하는 표준 전처리 단계가 있다. 이를 한번에 제공하는 AtariPreprocessing 이라는 래퍼를 제공한다.
- 흑백 변환과 다운샘플링 ( 84x84 )
- 맥스 풀링 ( 마지막 두프레임을 1x1 필터로 맥스풀링한다. )
- 프레임 스킵 ( 에이전트는 4프레임마다 게임을 본다. 게임 속도를 높히고, 보상 지연이 줄어들어 훈련속도가 빨라진다. )
전처리를 수행한 환경에 왼쪽으로 4프레임 진행시킨 환경 모습
이렇게 만든 파이썬 환경을 tf_agents.environments.tf_py_environment import TFPyEnvironment 으로 감싸 텐서플로 그래프안에 환경을 사용하게 만들 수 있다.
18.12.5 훈련 구조
드라이버driver 는 수집 정책collect policy 으로 행동을 선택해서 환경environment 를 탐색하고, 경로trajectory ( 경험 ) 을 모은다. 이 경로를 옵저버observer 으로 보내어 재생 버퍼replay buffer 에 저장한다.
에이전트 agent 는 재생 버퍼에서 경로의 배치를 추출해서 수집 정책이 사용할 네트워크network 를 훈련한다.
- CPU 코어와 GPU 코어를 활용하기위해서 환경을 여러개 복사해 탐색한다.
- 경로trajectory 는 한 타임스텝에서 다음 타임 스텝으로 전환되는것 또는 n 타임 스텝에서 n + t 타임 스텝까지 연속된 시퀀스.
- 옵저버는 경로를 유연하게 저장하기 위해서 사용된다.
18.12.6 심층 Q-네트워크 만들기
tf_agents.networks.q_network.QNetwork 클래스를 이용해서 생성한다.
환경의 spec 들을 전달하고, preprocessing_layers 으로 전처리 층 ( 케라스 층 및 모델도 사용가능하다, 입력이 여러개로 각각 전처리를 수행하기위해서 리스트로 전달할 수 있다. ), conv_layer_params 으로 합성곱 층 구조, fc_layer_params 으로 출력층 구조를 전달한다. 출력층은 활성화 함수를 사용하지않고, 나머지는 relu 를 사용한다.
18.12.7 DQN 에이전트 만들기
tf_agents.agents.dqn.dqn_agent.DqnAgent 클래스로 에이전트를 구현할 수 있다.
18.12.8 재생 버퍼와 옵저버 만들기
tf_agents.replay_buffers.tf_uniform_replay_buffer.TFUniformReplaybuffer 클래스를 사용한다. tf 로시작하는 건 텐서플로기반, py 로 시작하는건 파이썬 기반이다.
18.12.9 훈련 측정 지표 만들기
tf_agents.metrics.tf_metrics 에 여러 강화 학습 측정 지표가 구현되어있다.
각 metrics 클래스에 result() 메서드 호출로 지표값을 확인할 수 있고, log_metrics() 으로 로깅할 수 있다.
18.12.10 수집 드러이버 만들기
드라이버는 주어진 정책으로 환경을 탐색하고, 경험을 수집하고 옵저버에 전파하는 객체이다.
- 현재 타임 스텝을 수집 정책에 전달하고, 수집 정책을 타임 스텝을 사용해 행동을 선택해 행동을 포함한 행동 스텝action step 을 반환한다.
- 행동을 환경에 전달하고 다음 타임 스텝을 반환 받는다.
- 이 전이를 표현하는 경로 객체를 만들고 모든 옵저버에 전파한다.
RNN 정책같은 상태가 있는 정책도 있다. 주어진 타임 스텝과 내부 상태를 기반으로 행동을 선택한다. 이러한 수집 정책은 행동 스텝을 반환할때 행동과 자체적인 내부 상태도 같이 반환한다. 드라이버는 이 상태를 정책으로 다시 전달하고, 경로에 정책 상태를 저장해 재생 버퍼에 저장된다.
배치 환경인 경우 배치 타임 스텝batched time step 을 정책에 전달한다 ( 모든 타임 스텝 정보의 배치 형태 ). 드라이버는 이전 정책 상태의 배치도 전달하고, 정책은 행동 배치와 정책 상태 배치를 담은 배치 행동 스텝batched action step을 반환한다. 드라이버는 배치 경로batched trajectory 를 만든다.
tf_agents.drives.dynamic_step_drive.DynamicStepDriver 을 이용한다.
18.12.11 데이터셋 만들기
경로의 배치를 샘플링하기 위해 재생 버퍼의 as_dataset() 메서드를 호출한다. 파라미터로 sample_batch_size, num_steps 를 지정가능하다.
결과값으로 trajectories, buffer_info 를 반환하고, trajectories는 step_type, observation, action, policy_info, next_step_type, reward, discount 를 포함하는 튜플이다.
전이 n 은 타임스텝 n, 행동 n, 타임 스텝 n + 1 으로 구성되고, 전이 n + 1 은 타임스텝 n + 1, 행동 n + 1, 타임스텝 n + 2 로 중간에 타임스텝 n + 1 이 중복되어 저장된다.
그래서 경로스텝이 저장될때는, 타임스텝 n 의 step_type, observation 과 타임 스텝 n + 1 의 step_type 만 가지고 있다.
tf_agents.trajectories.trajectory.to_transition 함수는 배치 경로를 time_step, action_step, next_time_step ( 전이 )을 담은 리스트로 반환한다. 타임 스텝 t +1 개 사이에 t 개의 전이가 있기 때문에 스텝 차원이 하나 줄어든다.
18.13 유명한 강화 학습 알고리즘
- 액터-크리틱 actor-critic 알고리즘
- A3C asynchronous advantage actor-critic
- A2C advantage actor-critic
- SAC soft actor-critic
- PPO proximal policy optimization
- 호기심 기반 탐색 curiousity-baased exploration