본문 바로가기
기계학습/자연어 처리 머신러닝

딥 러닝 개념 모음 - 딥러닝을 이용한 자연어처리 입문

by tryotto 2020. 1. 3.

# 퍼셉트론 


: N 개의 입력값 X 를 받아서, 1개의 출력값 Y 를 만드는 모델




# 단층 퍼셉트론 + 시그모이드 활성화 함수 = 로지스틱 회귀




# 퍼셉트론 종류


1) 단층 퍼셉트론 : 

- 은닉층 X, 입력층과 출력층만 존재

- 한계 : 다양한 출력값을 나타내지 못함

2) 다층 퍼셉트론 

- 정의 : 은닉층이 한 개 이상 존재

- 심층  신경망 (DNN, Deep Neural Network) : 두 개 이상의 은닉층을 가진 경우

   > 딥러닝 : 심층 신경망을 학습시키는 것

- 의의 : 다양한 출력값을 나타낼 수 있음 (단층 퍼셉트론 한계 극복)




# 퍼셉트론의 여러 개념


- 학습 : 매개변수 W (parameter) 를 최적 값으로 구해내는 과정


- 손실함수 : 


- 옵티마이저 : 손실함수 값을 최적으로 만드는 기법.

ex) Gradient Descent, SGD, Adam 등





# 인공 신경망 디자인 기법 


1) 피드 포워드  신경망 (FFNN, Feed Forward Neural Network) : 

입력층에서 출력층 방향으로 연산이 전개되는 신경망


2) 그 외 : 출력층의 값이 다시 입력층이나 출력층으로 전달되는 신경망

ex. RNN





# 인공 신경망의 층 종류


1) 전 결합층 (Fully Connected Layer) : 은닉층과 출력층에 있는 각각의 뉴런들 모두, 이전층의 모든 뉴런들과 연결돼 있는 층을 의미

* 다른 이름 : Dense Layer


2) 그 외 :  이전 층과 모두 연결돼있진 않은 층들.





# 인공 신경망의 활성화 함수 조건 : 비선형 함수


Why? 선형함수일 경우, 은닉층을 여러 개 추가하더라도 결국엔 하나의 은닉층의 효과밖에 나지 않는다.







# 순전파 : 


입력층에서 출력층으로 예측값의 연산이 진행되는 과정





# 손실함수 : 실제값과 예측값의 차이를 수치화 함.

 

- optimization : 손실함수를 최소로 만드는 매개변수 W, b 를 찾는 과정

- 이 과정에서, 각각의 층마다의 W, b 를 업데이트 해줌 (=역전파 과정)

- 회귀 : MSE 사용

- 분류 : 크로스 엔트로피 사용 -> 다중 클래스 분류시엔 categorial cross_entropy 사용





# 옵티마이저 종류 - 7가지


1) 배치 경사 하강법 : 전체 데이터를 가지고, Gradient Descent 를 해줌 (말이 배치지, 그냥 가장 일반적인 Gradient Descent 와 같다)


2) 확률적 경사 하강법 (Strochastic Gradient Descent, SGD) : 

  > 데이터 하나!! 가지고 트레이닝을 함. 랜덤하게 뽑기 때문에 Stochastic 이라고 했음.

  > 속도가 아주 빠르나, 매개변수 폭이 불안정하고 정확도가 낮을 수 있음.


3) 미니 배치 경사 하강법 : 배치만큼의 크기만 가지고 트레이닝을 시킴. SGD보다는 더 정확하다. 배치경사하강보다는 빠른 편(정확도는 조금 떨어지겠지)


4) 모멘텀 SGD : 로컬 미니멈에 빠지지 않도록 하는 옵티마이저. 관성이라는 성질이 더해짐.


5) 아다그라드 : 매개변수들은 각자 의미가 다르다 -> 각각 다른 학습률을 적용시켜야 한다 

   > 변화가 큰 매개변수는 작은 학습률, 변화가 작은 매개변수는 큰 학습률 적용

> 매개변수가 심하게 변하는 걸 막고싶어하는 것 같다.


