My Blog

강화학습(MDP 모를때 최고의 정책 찾는 방법-몬테카를로 컨트롤 편)


MDP를 모를때 최고 정책 찾는 방법

MDP(Markov Decision Process)를 모를 때 최고의 정책을 찾기 위해서는 강화학습의 비모델 기반 접근 방법을 사용할 수 있습니다. 이러한 방법들은 환경에 대한 명시적인 모델 없이도 에이전트가 경험을 통해 학습하고 최적의 정책을 찾을 수 있도록 설계되었습니다. 그 전에 MC와 TD를 이용해 주어진 정책을 평가하는 방법을 알아보았습니다. 하지만 이는 정책을 평가하는 방법론일뿐 최고의 정책을 찾는 방법은 아직 모르는 상태입니다. 이번 장에서는 최고의 정책을 평가하는 방법이 아닌, 최고의 정책을 찾는 방법에 대해 알아보도록 하겠습니다. 중요한 것은 여전히 테이블에 모든 상태의 가치를 담을 수 있을 정도로 상태의 개수나 액션의 개수가 작은 MDP세팅에 대해 알아볼 것이고, 여전히 MDP에 대한 상태 전이확률과 보상함수를 전혀 모르고 있는 상황이라 가정합니다. 1. 몬테카를로(Monte Carlo) 방법 완전한 에피소드를 기반으로 경험에서 얻은 보상의 합을 사용하여 각 상태의 가치를 추정합니다. 에피소드가 완전히 끝난 후에 각 상태의 가치 평가와 정책 개선을 진행합니다. 장점은 전체적인 반환값을 사용하여 가치를 추정하기 때문에 분산은 높지만 비편향적인 추정이 가능합니다. 단점은 긴 에피소드 또는 무한한 에피소드가 있을 경우 효율적이지 않을 수 있습니다. 2. 시간 차이(Temporal Difference, TD) 학습 TD 학습은 경험의 각 단계에서 즉시 가치 업데이트를 수행합니다. 가치 함수는 실제 보상과 현재 가치 추정치의 차이(TD 오류)를 사용하여 업데이트됩니다. TD 학습의 예로는 TD(0), SARSA, Q-learning 등이 있습니다. 장점은 부분적인 경험을 바탕으로 빠르게 학습할 수 있다는 것입니다. 단점은 초기 추정치가 결과에 영향을 미칠 수 있는 편향적인 추정을 할 수 있다는 것입니다. 3. Q-러닝(Q-Learning) Q-러닝은 TD 학습의 일종으로, 상태와 행동 쌍에 대한 가치(Q 값)를 직접 추정합니다. 최적의 정책을 찾기 위해 환경에 대한 모델을 필요로 하지 않습니다. Q-러닝은 각 단계에서 최대 보상을 가져올 것으로 예상되는 행동을 선택하여 Q 값을 업데이트합니다. 장점은 환경의 다이내믹스를 몰라도 최적의 정책을 찾을 수 있다는 것입니다. 단점은 대규모 상태 공간에서 Q 값의 수렴을 보장하기 어렵고 많은 학습 시간이 필요할 수 있다는 것입니다. 결론 MDP를 명확히 모르는 경우에도 강화학습 방법을 사용하여 최적의 정책을 찾을 수 있습니다. 선택하는 방법은 주로 특정 문제의 특성, 에피소드의 구조, 계산 자원 등에 따라 달라질 수 있습니다.

몬테카를로 컨트롤(Monte Carlo control) 방법의 한계

모델-프리 상황에서 정책 이터레이션을 그대로 사용할 수는 없습니다. 벨만 기대방정식에서 보상과 상태전이 확률을 알지 못하기 때문에 평가 단계에서 반복적 정책평가를 사용할 수 없다는 점입니다. 보상을 알기 위해서는 직접 액션을 해서 값을 받아야하고 다음 상태가 어디가 될지도 모르고, 실제 액션을 통해 알수 있고, 그것도 얼마의 확률로 이 상태에 도착했는지, 다른 상태에서 도착할 확률은 얼마인지 정보도 알지 못하기 때문에 벨만 기대방정식을 사용할 수 없게 됩니다. 또한 상태 전이에 대한 정보를 모르기에 도착하는 상태의 밸류도 비교할 수 없고 액션의 우열도 비교할 수 없습니다.

몬테카를로 컨트롤 변형과 탐색(exploration)

이러한 모델-프리 상황에서 정책 이터레이션을 그대로 적용하기 위해서는 변형이 필요합니다. 이때 해결방법은 상태가치함수인 V(s)로만 정책 개선단계의 그리디 정책을 생성할 수 없기에 V(s) 대신 상태-액션 가치 함수인 q(s,a)를 사용하게 됩니다. 이렇게 되면 MDP를 알지 못해도 그리디 액션을 선택할 수 있게 되고, 그 액션으로 인해 어느 상태에 도달하는지는 모르지만 각 액션의 밸류는 알수 있고 그 밸류가 가장 높은 액션을 선택할 수 있습니다. 몬테카를로를 이용해 q(s,a) 함수를 먼저 계산하고, 평가된 q(s,a)를 이용해 새로운 그리디 정책을 만듭니다. 그 다음 이 정책에 또 다시 MC를 이용해 q(s,a)를 계산하는 과정을 반복하면 어느 정도 최적 정책을 찾는 것이 가능합니다. 이때 필요한 것이 탐색(exploration)입니다.

앱실론 그리디(decaying e-greedy)

