5-2 Backpropagation in Practice 본문
뉴럴넷에서 Optimization을 사용하기 위해 파라미터를 벡터나 행렬로 사용하는 방법에 대해 알아본다.
뉴럴넷이 다음과 같을 때, 파라미터 θ 행렬을 하나의 큰 벡터에 담을 수 있다. (Gradient 행렬도 마찬가지)
기존의 θ 행렬은 하나로 만들었던 큰 벡터에서 reshape을 통해 추출할 수 있다.
(θ 행렬이 3개 있고, 그림에서 히든 레이어가 1개밖에 없다. 히든 레이어가 2개가 되거나 파라미터 행렬이 2개만 있어야 되는 거 같은데 오타인지?)
위에서 정의한 방법을 사용하면 뉴럴넷 학습 알고리즘은 다음과 같이 요약할 수 있다.
- 파라미터 θ 행렬을 가지고 있는다.
- Optimization에 적용하기 위해 초기의 파라미터 θ 행렬을 하나의 큰 벡터로 펼쳐서 넣는다.
- 아래의 cost function에선 cost값과 gradientVec를 리턴하기 위한 과정
- 위에서 정의한 큰 θ 벡터에서 reshape을 통해 각 레이어에 해당하는 파라미터 θ 행렬을 얻을 수 있음
- D1, D2, D3와 J(θ)를 구하기 위해 forward prop / backward prop를 함
- Backward prop해서 얻은 D1, D2, D3를 펼쳐서 다시 하나의 큰 gradientVec로 return함
Cost값이 줄어들면서 Backpropagation 알고리즘이 잘 동작하는 것처럼 보일 수 있지만 버그가 있을 수 있기 때문에 검증하는게 필요하다.
그러한 방법 중에 하나인 Gradient checking에 대해 알아본다.
Cost function J가 다음과 같을 때, 임의의 위치 θ에서 기울기를 그려보면 파란 직선처럼 나올 것이다.
그리고 θ를 기준으로 θ+입실론, θ-입실론의 위치에서 두 함수값의 지점을 서로 이으면 또 다른 직선을 구할 수 있다.
만약 입실론 값이 10^(-4)처럼 매우 작은 값이라면 두 지점을 이은 빨간 직선이 θ에서의 기울기에 근사할 것이다. 오른쪽 아래와 같은 방법도 있지만 정확도가 다소 떨어지기 때문에 사용하진 않는다.
다시 말해, 직접 편미분값을 계산하지 않고도 대략적인 기울기 근사치를 구할 수 있는 것이다.
파라미터 θ 벡터가 다음과 같을 때, 각 파라미터에 대한 편미분계수 값은 위에서 적용했던 방법을 이용하여 기울기 근사치를 구할 수 있다.
이러한 방법을 사용하여 Gradient checking을 하는 과정은 다음과 같다.
- Back propagation 알고리즘을 이용하여 Dvec를 계산한다.
- Numerical gradient check를 사용하여 기울기 근사치를 구한다.
- Back prop을 이용하여 구한 기울기 값과, numerical gradient를 이용하여 구한 값을 비교한다.
- 만약 차이가 난다면 알고리즘이 뭔가 잘못된 것이고 비교했을 때 차이가 거의 없이 비슷하다면 알고리즘이 제대로 작동하는 것이므로 학습을 계속 진행한다.
-> 이러한 방법을 사용하여 검증을 할 때 중요한 것은 두개를 비교해서 이상이 없다면 gradient checking하는 과정을 더 이상 하지 않도록 만들어줘야 한다.
만약 그대로 내버려두면 매번 비교를 하기 때문에 쓸모 없는 연산을 계속 할 것이다.
파라미터 랜덤 초기화에 대해 알아본다.
뉴럴넷으로 gradient descent라던지 다른 optimization method를 사용하기 위해 어찌됐건 우선적으로 파라미터 θ에 대한 초기화가 이루어져야 한다.
파라미터 θ를 모두 0으로 초기화 시키면 다음과 같은 문제가 발생한다.
이전 레이어의 출력 값이 무엇이던지 간에 파라미터가 0이기 때문에 다음 레이어에서 출력되는 모든 unit들의 값이 같은 값을 가지게 된다.
그리고 출력 레이어에서 error를 계산한 뒤 back prop를 했을 때도 특정 레이어의 모든 델타 값은 같은 값을 가지게 된다.
이로 인해 각 파라미터 θ에 대한 기울기 값도 모두 같은 값을 가지게 되고 업데이트 되는 값도 같은 값으로 업데이트 된다.
결과적으로 레이어의 모든 unit 값이 같아지는 대칭성 문제가 생기게 된다.
처음에 웨이트 값을 특정 범위의 랜덤값으로 초기화하여 이러한 Symmetry(대칭성, 균형(?)) 문제를 방지할 수 있다.
지금까지 배운 뉴럴넷에 대해 요약 정리한다.
뉴럴넷을 사용할 때 어떤 뉴럴넷의 구조는 어떻게 선택해야 하는가?
일단 input layer의 unit수는 우리가 사용하는 data feature x의 차원 수가 된다.
Output layer의 unit 수는 class 수
여러 개의 Hidden layer를 사용할 땐 보통 각 히든 레이어마다 같은 unit수를 가지게끔 한다. 대개는 unit수가 많을 수록 좋지만 그렇게 되면 계산량이 늘어난다. (unit이 많다고 무조건 좋은 건 아님)
뉴럴넷을 training하는 과정은 6가지로 요약할 수 있다.
- 웨이트를 랜덤하게 초기화한다.
- Forward propagation으로 input x를 뉴럴넷에 넣어 output layer에서 h(x)를 구한다.
- 위에서 구한 h(x)를 cost function에 넣어 cost가 얼마인지 계산한다.
- Back propagation을 통해 cost function에 대해 각 파라미터의 편미분 값을 구한다.
- Forward prop / back prop의 과정을 sample 수 m만큼 반복한다.
- 이 과정에서 activation값과 delta 값을 누적하여 구하면서 cost function J에 대한 파라미터 θ의 편미분 값을 구한다.
- Back propagation을 통해 구한 편미분 값과 numerical gradient를 통해 구한 기울기 근사값을 비교한다.
- 만약 두 값의 차이가 거의 없고 비슷하다면 back prop 알고리즘이 정상이므로 gradient checking을 중지한다.
- Gradient descent나 다른 optimization 기법과 back propagation을 사용하여 cost function J의 값이 최소화되는 파라미터 θ를 구해나간다.
파라미터가 두개만 있는 뉴럴넷의 cost function의 그림이 다음과 같다고 가정해보자
실제로 뉴럴넷의 파라미터는 굉장히 많기 때문에 엄청나게 고차원인 함수일 것이다. 이러한 고차원 그래프를 시각화하기 힘들기 때문에 단순화시켜 이해해보자
그래프의 파란지점에 해당하는 곳은 cost값이 매우 작기 때문에 가설 h(x)와 target y의 차이가 거의 없을 것이다. 반면 오른쪽 위의 빨간 지점은 cost 값이 크기 때문에 h(x)가 y랑 차이가 많이 날 것이다.
만약 다음과 같은 시작 지점에서 파라미터가 초기화 됐다면 back propagation과
gradient descent를 통해 cost값이 작아지는 지점으로 점점 이동하여 파라미터들이 업데이트 될 것이다. 그래서 그림과 같은 좋은 local optimum 지점에 도달할 수 있을 것이다.
'ML & DL > Coursera-ML' 카테고리의 다른 글
6-2 Bias vs Variance (0) | 2019.01.28 |
---|---|
6-1 Evaluating a Learning Algorithm (0) | 2019.01.21 |
5-1 Cost function and Backpropagation (0) | 2019.01.18 |
4-3 Applications (0) | 2019.01.16 |
4-2 Neural Networks (0) | 2019.01.15 |