강화학습의 최종 목표는 최적 정책찾기입니다. 전회 공부한 내용은 반복적 정책평가이고 이것으로 인해 정책을 평가할 수 있게 되었습니다. 이 정책을 평가할 수 있기 때문에 비교하거나 개선하는 것도 가능합니다. 정책을 개선하는데 최적 정책을 찾기 위한 수식을 표현해 보겠습니다. 결정적 최적정책 μ∗ 은 강화학습에서 특정 상태에서 항상 동일한 최적의 행동을 선택하는 정책을 의미합니다. 이러한 정책은 주어진 상태에서 가능한 모든 행동 중에서 가장 높은 기대 리턴을 제공하는 단일 행동을 지정합니다. 모든 상태에 대해 가장 높은 가치를 제공하는 행동을 항상 선택하는 정책입니다. 이 정책은 각 상태에서 가능한 행동 중에서 최대 가치를 생성하는 행동을 결정적으로 선택하므로, 확률적이거나 임의적인 요소가 없습니다. 수학적으로 결정적 최적정책은 다음과 같이 표현됩니다. μ∗(s) =argmax a Q∗(s,a) =argmax a Σs'의 합 p(s'|s,a){r(s,a,s') + γv∗(s')} μ∗(s)는 상태 s에서 결정적 최적정책에 따라 선택되는 행동입니다. 여기서의 정책을 탐욕정책(greedy policy)라고 합니다. v∗(s) 는 최적정책의 상태가치 함수입니다. Q∗(s,a)는 상태 s에서 행동 a를 취했을 때의 최적 행동가치 함수로, 이 행동가치는 행동 a를 취했을 때 예상되는 최대 누적 보상을 나타냅니다. 결정적 최적정책은 각 상태에서 항상 한 가지 '최선'의 선택만을 제공하기 때문에, 행동 선택의 불확실성이 없습니다. 이는 특히 복잡하지 않거나 불확실성이 낮은 환경에서 효과적으로 작동할 수 있습니다. 또한, 결정적 정책은 정책의 구현과 실행이 간단해지는 장점이 있습니다. 결정적 최적정책과 확률적 정책의 비교 반면에, 확률적 정책은 상태에 따라 다양한 행동을 확률적으로 선택할 수 있습니다. 이러한 확률적 정책은 특히 환경의 불확실성이 높거나 탐험(exploration)이 중요한 경우에 유리할 수 있습니다. 확률적 정책은 다양한 가능성을 탐색할 여지를 제공하며, 때로는 더 넓은 범위의 솔루션을 찾을 수 있도록 합니다. 결정적 최적정책 μ∗ 는 환경과 상태에 따라 최적의 행동을 명확히 지정함으로써, 에이전트가 높은 성능을 유지할 수 있도록 돕습니다. 이는 강화학습에서 최적의 행동 전략을 찾는 주요 목표 중 하나입니다.
정책 개선 정리(Policy Improvement Theorem)는 강화학습에서 중요한 이론적 기반을 제공하며, 정책을 점진적으로 개선함으로써 최종적으로 최적의 정책에 도달할 수 있음을 보장합니다. 이 정리를 이해하려면 먼저 강화학습의 기본 개념인 정책과 가치 함수에 대한 이해가 필요합니다. 정책(Policy): 강화학습 에이전트가 특정 상태에서 어떤 행동을 취할지를 결정하는 규칙입니다. 정책은 확률적일 수도 있고 결정적일 수도 있습니다. 가치 함수(Value Function): 특정 정책을 따랐을 때, 각 상태에서 시작해 얻을 수 있는 기대 리턴을 나타냅니다. 상태 가치 함수 Vπ(s)는 정책 π 하에서 상태 s의 가치를 평가하고, 행동 가치 함수 Qπ(s,a)는 상태 s에서 행동 a를 취했을 때의 가치를 평가합니다. 정책 개선 정리는 다음과 같은 아이디어에 기반합니다: 만약 어떤 정책 π에서 파생된 행동 가치 함수 Qπ(s,a)를 사용하여 새로운 정책 π′를 생성할 수 있다면, 이 새로운 정책은 원래의 정책보다 더 나쁘지 않을 것입니다. 즉, 새 정책 π′는 적어도 π만큼 좋거나 더 나은 성능을 보일 것입니다. 정책 개선 과정 정책 평가(Policy Evaluation): 먼저, 현재 정책 π에 대한 가치 함수 Vπ(s)를 계산합니다. 이는 정책 π를 따랐을 때 각 상태의 기대 리턴을 제공합니다. 정책 개선(Policy Improvement): 현재 정책에서 계산된 가치 함수를 기반으로 새로운 정책 π′를 생성합니다. 이 새 정책은 각 상태에서 행동 가치 함수 Qπ(s,a)가 최대가 되는 행동을 선택합니다: π′(s)=argmax a Qπ(s,a) 여기서 Qπ(s,a)=R(s,a)+γ∑s′P(s′∣s,a)Vπ(s′) 정책 수렴(Policy Convergence): 이 과정을 반복하면, 정책은 결국 최적의 정책 π∗ 로 수렴하게 됩니다. 최적 정책은 모든 상태에서 최대의 가치 함수를 제공합니다. 정책 개선 정리는 강화학습에서 정책이 점진적으로 개선될 수 있음을 보장합니다. 즉, 각 반복에서 정책은 이전 정책보다 성능이 개선되거나 최소한 동일한 성능을 유지하며, 이 과정을 통해 최적 정책에 도달할 수 있습니다. 정책 개선 정리를 간단히 요약해 보겠습니다. 1) 현재정책 π에서 시작합니다. 2) 현재정책 π는 확률적일 수도 있으므로 μ(s)가 아닌 π(s|a)로 표기합니다. 3) 다음으로 정책 π에 대해 가치함수 Vπ(s)를 평가하여 V0을 얻습니다. 4) 이 과정을 반복 시행하여 탐욕화를 수행합니다. 5) 정책 π를 평가 => V0에서 탐욕화 실행 => μ1 => 다시 평가 => V1에서 탐욕화 실행 => μ2 ..... 이 과정의 반복입니다. 결국 정책이 항상 개선되고, 만약 정책이 개선되지 않으면 그 정책이 곧 최적 정책이 됩니다. 이 과정이 정책 반복법(policy iteration)이라 합니다. 위 동적 프로그래밍에서는 환경 MDP를 알때 에이전트의 아무런 행동없이도 계산만으로 가치함수를 평가할 수 있고 이러한 정책 반복법 만으로도 최적 정책을 찾을 수 있습니다. 그래서 에이전트의 실제 행동 없이 계산만으로 최적 정책을 찾는 이러한 방법을 계획(planning)이라고 합니다. 이 다음 공부내용부터 나올 부분은 환경 MDP를 모를때 사례가 나오는데, 이때부터는 에이전트가 아무것도 모르는 환경에서 실제 행동을 취해 경험 데이터를 쌓으면서 최적 정책을 찾게 됩니다.
먼저 가장 큰 인자를 가져오는 argmax코드를 구현해 보겠습니다. 딕셔너리 d의 값을 비교하여 가장 큰 값을 가진 키를 찾는 함수 argmax를 정의하고 있습니다. 아래에서 각 부분을 자세히 설명하겠습니다: 함수 정의 def argmax(d): argmax라는 이름의 함수를 정의하며, 이 함수는 하나의 인자 d를 받습니다. d는 키와 값을 갖는 딕셔너리라고 가정합니다. 최대값 찾기 max_value = max(d.values()) d.values()는 딕셔너리 d의 모든 값들을 가져옵니다. max() 함수는 이 값들 중에서 가장 큰 값을 찾아 max_value 변수에 저장합니다. 최대값을 가진 키 찾기 max_key = 0 최대값을 가진 키를 저장할 변수 max_key를 초기화합니다. 여기서는 0으로 초기화되었지만, 이는 특별한 의미가 없으며 단지 변수를 선언하기 위한 초기값입니다. for key, value in d.items(): d.items()는 딕셔너리 d에서 키-값 쌍을 튜플로 반환합니다. for 루프를 사용하여 이 키-값 쌍을 key와 value 변수로 각각 받습니다. if value == max_value: 만약 현재의 value가 max_value와 같다면, 이는 최대값을 가진 키를 찾았다는 것을 의미합니다. max_key = key 최대값을 가진 키를 max_key 변수에 저장합니다. 결과 반환 return max_key 최대값을 가진 키 max_key를 반환합니다. 이 키는 딕셔너리 d에서 가장 큰 값을 가진 항목의 키입니다. 이 함수는 주어진 딕셔너리에서 최대값을 가진 키를 찾아 그 키를 반환하는 역할을 합니다. 예를 들어, d = {'apple': 3, 'banana': 5, 'cherry': 5}라는 딕셔너리가 있을 때, 이 함수는 'banana'나 'cherry' 중 하나를 반환할 것입니다(여기서는 먼저 찾은 'banana'를 반환하게 됩니다). 그 다음에는 아래와같이 argmax 함수를 이용해 가치함수를 탐욕화하는 함수를 구현합니다. 강화학습의 컨텍스트에서 특정 가치 함수 V를 기반으로 그리디(greedy) 정책을 계산하는 함수 greedy_policy를 정의하고 있습니다. 이 함수는 주어진 환경 env와 할인율 gamma를 사용하여 각 상태에서 최적의 행동을 선택하는 결정적인 정책을 생성합니다. 아래에서 각 부분을 자세히 설명하겠습니다: 함수 정의 def greedy_policy(V, env, gamma): V는 각 상태의 가치를 저장한 딕셔너리입니다. env는 에이전트가 상호작용하는 환경으로, 상태와 행동, 보상 등을 제공하는 메소드를 포함합니다. gamma는 할인율로, 미래의 보상을 현재 가치로 환산할 때 사용됩니다. 정책 초기화 pi = {} 최종적으로 반환할 정책을 저장할 빈 딕셔너리입니다. 이 정책은 각 상태에 대해 최적의 행동을 선택하는 방법을 저장합니다. 각 상태에 대한 최적 행동 찾기 for state in env.states(): env.states()는 가능한 모든 상태를 반환합니다. 각 상태에 대해 최적의 행동을 결정하기 위한 루프입니다. 각 행동에 대한 가치 계산 action_values = {} 현재 상태에서 가능한 각 행동의 가치를 저장할 딕셔너리입니다. for action in env.actions(): env.actions()는 가능한 모든 행동을 반환합니다. 각 행동에 대해 그 행동을 취했을 때의 가치를 계산합니다. next_state = env.next_state(state, action) env.next_state(state, action)는 현재 상태 state와 행동 action을 기반으로 다음 상태를 계산합니다. r = env.reward(state, action, next_state) env.reward(state, action, next_state)는 주어진 상태와 행동, 그리고 결과적으로 도달한 상태에 따른 보상을 반환합니다. value = r + gamma * V[next_state] 현재 행동의 가치를 계산합니다. 이 가치는 현재 받은 보상 r과 다음 상태의 할인된 가치 gamma * V[next_state]의 합입니다. 최적 행동 선택 max_action = argmax(action_values) argmax(action_values) 함수는 앞서 설명한 바와 같이, 주어진 행동 가치 딕셔너리에서 최대 가치를 가진 행동을 찾습니다. 정책 업데이트 action_probs = {0:0, 1:0, 2:0, 3:0} 각 행동에 대해 선택 확률을 저장할 딕셔너리를 초기화합니다. 여기서는 모든 행동의 초기 확률을 0으로 설정합니다. action_probs[max_action] = 1.0 최적의 행동 max_action의 확률을 1.0으로 설정합니다. 이는 결정적인 정책으로, 최적의 행동만 선택됩니다. pi[state] = action_probs 최종적으로, 현재 상태에 대한 정책을 업데이트합니다. 이 정책은 해당 상태에서 각 행동을 취할 확률을 나타냅니다. 결과 반환 return pi 모든 상태에 대해 최적의 행동을 결정한 정책 pi를 반환합니다. 이 함수는 각 상태에서 최적의 행동을 결정하기 위해 주어진 가치 함수를 사용하여 환경과 상호작용하는 방법을 설명합니다. 결과적으로, 각 상태에서 가장 가치 있는 행동만을 선택하는 결정적인 정책을 생성합니다. 다음으로는 평가와 개선 반복에 대한 코드를 알아보겠습니다. 강화학습에서 정책 반복(Policy Iteration) 알고리즘을 구현한 것입니다. 이 알고리즘은 정책 평가(Policy Evaluation)와 정책 개선(Policy Improvement)을 반복하여 최적의 정책을 찾는 과정입니다. 코드의 각 부분을 쉽게 설명하겠습니다. 함수 정의 def policy_iter(env, gamma, threshold = 0.001, is_render=False): env: 에이전트의 환경을 나타냅니다. 에이전트는 이 환경과 상호작용하며 학습합니다. gamma: 할인율로, 미래의 보상을 현재 가치로 할인하는 데 사용됩니다. threshold: 가치 함수가 수렴했다고 판단하는 기준입니다. 이 값이 작을수록 정밀도가 높아집니다. is_render: 학습 과정을 시각화할지 여부를 결정하는 플래그입니다. 초기화 pi = defaultdict(lambda : {0:0.25, 1:0.25, 2:0.25, 3:0.25}) pi는 각 상태에 대한 정책을 저장하는 딕셔너리입니다. 초기 정책은 모든 행동에 동일한 확률(0.25)을 할당합니다. V = defaultdict(lambda : 0) V는 각 상태의 가치를 저장하는 딕셔너리입니다. 초기 가치는 모든 상태에서 0으로 설정됩니다. 정책 반복 과정 while True: 무한 루프를 통해 정책 평가와 개선을 반복합니다. 이 반복은 최적의 정책이 찾아질 때까지 지속됩니다. 정책 평가 V = policy_eval(pi, V, env, gamma, threshold) policy_eval 함수는 주어진 정책 pi에 대해 가치 함수 V를 평가합니다. 이 함수는 현재 정책 하에서 각 상태의 가치를 업데이트하고 반환합니다. 정책 개선 new_pi = greedy_policy(V, env, gamma) greedy_policy 함수는 계산된 가치 함수 V를 바탕으로 각 상태에서 가장 좋은 행동을 선택하는 새로운 결정적 정책 new_pi를 생성합니다. 시각화 옵션 if is_render: env.render_v(V, pi)를 호출하여 현재 가치 함수 V와 정책 pi의 상태를 시각화합니다. 이는 학습 과정을 관찰하는 데 유용합니다. 정책 비교 및 종료 조건 if new_pi == pi: 새로운 정책 new_pi와 이전 정책 pi가 같다면, 정책이 수렴했음을 의미하고 반복을 종료합니다. pi = new_pi 새로운 정책을 현재 정책으로 업데이트합니다. 반환 return pi 최종적으로 최적의 정책 pi를 반환합니다. 이 정책은 각 상태에서 최선의 행동을 지시합니다. 이 코드는 정책 평가와 개선을 반복적으로 수행하여 최적의 행동 방침을 도출하는 정책 반복 알고리즘의 전형적인 구현을 보여줍니다. 이러한 접근 방식은 복잡한 결정 과정과 다양한 상태가 있는 환경에서 유용하게 사용될 수 있습니다.
정책반복법(Policy Iteration)과 가치반복법(Value Iteration)은 강화학습에서 널리 사용되는 두 가지 동적 프로그래밍 방법입니다. 이 두 방법은 강화학습 문제를 풀기 위해 환경의 동적 모델을 사용하고, 정책 또는 가치 함수를 반복적으로 개선하여 최적의 솔루션을 찾습니다. 여기에서는 이 두 방법의 공통점과 차이점을 살펴보겠습니다. 공통점 최적화 목표: 두 방법 모두 강화학습의 목적인 최적 정책을 찾는 것을 목표로 합니다. 벨만 방정식: 정책반복과 가치반복 모두 벨만 최적 방정식을 기반으로 작동합니다. 이 방정식은 각 상태의 최적 가치를 다른 상태의 가치를 참조하여 계산합니다. 반복 프로세스: 두 방법은 반복적인 계산을 통해 점진적으로 가치 함수와 정책을 개선합니다. 수렴 보장: 두 방법 모두 적절한 조건 하에서 최적 정책으로 수렴한다는 이론적 보장이 있습니다. 모델 기반: 두 방법은 모두 환경의 전체 모델(상태 전이 확률과 보상 함수)을 알고 있어야 실행할 수 있습니다. 차이점 접근 방식: 정책반복법은 두 단계로 진행됩니다. 첫 번째는 정책 평가(Policy Evaluation) 단계로, 현재 정책의 가치 함수를 계산합니다. 두 번째는 정책 개선(Policy Improvement) 단계로, 계산된 가치 함수를 기반으로 현재 정책을 개선합니다. 가치반복법은 정책 평가와 정책 개선 단계를 명확히 구분하지 않고, 각 상태의 최적 가치를 직접적으로 계산하며, 이 과정에서 정책이 함께 개선됩니다. 이 방법은 매 반복마다 가치 함수를 조금씩 개선하며, 정책은 그 결과로 간접적으로 개선됩니다. 계산 복잡성: 정책반복법은 정책 평가에서 전체 가치 함수를 완전히 계산한 후, 정책 개선을 수행합니다. 이는 일반적으로 느린 과정일 수 있지만, 정책 변경이 일어나지 않으면 바로 종료됩니다. 가치반복법은 각 반복에서 최적 가치를 부분적으로만 업데이트하므로, 일반적으로 더 빠르게 수렴할 수 있습니다. 그러나 종종 더 많은 반복이 필요할 수 있습니다. 수렴 속도: 정책반복법은 적은 반복 횟수로 수렴할 수 있지만, 각 반복에서 수행해야 할 계산이 더 많습니다. 가치반복법은 각 반복에서 수행하는 계산은 적지만, 보통 더 많은 반복을 요구합니다. 결론적으로, 정책반복법과 가치반복법은 강화학습에서 문제를 해결하기 위한 두 가지 유력한 동적 프로그래밍 방법입니다. 이들 각각의 방법은 특정 상황이나 특성에 따라 더 적합할 수 있으며, 선택은 문제의 세부 사항과 계산 자원에 따라 달라질 수 있습니다.
앞서 정책반복법을 알아 보았습니다. 정책 반복법에서 개선과 평가 단계에서 수행하는 수식을 다시 살펴 보겠습니다. <개선> μ(s) = argmax a Σs'의 합 p(s'|s,a){r(s,a,s') + γv(s')} <평가> a = μ(s)일때 V'(s) = Σs'의 합 p(s'|s,a){r(s,a,s') + γv(s')} 여기서 Σs'의 합 p(s'|s,a){r(s,a,s') + γv(s')}부분의 계산이 중복됩니다. 개선에서 탐욕 행동을 찾기위해 계산후, 또 평가단계에서 같은 계산을 수행함을 볼수 있습니다. 이 중복되는 계산을 하나로 묶어 두번 계산이 아닌 한번만 계산하는 가치반복법 수식이 나올 수 있습니다. V'(s) = max a Σs'의 합 p(s'|s,a){r(s,a,s') + γv(s')} 이와 같은 수식이 도출될 수 있는데 최댓값을 찾아주는 max 연산자를 사용해 가치함수를 직접 갱신합니다. 정책을 사용하지않고 가치함수를 계산하고 있고 이처럼 최적 가치함수를 구하는 알고리즘을 가치반복법이라 하고 평가와 개선을 따로하지 않고 동시에 수행합니다. 여기서 벨만 최적방정식을 다시 보도록 하겠습니다. V(s) = max a E[Rt+1 + γV (St+1) | St = s, At = a] = max a Σs'의 합 p(s'|s,a){r(s,a,s') + γv∗(s')} 이러한 벨만 최적방정식이 가치반복법의 식과 같음을 알수 있습니다. 이것을 갱신식으로 다시 표현하자면 다음과 같습니다. Vk+1(s) = max a Σs'의 합 p(s'|s,a){r(s,a,s') + γvk(s')} 이처럼 k번 갱신한 가치함수를 Vk로 표현하고, k+1번 갱신한 가치함수를 Vk+1로 표현합니다. 결국 가치반복법은 k=0에서 시작해서 k=1,2,3,...순서로 가치함수 Vk를 갱신하는 알고리즘으로 같은 계산을 두번하지 않고 순차대로 k가 늘어남에 따라 각각 한번씩만 계산됩니다. 가치반복법은 갱신을 무한히 반복하면 최적가치함수 v∗를 얻을 수 있는데, 무한히 할수는 없고 멈추기 위한 장치로 임곗값 threshold를 사용하게 됩니다. 모든 갱신상태가 임곗값 밑으로 떨어지면 갱신을 중단하게 됩니다. 다음 최적가치함수 v∗(s)가 주어지면 최적정책 μ∗(s)는 다음 식으로 구할 수 있습니다. μ∗(s) = argmax a Σs'의 합 p(s'|s,a){r(s,a,s') + γv∗(s')} 탐욕정책을 알아내면 그것이 곧 최적정책이 됩니다.
1. value_iter_onestep(V, env, gamma) 이 함수는 가치 함수 V를 한 번 업데이트하는 역할을 합니다. 매개변수: V: 현재 상태의 가치를 저장하는 딕셔너리. env: 에이전트의 환경으로, 상태, 행동, 보상, 다음 상태 정보를 제공합니다. gamma: 미래 보상의 할인율. 로직: def value_iter_onestep(V, env, gamma): V: 현재 각 상태에 대한 가치를 저장하고 있는 딕셔너리입니다. env: 에이전트의 환경으로, 상태, 행동, 상태 전이, 보상 등에 대한 정보를 제공합니다. gamma: 할인율로, 미래의 보상을 현재 가치에 얼마나 중요하게 반영할지를 결정합니다. 상태별 가치 업데이트 for state in env.states: env.states는 환경에서 가능한 모든 상태를 제공합니다. 이 반복문을 통해 각 상태에 대해 가치를 업데이트합니다. 목표 상태 처리 if state == env.goal_state: env.goal_state는 환경에서 정의된 목표 상태입니다. 목표 상태에 도달한 경우, 그 상태의 가치는 0으로 설정됩니다. 목표 상태에서는 추가적인 보상을 얻을 수 없기 때문에 가치를 0으로 설정하고, 그 상태에 대한 처리를 중단하고 다음 상태로 넘어갑니다. 행동 가치 계산 action_values = [] 각 상태에서 가능한 각 행동에 대한 가치를 계산한 후 저장할 리스트입니다. for action in env.actions: env.actions는 가능한 모든 행동을 제공합니다. 각 행동에 대해 그 결과의 가치를 계산합니다. next_state = env.next_state(state, action) 주어진 상태 state에서 행동 action을 취했을 때 도달하는 다음 상태를 반환합니다. r = env.reward(state, action, next_state) 주어진 상태 state에서 행동 action을 취하고 다음 상태 next_state로 이동했을 때 받는 보상을 반환합니다. value = r + gamma * V[next_state] 계산된 보상 r과 다음 상태 next_state의 할인된 가치를 합하여 이 행동의 총 가치를 계산합니다. action_values.append(value) 계산된 행동의 가치를 action_values 리스트에 추가합니다. 가치 최대화 V[state] = max(action_values) action_values 리스트에 저장된 각 행동의 가치 중 최댓값을 선택하여 현재 상태 state의 가치를 업데이트합니다. 가치 반환 return V 모든 상태의 가치를 업데이트한 후 수정된 가치 딕셔너리 V를 반환합니다. 이 함수는 각 상태의 가치를 한 번만 업데이트하는 단계를 수행하며, 전체 가치반복법에서는 이 함수를 여러 번 반복 호출하여 가치 함수가 수렴할 때까지 계속 업데이트합니다. 이는 각 상태의 최적의 가치를 찾아내고, 결과적으로 최적의 정책을 도출하는 데 사용됩니다. 2. value_iter(V, env, gamma, threshold=0.001, is_render=False) 이 함수는 value_iter_onestep을 반복적으로 호출하여 가치 함수가 수렴할 때까지 계속 업데이트합니다. 매개변수: threshold: 가치 함수의 변화가 이 값보다 작아지면, 수렴했다고 판단하고 반복을 중단합니다. is_render: 학습 과정을 시각화할지 여부를 결정합니다. 로직: 이 코드는 강화학습에서 가치반복법을 사용하여 주어진 환경 env에서 모든 상태의 가치를 계산하는 value_iter 함수의 구현 부분입니다. 이 함수는 주어진 환경의 모든 상태에 대해 최적의 가치를 계산하고, 가치가 수렴할 때까지 반복적으로 가치를 업데이트하는 과정을 포함합니다. 이 함수를 통해 최적의 가치 함수를 찾아내며, 그 결과를 통해 최적의 행동 정책을 결정할 수 있습니다. 각 부분의 역할과 작동 방식을 자세히 설명하겠습니다. -함수 정의 def value_iter(V, env, gamma, threshold=0.001, is_render=False): V: 현재 각 상태에 대한 가치를 저장하고 있는 딕셔너리입니다. env: 에이전트의 환경으로, 상태, 행동, 상태 전이, 보상 등에 대한 정보를 제공합니다. gamma: 할인율로, 미래의 보상을 현재 가치에 얼마나 중요하게 반영할지를 결정합니다. threshold: 수렴 판단 기준으로, 가치의 변화량이 이 값 이하로 떨어지면 가치가 수렴했다고 판단하고 반복을 종료합니다. is_render: 학습 과정을 시각화할지 여부를 결정하는 플래그입니다. -반복 업데이트 시작 while True: 무한 루프를 사용하여 가치 함수가 수렴할 때까지 반복합니다. -시각화 옵션 if is_render: env.render_v(V)을 호출하여 현재의 가치 함수 V를 시각화합니다. 학습 과정을 관찰하는 데 도움이 됩니다. -가치 업데이트 old_V = V.copy() 현재의 가치 함수 V의 복사본을 old_V에 저장합니다. 이는 이전 가치 함수의 상태를 보존하기 위해 사용됩니다. V = value_iter_onestep(V, env, gamma) value_iter_onestep 함수를 호출하여 가치 함수를 한 단계 업데이트합니다. 이 함수는 각 상태에 대해 최대의 예상 가치를 계산하고 그 결과를 V에 저장합니다. -수렴 조건 검사 delta = 0 delta는 가치의 최대 변화량을 추적하는 데 사용됩니다. for state in V.keys(): V.keys()를 통해 모든 상태를 반복하며, 각 상태의 가치 변화량을 계산합니다. t = abs(V[state] - old_V[state]) 현재 상태의 가치와 이전 가치 사이의 절대 변화량을 계산합니다. if delta < t: 계산된 변화량이 현재까지의 최대 변화량보다 크면 delta를 업데이트합니다. if delta < threshold: 가치 변화량 delta가 임계값 threshold보다 작으면 가치 함수가 수렴했다고 판단하고 반복을 종료합니다. -최종 가치 함수 반환 return V 수렴한 가치 함수 V를 반환합니다. 이 함수는 각 상태에 대한 최적의 가치를 찾기 위해 가치반복법을 사용합니다. 최적의 가치 함수를 통해 각 상태에서 취할 최선의 행동을 결정할 수 있으며, 이는 강화학습에서 중요한 과정입니다. 3. greedy_policy(V, env, gamma) 최적의 가치 함수 V를 바탕으로 각 상태에서 최선의 행동을 결정하는 정책을 생성합니다. 로직: 각 상태에 대해 가능한 모든 행동의 가치를 계산하고, 가장 높은 가치를 제공하는 행동을 선택하여 정책을 구성합니다. 최종 실행 과정 V를 0으로 초기화된 defaultdict로 생성합니다. env를 GridWorld 환경의 인스턴스로 설정합니다. 이 환경은 격자 형태의 세계에서 에이전트가 상호작용합니다. value_iter 함수를 호출하여 환경에서 가치 함수를 계산하고, 이를 바탕으로 greedy_policy 함수를 호출하여 최적의 정책을 결정합니다. 이렇게 가치 반복법을 통해 최적의 정책을 찾는 과정은 강화학습에서 중요한 방법론 중 하나입니다. 이 코드는 그 과정을 체계적으로 구현하고 있습니다.