6) RMSprop : 아다그라드 계속 사용시, 나중에는 학습률이 지나치게 떨어짐 -> 이를 다른 수식으로 대체

> 왜 학습률이 지나치게 떨어질까? 이상하네


7) 아담 : RMSprop + 모멘텀 SGD 방식





# 머신러닝의 학습 : 

실제값과 예측값의 오차를 이용 -> 옵티마이저 -> 매개변수 업데이트





# epoch : 전체 데이터를 총 몇 번이나 반복했는가?

ex) 50 epoch : 총 50번씩 전체 데이터에 대한 학습을 완료하였다


   > epoch 값에 따라 오버피팅, 언더피팅이 결정됨






# 배치 크기 

= 몇 개의 데이터 단위로 매개변수를 업데이트 하는가?






# 배치 수 

= 이터레이션(iteration) = 한 번의 에포크를 끝내기 위해 배치가 몇 개 필요한가





# 오버피팅 : "트레이닝" 데이터에 너무 많이 훈련된 나머지, "검증" 데이터와 "테스트" 데이터에 대해서 제대로 작동하지 않는 경우.

> Why? 노이즈에 대해서도 과하게 학습되어있기 때문.







# 오버피팅 방지 방법 - 4가지


1) 데이터 양을 늘리기 : 더 일반적인 경우의 데이터들을 많이 학습하다보면, 노이즈에 대해 과하게

      훈련되었던 부분을 해소할 수 있다. 이를 상쇄할 수 있기 때문. 

> 헷갈리지 말자! 데이터의 양은 많을 수록 좋다. 그러나 epoch 가 너무 많을수록 안 좋다.

   주어진 데이터에 과하게 학습되기 때문이다!

> 의도적으로 데이터 늘리는 방법 : 데이터 증식/증강 (Data Augmentation)

-> 노이즈를 추가하여 일부분을 수정하는 방식.


2) 모델의 복잡도를 줄인다 : 은닉층, 매개변수 갯수에 따라 결정됨

- 은닉층의 갯수를 줄인다

- 매개변수의 수를 줄인다 : 이걸 인공신경망에서는 모델의 수용력이라고 표현하기도 함.


3) Regulation : L1, L2 노름 정형화 방식으로 구성.

- L1 노름 : 어떤 feature 가 모델에 영향을 주고 있는지 정확히 파악하는 데에 유용

  > Feature Selection 이 가능하다. 따라서, Sparse model 에 적합.

- L2 노름 : 이런 판단이 필요 없을 경우, 전체적으로 더 성능이 좋은 L2 노름 방식이 유용


4) 드롭 아웃 : 학습할때만!! 일부 뉴런을 랜덤하게 선택해서, 사용하지 않는 방식. Prediction (예측) 을 할 때에는

     적용하지 않는다. 즉, Test Data 나 검증 데이터에 대해서 적용할때는 사용 안함.






# Feature Selection  vs  Feature extraction (ex.PCA)





# Normalization  vs  Regularization






# Feature  vs  x_data


- Feature 은 말 그대로 x 변수고


- x_data 는 말 그대로 입력값 x 이다.


ex) 일차함수 y=ax+b 에서 x 가 입력"값"은 아니고 변수를 의미하지만,

(1,2) 라는 좌표가 주어질때 1 은 x_data 라고 할 수 있다. 이런 차이이다.







# 기울기 소실과 폭주


1) 기울기 소실 : 역전파 과정에서, 입력층으로 갈수록 gradient 값이 작아질때 

-> 입력층에 가까운 층의 가중치가 제대로 업데이트 되지 못함


2) 기울기 폭주 : 역전파 과정에서, 입력층으로 갈수록 gradient 값이 심하게 커질 때

-> 입력층에 가까운 층의 가중치가 발산해버림

> RNN 에서 주로 발생하는 현상







# 기울기 소실/폭주 방지법 - 5가지


1) ReLU, 변형 ReLU :

   > 시그모이드, 하이퍼볼릭 탄젠트 : 입력값의 절댓값이 커질수록 -> 기울기값이 0에 가까워짐

   > "은닉층"의 활성화함수로 ReLU, Leaky ReLU 같은걸 사용시 해결 : 기울기값이 0에 가까워지진 않기 때문

