컴퓨터는 사진, 영상, 자연어에 대한 것을 이해하지 못합니다. 오로지 숫자를 계산할 뿐이죠.
그래서 사진의 특징을 살리려면 어떻게 픽셀 데이터를 잘 수치화 해서 표현해야하고
자연어처리의 경우 각 단어들을 어떻게 feature vector로 만들어(임베딩) 단어의 특성을 잘 표현할 수 있을까에 대해 고민해야 합니다.
Data Representation을 성공적으로 해낸다면, 딱 1개의 히든 레이어를 가지는 Neural Network를 가지고도 우리는 Universal한 task, 즉 아주 많은 일을 할 수 있씁니다.
Expert Driven Approach VS Data Driven Approach
과거 딥러닝 시스템은 대부분 룰베이스 시스템이었습니다. 모든 경우의 수를 다 프로그램화 해서 만든 시스템이 전문가 기반 시스템(Rule-based Expert Driven Approach) 였습니다.
이를 만들기 위해서는 문제 해결에 필요한 특정 도메인의 지식인 기반 지식(Knowledge Base), 추론 역할을 담당하고 규칙들을 데이터베이스의 사실과 연결하는 데이터 베이스(Database), 어떻게 특정 결론에 이르렀는지 왜 특정 사실이 필요한지 설명하는 추론 엔진(Explanation facillities)와 인터페이스가 필요했습니다.
하지만 이 세계와 우리의 삶은 너무나도 복잡하고 너무나 많은 경우의 수와 예외들이 있죠. 한 주제에 대한 전문가(Domain expert)도 해결할 수 없는 문제였습니다.
현재 접근되는 방식은 Input 데이터를 넣어주면 인공지능 모델이 데이터의 특징을 파악해서 룰이 나오는 방식 데이터 기반 시스템(Data Driven Approach)를 이용합니다.
expert driven system이 '룰을 만드는데' 중점적으로 신경을 써야 했다면,
딥러닝 approach 즉 data driven system은 데이터를 잘 넣어주어 모델이 패턴을 스스로 학습해 룰을 생성해내도록하는데 신경써야 한다는 얘기입니다.
일관성이나 관련성이 없고 노이즈가 많은 데이터를 넣어도 모델이 알아서 패턴을 생성해주겠지라는 생각은
차라리 룰베이스를 사용하는 것만 못한 결과를 내게 됩니다.
그래서 데이터를 잘 잘라주고 정형화 시켜주어 패턴을 잘 학습할 수 있도록 해야합니다. 그래서 실제 딥러닝 workflow에서는 70-80프로의 시간을 데이터 전처리 및 가공하는데 시간을 쓰게 됩니다.
데이터가 없다면 데이터를 수집해야 되고, 데이터가 복잡하고 정형화 되지 않았다면 그 데이터를 깔끔하게 만들어주어야 합니다.
실제 모델을 돌렸을 때 파라미터들의 overfitting 문제인 경우보다는 데이터를 잘 가공하지 않아서 발생하는 문제가 더 많다고 하니 그만큼 Data Representation은 어쩌면 가장 중요한 부분이 아닐까 생각해 봅니다.
데이터의 유형
데이터의 유형은 크게 4가지가 있습니다.
1. 숫자형 데이터
숫자형 데이터는 가장 전처리하기 쉬운 데이터이고 데이터에 따라 Scaling을 해주는 부분이 필요합니다.
Standard Scale
Robust Scale
Min-max Scale
Normalization(표준 정규 분포로 만듬)
2. Categorical Data
label encoding & one-hot encoding
3. boolean
0과 1(True, False)만의 결과만 필요한 유형
4. graph data
독립 변수, 종속 변수
데이터의 feature라고 하면은 간단하게 생각하면 데이터의 특성을 나타내는 것을 말합니다. 주로 테이블 데이터나 데이터프레임이 있을 때 '열', '컬럼'에 해당하는 부분을 말합니다.
열 : 특성(feature), 속성(attribute), 변수(variable), field
종속변수와 인과관계가 있는 독립변수를 확인했다면 그 다음은 독립변수들을 잘 정의하는 일이 필요합니다.
input data와 관계 mapping에 확실한 feature 위주로(영향이 큰 feature) feature를 생성하고 그 다음 feature를 늘려나가야 하며, feature를 추가할 때 성능이 오르는 feature와 떨어지는 feature를 구분해야 합니다.
Word Embedding
자연어처리에서 단어를 벡터로 표현하는 방법을 말하며 이 부분이 task 성능에 엄청나게 큰 영향을 미치게 됩니다. 데이터의 수가 부족해서 모델이 task를 잘 이해할 수 없다면 Language Model이 단어를 벡터로 의미있게 잘 생성하는 것만으로도 성능이 크게 올라갈 수 있는 것만 봐도 알 수가 있죠.
unique token이 80000개가 있다면 차원은 80000차원이 되는 것인데 이렇게 많은 차원을 가지고 모델에게 학습을 시키면 당연히 잘 이해하지 못합니다. 그래서 어떻게 하면 데이터가 피처를 잃지 않고(데이터의 특성을 잘 표현) 차원을 줄일 수 있을까에 대한 고민들이 필요합니다. 이렇게 고차원의 단어들을 저차원으로 매핑하는 것을 '차원 축소' 기법이라고 하며 여러가지 방법이 있습니다. 과거에는 통계기반의 SVD가 많이 사용되었고 최근에는 이 부분도 딥러닝을 통해 해결하고 있기도 합니다.
SVD방법은 통계학적으로 분포를 고려하거나 문서에 등장하는 토큰의 수 등을 고려하여 임베딩을 생성하고, 딥러닝을 이용한 방법은 문맥을 반영해 다음에 나올 단어를 예측하여 가중치를 맞추고 임베딩을 생성하게 됩니다.
데이터의 행렬표현(BoW, DTM, n-gram, Tf-IDF)
Word2Vec, GloVe, FastText(단어 수준)
ELMo, BERT 등의 Transformer 기반
PCA, LDA, T-SNE, MF 차원축소(SVD)
이렇게 생성된 임베딩들은 task 모델을 수행하기 위해(Classification, Named Entity Recognition, Semantic Role Embedding 등) 비밀 소스 같은 역할을 합니다.
결론
아주아주 똑똑한 사람이 이 데이터를 볼 때 패턴을 파악할 수 있겠다라는 생각이 들때까지 데이터를 만든다^^