서론

이전에 이어서 계속 만들어보자.

Broadcast를 어떻게 처리해야 할지를 생각하자.

동적으로 클래스를 만드는 법

지금 Func 클래스들은 전부 인스턴스화를 시키지 않고 사용하고 있다.

여기서 하나 문제가 생기는건, Broadcast를 Func의 일종으로 편입할 때 생긴다.

CalcGraphLeaf처럼 CalcGraph의 일종으로 해도 안될건 없겠지만… Func의 일종으로 하고 싶다.

문제는 Broadcast는 종류가 무한하다는 것이다.

클래스 자체를 동적으로 만들어 써야 한다는 것이다.

type 내장 함수는 두 가지 역할을 하는데, 그 중 하나는 동적으로 클래스를 만드는 것이다.

필요한 함수들을 만들어서 동적으로 클래스를 만들어주자.

Broadcast를 반대로?

forward는 쉽다. backward가 문제다.

그냥 ‘평균을 취하지’가 말은 쉽지만, 실제 계산은 조금 까다롭기 때문이다.

Broadcast가 정확히 어떻게 일어나는지를 알아야지 실제 계산을 할 수 있다.

실제 Broadcast때엔 적어도 하나의 길이가 1인 차원이 있어야 한다.

그 차원을 확장시켜서 차원을 맞추는게 Broadcast의 일이다.

다음과 같은 방법으로 Broadcast를 반대로 해줄 수 있을 것이다.

  1. 이전 차원과 이후 차원의 크기를 비교한다.
  2. 이전 치원이 만약 크기가 더 작다면, 그 만큼 앞에 (1, )을 붙여준다. (ex: (2, 2) -> (1, 2, 2))
  3. 이전 차원의 크기가 1이고 이후 차원의 크기가 1이 아닌 축을 따라서 평균을 구해준다.
  4. 이전 차원과 모양이 같도록 squeeze 해준다. (2번을 했을 경우)

어떻게 어떻게 Broadcast를 처리했다.

Broadcast와 계산 그래프의 처리

Broadcast를 만드는 함수를 만들었으면, 실제로 Broadcast를 계산 그래프에 넣는 것을 처리해야 한다.

따로 함수를 빼서 처리해줬다.

조금 난잡해 보이기는 하지만 제대로 굴러간다.

오늘의 결과

Broadcast를 제대로 처리할 수 있게 된 것 같다.

numpyufunc 말고 다른 함수들도 있는 모양인데 이건 또 머리가 아파진다.

squeeze처럼 다른 shape에 관여하는 변수들도 어떻게 처리는 해 줘야 할 것이다. 휴우.

잡설로, 타입 힌팅하고 IDE를 같이 사용하면 정말로 편하다.

파이썬은 타입을 강제하지 않지만, 타이핑이 주는 이점도 무시할 수 없이 무지막지하다.