RNN layer의 구성
💡 ml, dl의 텍스트 데이터 인코딩 방식
머신러닝에서는 BOW, TF-IDF 인코딩 방식을 주로 사용하고 딥러닝에서도 사용하기도 함
RNN에서는 순차적으로 데이터를 인코딩해주는 시퀀스 인코딩 방식을 사용하면 좀 더 나은 성능을 내기도 함
💡padding 한 이후 train과 test의 결과 shape의 열 개수가 다르다면 maxlen으로 두 개가 같도록 맞춰줘야 함
💡RNN은 주로 시퀀스 데이터에 사용
🤔validation_split 을 사용하면 성능이 잘 안 나오는데 train_test_split 으로 train 을 train, valid로 나눠준 데이터를 사용하면 좀 더 나은 성능이 나오는 이유는?
입력 갯수와 출력 갯수에 따른 유형으로, 입력과 출력의 길이에 따라서 달라지는 RNN의 다양한 형태가 있음
One to one: 가장 기본적인 모델(simpleRNN)
One to many: 하나의 이미지를 문장으로 표현할 수 있음
Many to one: 단어 시퀀스에 대해서 하나의 출력을 하는 구조
Many to many: 여러 개의 단어를 입력받아 여러 개의 단어로 구성된 문장을 명사, 동사, 형용사 등으로 구분 반환하는 번역기
워드 임베딩이란 단어를 특정 차원의 벡터로 바꾸어 주는 것
텍스트를 벡터화하는 세 가지 방법
💡 1) one-hot-encoding
💡 2) 고유 번호로 인코딩
💡 3) word embedding(n-dimensional embedding)
RNN explainer
https://damien0x0023.github.io/rnnExplainer/
🤔Bidirectional 과정에서 차원 축소 기능이 있을까?
TF 공식문서
https://www.tensorflow.org/api_docs/python/tf/keras/layers/Bidirectional
RNN의 기울기 소실: RNN의 구조상 관련 정보와 그 정보를 사용하는 지점 사이 거리가 멀 경우, 역전파하는 과정이 너무 길어져 기울기 값이 아주 작아져 소실되는 문제 발생(초기 입력이 잊혀져 예측 성능이 떨어짐)
장단기 메모리(Long Short-Term Memory, LSTM)는 순환 신경망(RNN) 기법의 하나
메모리 셀, 입력 게이트, 출력 게이트, 망각 게이트를 이용해 기존 순환 신경망(RNN)의 문제인 기울기 소실 문제를 방지함
LSTM 알고리즘은 Cell State라고 불리는 특징층을 하나 더 넣어 Weight를 계속 기억할 것인지 결정
셀 상태(Cell state)는 정보를 추가하거나 삭제하는 기능을 담당 >> LSTM은 과거의 데이터를 계속해서 업데이트
기존 RNN의 경우, 정보와 정보사이의 거리가 멀면, 초기의 Weight값이 유지되지 않아 학습능력이 저하됨
장점 : 각각의 메모리 컨트롤이 가능하고 결과값 컨트롤이 가능
단점 : 메모리가 덮어씌워 질 가능성이 있고 연산속도가 느림
📚Tensorflow api
tf.keras.layers.LSTM(
units, activation='tanh', recurrent_activation='sigmoid', use_bias=True, kernel_initializer='glorot_uniform',
recurrent_initializer='orthogonal', bias_initializer='zeros', unit_forget_bias=True, kernel_regularizer=None,
recurrent_regularizer=None, bias_regularizer=None, activity_regularizer=None, kernel_constraint=None,
recurrent_constraint=None, bias_constraint=None, dropout=0.0, recurrent_dropout=0.0,
return_sequences=False, return_state=False, go_backwards=False, stateful=False,
time_major=False, unroll=False, **kwargs)
LSTM을 변형시킨 알고리즘으로, Gradient Vanishing의 문제를 해결함
LSTM은 초기의 weight가 계속 지속적으로 업데이트되었지만, GRUs는
Update Gate와 Reset Gate를 추가하여, 과거의 정보를 어떻게 반영할 것인지 결정(GRU는 게이트가 2개, LSTM은 3개)
Update Gate는 과거의 상태를 반영하는 Gate이며, Reset Gate는 현 시점 정보와 과거 시점 정보의 반영 여부를 결정
게이트 순환 유닛으로 장단기 메모리(LSTM)과 달리 출력 게이트가 없는 간단한 구조를 가짐
데이터 양이 적어 사용해야 할 매개변수의 양이 적다면 GRU를 사용하고, 데이터 양이 많으면 LSTM의 성능이 더 나음
📚Tensorflow api
tf.keras.layers.GRU(
units, activation='tanh', recurrent_activation='sigmoid', use_bias=True, kernel_initializer='glorot_uniform',
recurrent_initializer='orthogonal', bias_initializer='zeros', kernel_regularizer=None, recurrent_regularizer=None, bias_regularizer=None, activity_regularizer=None, kernel_constraint=None, recurrent_constraint=None, bias_constraint=None,
dropout=0.0, recurrent_dropout=0.0, return_sequences=False, return_state=False, go_backwards=False, stateful=False, unroll=False, time_major=False, reset_after=True, **kwargs )
🤔텍스트 데이터 전처리는 보통 semantic한 내용만 남기는 게 목적인가?
💡퀴즈 정리
return_sequences는 시퀀스 출력 여부로 레이어를 여러개로 쌓아올릴 때는 return_sequence=True 옵션을 사용한다.
Embedding layer을 통해 출력된 임베딩 벡터의 최종 차원은 (batch_size, vocab_size, embedding_dim)이 됨.
모델 구성층 중 각 단어의 유사도를 계산하여 주어진 배열을 정해진 길이로 압축해주는 층은?
각기 다른 문장(또는 문서)의 길이를 동일한 길이로 맞춰주어 모델에서 같은 길이의 문장에 대해서 하나의 행렬로 보고, 한꺼번에 묶어서 처리할 수 있도록 하는 방법은?
딥러닝 모델에 자연어 데이터를 바로 넣는다면 인식하지 못하는 문제가 있어, 문자열 데이터를 숫자형으로 바꿔주는 작업(인코딩)을 위해 사용되는 방법은?
자연어 처리 중 주어진 코퍼스(corpus)에서 의미있는 단위로 나누는 작업을 위해 사용되는 방법은?