본문 바로가기
프로그래밍 언어 기본 문법/파이썬

케라스 기본 문법 정리 - 딥러닝을 이용한 자연어처리 입문

by tryotto 2020. 1. 30.

# 자연어처리 문법 정리





1) Embedding : 정수 인코딩 된 문장(또는 단어)을 입력받아서, 밀집 벡터로 전환시키는 함수

-> 단어의 차원 수를 줄일 수 있다.

      Why? 원래 단어 하나는, 원핫벡터로 표시되어야 하므로 단어의 종류에 따라서 차원 수가 무한정 커질 수 있다

> 그러나, 밀집벡터를 이용할 경우 하나의 단어를 표현하기 위해 적은 차원 수로 표현이 가능하다

   (보통은 2의 제곱수 만큼의 차원 벡터로 표현한다. 2, 4, 8, 16 차원...)


- input : 2D 정수 텐서 -> 두 개의 입력 길이를 가진 2차원 텐서가 필요

    1) # of samples

>이때, samples들은 정수 인코딩이 완료된 값들

       ex) i love you -> [3, 1, 2]

    2) input length

> 각각의 input 문장들 길이가 다양할텐데, 이를 해결하기 위해 padding 을 수행함

   ex) i love you    -> [3, 1, 2] -> [3, 1, 2, 0]

        i love you, too -> [3, 1, 4, 5] -> [3, 1, 4, 5]

    **3) vocabulary : 입력 문장 속에 있는 단어들이, 어떤 character 들로 구성되어 있는지 그 character의 가짓수를 받는다

ex) i love you -> i, l, o, v, e, y, u : 7가지

> 왜 받는걸까? : (뇌피셜임)

각 문장에 들어있는 단어들이 정수 인코딩이 되어 있지만, 이를 처리하기 위해선 원핫벡터로 또다시 표현을 해줘야 한다

vocabulary 는 결국 원핫벡터의 차원수를 알려주기 위한 값이라고 생각할 수 있다.


- output : 3D 실수 텐서 -> 세 개의 길이 값을 지닌 3차원 텐서를 반환한다

    1) # of samples : input에서의 값과 동일해야 한다. 

ex) 3 개의 입력 문장을 받았으면, 3 개의 밀집 벡터를 반환해야 함

    2) input length : input에서의 값과 동일해야 한다.

Why? 각 문장 안에 있는 단어들이 밀집 벡터로 임베딩 된거지, 문장 자체가 변한 것이 아니기 때문 (번역체랑 헷갈리면 안 된다!)

   ex) i love you    -> [3, 1, 2] -> [3, 1, 2, 0] ->[ [1.1, 2.1], [3.3, 2.1], [5.3, 4.4], [0.0, 0.0] ]

    3) embedding word dimensionality : 각 단어가 밀집벡터로 표시되었을 때, 그 밀집벡터의 차원수가 얼마인지 나타냄

   ex) 위의 예시를 이용하자면, 밀집벡터 차원수 = 2 다





2) Sequential : sequential 모델 "인스턴스"를 반환함

    ex) model = Sequential( );


    > 이렇게 모델 객체를 만든 뒤엔, 레이어를 계속해서 붙여줄 수 있다

ex) Dense(), Embedding() 등등





3) Dense() : 전결합층을 반환한다


- 구조 :

    1. 입력뉴런으로부터 값들을 받는다

    2. 가중치 W 연산을 해서, 출력뉴런으로 전달한다

    3. 출력뉴런으로 전달받은 값을, 활성화 함수에 통과시킨다

> 결국, 입력뉴런, 출력뉴런, 활성화함수 세 가지를 합한 것이 Dense() 함수라고 할 수 있다.


- input : 

    1. 출력 뉴런의 수

    2. 입력 뉴런의 수

    3. 활성화 함수 종류


- output : 위의 구조를 만족시키는 전결합층 객체






4) summary() : 모델에 대한 정보들을 모두 반환 

-> 이때, 미지수 갯수도 반환함 (미지수 갯수는 오직 가중치 행렬 원소 갯수만 체크하면 된다)

     ex) model.summary()





5) Compile() : 모델을 기계가 이해할 수 있도록 처리하는 과정. (아직 훈련에 들어가는게 아님!!)


- input : 

    1. 오차 함수 (loss function) : mse, entropy 

**entropy 종류 : 

     1) cross : 이진분류 -> 보통, 시그모이드를 출력층 활성화함수로 사용

     2) categorical : 다중 분류 -> 보통, 소프트맥스를 출력층 활성화 함수로 사용

    2. 최적화 방법 : adam, sgd, rmsprop 등등

    3. 매트릭 함수 : 훈련을 모니터링 하기 위한 지표


- output : 모델을 위의 조건들에 맞게 훈련시킬 수 있도록 준비해줌






