서론

Optimizer를 만들어보자! 기본적인 이론 공부는 이전에 이미 해뒀었다. 그걸 코딩하면서 생기는 문제에 부딛혀보자.

뼈대부터 차근차근

일단 Optimizer의 뼈대부터 만들어보자.

Optimizer는 어떤 매개 변수를 가지고 있어야 할까? 또 어떤 함수가 필요할까?

일단 Optimizer가 필요한 매개 변수는 텐서다. 정확히는 계산 그래프의 제일 끝자락에 있는 텐서로, 그라디언트를 계산할 수 있어야 한다.

필요한 함수는 역시 학습시키는 step이다.

또한 각종 Hyperparameter들도 받아야 한다. 일단 기본적으로 lr이 있다.

그 외에 필요한 Hyperparameter는 상속하면서 받게 만들자.

그래프 내의 모든 항목 순회

어떻게 하면 계산 그래프 내의 모든 항목을 순회할 수 있을까?

중요한 것은 같은 노드를 두 번 순회하지 않는 것이다. 리스트에다가 넣어 두고 member test를 하는 식으로 할 수 있지 않을까.

매직 메서드: __iter____next__

이럴 때 필요한 것이 __iter____next__ 메서드다.

이걸 잘 구현해두면 이터레이터를 만들 수 있다. 즉 아무 걱정 없이 for문 안에다가 집어넣어서 쓸 수 있다.

__iter__은 이터레이터를 반환한다. 무슨 뜻이냐 하면 이터레이터와 관련된 논리는 다른 클래스에 작성한 후 이를 반환하게도 할 수 있다는 뜻이다. 편하다.

__next__는 실제 논리를 처리하는 부분이다. 불릴 때마다 그 다음 그 다음 노드를 반환하게 만들어야 한다.

__iter__를 활용해서, 다른 클래스에 구현해주자.

사실 이걸 구현할 때는 (지금껏 그랬듯) 재귀 호출을 사용하는게 가장 편한데, 이건 어떻게 재귀 호출로 처리될 문제가 아니다.

하지만 재귀 호출로 그래프를 읽는건 스택을 쓰는 것과 같다. (콜) 스택을 쓰는 방법이라는 점에선 동일하기 때문이다.

다음 시간

대충 보고 싶은게 생겨서 실제 구현은 뒤로 미룬다.

이제 적당히 구현해보자.