페이지

2022년 8월 11일 목요일

STEP7 역전파 자동화

 이전 단계에서 역전파를 동작신키는 데 성공했습니다. 그러나 역전파 계산 코드를 수동으로 조합해야 했습니다. 새로운 계산을 할 때마다 역전파 코드를 직접 작성해야 한다는 뜻이죠. [그림 7-1]처럼 계산 그래프가 여러 개라면 각각의 계산에 맞게 역전파 코드를 수동으로 따로따로 작성해야 합니다. 그러다 보면  실수가 생길 수도 있고, 무엇보다도 지루할 것입니다. 지루한 일은 파이썬에게 시키자고요!


그래서 이제부터 역전파를 자동화하려 합니다. 더 정확히 말하면, 일반적인 계산(순전파)을 한 번만 해주면 어떤 계산이라도 상관없이 역전파가 자동으로 이루어지는 구조를 만들 것입니다. 두둥! 지금부터가 바로 Define-by-Run의 핵심을 건드리는 내용입니다!

Define-by-Run이란 딥러닝에서 수행하는 계산들을 계산 시점에 '연결'하는 방식으로, '동적 계산 그래프'라고도 합니다. Define-by-Run의 개념과 장점은 제2고지 마지막의 '칼럼:Define-by-Run'에서 자세히 설명합니다.

그런데 [그림7-1]의 계산 그래프들은 모두 일직선으로 늘어선 계산입니다. 따라서 함수의 순서를 리스트 형태로 저장해두면 자중에 거꾸로 추적하는 식으로 역전파를 자동화할 수 있습니다. 그러나 분기가 있는 계산 그래프나 같은 변수가 여러 번 사용되는 복잡한 계산 그래프는 단순히 리스트로 저장하는 식으로 풀 수 없습니다. 우리 목표는 아무리 복잡한 계산 그래프라 하더라도 역전파를 자동으로 할 수 있는 구조를 만련하는 것입니다.


사실 리스트 데이터 구조를 응용하면 수행한 계산을 리스트에 추가해 나가는 것만으로 어떠한 계산 그래프의 역전파도 제대로 해낼 수 있습니다. 이 데이터 구조를 웬거트 리스트(Wergert List)(혹은 테이프(tape))라고 합니다. 이 책에서는 웬거트 리스트에 대한 설명은 하지 않으니 관심 있는 분은 참고 문헌 [2]와 [3]을 참고하시고, 웬거튼 리스트를 활용하는 Define-by-Run의 장점은 참고문헌[4]를 참고해 주세요


댓글 없음: