페이지

2022년 8월 13일 토요일

9.1 파이썬 함수로 이용하기

 지금까지의 DeZero는 함수를 '파이썬 클래스'로 정의해 사용했습니다. 그래서 가령 Square 클래스를 사용하는 계산을 하려면 코드를 다음처럼 작성해야 했습니다.


x = Variable(np.array(0.5))
f = Square()
y = f(x)

이와 같이 Square클래스의 인스턴스를 생성한 다음, 이어서 그 인스턴스를 호출하는 두 단계로 구분해 진행해야 합니다. 사용자 입장에서 조금 번거롭죠. y=Square()(x)형태로 한줄로 적을 수도 있지만 모양새가 좋지 않습니다. 더 바람직한 해법은 '파이썬 함수'를 지원하는 것입니다. 그래서 다음 코드를 추가합니다.

def square(x):
  f = Square()
  return f(x)

def exp(x):
  f = Exp()
  return f(x)

보다시피 square와 exp라는 두 가지 파이썬 함수를 구현했습니다. 이로써 'DeZero 함수'를 '파이썬 함수'로 이용할 수 있게 됩니다. 참고로 이 코드는 다음과 같이 한 줄로 표현할 수도 있습니다.

def square(x):
  return Square()(x)   # 한 줄로 작성

def exp(x):
  return Exp()(x)

이전의 f = Square() 형태에서는 DeZero함수를 f라는 변수 이름으로 참조한 데 반해, 간소화한 코드에서는 직접 Square()(x)라고 쓴 것입니다. 그럼 방금 구현한 두 함수를 사용해보죠.

x = Variable(np.array(0.5))
a = square(x)
b = exp(a)
y = square(b)

y.grad = np.array(1.0)
y.backward()
print(x.grad)

3.297442541400256

보다시피 최초의 np.array(0.5)를 Variable로 감싸면 일반적인 수치 계산을 하듯, 즉 넘파이를 사용해 계산하도록 코딩할 수 있습니다. 또한 다음과 같이 함수를 연속으로 적용할 수 있습니다.


x = Variable(np.array(0.5))
y = square(exp(square(x)))   # 연속하여 적용
y.grad = np.array(1.0)
y.backward()
print(x.grad)

3.297442541400256

이제 계산을 더 자연스러운 코드로 표현할 수 있게 되었습니다. 이것이 첫번째 개선입니다.

댓글 없음: