My Blog

강화학습(몬테카를로 MC법) 공부기록 9


몬테카를로법 정의

강화학습은 에이전트가 환경과 상호작용하면서 얻은 경험을 통해 학습하는 방식입니다. 에이전트는 주어진 상태에서 어떤 행동을 취하고, 그 결과로 보상을 받습니다. 에이전트의 목표는 받을 수 있는 보상을 최대화하는 최적의 행동 정책을 찾는 것입니다. 이 전에는 환경모델 MDP를 알때 다이나믹 프로그래밍으로 최적정책을 찾는 방법을 찾아보았습니다. 환경모델 MDP를 안다고 함은 상태전이확률과 보상함수를 알고 있는 환경을 말합니다. 하지만 현실세계에서는 이처럼 환경모델을 아는 경우보다 모르는 경우가 많은데, 앞으로는 이처럼 환경모델을 모르는 상태에서 최적정책을 찾기위한 방법을 알아볼 것이고, 그중 첫번째는 몬테카를로 법입니다. 몬테카를로 방법은 강화학습에서 특정 상황에서의 에이전트의 행동을 평가하기 위해 사용됩니다. 이 방법은 에피소드(에이전트가 시작부터 종료까지의 경로)가 완전히 끝난 후에만 결과를 평가하고 학습합니다. 즉, 전체 에피소드의 결과를 통해 학습이 이루어집니다. 몬테카를로 법은 데이터를 반복적으로 샘플링해서 그 결과를 토대로 추정하는 방법으로, 경험으로부터 가치함수를 추정할 수 있습니다. 여기서의 경험은 환경과 에이전트가 실제로 상호작용하여 얻는 데이터를 말하고, 상태, 행동, 보상 데이터가 바로 경험 데이터입니다. 몬테카를로에서 목표는 에이전트가 얻는 경험을 바탕으로 가치함수를 추정하는 것으로 이 목표가 달성되면 이어서 최적정책을 찾을 수 있습니다. -몬테카를로 방법을 사용하는 방식 에피소드 생성: 에이전트가 환경에서 행동을 취하며 에피소드를 생성합니다. 에피소드는 에이전트가 시작 상태에서부터 종료 상태에 이르기까지의 전체 행동 시퀀스입니다. 보상 계산: 각 에피소드가 종료되면, 에이전트가 받은 각 상태에서의 보상을 계산합니다. 이 보상은 미래에 얻을 수 있는 보상의 총합을 반영합니다. 가치 업데이트: 에피소드를 통해 얻은 보상을 바탕으로, 각 상태의 가치를 업데이트합니다. 이때 모든 상태의 가치는 해당 상태에서 시작해서 얻을 수 있는 미래 보상의 기대치로 정의됩니다. 정책 개선: 가치가 업데이트되면, 이 정보를 사용하여 에이전트의 행동 정책을 개선합니다. 즉, 더 높은 보상을 얻을 수 있는 방향으로 에이전트의 행동을 조정합니다. -장단점 장점: 몬테카를로 방법은 각 에피소드의 보상을 정확하게 추정할 수 있어 복잡한 환경에서도 효과적으로 작동할 수 있습니다. 단점: 에피소드가 완료될 때까지 기다려야 하므로, 학습 과정이 느릴 수 있습니다. 또한, 많은 에피소드가 필요할 수 있고, 각 에피소드의 길이가 길면 계산 비용이 많이 들 수 있습니다. 몬테카를로 방법을 이용한 강화학습은 다양한 분야에서 응용될 수 있으며, 특히 의사결정 과정이 중요한 영역에서 유용하게 사용됩니다.

확률 분포모델, 샘플모델

