글쟁이, 코딩한다

0120 / k_digital 31일차 / 딥러닝 이론 본문

나는 코딩도 한다/TIL

0120 / k_digital 31일차 / 딥러닝 이론

Algori 2021. 1. 20. 23:58

0.

딥딥

 

 

딥러닝 최적화

 

에러가 제일 낮은 θ값을 찾아 데구르르. Gradient Descent. 

 

하나. Weight Initialization.

 

Gradient Descent 적용을 위한 첫 단계. parameterθ 초기화   

 경사를 데굴데굴 굴러 가장 깊은 골짜기로. 초기화 이후 시작점을 어디로 잡을 수 있을까? 시작점은 많은 것을 바꾼다. 
 

 아래 초기화 기법들은 선형결합 값이 너무 커지거나 작아지지 않도록 초기 parameterθ를 잡아준다. 선형결합 값이 극단적이면 초기화 지점이 산으로 갈 확률이 높다. 

 #너무 터무니없는 곳을 잡으면 고생 #함정에 빠지거나 시간이 너무 오래


 1) Xavier Initialization 자비에 초기화
표준편차가 (1 / 앞선 레이어 퍼셉트론의 숫자에 루트를 씌운 값)인 정규분포를 따른다.

 #예로 앞선 레이어가 10000개면 θ 초기값은 1/100, 0.01. #다만 이 식은 나이브한 인식. 수식은 조금씩 달라진다.

 #sigmoid나 tanh를 활성화 함수로 쓸 때 적용 #보통은 default 

 
 2) He Initialization 헤(흐어) 초기화  
 표준편차가 (2 / 앞선 레이어 퍼셉트론의 숫자에 루트를 씌운 값)인 정규분포를 따른다.

 #예로 앞선 레이어가 10000개면 초기값은 1/50, 0.02. #마찬가지로 수식은 조금씩 달라지고 있다

 #활성화 함수로 ReLU 쓸 때 주로 적용



둘. Weight Regularization


gradient descent 적용을 위한 두 번째 단계. parameterθ 규제화(정규화)

 

 트레이닝 데이터만 고려한 cost function 값으로 모든 가중치를 결정할 때는 모델이 툭하면 overfitting에 빠진다

  #응석쟁이 => 굴러떨어지기를 적당한 수준에서 멈추자.

  이를 바로잡으려면? 새로운 cost fuction을 주자!   

  

   새 친구  MSE + λR(θ) 

      %모델이 복잡해질수록 θ 갯수가 늘어나고 θ 절댓값이 커지는 성질을 이용한다. 


  1. L1 정규화(Lasso) : R(θ) = θ절대값을 Σ 
  #θ lasso : L1 정규화 표현에서 제약 조건(사각형, 절대값 그래프)을 벗어나지 않으며 실제 SSE의 최소값과 가까운 점. 
  #θ lasso 한 축의 θ값은 0이 되기도 한다=> 가중치 낮은 열 하나를 모델에서 배제 #Feature selection 효과를 낸다. 

  2. L2 정규화(Ridge) : R(θ) = θ제곱을 Σ   
  #θ ridge : L2 정규화 표현에서 제약 조건(원 그래프)을 벗어나지 않으면서 실제 SSE의 최소값과 가까운 점.
  #전반적으로 요게 overfitting을 더 잘 걷어준다

  3. Lasso와 Ridge를 함께 쓰면 ElasticNet

 

모델이 복잡해지면(성능이 좋아지면, 올바른 예측을 위한 식이 늘어나면) R(θ)는 자꾸자꾸 커진다. 반면 MSE는 작아진다. 반비례 관계인 두 친구를 묶어 새로운 cost function으로 쓴다. 

  즉, MSE 줄이는 거에만 집중하지 않고 모델이 너무 복잡해지지 않는 것두 고려하겠다는 셈

 

