보안세상

[강화학습] Policy Gradient(정책 그래디언트)에 대해서 알아보자. 본문

내 생각

[강화학습] Policy Gradient(정책 그래디언트)에 대해서 알아보자.

똔민 2023. 7. 25. 13:02
반응형

Policy Gradient(정책 그래디언트)는 강화학습에서 정책(액션을 결정하는 함수)을 학습하는 알고리즘입니다. 이 알고리즘은 강화학습에서 가장 중요하고 강력한 기법 중 하나로, 실제로 딥러닝을 활용한 강화학습에서 많이 사용되고 있습니다.

Policy Gradient는 보통 REINFORCE 알고리즘이라고도 불립니다. 이 알고리즘의 핵심 개념은 보상을 최대화하는 방향으로 정책의 파라미터를 조정하는 것입니다. 목표는 정책의 파라미터를 조정하여 기대값이 높은 보상을 얻을 수 있는 최적의 정책을 찾는 것입니다.

주요 특징과 장점:


확률적인 정책 학습: Policy Gradient는 주어진 상태에서 각 액션을 취할 확률을 파라미터화하여 학습합니다. 이러한 접근 방식은 환경의 불확실성을 처리하는데 유리하며, 확률적인 정책을 학습할 수 있습니다.

대규모 액션 공간: Policy Gradient는 대규모 액션 공간에서도 잘 동작합니다. 이는 연속적인 액션 공간을 다룰 수 있기 때문에 실제로 많은 문제에서 사용되고 있습니다.

확률적 경사하강법: Policy Gradient는 확률적 경사하강법(Stochastic Gradient Descent, SGD)을 사용하여 정책의 파라미터를 업데이트합니다. 이로 인해 대규모 데이터셋에서도 효율적으로 학습할 수 있습니다.

스케일링 가능성: Policy Gradient는 함수 근사를 사용하여 정책을 학습하기 때문에, 복잡한 문제에서도 상대적으로 잘 확장될 수 있습니다.

연속적인 정책 개선: Policy Gradient는 보상을 최대화하는 방향으로 정책의 파라미터를 조정하므로, 계속해서 정책이 개선될 수 있습니다.

반응형

정책 그래디언트는 하지만 몇 가지 주요한 주의사항이 있습니다:

샘플 효율성: Policy Gradient는 샘플링 기반의 방법이므로 샘플 효율성이 중요합니다. 적은 샘플로도 좋은 결과를 얻을 수 있도록 최적화 및 알고리즘을 최적화해야 합니다.

높은 분산성: Policy Gradient는 샘플에 따라 추정 값이 높은 분산성을 가질 수 있습니다. 이러한 높은 분산성으로 인해 안정성과 수렴 속도에 영향을 미치기도 합니다.

Local Optima: 정책 파라미터의 초기값에 따라 국소 최적점에 수렴할 가능성이 있습니다. 이를 극복하기 위해 다양한 초기화 전략이 사용될 수 있습니다.

정책 그래디언트는 강화학습의 핵심 기법 중 하나이며, 딥러닝과 결합하여 다양한 분야에 적용되고 있습니다. 하지만 강화학습의 다양한 문제와 도메인에 따라 알고리즘과 파라미터 설정에 주의를 기울여야 합니다.

 

예시코드

import gym
import torch
import torch.nn as nn
import torch.optim as optim
from torch.distributions import Categorical

class PolicyNetwork(nn.Module):
    def __init__(self, s_dim, a_dim):
        super().__init__()
        # 정책 네트워크의 레이어를 정의합니다.
        # 입력 차원은 상태의 크기 (s_dim)이고, 출력 차원은 액션의 개수 (a_dim)입니다.
        self.fc1 = nn.Linear(s_dim, 64)  # 첫 번째 fully connected 레이어
        self.fc2 = nn.Linear(64, a_dim)  # 두 번째 fully connected 레이어

    def forward(self, x):
        x = torch.relu(self.fc1(x))  # ReLU 활성화 함수를 사용하여 첫 번째 레이어를 통과시킵니다.
        logits = self.fc2(x)  # 두 번째 레이어를 통과시켜 로짓을 얻습니다.
        return logits

class REINFORCE:
    def __init__(self, s_dim, a_dim, gamma=0.99, lr=0.001):
        self.policy = PolicyNetwork(s_dim, a_dim)
        self.optimizer = optim.Adam(self.policy.parameters(), lr=lr)
        self.gamma = gamma

    def get_action(self, state):
        with torch.no_grad():
            logits = self.policy(state)
            dist = Categorical(logits=logits)
            action = dist.sample()
        return action.item()

    def update_episode(self, log_probs, rewards):
        returns = []
        R = 0
        # 에피소드의 보상을 누적하여 에피소드의 리턴을 계산합니다.
        for r in rewards[::-1]:
            R = r + self.gamma * R
            returns.insert(0, R)

        returns = torch.tensor(returns)
        log_probs = torch.stack(log_probs)
        # Policy Gradient Loss 계산합니다.
        loss = -torch.mean(log_probs * returns)

        self.optimizer.zero_grad()
        loss.backward()
        self.optimizer.step()

if __name__ == "__main__":
    env = gym.make('CartPole-v1')
    s_dim = env.observation_space.shape[0]  # 상태의 차원 크기를 얻습니다.
    a_dim = env.action_space.n  # 액션의 개수를 얻습니다.

    agent = REINFORCE(s_dim, a_dim)  # REINFORCE 알고리즘에 따른 강화학습 에이전트를 생성합니다.

    for episode in range(1000):  # 1000번의 에피소드 동안 학습을 수행합니다.
        state = env.reset()  # 환경 초기화 및 초기 상태 얻기
        log_probs = []  # 로그 확률을 기록할 리스트
        rewards = []  # 보상을 기록할 리스트

        for t in range(1000):  # 최대 1000개의 타임스텝까지 반복
            state = torch.tensor(state, dtype=torch.float32).view(1, -1)
            action = agent.get_action(state)  # 정책을 기반으로 액션을 선택합니다.
            next_state, reward, done, _ = env.step(action)  # 액션을 환경에 적용하고 다음 상태와 보상을 얻습니다.

            log_prob = torch.log_softmax(agent.policy(state), dim=-1)
            log_prob = log_prob[0, action]  # 선택한 액션의 로그 확률을 얻습니다.

            log_probs.append(log_prob)  # 로그 확률을 기록합니다.
            rewards.append(reward)  # 보상을 기록합니다.

            if done:
                # 에피소드 종료 후 정책 업데이트를 수행합니다.
                agent.update_episode(log_probs, rewards)
                break

            state = next_state

    env.close()

이 코드는 CartPole 환경에서 Policy Gradient(정책 그래디언트) 알고리즘을 사용하여 간단한 에이전트를 학습하는 예시입니다. 주석을 통해 코드의 각 부분이 어떻게 동작하는지 상세하게 설명하였습니다. PolicyNetwork 클래스는 정책을 나타내는 뉴럴 네트워크를 정의하고, REINFORCE 클래스는 정책을 업데이트하는 알고리즘을 구현합니다. 코드를 실행하면 에이전트가 CartPole 환경에서 에피소드를 통과하는 것을 확인할 수 있습니다.

반응형
Comments