확률분포와 기댓값 계산은 확률론과 통계학에서 중요한 개념입니다. 확률분포는 어떤 확률변수가 특정한 값을 취할 확률을 설명하며, 기댓값은 그 확률변수의 평균적인 값을 나타냅니다. 이해를 돕기 위해 간단한 예를 들어 설명하겠습니다. 먼저 확률분포로 표현된 모델인 분포모델을 알아보겠습니다. 예시: 주사위 던지기 주사위 하나를 던졌을 때 나오는 눈의 수를 확률변수 X라고 하겠습니다. 이 주사위는 공정한 주사위로 가정하며, 각 눈이 나올 확률은 동일합니다. 확률분포 확률변수 X는 1부터 6까지의 값을 가질 수 있으며, 각각의 확률은 1/6 입니다. 기댓값 E(X)는 각 값과 그 값이 나올 확률의 곱의 합으로 계산됩니다. 공식은 다음과 같습니다. E(X)=∑(x×P(X=x)) 주사위의 경우: E(X)=(1×1/6)+(2×1/6)+(3×1/6)+(4×1/6)+(5×1/6)+(6×1/6) 이 계산을 수행해 보겠습니다. 주사위를 던졌을 때 나오는 눈의 기댓값은 3.5입니다. 이는 주사위의 각 눈이 나올 확률이 동일하므로 계산된 평균값입니다. 이처럼 기댓값은 확률변수의 평균적인 결과를 나타내며, 이를 통해 확률적인 사건의 결과를 예측하는 데 사용할 수 있습니다. 이번에는 주사위 두개를 굴리는 문제를 보겠습니다. 이때 각 눈이 나올 확률이 정확히 1/6이라고 가정할때 주사위 눈의 합을 확률분포로 표시해 보겠습니다. ps = {2:1/36, 3:2/36, 4:3/36, 5:4/36, 6:5/36, 7:6/36, 8:5/36, 9:4/36, 10:3/36, 11:2/36, 12:1/36} 이와같이 주사위 눈의 합 확률분포가 나오고, 이 기댓값을 계산해 보면 결과는 6.999...가 나옵니다. 기댓값을 계산하는 이유는 강화학습에서 기댓값 계산을 주로 하고, 강화학습의 목적이 수익을 극대화하는 것으로, 이 수익은 보상의 총합에 대한 기댓값이기 때문입니다. 다음은 샘플모델에 대해 알아보도록 하겠습니다. 샘플모델은 말 그대로 표본을 샘플링 하면 충분한 것으로 위 사례에서 주사위를 실제 굴려서(샘플링) 나온 눈의 합을 관찰하는 것이 샘플모델입니다. 전체 확률분포는 필요하지않고 단순히 샘플링만 할수 있다면 충분합니다. 샘플모델로 기댓값을 계산하려면 샘플링을 많이하고 평균을 구하면 되는데, 이것이 몬테카를로법입니다. 숫자를 세어 평균을 구하는 간단한 방법이지만 표본 수를 무한대로 늘리면 큰 수의 법칙에 따라 그 평균이 참값으로 수렴하게 됩니다.

몬테카를로법 기초

