2023년 8월 23일 수요일

밑바닥부터 시작하는 딥러닝 4장 simpleNet 클래스와 numerical_gradient 함수 분석

아래 소스에서 빨간색 사각형 부분을 보면



























람다 함수 f는 인수로 w를 받는데 실제로 사용을 하지않는다.
그리고 이 f 함수를 numerical_gradient 함수에 인수로 넘긴다.

그리고 numerical_gradient 함수를 보면























위와 같이 f(x) 를 호출하는데 f는 위에서 언급한 인수를 사용하지않는 람다 함수이므로
f(x) 를 호출해도 x 값은 사용되지않는다.

그러면 실제 numerical_gradient 함수는 어떻게 해서 편미분값 grad 를 구하는가를 따라가보면





























f 호출 -> simpleNet.loss 호출 -> simpleNet.predict 호출로 진행되는데
predict 함수에서 입력변수 x([0.6, 0.9])와 가중값 self.W 를 행렬곱을 한다.
여기서 self.W 는 numerical_gradient 함수에 인수로 넘긴 값인데 위에 위에 그림에서
numerical_gradient 함수의 인수 x에 해당한다.
파이썬에서 넘파이 배열은 call by reference 이므로 
x[idx] = float(tmp_val) + h
x[idx] = tmp_val - h 
와 같이 x[idx] 에 값을 대입하면 simpleNet 클래스의 인스턴스(net)의 멤버변수 W가 변경된다.

결국 

x[idx] = float(tmp_val) + h => W[idx] = float(tmp_val) + h
x[idx] = tmp_val - h => W[idx] = tmp_val - h

이므로 W에 h가 적용된 변환값이 들어가서 정상적으로 계산할 수 있다.