개발

Q Learning과 DQN

박붕어 2023. 12. 9. 16:58

목차

1. Q learning이란?

2. Q러닝을 이용한 미로찾기

3. Q러닝을 이용한 Cartpole

4. DQN을 이용한 Cartpole

1. Q learning이란?

Q러닝이란?

모델이 없는 Model-Free상태에서 학습하는 강화학습으로 유한한 마르코프 결정과정(FMDP)에서 특정 Agent가 특정 상황에서 특정 행동을 할 수 있는 최적의 Policy를 배우는 것.

현재 상태로부터 시작해 모든 연속적인 단계들을 거쳤을 때 전체 보상의 예측값을 극대화하는 것을 목표로 한다.

 

 

특정 State에서 행하는 Action의 가치를 평가하고, 그 가치를 극대화 하는 쪽으로 행동하는 것이라고 볼 수 있겠습니다.

위 식에서 감마는 Discount Factor인데, 0~1사이로 현재로부터 멀리 떨어진 보상의 가치가 같거나 떨어지거나를 의미합니다.

그럼 예제를 한번 보겠습니다.

2. Q러닝을 이용한 미로찾기

Q러닝을 통해서 미로 찾는 Agent를 학습시켜 보겠습니다.

 

이런식으로 미로가 있고

상태는 S0부터 S8까지 있습니다. S8에 도착하면 에피소드가 종료되게 됩니다.

Agent가 할 수 있는 액션은 "상","좌","하","우"가 있을 것이고, 빨간색 벽을 넘어서 이동할수는 없습니다.

그럼 우리 Agent가 길을 잘 찾을 수 있도록 학습시켜 볼까요?

1. Q 러닝을 이용해서 미로 찾기 수행 과정

Q 테이블을 만들고 Q값을 업데이트 하며 미로찾기 수행.

 

 

각 State에 대한 액션의 가치를 랜덤으로 초기화해줍니다.

State0에서의 "상","좌","하","우" Action에 대한 가치가 nan, 0.02, 0.033, nan으로 초기화가 된 것을 볼 수 있습니다.

epsilon은 무작위로 행동할 가능성을 나타내는데 이는 Q러닝에서는 모델을 모르기 때문에

가보지 않은 길을 가보는 탐험을 할 가능성을 나타냅니다. 탐험을 하지 않는다면 가본 길로만 가는 정책이 형성되기 때문에 최적의 가치에 수렴하지 않을 수 있습니다.

 

한번 Action을 하고 난 다음에는 Q 테이블을 수정합니다.

벨만 방정식에 따라 다음과 같은 관계식이 성립하는데

학습중에는 행동가치함수가 정확하지 않기 때문에 이 관계식의 등호가 성립하지 않습니다.

따라서 위 변의 차이를 TD 오차라고 하고, TD오차가 0이 되면 정확한 행동 가치 함수가 학습된 것이라고 봅니다.

Q러닝에서는 이 수정식을 사용하여 행동 가치 함수를 학습하게 됩니다.

2. 결과

동영상

 

 

상태 가치 함수값이 변화하는 모습을 시각화 한 영상입니다.

학습이 진행됨에 따라 상태가치가 높아지면서 목표지점으로 가는 경로가 붉어지는 것을 볼 수 있습니다.

결론

1. 보상을 받게 되는 지점인 목표 지점부터 거슬러 올라가면서 상태가치가 학습되는 양상을 보인다

2. 학습 이후에는 시작 지점부터 목표 지점까지 가는 경로가 형성된다.

3. Q러닝을 이용한 Cartpole

Cartpole이란?

막대기를 세우는 과제.

강화학습에서도 널리 사용되는 단골 과제입니다.

수레가 Agent이고

State에는 수레의 위치, 수레의 속도, 봉의 각도, 봉의 각속도가 있습니다.

Action에는 수레를 오른쪽으로 움직이는 것, 왼쪽으로 움직이는 것. 이렇게 두가지 Action이 있습니다.

1. 무작위로 action을 선택한 경우

 

학습 전

수레를 무작위로 움직이도록 했을 때 입니다.

막대가 돌아다니죠? 이러면 안되는겁니다.

이 막대를 계속 세울 수 있도록 학습시켜 보도록 하겠습니다.

2. Q table을 사용한 Q learning

이 State는 이산값이 아닌 연속값을 갖기 때문에 Q러닝을 위해서 이 연속값을 이산값으로 변환시켜주어야 합니다. State들은 다음과 같은 범위를 갖습니다.

  • 수레의 위치 ( -2.4 ~ 2.4 )
  • 수레의 속도 ( -Inf ~ Inf )
  • 봉의 각도 ( -41.8도 ~ 41.8도 )
  • 봉의 각속도 ( -Inf ~ Inf )

수레의 위치, 수레의 속도, 봉의 각도, 봉의 각속도를 6개의 구간으로 나누어 연속값을 이산값으로 변환시킨 후 Q테이블을 생성합니다.

Q Table을 생성한 뒤 구현 과정은 다음과 같습니다.

  1. State를 고려하여 최적의 행동을 결정한다.
  2. 행동을 취한 뒤 환경을 한단계 진행시킨다.
  3. 그 정보를 가지고 Q테이블을 수정한다.

 

  1. decide_action함수를 사용하여 행동을 결정한 뒤
  2. 행동을 취하고 다음 Observation을 받습니다. 그 Observation을 가지고
  3. update_Q_table함수를 사용하여 Q테이블을 수정합니다.

