증분 평균(Incremental Mean)을 사용한 몬테카를로 방법(3/4)

증분 평균(Incremental Mean)은 이전까지 계산된 평균을 기반으로, 새로운 값이 들어올 때 전체 평균을 빠르게 갱신할 수 있는 방법이다.

증분평균

(1) 전체 평균의 정의
평균을 구하는 가장 기본적인 방식은, 지금까지 들어온 모든 값들을 다 더해서 그 개수로 나누는 것이다. 예를 들어 x1, x2, . . . , xk ​와 같은 데이터가 순차적으로 들어왔다면, 전체 평균은 이 모든 값을 더한 뒤 k로 나누는 방식이다. 이 과정은 간단하지만, 새로운 데이터가 들어올 때마다 전체 데이터를 다시 더해야 하기 때문에 비효율적이다.

(2) 새 데이터 분리와 이전 합 묶기
이제 평균을 조금 다르게 생각해보자. 새롭게 들어온 마지막 데이터를 따로 떼어내고, 이전까지의 값들을 한 묶음으로 본다. 즉, 가장 최근에 들어온 데이터를 xk​라고 한다면, 나머지 x1​부터 xk1​까지의 값은 이전까지의 데이터들이고, 이들의 합은 별도로 정리할 수 있다. 이렇게 나누면 새 데이터와 이전 데이터가 구분되어 계산하기 쉬워진다.

(3) 프로그래밍에 유리한 형태로 변형
이전 데이터들의 평균은 k1개의 데이터를 기반으로 한 값이므로, 그 평균에 k1을 곱하면 이전까지의 전체 합이 된다. 이렇게 수식을 약간 조정해주면, 이전 평균을 활용해서 전체 평균을 계산할 수 있는 형태가 된다. 이 과정은 수학적으로는 의미가 같지만, 컴퓨터 프로그래밍에서는 계산을 훨씬 단순하게 만들어준다.

(3)-1 이전 데이터 합의 재표현
여기서 우리가 정리한 부분은 사실 k1개 데이터의 합이다. 즉, x1​부터 xk1​까지를 더한 값이며, 이것은 이전 평균에 k1을 곱한 값과 같다. 이 점을 명확히 해두면 이후 계산이 훨씬 쉬워진다.

(4) 이전 평균으로 대체
이제 앞서 계산한 k1개 데이터의 평균을 활용할 수 있다. 이 값은 μk1​로 표현되며, 지금까지의 평균을 의미한다. 따라서 전체 평균은 새로 들어온 데이터 하나와, 이전 평균을 적절히 조합해서 만들 수 있다. 이로써 우리는 이전까지의 평균만 알고 있다면, 새 값을 추가할 때 전체 평균을 다시 계산하지 않고도 쉽게 갱신할 수 있게 된다.

(5) 증분 평균 공식 정리
수식을 조금 더 다듬으면, 새로운 평균은 "이전 평균 + 새 데이터와의 차이 × 조정 비율"이라는 형태로 바꿀 수 있다. 여기서 조정 비율은 1/k이며, 데이터 개수가 늘어날수록 점점 작아진다. 이 식은 증분 평균의 핵심이다. 새 데이터가 기존 평균보다 크면 전체 평균은 살짝 올라가고, 작으면 조금 내려가게 된다.

(6) 계산 편의를 위한 표현 변경
마지막으로, 프로그래밍이나 수식 정리에서 더 간단하게 쓰기 위해 평균 기호를 이전 평균이 아닌 현재 평균인 μk​로 바꾸어 사용한다. 정확하게는 이전 평균 μk1​를 사용하는 것이 맞지만, 실제 코드에서는 값을 바로 갱신하면서 같은 변수 이름을 유지하는 것이 더 편리하기 때문에 이렇게 표현해도 무방하다.

이러한 증분 평균 방식은 전체 데이터를 모두 저장하거나 다시 계산하지 않아도 되기 때문에, 실시간 처리나 메모리가 제한된 상황에서 매우 유용하게 사용된다. 특히 강화학습처럼 많은 반복과 평균 계산이 필요한 분야에서 그 진가를 발휘한다. 새로운 데이터가 들어올 때마다 평균을 빠르게 갱신할 수 있으므로, 단순하면서도 강력한 도구로 활용된다.

증분평균을 사용한 MC

이제 우리는 몬테카를로 방법에서 상태 가치 함수를 계산할 때, 더 효율적인 방식인 증분 평균을 어떻게 사용하는지 살펴볼 차례다. 위 그림은 기존 방식과 증분 평균 방식을 비교해서 보여주고 있다. 이를 이해하기 쉽게 설명해보자.

먼저 기존의 방식에서는 상태 s에 대해 여러 번 에피소드를 수행한 뒤, 그때그때 받은 반환값을 모두 더하고, 수행한 횟수로 나눠서 평균을 구한다. 이 방식이 바로 그림에서 (1)로 표시된 방법이다. 예를 들어 어떤 상태에서 다섯 번 에피소드를 수행했다면, 다섯 번의 보상 값을 모두 저장해두고, 그걸 더해서 다섯으로 나누는 방식이다. 이렇게 하면 평균을 구할 수는 있지만, 문제는 모든 반환값을 계속 저장해 둬야 한다는 점이다. 데이터가 많아지면 연산도 느려지고, 저장 공간도 많이 차지하게 된다.

이런 문제를 해결해주는 것이 바로 그림의 (2)로 표시된 증분 평균 방식이다. 이 방식은 이전까지의 평균만 알고 있으면, 새로 들어온 데이터 하나만으로도 평균을 바로 갱신할 수 있다. 다시 말해, 과거 데이터를 일일이 저장하지 않아도 된다는 것이다.

그 방식은 간단하다. 새로 얻은 반환값에서 현재까지의 평균 값을 빼고, 그 차이를 지금까지 수행한 에피소드 수로 나눈다. 그리고 그 결과를 이전 평균에 더해주면 된다. 이렇게 하면 평균이 자연스럽게 최신 값까지 반영되면서도 계산은 훨씬 간단 해진다.

이때 재미있는 점은, 새로 들어온 반환값과 현재 평균이 같다면 두 값의 차이가 0이 되기 때문에, 더 이상 평균이 바뀌지 않게 된다. 이 상태는 우리가 구하고자 하는 참된 상태 가치 함수에 도달한 것을 의미한다. 즉, 더 이상 학습할 필요가 없는 완전한 상태가 된 것이다.

강화학습에서는 이런 참된 가치 함수에 수렴하도록 학습을 진행한다. 다시 말해, 반환값과 현재 가치 함수의 차이가 점점 작아지도록 정책을 개선해 나가는 것이 학습의 핵심 목표가 된다.

이처럼 증분 평균 방식은 계산을 단순하게 만들면서도 정확한 결과에 점점 가까워지도록 도와주는 매우 효율적인 방법이다. 그래서 많은 강화학습 알고리즘에서 널리 사용되고 있다.

프로그래밍을 위한 MC

이제 우리는 몬테카를로 방법에서 상태 가치 함수 V(s)를 갱신할 때, 계산을 좀 더 쉽게 만들기 위한 한 가지 기법을 살펴보려고 한다. 그림에는 두 가지 방식이 순서대로 소개되어 있는데, 각각 (1)번과 (2)번으로 나뉘며 그 의미를 차근차근 풀어보자.

(1)번 방식은 이전에 설명한 증분 평균 방식이다.
이 방식에서는 특정 상태에 대해 에피소드를 한 번 수행할 때마다 해당 상태의 평균 값을 조금씩 업데이트하게 된다. 얼마나 업데이트할지는 지금까지 그 상태를 몇 번 방문했는지에 따라 결정된다. 예를 들어 10번째 방문이라면, 열 번째 데이터이니까 기존 평균에 아주 조금만 반영된다. 이처럼 갱신 비율이 에피소드 수에 따라 점점 작아지기 때문에, 학습이 점점 안정되게 수렴하게 된다. 하지만 이 방식은 상태별로 몇 번 방문했는지를 계속 세어야 하며, 그에 따라 매번 계산도 달라지게 된다.

(2)번 방식은 위 식을 프로그래밍하기 쉬운 형태로 바꾼 것이다.
여기서는 ‘지금까지 몇 번 방문했는지’를 기준으로 계산하지 않고, 단순히 고정된 숫자 하나를 사용하는 방식이다. 이 숫자를 알파(α)라고 부른다. 알파는 0보다 크고 1보다 작은 값이며, 보통 0.1이나 0.01 같은 작은 값을 쓴다. 이 값은 고정되어 있기 때문에 상태를 몇 번 방문했는지 따질 필요 없이, 매번 동일한 방식으로 평균을 업데이트할 수 있다.

이렇게 바꾸는 이유는 간단하다. 코드로 구현할 때 훨씬 간단하고, 계산도 빠르기 때문이다. 수학적으로는 앞의 방식이 더 정교할 수 있지만, 몬테카를로 방법 자체가 경험 기반의 통계적 추정이기 때문에, 이런 식의 간단한 대체도 실용적으로 충분히 의미가 있다. 결국 중요한 건 정확한 계산이 아니라, 반복된 경험을 통해 점점 진짜 값에 가까워지는 것이기 때문이다.

이처럼 (1)번 방식은 수학적으로는 더 정밀하지만, (2)번처럼 알파 값을 사용하는 방식이 프로그래밍에는 더 유리하다. 둘 다 강화학습에서는 자주 쓰이는 방식이며, 문제에 따라 적절한 방법을 선택하면 된다.


댓글 쓰기

Please Select Embedded Mode To Show The Comment System.*

다음 이전