정지홍 2023. 1. 24. 23:22

신경망 학습의 목적?

-손실 함수의 값을 최대한 낮추는 매개변수를 찾는 것.

-최적화를 위하여(매개변수의 최적값을 찾기 위함)

-아래의 4가지(SGD , Momentum , AdaGrad , Adam)중 풀어야할 문제에 따라서 적절하게 선택하여 수행   

-신경망 학습에서는 가중치의 초깃값이 중요       

 

오버피팅?

-신경망이 훈련 데이터에만 지나치게 적응되어 다른 데이터에는 대응을 못하는 것

-훈련 데이터가 적거나 매개변수가 많고 표현력이 높은 모델에서 주로 발생

 

가중치 감소?

-오버피팅을 억제하기 우;한 방법

-학습 과정중에 가중치가 큰 값을 감소시켜서 억제하는 방식

 

 


 

확률적 경사 하강법(SGD)?

-기울어진 방향으로 계속 매개변수 값을 갱신하여 최적해에 다가가는 방법

-갱신할 가중치 매개변수 = 갱신할 가중치 매개변수-학습률*손실함수의 기울기

-단순 및 구현이 쉬우나 비효율적이다.

class SGD:

    def __init__(self, lr=0.01):#학습률은 0.01로 설정
        self.lr = lr
       
    def update(self, params, grads):#(self , 매개변수 , 기울기)
        for key in params.keys():#매개변수 갱신
            params[key] -= self.lr * grads[key]#기존의 매개변수값에 매개변수*손실함수 기울기 값을 뺀다.

모멘텀?

-SGD단점을 개선

-갱신할 가중치 매개변수= 갱신할 가중치 매개변수 + ( a*v - 학습률*손실함수의 기울기 )    여기서 av는 물체에 아무런 힘을 받지 않을때 서서히 값을 하강시키는 역할을 한다.

class Momentum:


    def __init__(self, lr=0.01, momentum=0.9):#학습률은 0.01 , 모멘텀은 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]

 


AdaGrad?

-SGD단점을 개선

-각각 변수들에게 맞게 각각 학습률을 점차 줄여나간다.

class AdaGrad:
    def __init__(self, lr=0.01):
        self.lr = lr
        self.h = None
       
    def update(self, params, grads):
        if self.h is None:
            self.h = {}
            for key, val in params.items():
                self.h[key] = np.zeros_like(val)
           
        for key in params.keys():
            self.h[key] += grads[key] * grads[key]
            params[key] -= self.lr * grads[key] / (np.sqrt(self.h[key]) + 1e-7)

Adam?

-SGD단점을 개선

-AdaGrad와 모멘텀 방식을 합친 방법


가중치의 초깃값

-가중치 감소 기법(가중치 값을 작게 하여 오버피팅을 억제해서 범용 성능을 높인다.)

-가중치를 0으로 설정하면 모든 가중치 값이 똑같이 갱신되어 않된다.

-가중치를 제대로 설정하지 않으면 활성화 값들이 치우쳐져서 표현력을 제한할 수 있다.(만약 활성화값이 0.5에 치우쳐 지거나 0과1에 치우쳐진 경우)

 

배치 정규화?

-가중치 초깃값을 적절히 설정하여 각 층의 활성화값 분포가 적당히 퍼지는 것을 강제시키는 것

-학습 속도를 개선

-초깃값에 의존하지 않는다.

-오버피팅을 억제

-활성화값이 적당히 분포하도록 조정한다.(ex->  Affine->batch_norm->ReLu)