loss = -norm.log_prob(v) * reward
1. 먼저 출력된 Action은 softmax 이므로 사실상 확률 분포를 의미하는 것과 같다. 이 중에서 샘플을 구성해서 한 개 샘플을 뽑는다.
샘플을 뽑기 위해서 Torch 의 Categorical을 사용한다. Categorical을 사용하면 Net 에 나온 Action의 확률 분포를 반영하여 랜덤 뽑기를 진행할 수 있다. 인덱스 정보가 출력된다.
c = torch.distributions.Categorical(Net 결과)
2.상기 Categorical 인스턴스에 대해서 sample을 뽑는다.
idx = c.sample()
3.해당 idx 에 대해서 보상 점수를 매긴다.
4. 해당 IDX 에 대해서 c.log_prob() 를 사용한다. 이 인자에 인덱스를 넣어주면, 해당 확률 분포 인덱스의 확률 정보를 계산해준다. 이 계산 과정은 역시 텐서의 미분 정보와 연결되어 있기 때문에 로스 함수로 사용할 수 있게 된다. 따라서 policy gradient 방법대로 -를 붙이고 보상 점수를 곱하면 된다.