몬테카를로 법으로 기댓값을 구하는 방법을 보겠습니다. 1. sample 함수 파라미터 dices=2: 이 함수는 기본적으로 두 개의 주사위를 던집니다. dices 파라미터를 통해 주사위의 수를 조정할 수 있습니다. 변수 x: 주사위 던지기의 결과를 더할 변수입니다. 초기값은 0입니다. 반복문과 랜덤 선택: for _ in range(dices):는 주사위 수만큼 반복합니다. 예를 들어, 두 개의 주사위를 사용하면 두 번 반복됩니다. np.random.choice([1,2,3,4,5,6])는 1부터 6까지의 숫자 중 하나를 무작위로 선택합니다. 이는 주사위의 한 면이 나온 것을 시뮬레이션합니다. 선택된 숫자는 x에 더해집니다. 따라서 x는 두 주사위의 눈금의 합을 저장하게 됩니다. 리턴 값 x: 주사위 눈금의 총합을 반환합니다. 2. 샘플링과 평균 계산 변수 trial = 1000: 총 1000번의 시도(샘플링)를 수행합니다. 리스트 samples: 각 시도의 결과(두 주사위의 눈금 합)를 저장할 리스트입니다. 샘플링 반복문: for _ in range(trial):는 1000번 반복하면서 각 시도마다 sample() 함수를 호출해 결과를 samples 리스트에 추가합니다. 평균 계산 V: sum(samples)는 samples 리스트에 저장된 모든 주사위 눈의 합을 계산합니다. len(samples)는 리스트의 길이, 즉 시도 횟수(1000번)입니다. V = sum(samples) / len(samples)는 평균값을 계산합니다. 이는 1000번의 시도에서 두 주사위의 눈금 합의 평균을 의미합니다. 3. 결과 출력 print(V)는 계산된 평균값 V를 출력합니다. 이 코드를 실행하면, 두 주사위를 1000번 던져서 나온 눈의 합의 평균값을 알 수 있습니다. 이 평균값은 이론적으로 두 주사위의 기댓값의 합, 즉 3.5+3.5=7 3.5+3.5=7에 가까울 것으로 예상됩니다. 이처럼 몬테카를로 법은 샘플 수를 늘릴수록 신뢰도가 높아집니다. 이를 정리하자면 분산(variance)이 작아지고, 이 분산은 정답에서 벗어난 편차라고 생각하면 됩니다. 하지만 다음에 나올 TD모델에 비하면 몬테카를로 방법은 샘플수를 많이 늘려야지만 분산이 작아지는 것이기 때문에 같은 적은 수로 했을대는 TD모델이 분산이 더 적습니다. 몬테카를로 방식에는 평균을 구하는 계산식에는 두가지가 있는데, 일반적으로 평균을 구하는 방식과 증분 구현 방식이 있습니다. 증분 방식은 샘플 데이터를 얻을때마다 평균을 구합니다. <일반적인 방식> Vn = s1+s2+...+sn/n <증분방식> Vn = Vn-1 + 1/n*(sn-Vn-1) 평균을 어느 방식으로 계산하든 결과는 같지만, 샘플 데이터를 얻을때마다 평균을 구해야 할땐 증분방식이 더 효율적입니다. 두 개의 주사위를 던져 나온 눈의 합을 시뮬레이션하고, 온라인 방식으로 평균값을 업데이트하는 방법을 사용합니다. 각 부분에 대해 자세하게 설명하겠습니다. 1. sample 함수 파라미터 dices=2: 기본적으로 함수는 두 개의 주사위를 던지도록 설정됩니다. 변수 x: 주사위 눈의 합을 저장할 변수입니다. 반복문과 랜덤 선택: for _ in range(dices):는 설정된 주사위 수(여기서는 2개)만큼 반복합니다. np.random.choice([1,2,3,4,5,6])는 1부터 6까지 중 하나를 무작위로 선택합니다. 이는 주사위의 던지기를 시뮬레이션합니다. 선택된 눈은 x에 누적됩니다. 리턴 값 x: 함수는 주사위 눈의 합을 반환합니다. 2. 온라인 평균 계산 변수 trial = 1000: 1000번의 시도를 수행합니다. 변수 V, n: V는 계산된 평균을 저장하고, n은 시도 횟수를 추적합니다. 샘플링과 평균 업데이트: for _ in range(trial): 루프는 1000번 실행되며, 각 반복마다 sample() 함수를 호출해 주사위의 눈금 합을 받아옵니다. n += 1은 시도 횟수를 1씩 증가시킵니다. V = V + (s - V) / n은 새로운 샘플값 s를 기반으로 현재까지의 평균 V를 업데이트합니다. 이 공식은 새로운 샘플이 주어질 때마다 평균을 점진적으로 조정합니다. (s - V)는 새 샘플과 현재 평균과의 차이입니다. (s - V) / n은 이 차이를 샘플 수로 나누어 평균에 미치는 영향을 조정합니다. 이 방식은 모든 데이터를 저장하지 않고도 평균을 계산할 수 있어 메모리 효율성이 높습니다. 결과 출력: print(V)는 각 시도 후의 업데이트된 평균값을 출력합니다. 이로 인해 사용자는 평균이 어떻게 점진적으로 변하는지 관찰할 수 있습니다. 이 코드는 주사위 던지기 시뮬레이션을 통해 평균을 온라인 방식으로 계산하는 효율적인 예시를 제공합니다. 각 단계에서 평균이 어떻게 업데이트되는지 관찰할 수 있으며, 이는 통계학적 학습이나 데이터 스트림 처리에서 유용하게 사용될 수 있습니다.

Blog Home Back to Post List