하나의 모델에는 여러 개의 layer들이 있고 backward를 진행하며 grads를 구합니다.
layer들의 grads를 self.grads에 list로 관리를 하는데, 이런 구조에서는 반드시 깊은 복사를 해줘야합니다.
self.grads[0][...] = dW
그 이유에 대해 정리해봅니다.
먼저 깊은 복사란 새로운 메모리를 할당받는 것을 말합니다.
보통의 상황에서는 큰 차이가 없지만 리스트와 같은 자료형을 통해 관리할 때는 중요한 차이를 보입니다.
그림 4와 같이 얕은 복사를 할 경우에는 a에 새로운 값을 할당했지만 그 값이 적용되지 않습니다.
이를 쉽게 설명하자면, 같은 이름의 a 지만 얕은 복사를 했기 때문에 새로운 a를 만든 것입니다.
반면에 그림5와 같이 깊은 복사를 할 경우 그 값이 반영되었음을 확인할 수 있습니다.
이 2개의 차이를 그림으로 표현하면 다음과 같습니다.
즉 c는 a와 b의 주소를 가지고 있고 이를 통해 접근합니다.
얕은 복사를 하면 a의 주소가 바뀌게 되고 c가 가지고 있는 a의 주소와 새로 바뀐 a의 주소는 다릅니다.
따라서 c는 기존 값을 계속 가지고 있습니다.
깊은 복사를 하면 a의 주소는 그대로이고 값만 새로 할당되기에 새로 바뀐 값을 가지고 있습니다.
- reference
밑바닥부터구현하는딥러닝2
'DataScience > DeepLearning' 카테고리의 다른 글
[삽질 기록하기] Keras custom trainer (0) | 2024.02.26 |
---|---|
[활성화 함수] 활성화함수는 왜 필요할까? (0) | 2023.07.15 |
댓글