해당 포스팅은 네이버 부스트캠프 AI Tech 학습 정리 자료임을 알려드립니다.
1. 강의 정리
주재걸 교수님 - Intro to Natural Language Processing(NLP)
1) 자연어 처리란 무엇인가?
자연어 처리(Natural language processing, NLP)는 보통 단어, 문장, 문단, 글을 이해하는 NLU(Natural language understanding)과 인간의 언어를 생성하는 NLG(Natural language generating)으로 나눌 수 있습니다. 특히, 자연어 처리는 딥러닝의 발전과 함께 좋은 성능을 나타냈습니다.
NLP 관련 학문 분야로는 크게 NLP, 텍스트 마이닝(Text mining), 정보 검색(Information retrieval)로 나눠 볼 수 있습니다.
NLP는 아주 작은 단위(형태소)부터 문단까지 이르는 다양한 방법들이 존재합니다.
먼저 low-level parsing에는 Tokenization과 stemming이 포함되어 있습니다. tokenization은 단어 단위로 쪼개 나가는 것을 의미하고, stemming은 어미가 다른 단어를 컴퓨터가 이해하기 위해 의미 변화를 없애고, 언어의 의미만 보존하는 것을 의미합니다. 예를 들어, "I study math" 라는 문장이 존재한다고 했을 때, 문장을 "I", "study", "math"로 나누는 과정을 tokenization이라고 하며, "study", "studying", "studied"와 같이 의미는 같으나 형태가 다른 것을 같은 것으로 이해하도록 해주는 과정을 stemming이라고 합니다.
두 번째로 Word and phrase level에서는 단일 언어나 여러 단어로 이뤄진 고유명사를 인식하는 NER(Named entity recognition), 품사와 성분이 무엇인지 맞추는 POS(part-of-speech tagging), 이것들 외에도 noun-phrase chunking, dependency parsing, coreference resolution 등을 포함합니다.
세 번째로 Sentence level에서는 긍정과 부정을 구분하는 감정분석(Sentiment analysis), 문장을 다른 언어로 번역해주는 기계어 번역(machine translation)을 포함하고 있습니다.
마지막으로 Multi-sentence and paragraph level에서는 두 문장간의 모순관계를 예측하는 Entailment prediction, 질문에 답을 구하는 질의 응답(question answering), 챗봇(dialog systems), 문서 요약(summarization)을 포함하고 있습니다.
텍스트 마이닝(Text mining)은 빅데이터와 관련되어 있는데 수많은 기사에서 특정 키워드들의 빈도수를 시간 순으로 분석해서 유용한 정보를 추출하기도 하고, 특정 유명인의 이미지 변화를 분석하는 Trend 분석 등을 포함하고 있습니다. 또한 서로 다른 키워드이지만 비슷한 키워드들을 그룹핑해주는 Document clustering(topic modeling)도 포함됩니다. 특히 텍스트 마이닝은 사회 과학 분야에서 유용하게 사용되는 데, SNS 데이터를 바탕으로 유의미한 내용을 얻어내는 방법으로 많이 사용하고 있습니다.
정보 검색(Information retrieval)은 구글이나 네이버처럼 포털 사이트에서 우리가 원하는 키워드를 검색했을 때, 이에 해당되는 내용의 사이트만 알려주는 것이 아니라, 가장 근접한 답을 찾아주기도 합니다. 또한 유튜브의 영상을 봤을 때 비슷한 영상을 검색없이 이어서 볼 수 있도록 돕는 추천시스템도 포함 되어 있습니다.
2) 자연어처리의 동향
텍스트 데이터는 기본적으로 순서를 포함하는 sequence data입니다. 우리는 단어를 학습하기 위해 컴퓨터가 알아 들을 수 있도록 변경을 해줘야 합니다. 이처럼 단어를 숫자로 변경해주는 과정(벡터)을 word embedding이라고 합니다. 이 과정에서 Word2Vec와 GloVe를 활용합니다.
순서 정보를 학습시키기 위해서 RNN model(LSTM, GRU)을 활용해서 학습을 주로 사용해왔습니다. 하지만, 2017년에 발표된 "attention is all you need."라는 제목의 논문이 나오면서 기존의 RNN 계열의 모델 구조를 self-attention이라고 불리는 모듈로 완전히 대체할 수 있는 Transformer가 등장했습니다. 다양한 자연어처리 분야에서는 Transformer를 사용해서 좋은 성능을 얻을 수 있었고, 현재에도 많이 사용되고 있습니다. Transformer는 자연어처리 분야 뿐만 아니라 영상처리, 시계열 예측, 신약 개발 등 다양한 분야에서 성능 향상을 이뤄내고 있습니다. Transformer가 존재하기 이전에는 자연어 처리 분야별로 각각 다른 모델을 가지고 있었습니다. Transformer가 등장한 이후로 self-supervised training을 통해 성능 향상을 해왔고, transfer learning을 통해서 customized 된 task에서도 좋은 성능을 보여주고 있습니다. 하지만, 이렇게 모델이 커짐으로써 GPU 자원이 많이 필요하게 되는 어려움이 있습니다.
3) Bag-of-Words
Bag-of-Words는 자연어 처리 텍스트 마이닝 분야에서 딥러닝 기술이 적용되기 이전에 활용하던 단어 및 문서를 숫자로 바꾸는 방법입니다.
Bag-of-Words를 하기 위해서 가장 먼저 sentence에 포함된 단어들을 포함한 vocabulary를 생성해야 합니다. 여기서, 단어들은 unique해야 합니다. 예를 들어 "Mike likes this flower","Jane loves this game" 이라는 문장으로 vocabulary를 만든다고 해봅시다. 여기에는 "this"라는 단어가 2개 중복되어 있지만, vocabulary를 생성할 때에는 하나만 포함하게 됩니다. 그렇게 완성된 vocabulary는 {"Mike","likes","this","flower","Jane","loves","this","game"}으로 만들 수 있습니다.
두 번째로, 위에서 만들어 준 vocabulary를 one-hot vector로 변경해주는 과정을 거칩니다. 이 때, one-hot vector의 차원은 vocabulary의 개수와 동일하게 설정합니다. 위의 예를 따르면, 8-dimension을 가지는 one-hot vector를 만들게 됩니다. "Mike"는 [1 0 0 0 0 0 0 0] 라는 벡터를 가지게 될 것입니다. 동일한 방식으로 vocabulary의 모든 단어들을 벡터화 시켜줍니다. 여기서 특징적인 부분으로는 어떠한 단어 2개를 고르던지 유클리디안 거리는 $\sqrt{2}$로 동일하게 되며, 코사인 유사도(cosine similarity)도 0으로 동일하게 됩니다. 이것이 뜻하는 것은 단어의 의미와 상관없이 동일한 관계를 가진다는 것을 의미합니다.
이렇게 구해진 one-hot vector를 더해서 Sentence의 Bag-of-words를 구할 수 있습니다.
4) NaiveBayes Classifier for Document Classification
Documents와 Classes에 Bayes' Rule을 적용하면 $d$는 document, $c$는 class라고 했을 때, 아래와 같습니다.
$$C_{MAP} = \underset{c \in C}{argmax} P(c|d)$$
여기서 MAP은 최대 사후 확률을 말하는 것으로 가장 비슷한 클래스를 표현하는 것과 동일합니다. 위의 식을 통해서 가장 확률이 높은 클래스 $c$를 출력하는 것입니다. 위의 식에 Bayes Rule을 적용 적용하면 아래와 같습니다.
$$C_{MAP} = \underset{c \in C}{argmax}\frac{P(d|c)P(c)}{P(d)}$$
여기서 $P(d)$는 상수로 무시할 수 있습니다. 왜냐하면 이미 $d$는 주어져 있기 때문입니다. 확률은 동일한 값으로 나눠줘도 상관이 없습니다. 그래서 $P(d)$ 값을 제거하면 아래와 같은 식을 만들 수 있습니다.
$$C_{MAP} = \underset{c \in C}{argmax} P(d|c)P(c)$$
이번에는 $d$를 시퀀스 단어인 $w$로 표현해서 적용해보면 아래와 같습니다.
$$P(d|c)P(c) = P(w_{1}, w_{2}, ... , w_{n} |c)P(c) \rightarrow P(c)\prod_{w_{i} \in W}P(w_{i}|c)$$
$c$가 고정되었을 때, 서로 독립이라고 가정할 수 있다면, 화살표 우측의 항으로 표현이 가능합니다. 여기서의 $P(d|c)$는 특정 카테고리 $c$가 고정일 때, 문서 $d$가 나타날 확률입니다.
위에서 말한 것을 예제에 적용하면서 설명해보려고 합니다. 아래처럼 4개의 train 문장으로 학습해서 test 문장을 예측하려고 합니다.
Document(d) | Document(w) | class(c) | |
train | 1 | Image recognition uses convolutional neural networks | CV |
2 | Transformer can be used for image classification task | CV | |
3 | Language modeling uses transformer | NLP | |
4 | Document classification task is language task | NLP | |
test | 5 | Classification task uses transformer | ? |
train으로 얻은 $P(c_{CV}) = \frac{2}{4} = \frac{1}{2}$, $P(c_{NLP}) = \frac{2}{4} = \frac{1}{2}$ 값을 얻을 수 있습니다. 이것으로 $P(c_{CV}|d_{5})$와 $P(c_{NLP}|d_{5})$를 구해보면 각각 $P(c_{CV})\prod_{w \in W}P(w|c_{cv})$와 $P(c_{NLP})\prod_{w \in W}P(w|c_{NLP})$를 구하면 됩니다.
각각의 단어에 대한 조건부확률을 구하면 아래의 표처럼 구할 수 있습니다.
Word | Prob | Word | Prob |
$P(w_{classification}|c_{CV})$ | $\frac{1}{14}$ | $P(w_{classification}|c_{NLP})$ | $\frac{1}{10}$ |
$P(w_{task}|c_{CV})$ | $\frac{1}{14}$ | $P(w_{task}|c_{NLP})$ | $\frac{2}{10}$ |
$P(w_{uses}|c_{CV})$ | $\frac{1}{14}$ | $P(w_{uses}|c_{NLP})$ | $\frac{1}{10}$ |
$P(w_{transformer}|c_{CV})$ | $\frac{1}{14}$ | $P(w_{transformer}|c_{NLP})$ | $\frac{1}{10}$ |
$$P(c_{CV}|d_{5}) = \frac{1}{2} \times \frac{1}{14} \times \frac{1}{14} \times \frac{1}{14} \times \frac{1}{14}, \, P(c_{NLP}|d_{5}) = \frac{1}{2} \times \frac{1}{10} \times \frac{2}{10} \times \frac{1}{10} \times \frac{1}{10}$$
이렇게 값을 구해보면 $c_{NLP}$일 때의 값이 더 큰 것을 알 수 있으므로, NLP로 예측할 것입니다. 여기서 중요한 점이 있는데 만약 단어가 포함되어 있지 않으면 0의 확률을 갖게 됩니다. 이렇게 되었을 때, 다른 단어가 아무리 연관성이 높아도 해당 클래스로 분류할 수 없습니다. 이를 막기 위해 Regularization(상수를 더해주는 방법)이 필요합니다.
주재걸 교수님 - Word Embedding : Word2Vec, GloVe
1) Word Embedding은 무엇인가?
Word Embedding은 앞에서도 말했듯이 단어를 공간 상의 한 점(벡터)로 표현하는 것입니다. 예를 들어, "dog"와 "puppy"는 비슷한 단어로 비슷한 벡터의 위치에 있습니다. 하지만, "bicycle"은 "dog"와 "puppy"와 비슷한 단어가 아니기에 두 점 사이의 거리는 멀게 맵핑하게 됩니다. 이러한 방식으로 비슷한 의미의 단어는 공간 상 가까운 위치에 맵핑하도록 하여 의미의 유사도를 잘 반영합니다. 이렇게 Word Embedding을 학습하는 방법에는 Word2Vec과 GloVe가 있습니다. 이 방법들에 대해 자세히 알아보겠습니다.
2) Word2Vec
Word2Vec는 같은 문장에서 나타난 인접한 단어들끼리의 의미가 비슷할 것이라는 가정을 사용합니다. 따라서 Word2Vec에서는 한 단어가 주변에 등장하는 단어들에 의해 그 의미를 알 수 있다는 사실에 착안했습니다. 주어진 학습데이터를 바탕으로 "cat" 단어를 주고, "cat" 주변 단어들의 확률 분포를 예측하게 됩니다. 좀 더 구체적으로 Word2Vec 구조 및 학습방식을 알아보겠습니다.
먼저 주어진 학습데이터는 "I study math." 라는 단 하나의 문장으로 구성되어 있다고 가정해보겠습니다. 먼저 Word2Vec에서는 주어진 학습데이터를 word별로 분리하는 tokenization 과정을 수행합니다. 그리고 unique한 단어들만 모아서 vocabulary를 만듭니다. 사전의 각 단어는 vocab의 사이즈만큼의 차원을 가지는 원핫벡터의 형태로 나타낼 수 있습니다. 여기서 sliding window라는 기법을 이용해서 한 단어를 중심으로 앞 뒤의 단어로 입출력 단어 쌍을 이루게 됩니다. 아래의 그림을 참고하시면 도움이 될 것 같습니다.
"I"를 중심단어로 두고, 앞과 뒤의 단어를 이용해서 ("I","study")라는 입출력쌍을 만들고, 1칸 우측으로 움직이는 방식을 통해서, 입출력쌍을 얻어낼 수 있습니다. 이렇게 얻어진 입출력 쌍을 가지고 예측을 하는 two layer Neural Network를 만들었다고 가정해봅시다.
여기서 Input Layer의 dimension은 "study"라는 input vector의 크기와 동일한 값을 가져야 합니다. 물론, Output Layer도 동일한 dimension을 가져야 합니다. 원-핫 벡터로 변환한 벡터를 linear layer의 weight인 W1과 W2를 거쳐서 원하는 출력 값이 나오는 방향으로 학습하게 됩니다.
맨 처음으로 W1과 input vector와 행렬곱을 하게 되는데 이 과정에서 행렬곱을 모두 계산할 필요가 없습니다. 그 이유는 input vector의 1인 부분만 살아남기 때문입니다. 그래서 우리는 input vector가 1인 인덱스인 W1의 열벡터를 얻을 수 있습니다. 추출된 열벡터는 W2와 곱셈을 통해서 값을 Output vector와 동일한 차원의 벡터를 얻게 됩니다. 여기서 W1과 W2의 내적을 벡터의 유사도를 나타내는 것으로 생각한다면 주어진 W1과 W2 의 내적의 유사도가 최대한 커지도록 해야합니다. 이러한 방법으로 Weight값을 업데이트 시켜주게 됩니다.
이런 방식을 통해서 Word를 Vector로 변경하면 아래와 그림처럼 비슷한 관계의 경우에는 비슷한 벡터 모습을 볼 수 있습니다.
비슷한 관계는 동일한 관계를 나타내기 때문에 유사도가 크다고 볼 수 있습니다. 이것 외에도 Analogy Reasoning이나 여러 단어가 주어졌을 때, 나머지 단어와 상이한 단어를 유클리디안 거리를 이용해서 찾는 Intrusion Detection방법 등에서 사용됩니다. 또한 Word2Vec은 NLP의 단어 유사도나 기계어 번역, PoS, NER, 감정 분석, 군집화 등 대부분의 분야에서 성능을 향상시켰습니다.
3) GloVe
GloVe는 Word2Vec와 다르게 각 입력 및 출력 단어쌍에 대해 같은 윈도우 내에서 얼마나 동시에 나타났는지를 미리 계산합니다. 아래와 같은 loss function을 가지게 됩니다.
$$ J(\theta) = \frac{1}{2}\sum_{i,j = 1}^{W} f(P_{ij})(u_{i}^{T}v_{j} - logP_{ij})^{2}$$
여기서, $u_{i}$는 입력벡터, $v_{j}$는 출력벡터, $P_{ij}$는 동시에 나온 확률로 두개의 차이를 0으로 가까이 가게 하는 새로운 loss function을 사용합니다. 이러한 방법은 Word2Vec과 비교해서 중복 계산을 줄여주기 때문에 더 빠르며, 적은 데이터에서도 잘 동작하는 특징을 갖습니다. GloVe도 Word2Vec와 동일하게 비슷한 관계끼리의 벡터가 동일한 모습을 확인할 수 있습니다.
2. 피어 세션 정리
지난 주 공부 공유
-
지형님 - positional Encoding(Transformer에 순서를 매기는 방법)
-
l1_norm, l2_norm
지난 주 알고리즘 풀이
-
2042 - 구간 합 구하기
-
1766 - 문제집
질문
-
convolution 에서 왜 padding은 kernel_size 나누기 2로 해주는가?
-
conv의 output 크기를 input과 동일하게 만들어 줄 수 있음.
-
kernel_size가 짝수일 때는 크기가 커지는 현상이 발생함.
-
3. 추가로 공부할 내용 및 궁금한 내용
-
CBOW, skip-gram
-
Word2Vec를 통해서 학습하고 난 다음에 어떻게 우리가 원하는 좌표값을 얻을 수 있는 것인가?