페이지

2022년 8월 12일 금요일

8.2 반복문을 이용한 구현

 이번 절에서는 지금까지의 '재귀를 사용한 구현'을 '반복문을 이용한 구현'으로 고쳐보겠습니다. 코드는 다음과 같습니다.

class Variable:
  def __init__(selfdata):
    self.data = data
    self.grad = None
    self.creator = None

  def set_creator(selffunc):
    self.creator = func
  
  def backward(self):
    funcs = [self.creator]
    while funcs:
      f = funcs.pop()   # 함수를 가져온다.
      x, y = f.input, f.output  # 함수의 입력과 출력을 가져온다.
      x.grad = f.backward(y.grad)   # backward 메서드를 호출한다

      if x.creator is not None:
        funcs.append(x.creator)   # 하나 앞의 함수를 리스트에 추가한다.

이것이 반복문을 이용한 구현입니다. 주묵할 점은 처리해야 할 함수들을 funcs 라는 리스트에 차례로 집어넣는다는 것입니다.  while블럭 안에서 funcs.pop()을 호출하여 처리할 함수 f를 꺼내고, f의 backward메서드를 호출합니다. 이때 f, input과 f, output에서 함수 f의 입력과 출력 변수를 얻음으로써 f.backward()의 인수와 반환값을 올바르게 설정할 수 있습니다.


리스트의 pop 메서드는 리스트에서 마지막 원소를 꺼내줍니다(반환된 요소는 리스트에서 제거됩니다). 예컨대 funcs = [1,2,3] 일때 x = funcs.pop()을 실행하면 3이 반환되고 funcs는 [1,2]가 됩니다.

댓글 없음: