데이터 분석 및 프로젝트/딥러닝

딥러닝 3일차 - 학습률

막막한 2023. 4. 23. 17:18

더 나은 신경망 학습 위해 

- 학습률

- 가중치 초기화

- 정규화 

 

 

1. 학습률 감소/ 계획법 

 

학습률 (lr) - 얼마나 이동할 지 조정하는 하이퍼 파라미터 

가중치에 대해 구해진 기울기 값을 얼마나 경사에 적용할 지 결정하는 하이퍼파라미터 

 

학습률이 너무 적거나, 너무 크거나

학습률니 너무 낮으면 : 최적점에 이르기까지 너무 오래 걸림/ 주어진 Iteration내에서 최적점에 도달하는데 실패

학습률이 너무 높으면 : 경사하강과정에서 발산하면서 모델이 최적값을 찾을 수 없게 되어버림 

 

1. 학습률 감소

 .compile내에 있는 optimizer= 에 adam 등 옵티마이저 적용 후 내부 하이퍼파라미터 변경해 학습률 감소

 

# optimizer 내 lr 인자 통해 학습률 설정 
# beta_1 : 학습률 감소율 설정 , adam 내 수식의 변수를 그대로 사용

model.compile(optimizer=tf.keras.optimizers.Adam(lr=0.001, beta_1 = 0.89)
			, loss='sparse_categorical_crossentropy'
            , metrics=['accuracy'])

2.  학습률 계획법 learning rate scheduling

 

 

 

# .experimental 내부 함수 사용해 설계

first_decay_steps = 1000  #step= iteration
initial_learning_rate = 0.01 #초기 학습률 

lr_decayed_fn={
	tf.keras.experimental.CosineDecayRestarts(
    #코사인 값 이용- 증감 나타내는 매서드
    initial_learning_rate,
    first_dexay_steps)
    )
    
# 앞서 설정한 학습률 계획을 optimizer 내 lr 인자로 사용

model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=lr_decayed_fn)
		, loss='sparse_categorical_crossentropy'
        , metrics=['accuracy'])

2. 가중치 초기화 ( xavier 초기화, he 초기화)

 

<1>  표준편차를 1인 정규분포로 가중치 초기화 할 때, 각 층의 활성화 값 분포 

 표준편차를 일정한 정규분포로 가중치 초기화 하면 활성화 값이 0과 1에 일치

 

활성값 고르지 않으면 학습 제대로 이루어지지 않음

 

활성화 값 0, 1에 분포

<2> xavier 초기화 할때 호라성화 값 분포

 가중치를 표준편차가 고정값이 정규분포로 초기화했을때 문제해결하기 위해 등장

 

xavier 초기화는 이전 층의 노드가 n개일때, 현재 층의 가중치를 표준편차가 1/ n^-2인 정규분포로 초기화 

 

 

<3> he 초기화 해주었을 때 활성화 값 분포 

xavier 초기화= 활성화 함수가 시그모이드인 신경망에서는 잘 동작

relu일때는 층이 지날수록 활성값이 고르지 못함

 

he초기화는 이전층의 노드가 n개일때, 현재층의 가중치를 표준편차가 2/n^2인 정규분포로 초기화 

<정리>

activation function 초기값 추천

1. sigmoid - xavier 초기화 사용하는 것이 유리

2. relu - he 초기화 사용하는 것이 유리

 

init_mode=['uniform', 'lecun_uniform', 'normal', 'zero', 'glorot_normal', 'glorot_uniform', 'he_normal','he_uniform']

케라스의 dense layer에서는 defalut로 'glrot_uniform' 설정 

 

# 모델 내 추가하는 dense layer 내 kernal_initializer 인자통해 가중치 초기화 설정 

Dense(32, activation='relu', kernel_initializer='he_uniform')