- ReLU 보단 변형 ReLU 가 성능이 더 좋다 

(일반 ReLU 의 경우, 기울기가 0이 되는 부분이 있긴 하기 떄문. 반면, 변형 ReLU는 기울기가 0이 되는 부분이 하나도 없음)

2) Gradient Clipping :

   > RNN을 하다보면 기울기 폭주가 발생함

- 이때, 기울기가 임계치를 넘어버릴 경우 잘라버림 (임계치만큼 크기를 감소시킴)


3) 가중치 초기화 :

   > 가중치 초기화만 잘 해줘도, 기울기 폭주/소실은 발생할 확률이 크게 줄어듬


   1) 세이비어 초기화

- uniform 분포 / Normal 분포  두 종류가 있음

- ( 이전 층의 뉴런 갯수 + 다음 층의 뉴런 갯수 )  <- 이 수치를 이용해서 분포를 결정

- 의의 : 특정 층이 과도하게 주목 받는 것을 방지

- 한계 : S자 활성화 함수에만 유용 (ReLU에는 불리)

> 해결책 : He 초기화 (ReLU에 유리)

   2) He 초기화

- uniform 분포 / Normal 분포  두 종류가 있음 (위와 동일)

- (이전 층의 뉴런 갯수)  <- 이 수치만 반영함 (차이점임)

> 보통 (ReLU + He 초기화)  방식이 국룰. 위의 초기화 방식은 잘 사용 안 됨


4) 배치 정규화 (Batch Normalization)  https://light-tree.tistory.com/132

   > 인공 신경망의 각 층에 들어가는 입력을 평균과 분산으로 정규화를 시킴

   - 왜 해야 하나? : 내부 공변량이 변하기 떄문

- 내부 공변량 : 각 층별 입력 데이터 분포

- 입력 데이터가 각 층을 지날때마다, 내부 공변량이 계속 변함

     ** (구별 하기) 공변량 변화 : 훈련 데이터의 분포와 테스트 데이터의 분포가 다른 것


   - 배치 정규화 시기 : 각 층, 활성화 함수를 통과하기 전


   - 효과

- 시그모이드, 하이퍼볼릭탄젠트 에서도 기울기 소실 크게 개선

- 가중치 초기화에 덜 민감

- 훨씬 큰 학습률 적용 가능 -> 학습 속도 개선

- 드롭 아웃과 비슷한 효과 : 잡음이 주입되므로.

    > 배치 단위의 평균, 분산을 계산하기 때문. 이 과정에서 잡음이 생김. 

    > 덕분에, 오버피팅 예방 (Why?)


   - 한계 :

- 모델이 복잡해짐

- 추가 계산을 하는 것 -> 테스트 데이터에 대한 예측 시간이 더 걸림

- 미니 배치 크기에 의존적 : 배치 크기가 너무 작은 경우, 정규화가 극단적으로 되기 때문.

- RNN 적용 어려움 : 각 시점마다 다른 통계치를 가지기 떄문

    > 해결 방법 : layer normalization


5) 층 정규화

   - 각 층들에 대해서 정규화를 시킴 

- 해당 층에 있는 뉴런들의 값들을 모두 정규화 시킴


https://wikidocs.net/61375 구별 잘하자!!

  ** 배치 : feature 를 나누는게 아니다!! "모든 feature" 를 포함한 데이터들을 단위별로 자른것!

- 예를 들면, 총 30개의 데이터 셋이 있다고 하자. 나는 이걸 3개의 데이터 셋을 하나의 배치 해서 학습하려고 함

- 이때, 하나의 데이터 셋에는 "모든 feature"들을 포함하고 있어야 한다!! 헷갈리면 안 돼!

- 그렇기 때문에, 3개의 데이터 셋으로 구성 된 배치가 있다고 하면, 이 배치에는 각 fearture 들이 3개씩 있다고 할 수 있다.

- 배치 정규화는, 이 각각의 feature 들을 정규화 하는 것.