REINFORCE ALGO의 학습 매커니즘을 더 와닿게 만들겠다
learning_rate = 0.0002
gamma = 0.98
# Policy Network: 4개의 state를 입력으로 받아서 2개의 action 출력
class Policy(nn.Module):
def __init__(self):
super(Policy, self).__init__()
self.data = []
self.fc1 = nn.Linear(4, 128)
self.fc2 = nn.Linear(128, 2)
self.optimizer = optim.Adam(self.parameters(), lr=learning_rate)
def forward(self, x):
x = F.relu(self.fc1(x))
x = F.softmax(self.fc2(x), dim=0)
return x
def put_data(self, item):
self.data.append(item)
def train_net(self):
R = 0
self.optimizer.zero_grad()
for r, prob in self.data[::-1]:
R = r + gamma * R # discounted reward
loss = -torch.log(prob) * R
loss.backward()
self.optimizer.step()
self.data = []
def main():
env = gym.make('CartPole-v1')
pi = Policy()
score = 0.0
print_interval = 20
for n_epi in range(10000):
s = env.reset()
done = False
while not done: # CartPole-v1 forced to terminates at 500 step.
prob = pi(torch.from_numpy(s).float())
m = Categorical(prob)
a = m.sample() # prob에 따라 discrete action 선택
s_prime, r, done, info = env.step(a.item())
pi.put_data((r,prob[a]))
s = s_prime
score += r
pi.train_net()
출처 : https://github.com/seungeunrho/minimalRL/blob/master/REINFORCE.py
코드로 어떻게 학습되는지 보면 더 잘 보일 것 같다.
REINFORCE ALGORITHM은 Actor - Critic과 달리 Value Function을 쓰지 않아도된다.
코드의 main에서 Reward : r 과 policy network로 뽑은 action의 Probability : prob이
self.data에 append 되는 것을 볼 수 있다.
에피소드 끝까지의 보상과 액션의 확률 <나중에 미분을 위하여>을 저장해놓는다.
그리고 에피소드가 끝나면 train_net을 호출하는데,
쌓아놨던 메모리를 불러오는 순서를 유심히 보자.
가장 최근의 사건부터 거꾸로 불러오는 것을 볼 수 있다.
왜 그런가하면 $G_{t} = R_{t} + \gamma R_{t+1} + \gamma R^{2}_{t+2} ..$ 이기 때문이다.
마지막의 보상부터 R 이라는 변수에 저장을 해주며
$ R = r + \gamma R $ 반복하면 이전의 $R$은 $\gamma$가 누적돼서 곱해진다.
에피소드 길이가 4일 때 학습되는 식을 풀어보자
memory = [((0,0.6)),((0,0.58)),((0,0.8)),((1, 0.7))]
memory의 순서대로 $s_{t}$별로 적재된 reward와 action의 prob이 있다
Policy network의 object function를 인지하고 따라가보자.
$ \theta_{t+1} = \theta_{t} + \eta(ln(P_{\theta_{t}}(a_{t} | s_{t})) G_{t}) $
코드 그대로 식을 풀어보면
R = 0
step 1 $s_{3}$에 대하여
$ R = 1 + \gamma * 0 $
$ loss = -ln(prob) * R $
$ loss.optimize $
step 2 $s_{2}$에 대하여
$ R = 0 + \gamma * 1 $
$ loss = -ln(prob) * \gamma $
$ loss.optimize $
step 3 $s_{1}$에 대하여
$ R = 0 + \gamma * 1 $
$ loss = -ln(prob) * \gamma^{2} $
$ loss.optimize $
step 4 $s_{0}$에 대하여
$ R = 0 + \gamma * 1 $
$ loss = -ln(prob) * \gamma^{3} $
$ loss.optimize $
이제 감이 잡힐 것이다.
$s_{0}$ 시점에서 $R$ , 그니까 $G_{t}$는 앞의 $\gamma$가 모두 누적되어 곱해진 결과다
'Data Analysis > [Project] Financial Reinforce Agent' 카테고리의 다른 글
주식 강화학습 에이전트 만들기 - 전체 리뷰 (7) | 2023.12.05 |
---|---|
즉각 보상을 계산할 수 없는 상황일 때, 과연? (5) | 2023.11.14 |
Policy Based Reinforce Learning in Stock Trading - 정책기반 강화학습과 주식 (0) | 2023.10.22 |
Financial Time-Series Overview<1> (0) | 2023.08.18 |
투자 용어 간단 정리 - 물가연동국채, 전환사채, 권리락 (1) | 2023.07.11 |