Weight Decay가중치 감퇴/감소
   #쉽게 생각하자. lasso, ridge, elasticnet은 cost function값을 눌러줘 overfitting을 걷어내주는 일을 한다 

   #회귀 ML 모델에서도 자주 만날 수 있다.
 
 λ(Lambda) : 정규화율(Regularization Rate) : Hyper-params
  ; 값을 크게 줄수록 weight decay를 세게 먹인다 : overfitting을 줄여준다

  ; 값을 작게 줄수록 weight decay가 약하게 먹는다 : 성능이 올라갈수도?

  #대부분은 default값으로 써도 괜찮다

셋. Advanced gradient descent algorithm

 

gradient descent 적용을 위한 세 번째 단계. 상급자 코스.

 

 

용어를 잠깐 보고 가자. 

Batch(size)배치 : 임의로 설정한 일부 데이터양

Epoch에포크 : 전체 데이터를 한 번 밀어넣어 학습시킨 횟수 
Iteration이터레이션 : batch size만큼 데이터를 적용한 횟수

 

(옆 그림은 Epoch=100, Iteration=700, 1Epoch = 7Iteration) 

 

배치 차이.

  기울기를 구하기 위해 데이터(와 그 cost function)를 얼마나 밀어넣느냐.


 1) Full-batch Gradient Descent
 매번 모든 데이터의 cost function을 구하며 값을 내던 기존 방법
  #안정적으로 값을 조정해 나가지만, 너무 느려서 속 터짐

 2) SGD (확률적 경사 하강법, Stochatstic Gradient Descent)
 랜덤한 데이터 하나를 모델에 넣고 곧바로 Gradient Descent를 적용해 θ를 조정한다. 
 #랜덤 데이터에 따라 에러 값이 너무 흩날려서 정신 없음 #cost 값이 안정적으로 줄지 않는다 

 3) Mini-batch Stochatstic Gradient Descent
 적당히를 모르는 두 방식의 중간. 전체 가운데 일부 데이터만 집어 넣으며 값을 조정해 나간다. 
 #batch size는 사람이 정한다. 고로 hyper-params, 대강 10배수로 줌

 #이제는 표준 방식 #때로 데이터가 적으면 full-batch로도

 

 SGD류 만이 아니다. Gradient Descent가 너무 더디게 가지 않도록, 또 함정에 빠지지 않도록 돕는 이들이 더 있다. 

 

Optimizer(최적화 프로그램) 

  G.D. 작업을 도와주는 친구

 

 Momentum 관성-가던 방향으로 가라 부류   

 Adagrad 알아서 하는 보폭-Learning Rate 조절 부류 #학습 초기에는 과감하게, 갈수록 신중하게. 

 

 Adam(Adaptive Moment Estimation) Optimizer 
  #가장 성능이 좋은 것으로 알려졌다 #그래도 Adagrad, RMSProp(Adagrad보다 새 보폭에 더 중점)도 함께 써보자.


넷. overfitting을 피하자

 

1. Dropout

 

한번 학습(traning)할 때마다 랜덤으로 퍼셉트론 몇 개를 꺼버린다 : 결과값을 결정하는 다양한 방법들을 주목!
 #레이어 단위로 일정 비율만큼 #간단한 적용방법에도 높은 일반화 성능을 뽑아낸다 

 #마치 데이터에 여러 모델을 적용하는 듯한 효과
 #다시 예측할때는 dropout을 걷어내야한다

