Deep RL

MostlyFor·2023년 2월 14일
0

강화학습

목록 보기
11/12

Deep RL이 필요한 이유

state space가 비약적으로 클 경우, 또는 연속적인 state space를 가질 경우 기존 table 기반 학습법으로는 모든 상태를 방문할 수가 없다. 따라서 (s,v(s))를 학습하여 학습하지 못한 상태에 대해서도 가치함수를 추정할 수 있게 해야 하는데, 그 방법 중 하나가 함수이다.

f(s)=vπ(s)f(s) = v_\pi^{}(s), 다음과 같은 형태의 상태를 인수로 가지고 가치를 반환하는 하나의 함수를 생각해보자.

만약, 상태와 가치가 특정한 관계를 가진다면 우리는 위와 같이 가치함수를 하나의 식으로 표현할 수 있게 된다. 이를 이용하면 학습한 상태가 아니라도 추정이 가능하게 되고 이것이 근사함수가 가지는 generalization의 의미이다.

그렇다면 상태와 가치의 관계를 가장 잘 표현하는 함수를 어떻게 찾아낼까?
-> 이는 MSE를 주로 사용하고 더 나아가서는 신경망을 활용하게 된다.

하지만, 가치 함수는 본래 리턴값의 기댓값으로 하나의 값이 정해져있다. 반면 각 에피소드마다 리턴값이 다르므로 리턴값은 확률값이다. 따라서 하나의 에피소드를 데이터로 근사함수를 학습할 때, 리턴값에 값을 정확히 맞출 필요는 없다.

가치 기반 에이전트 (Q함수에 따라 행동)

기존의 sarsa, Q-learning 등의 방법은 여전히 한정된 상태 공간이라는 제약 조건이 있었다. 이를 방지하기 위해 신경망을 이용하여 근사함수를 사용한다고 했었다.

정책 π\pi가 고정되어 있을 때의 가치함수를 vθ,π(s)v_{\theta,\pi}(s) 벨류 네트워크라고 한다. (여기서 θ\theta는 뉴럴넷의 파라미터이다.)

value network는 특정 state에서 고정된 policy를 따랐을 때의 state value를 리턴한다.

value network 학습

신경망을 학습하기 위해서는 Loss function이 필요하다. Loss function을 만들기 위해서는 정답값과 예측값이 필요하다. 손실 함수를 MSE로 사용할 경우 다음과 같이 쓸 수 있다.

L(θ)=s(vtrue(s)vθ(s))2L(\theta)= \sum_{s}(v_{true}(s) - v_\theta(s))^2

우리는 정답값을 MC등의 방법을 통해서 알 수 있지만, 알 수 있다 하더라도 수많은 s를 모두 방문할 수 없기에 위 손실함수의 정의는 사용할 수 없다.

그래서 우선 수많은 s에 대한 문제를 해결하여 loss function을 계산하기 위해 '기댓값' 개념을 활용한다.

L(θ)=Eπ[(vtrue(s)vθ(s))2]L(\theta) = E_\pi[(v_{true}(s) - v_\theta(s))^2]

기댓값 연산자의 의미는 π\pi를 이용해 방문해썬 상태 s에 대해 계산하는 것이다.

이에 대한 계산은 방문한 s의 횟수에 대한 기댓값으로 생각하면 된다.

이렇게 되면 자주 방문한 상태(=중요한 상태) s에 대해서는 가중치가 높게, 그렇지 않은 상태에서는 가중치가 낮게 계산되어 자주 방문한 상태에 대해 더 정확하게 계산이 된다.

θL(θ)=Eπ[2(vtrue(s)vθ(s))θvθ(s)]\nabla_\theta L(\theta) = -E_\pi[2*(v_{true}(s)-v_\theta(s))\nabla_\theta v_\theta(s)]

다음과 같이 parameter θ\theta에 대한 gradient를 계산할 수 있다.

위 값을 계산하기 위해서는 실제 π\pi를 따라가는 sample이 필요하다. 여러 episode를 가지고 위 gradient를 계산하면 우리는 다음의 정의와 같이 parameter θ\theta를 계산할 수 있게 된다.

