딥러닝

[Easy! 딥러닝] Chapter6 앞부분까지 새롭게 배운 내용

jun1-cs 2025. 5. 15. 23:01

1. 웨이트 초기화 단계의 개념과 여러 방식들

딥러닝 모델을 코딩할 때에는 처음에 신경망 모델을 구성하는 단계가 있다. 이 때 input 노드의 수, hidden layer의 개수와 노드의 개수, output layer의 노드의 수를 지정하게 된다. 나는 이 부분에서, 역전파하기 전 가장 처음에는 파라미터들이 어떻게 세팅되는지 궁금했는데 웨이트 초기화 단계(weight initialization)가 있다는 것을 알게 되었다. 파라미터들이 local minimum이 아닌 global minimum에 수렴하는 것이 바람직하므로 처음에 파라미터가 Loss함수에 대해 어느 위치에 위치하느냐가 매우 중요하다. Loss 함수의 global minimum에 가깝게 위치한다면 매우 좋을 것이다. 

->Yann LeCun, Kaiming He, Xavier 방식이 있다. 공통적으로 웨이트를 평균이 0인 랜덤 값으로 초기화하는데 웨이트에 대한 입력노드의 수가 많을수록 분산이 작아지게 해 웨이트를 0에 가깝게 초기화한다. Xavier 방식은 역전파까지 고려해 입력, 출력노드의 수가 많을수록 분산이 작아지게 했다. 

 

2. GD, SGD, minibatch SGD 비교

GD: 1 epoch동안 모든 데이터를  한꺼번에 사용 -> 모든 데이터 이용해 loss 함수 구하고 파라미터에 대해 편미분해 gradient 구하고 파라미터 업데이트한다. =>모든 데이터 사용하므로 파라미터 수가 많다. 신중하게 방향 결정하므로 local minimum으로 빠질 가능성이 높다. 

SGD: 1epoch 동안 데이터를 하나씩 랜덤하게 뽑아서 사용 -> 각 데이터에 대해 loss함수 구하고 파라미터에 대해 편미분해 gradient구하고 파라미터 업데이트한다. =>데이터 하나씩 사용하므로 속도 측면에서 효율적이다. (GPU쓰면 더 효율적) 덜 신중하게 방향 결정하므로 global minimum으로 도달할 가능성이 높아진다.(local minimum 탈출 기회 제공받는다) 

minibatch SGD:  1 epoch 동안 데이터를 batch size만큼 랜덤하게 뽑아서 사용 -> 배치의 데이터에 대해 loss구하고 파라미터에 대해 편미분해 gradient 구하고 파라미터 업데이트한다. => SGD의 장점인 빠른 속도와 global minimum 도달 가능성 상승효과, GD의 장점인 신중하게 방향 결정효과

 

3. 옵티마이저(파라미터 업데이트함수)의 종류- RMSProp, Momentum, Adam

이전의 웨이트에 값을 더해 새로운 웨이트로 업데이트하는 여러 방법들이 있다. 

 

Momentum: 현재의 그래디언트(편미분 값)만으로 웨이트 업데이트 X, 이전 그래디언트 값들도 더해 현재의 그래디언트와 함께 웨이트 업데이트. 옵티마이저 식이 웨이트에 대한 등비수열 점화식 형태이므로 예전의 그래디언트일수록 그 크기가 작아진다.(희미해져서 영향을 적게 미친다) 

 

RMSProp: 현재의 그래디언트 제곱 +과거의 그래디언트 제곱, 이 값의 역수를 웨이트 업데이트에 이용.(많이 이동한 웨이트의 급격한 변화를 줄이기 위해, 균형을 맞추기 위해) 웨이트에 더한다는 개념은 위와 동일한데 제곱한다는 점과 역수를 더한다는 점이 다르다.

->두 방법 모두 그래디언트의 지수이동평균(exponential moving average)으로 구한다.

 

Adam: Momentum+RMSProp으로 두 방법을 합친 것이다. 따라서 Momentum에서의 가던 방향으로 더 가려는 성질과 RMSProp의 많이 변한 웨이트는 적게 변하도록 하는 성질을 모두 상호보완적으로 이용할 수 있다. ->최적화된 옵티마이저이다.

 

4. 역전파(backpropagation): model의 결과로 나온 y_pred랑 y_true, 파라미터값들로 loss함수를 구한 다음 신경망의 모든 층의 모든 뉴런의 웨이트들을 변수로, loss를 한번씩 다 편미분한 후, 그 값들을 더해 gradient를 얻는다.(이후 위의 옵티마이저 실행) 

이 때 만약 뉴런의 활성화홤수로 sigmoid 함수를 쓴다면, 입력층과 가까운 층의 파라미터들에 대해 loss함수를 편미분한 값은 작아질 수 밖에 없다. 앞쪽의 파라미터들이 변화해도 output에 도달하기까지 sigmoid함수를 여러 번 거치므로 sigmoid함수의 개형을 생각해보면 파라미터의 변동이 점차 작게 전달된다.

-> 입력층에 가까운 레이어의 뉴런일수록 그 파라미터에 대한 편미분이 0에 가까워진다. : 기울기 소실(vanishing gradient)

->기울기 소실 현상 발생 시 앞쪽 레이어의 파라미터들이 업데이트되지 않는다.

->뒤쪽의 파라미터를 잘 업데이트하더라도 앞쪽이 업데이트되지 않아 loss가 커지므로 전체적인 loss가 잘 줄지 않는다. 

=>과소적합(underfitting) 발생(모델이 train data를 충분히 학습하지 못함)

 

->sigmoid 대신 ReLU를 활성화함수로 사용!

=>양수에서 미분값이 1이므로 노드의 수가 많으면 기울기소실 문제를 피할 수 있지만 , 노드의 수가 적으면 sigmoid보다도 기울기소실에 취약해질 수 있다.(음수에서 미분값이 0이므로 중간에 하나라도 0이 나오면 앞의 다른 노드들은 학습이 안된다)

그럼에도 ReLU를 쓰는 이유? ->Linear 함수보다는 비선형성이 있고 sigmoid 함수보다는 기울기소실이 적다

 

->이후 ReLU를 변형한 SELU, GELU, SERLU, ELU 등 여러 활성화함수가 제안되어서 상황에 맞게 다른 것을 쓸 수 있다. 그러나 ReLU의 단순함과 강력함 때문에 자주 사용한다.