에이전트(Agent)가 환경(Environment)과 상호작용하며 보상(Reward)을 최대화하는 정책(Policy)을 학습하는 기계학습 분야
2. 주요 구성 요소
에이전트 (Agent)
정책(Policy)에 따라 행동(Action)을 선택하는 주체
환경 (Environment)
에이전트의 행동을 받아 다음 상태(State)와 보상(Reward)을 반환하는 외부 세계
상태 (State)
환경이 현재 상황을 묘사하는 정보
예시: CartPole 환경에서 카트의 위치와 막대의 기울기
행동 (Action)
에이전트가 환경에 취할 수 있는 선택
예시: 카트를 왼쪽 또는 오른쪽으로 이동
보상 (Reward)
행동의 결과로 환경으로부터 받는 실수 값 신호
목표: 이 보상을 최대화하는 방향으로 정책을 개선
정책 (Policy)
정의: 주어진 상태에서 어떤 행동을 취할지 결정하는 전략
확률론적 정책: π(a|s)는 상태 s에서 행동 a를 선택할 확률을 의미
3. Reinforcement Learning의 목표
정의: 누적 보상(Return)의 기대값을 최대화하는 정책을 찾는 것
학습 과정
환경 초기화 및 상태 수신
행동 수행
다음 상태와 보상 획득
에피소드 구성 및 반복
정책 점진적 개선
4. 정책(Policy)
정의: 주어진 상태에서 어떤 행동을 취할지 결정하는 전략
특징: 상태를 입력받아 행동의 확률 분포를 출력
확률론적 정책: π(a|s)는 상태 s에서 행동 a를 선택할 확률을 의미
5. 개발 환경 설정 (Google Colab 기준)
특징: 클라우드 기반 Jupyter 노트북 환경
장점: 별도의 설정 없이 PyTorch와 OpenAI Gym 사용 가능
[실습1: PyTorch 텐서 기본 사용법]
1. 텐서 생성
import torch
x = torch.tensor([1.0, 2.0, 3.0])
print(x)
tensor([1., 2., 3.])
2. 텐서 연산
y = x + 2
print(y)
tensor([3., 4., 5.])
3. 텐서의 크기 확인
print(x.shape)
torch.Size([3])
4. 텐서의 데이터 타입 확인
print(x.dtype)
torch.float32
5. 텐서의 연산 기기 확인
print(x.device)
cpu
6. GPU 사용 가능 여부 확인 및 텐서 이동
if torch.cuda.is_available():
device = torch.device('cuda')
print('GPU 사용 가능')
else:
device = torch.device('cpu')
print('GPU 사용 불가능')
x = x.to(device)
print(x.device)
GPU 사용 불가능
cpu
7. 텐서의 요소 접근 및 변경
print(x[0])
x[0] = 10.0
print(x)
tensor(1.)
tensor([10., 2., 3.])
8. 텐서의 차원 변경
x = x.view(1, 3) # (1, 3) 형태로 변환
print(x)
print(x.shape)
for episode in range(10): # 10개의 에피소드 실행
observation, _ = env.reset() # 환경 초기화
done = False # 에피소드가 종료되었는지 여부를 나타내는 변수를 초기화
total_reward = 0 # 에피소드 동안 얻은 총 보상을 초기화
while not done: # 에피소드가 종료될 때까지 반복
# 랜덤 행동 선택 (0: 왼쪽, 1: 오른쪽)
action = env.action_space.sample()
# 선택한 행동을 환경에 적용하고 다음 상태, 보상, 에피소드 종료 여부, 추가 정보를 반환
next_observation, reward, terminated, truncated, info = env.step(action)
done = terminated or truncated
total_reward += reward # 에피소드 동안 얻은 보상을 누적
observation = next_observation # 다음 상태 업데이트
# 환경 렌더링 (주석 처리하면 렌더링을 비활성화)
# env.render()
# 각 에피소드가 종료될 때 총 보상을 출력
print(f"Episode {episode + 1}: Total reward = {total_reward}")
Episode 1: Total reward = 30.0
Episode 2: Total reward = 19.0
Episode 3: Total reward = 38.0
Episode 4: Total reward = 19.0
Episode 5: Total reward = 14.0
Episode 6: Total reward = 18.0
Episode 7: Total reward = 11.0
Episode 8: Total reward = 33.0
Episode 9: Total reward = 51.0
Episode 10: Total reward = 33.0