여기서 탐색은 강화학습에서 에이전트가 최적의 해를 찾기 위한 탐색이라는 의미입니다. 기존의 그리디 정책에서는 어느 한 상태 s에 대해 정해진 액션 a만 실행하게 되는데, 이럴경우 다른 액션들이 선택될 기회가 영구히 사라지는 것이고, 이것은 더 좋은 액션에 대한 기회가 없어지게 됩니다. 이처럼 다른 액션의 기회가 보장될때 최적의 정책을 찾을 수 있기 때문에 탐색을 그리디와 같이 고정하는 것이 아닌 탐색의 정도를 조정해 일정 확률로 다른 액션을 취하도록 하게 할수 있습니다. 이것을 e-greedy(앱실론 그리디)라고 합니다. 그래서 초반의 에이전트는 높은 랜덤 확률로 탐색을 실행하다가, 차츰 낮은 확률의 탐색 기회를 얻게 되고, 이것을 조정해 주는 것이 e그리디 방법입니다. 주어진 환경에 대한 정보를 충분히 얻었고 이미 얻은 정보를 바탕으로 조금 더 최선의 선택을 내리는 데 집중하게 되는데, 이때 줄여나간다는 의미인 decay가 사용되어 decaying e-greedy라고 부를 수 있습니다. 몬테카를로 컨트롤은 정책평가 단계에서 MC를 이용해 q(s,a)를 구하고, 정책개선 단계에서는 q(s,a)에 대한 e-greedy 정책을 만듭니다. 더 이상 정책이 변하지 않을때까지 반복하여 최적의 정책을 얻게 됩니다.

몬테카를로 컨트롤 방법 정리

기존의 정책 이터레이션이 평가단계에 수렴할때까지 진행한 것과 다르게 평가 단계에서 업데이트를 수렴할때까지 하지 않고, 일단 가치 테이블에 저장해둔 값들이 조금이라도 바뀌면 그에 대해 개선 단개를 진행하도록 합니다. 전체적인 순서는 다음과 같습니다. 1)한 에피소드의 경험 쌓기 2)경험한 데이터로 q(s,a) 테이블의 값을 업데이트(정책평가) 3)업데이트된 q(s,a) 테이블을 이용해 e-greedy정책을 만듭니다.(정책개선) 위 과정을 수렴할때까지 n번 반복합니다. 먼저 환경을 구성합니다. [환경] 환경 class를 만듭니다. 환경 안에는 에이전트의 최초 위치를 x, y, z 등의 좌표 위치를 초기화 합니다. 함수 def step으로 지정해 에이전트의 활동 액션영역을 만듭니다. 액션을 받아 상태변이를 일으키고 보상을 정해주는 함수입니다. 에이전트의 각 엑션에 따른 환경변화를 각각의 함수로 만듭니다. 예를들어 def move_left(self), def move_right(self)...등과 같은 방식으로 만들고 해당 MDP에서 이동할 수 있는 최대치를 이곳에서 설정해 줍니다. 그 과정은 에이전트의 움직임에 따른 다음 환경을 얻는 함수를 만듭니다. 최초 환경의 종료조건을 달성했을 때 에피소드가 끝났는지 판별해주는 함수를 작성합니다. reset 기능을 넣어 에이전트가 종료 조건 달성한 이후 초기화 상태를 만들어 놓기위해 설정합니다. 다음은 QAgent 클래스를 만듭니다. [QAgent] q벨류를 저장하는 변수를 처음에 모두 0으로 초기화 시킵니다. 그리고 e-greedy에 적용될 초기 epsilon을 지정합니다. 또 학습률 알파 alpht를 지정합니다. 에이전트의 액션을 선택해 주는데 랜덤이 아닌 epsilon-greedy로 액션을 선택하도록 합니다. e-greedy값은 0.9에서 시작해서 0.1까지 선형적으로 줄어들게 할수 있습니다. 그리고 업데이트 테이블 즉, 한 에피소드에 해당하는 history를 입력으로 받아 q테이블의 값을 업데이트 하는 함수를 작성합니다. 그 다음 anneal_eps함수는 epsilon의 값을 점차 줄여주도록 만듭니다. show table함수는 학습이 끝난 후 상태별로 q(s,a) 수치 중 값이 가장 큰 액션을 보여주는 함수입니다. 위 내용을 QAgent 클래스 안에 적절히 구성합니다. 다음은 학습을 실제로 실행하는 메인 함수입니다. [메인함수] def main() 함수를 만들고 그 안에 env에는 환경 class, agent에는 QAgent 클래스를 각각 만듭니다. 총 훈련할 에피소드의 범위를 지정해 for문을 사용해 학습을 이터레이션 코드를 작성합니다. while loop를 넣어 에이전트가 랜덤으로 경험을 쌓는 과정을 반복하고, append를 이용해 경험 저장소에 에이전트의 액션, 그에따른 환경, 보상을 각각 저장합니다. 히스토리를 이용해 에이전트를 업데이트를 진행하도록 만듭니다. 학습이 끝난 후 결과를 출력하여 업데이트된 테이블을 살펴봅니다. 이와같이 몬테카를로 컨트롤 방법으로 코드를 작성할 수 있고, 이 학습코드는 매번 실행할때마다 결과가 달라지는데 e-greedy라는 확률적 요소가 들어가 있기 때문입니다. 적은 학습을 시킬 경우 액션이 무한루프를 돌기도 하는데 학습 횟수를 늘리면 더 안정적으로 학습이 되도록 만들수 있고, 이옥세엇 지정해 줄수 있는 하이퍼 파라미터 값인 eps, alpha 등을 조정해 가면서 어떨때 학습이 가장 잘 되는지도 시도해 보시면 감을 익히기에 좋을 것입니다. 다음에는 강화학습 MDP 모를때 최고의 정책 찾는 방법 중 TD컨트롤 SARSA에 대해 알아보도록 하겠습니다.

Blog Home Back to Post List