[이 자료는 Coursera Stranford University Andrew Ng 교수님의 강의 자료를 활용하였습니다.]


* Unrolling Parameters


이전까지 역전파 알고리즘의 구현 방법에 대해 얘기해왔습니다. 이제 역전파 알고리즘이 실제로 어떻게 코드로 구현되어야 하는지에 대해 알아보겠습니다.

1


레이어가 4개인 뉴럴 네트워크에서의 Advanced optimization 알고리즘을 보여주는 코드입니다. 익숙하지 않은 부분이 하나 있네요. Unroll 의 의미에 대해 알아보겠습니다.

2


레이어의 유닛 개수를 알면 weight 행렬의 사이즈가 정해집니다. 그리고 그 사이즈는 대문자 델타 D와 행렬 사이즈가 같습니다. 위 그림의 thetaVec과 DVec의 input값에는 행렬들을 넣어주는데 그렇게되면 thetaVect과 DVec은 행렬이 아닌 열벡터 형태로 input 값들을 정렬해줍니다. 연산을 위해 잠시 열벡터를 사용하는 것이고 최적화된 theta들을 구하는 연산이 끝난 후에는 다시 weight 행렬로 reshape를 시켜주도록 코드를 입력 해줍니다.

3


위에서 했던 방식들을 적용하면 weight 행렬들과 D 행렬을 얻을 수 있습니다. Unroll을 하는 이유는 여러 행렬들을 하나의 열벡터로 압축시킨 다음 최적화 연산을 진행하기 위해서 외에 다른 이유는 없네요. 그 다음에는 다시 reshape 를 통해서 다시 행렬의 모양을 얻기만 하면 되니 어려운 점은 없어보입니다.


* Gradient Checking


역전파 알고리즘뿐만 아니라 다른 복잡한 모델의 알고리즘들을 구현하고 gradient descent를 돌려보면 모든 반복마다 코스트 함수가 줄어들면 그것은 실제로 잘 작동하고 있는것처럼 보입니다. 하지만 코스트 함수가 점점 줄어든다고 해서 Bug free 라고 확정을 짓기에는 무리가 있습니다. 그래서 Gradient checking 이라는 방법을 통해 이 네트워크가 오류없이 잘 돌아가고 있는지 확인하려고 합니다.

4



Gradient checking 의 아이디어는 매우 작은 양의 실수인 입실론을 정의하고 위에 그래프와 같이 두 가지의 기울기를 비교합니다.

5



theta 벡터는 weight 행렬의 unroll 된 버전이므로 n차원의 열벡터 입니다. 코스트 함수를 각각의 theta 에 대해 편미분한 식과 입실론을 이용한 기울기 식의 값이 근사한지 비교합니다.

6

위 그림은 gradient checking 구현 방법을 코드로 나타낸 것입니다. 반복문을 통해서 gradApprox 를 구하고 역전파 알고리즘을 통해서 DVec 을 구해서 근사값을 비교합니다.

7


여태까지 얘기한 gradient checking 구현 방법을 정리한 그림입니다. 주의할 점은 알고리즘을 돌릴 때 gradient checking 코드를 주석처리 해야한다는 점입니다. 그렇지 않고 gradient checking 과 알고리즘을 동시에 계산하게 되면 컴퓨터에 계산적으로 굉장히 큰 부하가 걸리게 되고 컴퓨터는 느려질 것입니다.

* Random Initialization


1


로지스틱 회귀에서는 theta 벡터를 0으로 초기화시켜도 gradient descent 가 가능했었습니다. 그런데 뉴럴 네트워크에서는 weight 행렬을 0으로 초기화하면 안된다고 하네요. 그렇다면 위 그림과 같이 weight 행렬을 랜덤으로 생성해주고 입실론 연산을 조절해서 weight 행렬을 만들면 되네요.

* Putting It Together


지금까지 배워왔던 아이디어를 정리해보겠습니다.

1



뉴럴 네트워크를 학습시키기 전에 네트워크의 아키텍처에 대해 고민해봐야 합니다. 입력 유닛과 출력 유닛은 처음에 가지고 있던 데이터 set에 의해 결정되겠지만 뉴럴 네트워크를 통해서 예측값을 얻는데는 히든 레이어의 역할도 중요합니다. 초기값은 1개의 히든 레이어로 설정할 수 있고 히든 레이어의 개수가 1개가 넘어가면 모든 히든 레이어 유닛 개수를 같게 설정해줍니다. 보통은 유닛 개수가 많으면 더 좋은 성능을 낼 수 있다고 합니다.

2


3



뉴럴 네트워크 학습의 단계를 정리해보겠습니다.

    1. weight matrix 를 랜덤 초기화 한다.
    2. i번째 입력 데이터를 위한 예측값을 얻기위해서 순전파를 실행한다.
    3. 코스트 함수를 계산할 코드를 실행한다.
    4. 코스트 함수의 편미분을 계산하기위해 역전파를 실행한다. 훈련 데이터 set이 m개 있는 경우 m번의 반복문을 실행한다. 이때는 각 데이터마다 순전파와 역전파를 수행한다.
    5.gradient checking 을 한다. 역전파로 구해진 코스트 함수 편미분 값과 numerical 하게 (직접 숫자로 계산한) 구해진 코스트 함수의 편미분값과 값을 비교한다. 그 값이 근사해야 한다.
    6.코스트 함수를 최소화시킬 수 있는 gradient descent 나 advanced optimization 방법을 사용한다. 코스트 함수는 non-convex 하기 때문에 global-minimum 에 도달한다고 장담할 수는 없지만 꽤 괜찮은 값의 local-minimum 을 갖게된다. 그래서 굳이 global-minimum 에 억지로 도달할 필요가 없다.


4



위 그림에서 코스트 함수의 3차원 그래프가 보입니다.붉은 부분일수록 예측값과 실제값의 차이가 크기 때문에 코스트 함수 값이 크게 나타납니다. 반대로 파란 부분일수록 예측값과 실제값의 차이가 작기 때문에 코스트 함수의 값이 낮게 나타납니다.