아이공의 AI 공부 도전기

[Error 해결법] RuntimeError: Trying to backward through the graph a second time, but the saved intermediate results have already been freed. Specify retain_graph=True when calling b ackward the first time.

 

     

 

문제 확인

 

모델 구현에 있어 자주 만나는 에러이기도 한만큼 잘못 설정할 경우 이와 같은 에러를 만날 수 있다.

 

본 에러는 문장에서 알 수 있듯, backward를 이미 시행했음에도 후에 이 값을 backward하는 경우가 생겨야만할 때 문제가 된다.

 

가령 다음과 같은 경우 가장 일반적인 경우라고 볼 수 있다.

 

for y in dataloader:
	
    y_hat = model.predict(x)
    
    loss = loss_norm(y, y_hat)
    
    optimizer.zero_grad()
    loss.backward()
        
    loss2 = loss_norm(loss, norm_dist)
    loss2.backward()    
    
    optimizer.step()

 

보이는 바와 같이 loss를 이미 구해 backward를 사용했음에도 이와 관련한 value를 loss2에서 사용하고 backward하는 것이 문제가 된다.

 

해결법

 

이와 관련한 해결법은 크게 2가지이다.

 

1. 두 loss가 서로 상충하지 않도록 잘 조율할 필요가 있다.

이 방법은 알아서 조율해야한다.

 

2. loss.backward(retain_graph=True)를 통해 해결한다.

여러번 호출해야하는 그래프의 값이라면  본 옵션을 통해 그래프 버퍼를 삭제하지 않도록 한다.

다만 이 경우 backward가 2번 된다는 것을 인정하기 때문에 본 의도에 맞게 진행되는 것인지 생각을 정리한 다음 사용할 필요가 있다.

 

 

번외

위와 같은 경우가 아니라 간혹 loss에서 사용되는 특정 value를 계산하는데만 사용하는데도 간혹 문제가 될 경우가 있다.

단순한 값만을 계산하는 경우 해당 tensor의 item 혹은 data를 통해 풀어야 본 해결법을 활용할 수 있다.

 

val = loss.item() * 3 + other_value

val = loss.data[0] * 3 + other_value

 

참조

https://stackoverflow.com/questions/46774641/what-does-the-parameter-retain-graph-mean-in-the-variables-backward-method?fbclid=IwAR24rnik7Q5L5dx5OXOhagL3iJR8efWhEf8J8mVeOB0cPCYekamAlgCiMGc 

 

What does the parameter retain_graph mean in the Variable's backward() method?

I'm going through the neural transfer pytorch tutorial and am confused about the use of retain_variable(deprecated, now referred to as retain_graph). The code example show: class ContentLoss(nn.Mo...

stackoverflow.com

 

 

공유하기

facebook twitter kakaoTalk kakaostory naver band
loading