티스토리 뷰

keep9oing

pytorch backward()

HTS3 2020. 4. 23. 22:10

keras만 사용하다가 pytorch를 사용할 때 autograd를 사용하는  것이 익숙하지 않아서 고역이다.

pytorch에서는 tensor에 대한 자동미분을 loss.backward()같은 기능을 이용해서 해주게 되는데 supervised learning같은 신경망을 학습할때에는 그렇게 신경쓰지않고 예제에 있는대로 가져다 써도 괜찮았다. 그러나 신경망 업데이트 타이밍이 알고리즘마다 제각각인 강화학습을 사용할때 autograd에 대한 이해를 잘해놓지 않으니 코딩할 때마다 매번 혼란에 빠진다. 오늘은 헷갈려서 시간을 쓴부분에 대한 정리.


Pytorch를 이용한 REINFORCE 알고리즘을 구현할때 손실함수를 아래처럼 정의하고 써야했다.

$$ loss = -\sum_{t=0}^{T}(log \pi (u_{t} | x_{t}) G_{t}) $$

 

이에 대해 참고한 minimal RL에서보면

https://github.com/seungeunrho/minimalRL

self.optimizer.zero_grad()

for r, prob in self.data[::-1]:
	R = r + gamma * R
	loss = -torch.log(prob) * R
	loss.backward()
    
self.optimizer.step()

이런식으로 매 t에 대해 loss.backward()를 진행해주는데 내 생각에는 로스를 다 더해준다음 backward를 진행하고 optimizer step을 해야하는게 아닌가 싶어 

loss = 0
self.optimizer.zero_grad()

for r, prob in self.data[::-1]:
	R = r + gamma * R
	loss = loss-torch.log(prob) * R
    
loss.backward()
self.optimizer.step()

이런식으로 바꿨더니 여전히 잘 동작했다.

 

왜그런지 autograd에 대한 문서를 천천히 읽어보니

backward()를 호출할경우 해당 스칼라에 대한 미분값이 전파되는데 이는 매번 backward를 호출 할때마다 autograd에서 추적되고있는 모든 tensor에 대해 계속 중첩해서 들어간다는 것이다. 그래서 optimizer같은 경우 매번 zero_grad()로 미분값을 0으로 바꿔주고 있었던 것..  사실 아직도 이게 확실히 맞게 이해한건지는 잘모르겠다 ㅋ

 

tensorflow keras pytorch를 어쩔수없이 왔다갔다 하다보니 급하게 작동만 되도록 코드를 짜집었다. 그러니 이런 기본으로 할 수 있는 부분에서 계속 구멍이 생긴다. tf2.0이 잘 정착 될때 까지는 torch를 쓰고 싶으니 계속 공부해볼 예정.

'keep9oing' 카테고리의 다른 글

ROS2 foxy 튜토리얼1 - 설치 및 설정  (2) 2020.07.07
Gazebo [Err] [REST.cc:205] Error in REST request 에러 해결  (3) 2020.04.28
Vimrc  (0) 2020.04.12
RVO2 Library - 1 - 개요  (8) 2020.03.03
강화학습과 latent space  (0) 2020.02.14
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31