이 과정을 수행함으로써, 각 State에 대한 행동 가치함수를 학습하고, 최종적으로 수레가 막대를 꾸준히 세울 수 있도록 학습할 수 있습니다.

 

뇌를 탑재시켜준 Agent를 생성하고

 

다음과 같은 Parameter에서 학습을 시켜보았습니다.

200step을 봉을 들고 서있을 경우 게임이 끝남과 함께 Reward 1을 주었고

게임을 연속으로 10번 clear했을 경우 학습을 종료하록 하였습니다.

224,156,140,258,150,195,342,239,186,239

평균 212 Episode에 학습이 되었습니다.

 

4. DQN을 이용한 Cartpole

1. DQN(Deeo Q Learning)이란?

표 형식의 행동가치함수를 사용할 때 Q러닝의 문제점 : State수가 많아지면 연산의 수가 기하급수적으로 늘어나게 됩니다.

이러한 한계를 극복하기 위해 State가 많은 Task에 각 State를 신경망의 입력으로 삼고, 출력을 Action에 대한 행동 가치함수의 값으로 삼는 Network를 만드는 것이 DQN입니다.

즉 기존의 Q 테이블을 Q Network으로 바꾼 것이 DQN입니다.

 

Q러닝에서는 한 단계씩 학습을 진행하며 행동 가치함수를 학습했다면

DQN에서는 State와 Action이 주어지면 행동 가치 함수의 함수값이 나오고

이 값을 오차값을 0으로 하게 하는 네트워크를 학습하는 것입니다.

 

오차를 줄이는 방향으로 학습시킵니다.

2. 방법

1. Fixed Target Q-Network

저는 DQN을 보고 든 생각은 “ 정답이 없는데 어떻게 학습을 시키지?” 라는 생각이였습니다. 보통 사용하는 Network는 Data와 Label이 있는 Supervised Learning이고, 그 Network을 학습시키기 위해서는 정답이 있어야 한다고 생각했습니다.

 

과연 어떻게 Network을 학습을 할까요?

DQN에서는 Network을 두개를 사용합니다.

행동을 결정하는 Main-Network와 오차함수 계산시에 행동가치를 계산하는 Target-Network를 구분합니다.

$$ Q(s_t,a_t) = Q(s_t,a_t) + \eta * (R_{t+1} + \gamma *max_aQ(s_{t+1},a_{t+1}) - Q(s_t,a_t)) $$

 

원래 Q함수를 구하는 식이죠.

$$ Q_m(s_t,a_t) =Q_m(s_t,a_t) + \eta * (R_{t+1} + \gamma *max_aQ_t(s_{t+1},a_{t}) - Q_m(s_t,a_t)) $$

 

 

다음과 같이 

를 구하는 Network를 따로 만들어 학습시킵니다.

 

 

Target-Network를 사용하여 Main-Network를 학습시키고, 일정 Step이 지난 후에 Main-Network의 가중치를 Target-Network에 덮어 씌인 후 다시 학습을 진행하는 방식을 사용합니다.

2. Experience Replay

DQN에서 단계별로 학습을 진행하게 되면 신경망이 시간적으로 correlation이 높은 내용을 연속적으로 학습하게 되므로 학습이 안정적으로 수행되기 어려워진다고 합니다.

따라서, 표 형식의 Q러닝처럼 각 단계마다 해당 단계의 내용을 학습하는 것이 아니라 메모리에 각 단계의 내용을 저장하고, 그 중에서 무작위로 꺼내 신경망을 학습시킵니다.

비고.

간단한 구현을 위해 Main-Network와 Target-Network을 분리하지 않고 같은 Network을 사용하는 예제를 사용하였습니다.

2. Pytorch를 사용한 Deep Learning Network

1. Experience Replay

각 단계의 내용을 저장하는 클래스 생성

 

mod연산자를 사용해서 Capacity만큼의 transition을 저장합니다.

transition : 한 단계의 State, Action, Reward의 값.

2. Network 설계

 

간단한 Fully Connected Network를 설계하였습니다.

ReLu와 Adam Optimizer를 사용하였습니다.

 

메모리에서 Batch만큼의 transition을 추출하고

Batch를 만들어 줍니다.

 

신경망에 입력값으로 준 State에 대한 Output(Action)의 값은 행동 가치 함수값이 되고

그 행동 가치 함수값을 정답신호로 사용하도록 합니다.

 

다음은 $\gamma *max_aQ_t(s_{t+1},a_{t})$를 만듭니다.

 

 

$\gamma *max_aQ_t(s_{t+1},a_{t})$를 학습시 Label값으로 주는 것을 볼 수 있습니다.

 

E-greedy 알고리즘을 사용하여 정해진 행동이 아닌 탐험을 할 확률을 정해줍니다.

이 탐험을 할 확률은 episode가 지날수록 점점 줄어들게 됩니다.

 

뇌 달린 Agent 클래스 만듭니다.

Q러닝의 Agent와 다른 점은 memorize함수를 통해 State를 저장한다는 것입니다.

 

다음과 같은 파라미터를 사용하여 학습하였습니다.

Q 러닝에서 사용한 조건과 같은 조건으로

200step을 봉을 들고 서있을 경우 게임이 끝남과 함께 Reward 1을 주었고

게임을 연속으로 10번 clear했을 경우 학습을 종료하록 하였습니다.

3. 결과

최고의 플레이

206,144,237,84,119,118,226,194,147,184

평균 165.9 episode만에 학습이 되는 것을 확인할 수 있었습니다.