# 자연어처리 문법 정리
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()
> 저장해둔 모델을 불러오기 위함
'프로그래밍 언어 기본 문법 > 파이썬' 카테고리의 다른 글
Dataframe - Pandas 자료형 정리 (0) | 2020.03.11 |
---|---|
파이썬 데이터/자료형 (0) | 2020.03.11 |
딥러닝 라이브러리 모음 (0) | 2020.02.15 |
(최신화 중)여러 패키지 문법 정리 - 딥러닝을 이용한 자연어처리 입문 (0) | 2020.01.31 |
케라스 함수형 API - 딥러닝을 이용한 자연어처리 입문 (0) | 2020.01.30 |