2. Batch Normalization


 데이터마다 feature 값이 달라지면 불균형으로 잘 굴러떨어지지 못한다

  % 자릿수를 맞춘 x데이터들이 input layer로 떼굴떼굴. 그럼 히든레이어로 넘어갈 때는? 그때도 하지, 뭐. 

 

  순서. 1-선형 결합(행렬곱) -> 2-batch_normalization -> 3-Activation 함수(ReLU 등)  
     #대부분 Standardization #평균이 0, 표준편차가 1 

  맞추고 보니 x값 범위가 너무 작다. 고작 -1부터 1 사이. 거의 직선과 같아서 활성화 함수를 씌워주는 의미가 없다.

  => 그럼 다시 흩뜨리자. 범위도 좀 넓혀주고, 자리도 옮겨주고. 그러기 위해서! γ(lambda)를 곱하고 β(beta)를 더한다. 
    #γ, β는 컴퓨터가 찾아낼 parameterθ #우리 맘대로 굴리면 자릿수를 맞춰준 의미가 또 사라진다.

장점 

 #핵심은 학습속도 향상 : 학습을 더디게 만드는 스케일 불균형을 해결해주니까
 #학습결과 향상 #랜덤 θ 초기값에 크게 의존하지 않음(데이터를 다듬어주는만큼) #overfitting 억제 
 

딥러닝에서 우리가 결정해야 하는 것들

 

Batch Normalization정규화 : Standardization이 보통 
Batch size배치 갯수 
Epoch에포크 횟수 : 가능한 많이 하면 좋다. 판단은 나중에
Learning rate학습율 : 0.01, 0.001 시작이 보통  
Cost(loss) function비용 함수 : 보통 회귀는 MSE, 분류는 cross-entropy
Initalization초기화 : 보통 ReLU에는 He
Optimizer최적화 프로그램 : Adam이 대세

Activation Function : ReLU 계열이 대세

 

...etc...

 

Layer size층 개수 : 첫 hidden layer는 input layer 수보다 크게

Unit size퍼셉트론,노드 갯수 : 2의 배수

  위 두가지에서 보통 나오는 이야기들은 이 정도가 전부라고 한다. 이건 답이 없다  
 

  너무 많고 어려워요 ㅠㅠ

=> 그래서 전이학습 =>그래서 NAS(Neural Architecture Search) : 알아서 hyper-params를 찾아주기 : 구글의 Auto ML

 

 

몇 가지 딥러닝 이야기

 

++
 Train data와 Test data 차이가 터지면 그대로 영원히 overfitting일까? 아닐 수도 있다! 

당연히 train data에서는 학습이 많아질수록, 모델이 복잡해질수록 에러는 줄어든다.
 Test data는? 에러 값이 쭉쭉 오르는 때가 있다 ; overfitting처럼 보인다

=> 하지만, 2019년 논문(deep double descent) 발표. 어느 선을 지나면 θ가 비대해질수록 test data도 에러가 줄어든다! 

  이후 θ가 몇십억개인 초대형 모델이 등장. 정확도를 이길 바가 없다. 

 

_두 가지 의의
=> 거대한 리소스를 가진 대형 기업(구글 등)이 아닌 개인, 작은 기업이 모델을 만드는 의미가 얼마큼 있을까?
=> '당연한 것'은 없다. 어떤 기준이건 다 의심해볼만하다.

++
이제는 컴퓨터가 직접 인공신경망을 만들어내는 시대. 

사람의 역할 : 인공신경망을 만드는 일 -> 인공신경망을 만드는 기계를 만드는 일?

 

++

굉장히 유명한 개발자님의 슬라이드라고 한다. 구글링을 하다보면 자주 마주쳤다. 개념 이해를 아주 쉽게 돕는다.

www.slideshare.net/yongho/ss-79607172

 

자습해도 모르겠던 딥러닝, 머리속에 인스톨 시켜드립니다.

백날 자습해도 이해 안 가던 딥러닝, 머리속에 인스톨 시켜드립니다. 이 슬라이드를 보고 나면, 유명한 영상인식을 위한 딥러닝 구조 VGG를 코드 수준에서 읽으실 수 있을 거에요

www.slideshare.net

 

더 했던 것

 

TensorFlow에 들어갔다.

직접 기본 인공신경망 코드를 짰다. (물론 알려주는 것을 받아 적으면서). 신기했다.

내일 다시 정리한다.

Comments