자연어처리(NLP)/자연어처리

언어지능 딥러닝

Jasonify97 2023. 3. 27. 17:56

bit.ly/3FP35xt

1.  인트로

mlops란?

개발과 운영을 따로 나누지 않고 개발의 생산성과 운영의 안정성을 최적화하기 위한 문화이자 방법론이 DevOps이며, 이를 ML 시스템에 적용한 것이 MLOps이다

text mining vs NLP

text mining : 전처리

일정한 패턴이 없는 비정형화 되어있는 글들을 수집하여 패턴을 찾아 패턴화 하고 사용할 수 있는 정형화 데이터로 바꾸는 것 

NLP(Natural Lanuage Processing) : 자연어 처리

text mining은 사람이 만들어 놓은 규칙을 기반하는 기술이라면, NLP는 규칙을 기계가 학습하는 구조
예를 들어, 사람이 쓴 숫자를 컴퓨터한테 이해시킬때의 방법의 차이다.
텍스트 파일은 sequential 데이터기 때문에 시계열 데이터 처럼 순서, 시간이 존재한다.
이런 데이터를 처리하는 방법이 Recurrent NeuralNetwork(RNN)이다.

과거와 현재까지 모든 정보를 반영해야하고, 히든스테이트는 똑같은 가중치로 반영해야한다,

return_sequences = True
모든 시점에서 제작한 특징 값들을 다음 레이어로 다 넘겨라

return_sequences = False
마지막 시점에서만 제작한 특징 값들을 다음 레이어로 넘겨라

Param counting

(이전 히든스테이트 연결 노드 + 지금 인풋 노드 수 + bias 1개)* 현재 히든 스테이트 노드수

A노드에 대한 파라미터 수는 
t-1시점에서 노드 4개
t시점에서 들어오는 노드 3개
바이어스(편향)1개
A노드의 파라미터수 = 8개
그리고 A가 속한 feature의 전체 노드수는 8*4 = 32개

sigmoid의 단점

LSTM(Long Short Term Memory)

RNN과 LSTM

RNN vs LSTM

Forget Gate

1. 시그모이드 함수를 쓰므로써 과거의 수치들을 미래로 얼만큼이나 가져갈 것인지 정함(과거의 수치들에 대해)
(tanh를 쓴다면 값이 음수가 되어 반전 될 수도 있음)

sigmoid = 0~1 사이의 수
tanh = -1 ~ 1 사이의 수

Input Gate

2. Input Gate는 이 수치들을 가져갈 것인지 아닌지를 판단함(현재의 수치들에 대해)
현재 이 수치들이 가져갈 가치가 있는지 판단

Old & New

과거의 수치가 Forget Gate를 거치고 현재의 수치들은 Input Gate를 거치고 두값을 합한다.

LSTM은 RNN과 비교하여 가중치는 4배이기 때문에 무겁긴하지만 똑똑하다.

GRU(Gated Recurrent Unit)

GRU vs RSTM

1. Cell State와 Hidden State를 따로 취급했지만 GRU는 2개를 같이 취급함(Ct + ht = zt)
2. 과거의 수치와 현재의 수치 각각의 게이트를 구성했었다면 GRU는 (1-)을 이용하여 과거와 현재의 비율로 나타냈다.
3. 3개 Gate vs 2개 Gate

일반적으로 복잡한 시퀀스 데이터를 처리하는데 LSTM이 효과적이지만, GRU는 모델 구조가 간단하여, 빠른 학습이 필요한 경우에 유용함

tokenize
embedding
modeling

 

1. 데이터 프레임을 리스트로 바꿈

X_train = train_data['document'].astype('str').tolist()
X_test = test_data['document'].astype('str').tolist()

# y는 숫자니까 values 이용
y_train = train_data['label'].values
y_test = test_data['label'].values

2.Tokenizer 선언 후 fit하고 seq로 바꿈

from tensorflow.keras.preprocessing.text import Tokenizer
max_words = 35000   # 상위 35,000개의 단어만 보존
tokenizer = Tokenizer(num_words=max_words, lower=False)  # lower(대문자->소문자) 옵션은, 한국어를 할땐 끄자.

tokenizer.fit_on_texts( X_train )
x_train = tokenizer.texts_to_sequences(X_train)
x_test = tokenizer.texts_to_sequences(X_test)

3. 패딩

max_words = max_words ## 위에서 설정하길 35000
embedding_dim = 128 ## 단어 embedding 차원
max_len = 30 ## 문장 최대 길이

from tensorflow.keras.preprocessing.sequence import pad_sequences

x_train = pad_sequences(x_train, maxlen = max_len)
x_test = pad_sequences(x_test, maxlen = max_len)

4 .array

# 어레이로 바꾸는데 왜바꾸는지는 모르겠음

x_train = np.array(x_train)
x_test = np.array(x_test)

5. 0만있는 데이터를 추가 전처리

not0train_idx = x_train.sum(1) > 0
not0test_idx = x_test.sum(1) > 0

train_data = train_data.loc[not0train_idx].reset_index(drop=True)
test_data = test_data.loc[not0test_idx].reset_index(drop=True)

x_train = x_train[not0train_idx]
y_train = y_train[not0train_idx]

x_test = x_test[not0test_idx]
y_test = y_test[not0test_idx]

6. 모델링!

parse_categorical_crossentropy

 

onehot encoding
sparse categorical_entrophy

MaxPooling1D vs MaxPool1D 

MaxPooling1D는 keras.layers.MaxPooling1D
MaxPool1D는 tensorflow.keras.MaxPool1D

caggle

한국어 맞춤법검사기를 이용하여 텍스트를 고침
베이지안 최적화
autokeras
허깅페이스에서 model을 검색하고 듀토리얼 보면서 진행
smote를 활용햐 데이터 불균형 조치

 

machine learning expert