본문 바로가기

VISION

forward/back propagation 코드 구현 시 헷갈렸던 내용 정리

나중에 또 궁금할까봐 적어놓는데 나만 알아볼 수 있을듯.

 

<Forward propagation>

1) Z = W.T · X에서 왜 transpose를 해야하는가?

- data matrix X에서 하나의 열에 하나의 샘플이 배정되어있는데, W에는 데이터 샘플 하나가 가지는 여러 feature에 대한 w값들이 column vector로 나열되어있기 때문에 X와 매칭해서 dot product를 수행하려면 transpose해주어야 한다.

2) cost를 계산할 때는 np.sum으로 각 샘플의 loss를 더한 다음 m(샘플 개수)으로 나눠줘야 한다. 샘플이 하나가 아니니까 그냥 loss funtion을 통과시키면 각 샘플의 loss들이 벡터로 나오기 때문에 그걸 더하고 나눠서 하나의 실수값으로 만드는 것.

 

<Backward propagation>

1) w에 대한 derivative (dw)를 계산할 때 X · (A-Y).T의 식을 사용한다. 이 때 transpose를 해주어야 하는 이유는?

activation function을 통과한 후의 결과값 행벡터인 A와 ground truth label인 행벡터 Y 모두 각 샘플에 대한 하나의 결과값만이 1행에 쭉 나열되어 있다. 그런데 w는 샘플의 각 feature마다 존재하므로, derivative도 마찬가지로 각 feature별로 구해야 한다. 그러려면 loss를 계산한 행벡터 A-Y에 transpose를 해서 열벡터로 만들어주어야 X의 행별로(특정 feature별로) derivative를 구할 수 있는 것이다. np.dot을 이용하면 각 feature에 대한 dw값이 열벡터로 쭉 나타나고, 그건 모든 데이터에 대한 sum 값이므로 마지막으로 m으로 나눠준다.

2) b에 대한 derivative (db)를 계산할 때 sum을 하고 m으로 나눠주는 이유는?

b는 하나의 실수값인데, 샘플이 하나라면 그냥 A-Y로 b에 대한 미분값을 구할 수 있겠지만 샘플이 여러개이므로 derivative값을 summation한 뒤 샘플 개수인 m으로 나눠주는 것이다.

 

이래서 shape assertion를 하는거구나 싶었다. transpose를 안하거나 잘못하면 gradient 계산이 안되기때문에 assertion을 통해 확실히 해주는 것. 근데 그렇게 안해도 대부분 컴파일 에러로 걸릴 것 같다.

 

추가) output layer에서 나온 ndarray를 0 또는 1로 맵핑하고 싶다면, 반올림을 하는 np.round(ndarray)를 사용하면 된다. 그런데 이걸 ndarray > 0.5 이렇게도 코딩할 수 있었다.