θθ+αθL(θ)\theta \leftarrow \theta + \alpha\nabla_\theta L(\theta)

이제 실제값 vtruev_{true}만 알게 된다면 value network 학습을 시킬 수 있다.

ture value를 아는 방법은 두 가지가 있다.

MC return

몬테카를로 방식을 이용하여 벨류값을 업데이트 하는 방법은 다음과 같았다.

V(st)V(st)+α(GtV(st))V(s_t) \leftarrow V(s_t) + \alpha(G_t - V(s_t))

가치함수의 정의가 return G의 기댓값인 걸 생각해보면 이를 적용하여 vtruev_{true}를 다음과 같이 바꿀 수 있다.

θL(θ)=Eπ[2(Gtvθ(st))θvθ(st)]\nabla_\theta L(\theta) = -E_\pi[2*(G_t-v_\theta(s_t))\nabla_\theta v_\theta(s_t)]

하지만 MC 방법을 사용할 때의 문제였던 G는 각 episode가 끝나야만 얻는 값이라는 점이 여전히 문제로 남는다. 이럴 경우 TD 방법을 도입한다.

TD 타깃

이것도 마찬가지로 이전의 한 스텝 가서의 보상을 정답값으로 표현한다.

θL(θ)=Eπ[2(rt+1+γvθ(st+1)vθ(st))θvθ(st)]\nabla_\theta L(\theta) = -E_\pi[2*(r_{t+1}+\gamma v_\theta(s_{t+1})-v_\theta(s_t))\nabla_\theta v_\theta(s_t)]

Deep Q - Learning

Q러닝은 벨만 최적 방정식을 이용하여 q 테이블을 업데이트 하는 방법이었다.

Q(s,a)=Es[r+γmaxaQ(s,a)]Q_*(s,a) = E_{s'}[r + \gamma max_{a'}Q_*(s',a')]

위 최적 방정식을 이용하여 다음과 같이 업데이트를 진행했다.

Q(s,a)Q(s,a)+α(r+γmaxaQ(s,a)Q(s,a))Q(s,a) \leftarrow Q(s,a) + \alpha(r+\gamma max_{a'}Q(s',a')-Q(s,a))

즉, 다음 상태로 가서의 greedy 값을 목표로 업데이트를 진행하는 것이었다.

Deep Q - learning도 마찬가지로 위 값을 정답으로 보고 손실함수를 정의한다.

L(θ)=E[(r+γmaxaQθ(s,a)Qθ(s,a))2]L(\theta) = E[(r+\gamma max_{a'}Q_\theta(s',a')-Q_\theta(s,a)) ^2]

학습을 진행할 때 상태가 많을 수록 참 값에 가까우므로 mini - batch 방법을 이용한다.

DQN

DQN (Deep Q-Network)는 뉴럴넷을 이용하여 표현한 Q 함수를 강화하는 것이다.

구글 딥마인드사에서 아타리 게임을 만들 때 딥마인드사는 2가지 방법론을 도입했다.

Experience Replay와 Target Network이다.

Experience Replay

'겪었던 경험을 재사용하면 좋지 않을까?'

경험은 여러 개의 episode로 이루어져 있고 하나의 episode는 여러 개의 transition으로 이루어져 있다.

하나의 상태 전이 ete_t(st,at,rt,st+1)(s_t,a_t,r_t,s_{t+1})로 이루어져 있다.

replay buffer를 이용하여 100만개의 최근 tranition을 저장해두고 임의로 32개를 뽑아 mini-batch로 구성하여 학습

-> 이러한 방법이 각각의 데이터(transition)의 상관성을 깨서 더 효과적이었다고 함.

상관성을 깨는게 왜 효과적이지?

Target Network

DQN에서는 정답이 parameter θ\theta에 의존한다. 따라서 파라미터를 업데이트 할 때마다 정답값이 바뀌게 되는데 이는 학습에 있어서 굉장히 불안정하게 만든다.

이를 방지하기 위해서 정답을 계산할 때 사용하는 네트워크 - target network와 학습을 받고 있는 Q - network 2개를 만들어 이용한다.

그리고 정답을 계산할 때는 target network를 이용하고 일정 주기로 target network의 paramter를 교체한다.

0개의 댓글