모두야

CH6) 학습 관련 기술들 본문

밑.시.딥/1권

CH6) 학습 관련 기술들

미미밍2 2021. 7. 24. 21:29
반응형

신경망 학습에 중요한 개념들

  • 가중치 매개변수의 최적값을 탐색하는 최적화 방법
  • 가중치 매개변수 초깃값
  • 하이퍼파라미터 설정 방법
  • 오버피팅 대응책 -> 가중치 감소, 드롭 아웃 ( 정규화 )
  • 배치 정규화 

==> 신경망 ( 딥러닝 ) 학습의 효율과 정확도를 높일 수 있다.


6.1 매개변수 갱신

딥러닝의 목적 : 손실 함수 값을 낮추는 매개변수를 찾는다.
                      : 매개변수의 최적값을 찾는다.
                   ====> 최적화 ( Optimization )

 딥러닝 최적화 어렵다... 너무 넓고 복잡하다. 순식간에 수식을 풀어 최솟값을 찾는 방법이 아니다. 매개변수 수도  너무 많다.

-> 지금까지는 최적의 매개변수 찾는 방법을 [ 매개변수의 기울기 (미분) ] 을 이용했다.

--> 매개변수의 기울기를 구하고, 기울어진 방향으로 매개변수 값을 갱신하는 방법을 반복하여 최적의 값을 찾는다.

====> [ 확률적 경사 하강법 ( SGD ) ]

무작정 매개변수 공간을 찾는 것보단 낫다. SGD는 단순하지만 다른 더 좋은 방법이 있긴함.


확률적 경사 하강법 ( SGD )

  • W : 갱신할 가중치 매개변수
  • dL/dW : W에 대한 손실 함수의 기울기
  • n : 학습률 0.01,0.001
  • ← : 우변 값에서 좌변 값으로 갱신한다.
  • SGD : 기울어진 방향으로 일정 거리만 가겠다.
class SGD:
    def __init__(self,lr=0.01):
        self.lr = lr
        
    def update(self,params,grads):
        for key in params.keys():
            params[key] -= self.lr * grads[key]
  • lr : learning rate 학습률
  • update(params,grads) 메서드는 SGD 과정에서 반복해서 불린다.
  • params, grads는 딕셔너리 변수이다.
  • params['W1'], grads['W1'] 처럼, 각각 가중치 매개변수와 기울기를 저장하고 있다.

실제 사용 코드 p191

network = TwoLayerNet(...) 
optimizer = SGD() 

for i in range(10000): 
    ... 
    x_batch, t_batch = get_mini_batch(...) #미니배치 
    grads = network.gradient(x_batch, t_batch) 
    params = network.params 
    optimizer.update(params, grads) 
    ...
매개변수 갱신은 optimizer가 책임지고 수행한다.
따라서, Optimizer에 매개변수와 기울기 정보만 넘겨주면 된다.

SGD의 단점

SGD는 단순하고 구현이 쉽지만, 비효율적일 때가 있다.

그래프, 등고선, 기울기

기울기 : y 축 방향은 크고, x 축 방향은 작다.

           = y 축 방향은 가파르고, x 축 방향은 완만하다.

최솟값은 ( x,y ) = ( 0,0 ) 이지만, 그래프가 가리키는 방향을 그렇지 않다.

 

위의 함수에 SGD를 적용해보자. 초깃값은 ( x,y ) = ( -7.0, 2.0 ) 이라고 가정하자.

 

 

SGD는 심하게 굽어진 움직임을 보인다.

= 상당히 비효율적이다.

= 비등방성함수 ( 방향에 따라 성질 즉, 기울기가 달라지는 함수)에서는 SGD의 탐색 경로가 비효율적이다.

 

 

SGD의 단점을 개선해주는 모멘텀, AdaGrad, Adam 세가지 방법이 있다.

 


1. 모멘텀

  • W : 갱신할 가중치 매개변수
  • dL/dW : W에 대한 손실함수의 기울기
  • n : 학습률
  • v : 물리에서 말하는 속도
  • 모멘텀 : 기울기 방향으로 힘을 받아 물체가 가속된다는 물리 법칙을 나타낸다.

av는 물체가 아무런 힘을 받지 않을 때, 서서히 하강하는 역할을 한다. a = 0.9 ( 지면 마찰, 공기 저항)

class Momentum:
    def __init__(self,lr=0.01,momentum=0.9):
        self.lr = lr
        self.momentum = momentum
        self.v = None
        
    def update(self,params,grads):
        if self.v is None:
            self.v = {}
            for key,val in params.items():
                self.v[key]=np.zeros_like(val)
                
        for key in params.keys():
            self.v[key] = self.momentum*self.v[key] - self.lr*grads[key]
            params[key] += self.v[key]

 

 

모멘텀의 갱신 경로는 공이 그릇 바닥을 구르듯 움직인다.

SGD에 비하여 지그재그가 덜하다.

 

x축 힘이 작고, 방향이 변하지 않아 한 방향으로 일정하게 가속한다.

y축 힘은 크고, 위아래로 번갈아 상충하여 y축 방향 속도는 안정적이지 않다.

 

=> SGD보다 x축 방향으로 빠르게 다가가서, 지그재그 움직임이 적다.

 

 


2. AdaGrad

신경망 학습에서 학습률 n 이 중요하다.

학습률이 너무 작으면 학습 시간이 길어지고, 학습률이 크면 발산하여 학습이 제대로 이뤄지지 않는다.

 

적절한 학습률은 어떻게 정하는가?

=> 학습률을 정하는 효과적인  기술로 [ 학습률 감소 ( learning rate decay ) ] 가 있다.

: 학습을 진행하면, 학습률을 점차 줄여간다. 

: 처음에는 크게 학습하다가, 조금씩 작게 학습한다.

 

==> 학습률을 서서히 낮춘다 = 매개변수 '전체'의 학습률 값을 일괄적으로 낮춘다. [ AdaGrad ]


3. Adam

모멘텀 : 공이 그릇 바닥을 구르는 듯한 움직임을 보였다.

AdaGrad : 매개변수의 원소마다 적응적으로 갱신 정도를 조정하였다.

 

이 두 기법을 융합하여 Adam  = 매개변수 공간을 효율적으로 탐색 해줄것이다!

+ 하이퍼파라미터 ' 편향 보정 ' 도 진행된다.

 

반응형

'밑.시.딥 > 1권' 카테고리의 다른 글

CH7) 합성곱 신경망 ( CNN ) - (2)  (0) 2021.07.25
CH7) 합성곱 신경망 ( CNN )  (0) 2021.07.25
CH5) 오차역전파법  (0) 2021.07.24
CH4) 신경망 학습 - (2)  (0) 2021.07.23
CH4) 신경망 학습 - (1)  (0) 2021.07.15