6) fit() : Compile 된 모델을 실제로 훈련시키는 과정


- input :

    1. 훈련 데이터 - X값

    2. 훈련 데이터 - Y값 = 레이블 값 = 실제 값

> 이 값을 이용해서 오차함수를 통과시킨 다음에, 적절하게 학습시키도록 한다

    3. epoch : 전체 데이터를 몇 회독 할건지를 의미

    4. batch size : 데이터가 너무 많을때, 샘플들을 한번에 처리하는 양

> epoch 랑 batch 를 헷갈리면 안 된다!

ex) 데이터가 100개가 있고 batch=25, epoch=5 라고 한다면

- 한 번의 batch에서 25개의 데이터 샘플을 다루므로, 100개의 데이터를 학습하기 위해선

  총 4 번 나눠서 훈련을 수행해야 한다

     > 4번 나눠서 훈련을 모두 수행했을 경우, 그제서야 epoch=1 을 달성하게 된 것이다!

- epoch=5 이므로, 100개의 데이터들을 총 5번 봐야 하므로 결국 100*5=500 연산을 하는 것이다

    5. validation data(x_val, y_val) : 

> 의의 : trainning data 에서 validation data를 따로 나눠서 사용한다.

이때, trainning data 는 "파라미터 값을 직접 변경"할때 사용되는 데이터고,

validataion data 는 파라미터 값이 변경되어야하는지 "여부를 알려주기 위한" 데이터이고,

test data 는 학습이 모두 완료 된 파라미터 값들을 이용해서 "실제 성능을 확인"하기 위한 데이터이다 

> 주의 : validation data 는 절대로 훈련 과정에는 참여하지 않는다. 훈련의 필요 여부만 알려줄 뿐

사설 모의고사 성적(validation data)을 기준으로, 내가 어떤 과목에 취약한지 파악한 다음에 해당 과목(trainning data)을 존나게 공부한다.

그리고 마지막으로 수능날(test data)때 실제 성적을 확인하게 된다

> 효과 : 

    1) test accuracy 를 알려준다 : 위에서 여러번 말했던 것. 하이퍼 파라미터의 수정이 "필요한지"를 알려준다 (실제 수정에 참여는 X)

    2) 오버피팅을 막는다 : test accuracy 가 계속 감소하다가, 어느순간 갑자기 상승할때 훈련을 멈춰야 한다. 오버피팅이 발생했기 때문

Why? trainning data 에 너무 적응된 나머지, valdation data 에서는 정확도가 낮아지게 되는 문제가 발생하므로

    6. validation split : 방식만 다를 뿐, 위와 동일한 의의를 가진다

> 방식 : 위와 동일하나, validation split 을 할 경우엔 trainning data 에서 validation을 위한 데이터를 뽑아내는 방식이라고 한다면,

위의 방식처럼 validation data 를 직접 설정할 경우, 이미 주어진 데이터 이외의 다른 데이터를 활용해서 validation에 활용하는 것

    7. verbose() : 학습 중 출력되는 문구 설정

> 숫자별 출력 내용

    - 0 : 아무것도 출력 X

    - 1 : 훈련마다 "진행도"를 보여주는 막대를 출력

    - 2 : 미니 배치마다 "손실 정보"를 출력


- output : History 자료형을 반환한다

> fit 연산을 하면서, 학습되는 과정들이 생긴다. 

   이 학습되는 과정을 기록해서 History 형식으로 저장해야 한다

> history.history() 를 출력할 경우, 기본적인 출력





7) evaluate() : test data 를 넣어서, 정확도를 측정한다


    - input : 

1) test data X : x data 를 입력으로 넣는다

2) test data Y : 입력 데이터인 x data 에 대해서, test data Y 와의 레이블 값을 비교하며 정확도를 측정한다

3) batch size : test data 의 크기가 너무 클 경우, 나눠서 연산을 해야 하므로 배치 사이즈를 설정해줘야 한다

    - output : 두 개의 값이 [1*2] 크기의 매트릭스에 담아서 반환된다.

  1) (1,1) 값 : 손실 값 (loss value)

  2) (1,2) 값 : 정확도 값 (accuracy)






8) predict() : 잘 훈련 된 모델이 있을때, 내가 X 값을 넣었을 경우 어떤 결괏값이 출력될 것인지 확인하기 위함 

(정확도 측정이 목적이 아님! 정확도 측정은 evaluate 함수를 통해 측정해야 함)

    - input : 

1) 입력값 X

2) batch size : 입력값 X 가 너무 크기가 클 경우, 나눠서 연산해줘야 하므로

    - output : 입력값 X 에 대해, 모델이 예측하는 Y 값






9) 저장, 로드

    - 저장 : model.save()

> 나중에 해당 모델을 사용할 수 있도록 하기 위함

    - 로드 : model.load()

> 저장해둔 모델을 불러오기 위함