본문 바로가기
Study 공부할레나

[스터디/밑시딥3] 제 2고지 자연스러운 코드로_14. 같은 변수 반복 사용

by LENA-cfg 2023. 8. 22.

현재, DeZero는 문제가 있습니다.

문제는 같은 변수를 반복해서 사용할 경우 의도대로 동작하지 않을 수 있습니다.

 

예를들어 위의 그래프처럼 y = add(x,x)일때 동일한 변수를 사용하여 덧셈을 하면 제대로 미분하지 못합니다.

y = x + x는 y = 2x인데 이를 미분하면 2가 나와야하는데 array(1.)을 내보내고 있습니다.

14.1 문제의 원인

 

출력 쪽에서 전해지는 미분값을 그대로 대입하여 같은 변수를 쓰면 미분값이 덮어 써지는 것인데

위 그림처럼 x.grad가 각각으로 가는 값들을 그냥 덮어쓰고 내보내는 것이 아니라 두 x.grad를 더해줘야 (x.grad + x.grad = 2)가 되야 올바른 결과 입니다.

 

14.2 해결책

형광펜 칠해진 곳을 수정하는데 gxs가 반복할 수 있는 값을 가질때

처음 들어온 gx는 x.grad가 저장이 되지 않았기때문에 x.grad에 저장해주고 

두번째 들어온 gx는 앞에 x.grad가 들어와 있기 때문에 앞에 x.grad와 현재들어온 gx를 더해주는 걸로 수정해줘야합니다.

14.3 미분값 재설정

14.2에서 수정한 코드는 새로운 주의 사항이 필요한데 같은 변수를 사용하여 '다른' 계산을 할 경우 계산이 꼬이는 문제가 발생합니다.

위의 이미지처럼 x = Variable(np.array(3.0))을 아래에서 각각의 다른 계산으로 사용할 때

Variable의 인스턴스인 x를 재사용하게되고 그 결과로 두번째 미분값(x.grad=3)가 첫번째 미분값(x.grad=2)가 더해져 5.0이라는 잘못된 값을 돌려줍니다.

 

그래서, Variable 클래스에 미분값을 초기화하는 cleargrad 메서드를 추가해줍니다.

단순히 미분값을 초기화하는  cleargrad 메서드는 self.grad에 None을 대입해주는데

이 메서드를 사용하면 여러가지 미분을 연달아 계산할 때 똑같은 변수를 재 사용할 수 있습니다.

x.cleargrad를 호출하면 변수에 누적된 미분값이 초기화 되기때문에 같은 변수를 재사용 할 수 있게 됩니다.