개인적으로 공부한 것을 정리한 내용이므로 틀린 곳이 있을 수 있습니다
자연어처리 모델들을 본격적으로 보려고 하기 시작하니까 필연적으로 머신러닝/딥러닝에 대한 이야기들이 나오기 시작했다. 웹개발에 집중하다보니 전에 공부했던 딥러닝 내용들을 많이 잊어버렸는데 다시 떠올려봐야겠다.
문제해결 패러다임의 변화!!
기존에는 "문제해결"이라고 하면 알고리즘을 많이 떠올렸다. 알고리즘이란 어떠한 문제를 해결하는 정확한 일련의 방법들이다. 이렇게 알고리즘이라고 정의할 수 있으려면 몇가지 필요조건들이 있다.
1. 입력
2. 출력
3. 명확성
4. 유한성
5. 실현가능성
위의 조건들을 통해 다시 정리하자면 알고리즘은 입력과 출력을 만들기 위해 유한번 실행되는 명확하고 실현가능한 명령들의 나열이라고 정의할 수 있을 것이다.
그런데 현실세계에서의 문제는 어떠한 명확한 논리적인 명령들의 나열로는 풀 수 없는 문제들이 많다.
문제를 해결하기 위한 알고리즘을 생각해낼 수 없다면 우리는 이러한 문제들에 어떻게 접근해야할까?
........
대신 만약 이러한 문제들에 수많은 input, output의 데이터들은 주어진다면...??
많은 데이터들을 기반으로 문제해결을 할 수 있지 않을까?
이러한 접근방식이 바로 문제해결의 새로운 패러다임이다. 기존의 알고리즘으로 명확한 명령들을 서술할 수는 없지만 많은 데이터들을 통해 학습을 시키고 학습을 통해 어떠한 문제를 해결을 하는 것이 머신러닝의 문제 접근 방식이다.
가설(hypothesis)선택과 hyper parameter선택
개인적으로 처음에 조금 헷갈렸던 지점이다.
머신러닝에서 가설이란 모델링 하려는 타깃함수이다. 즉 가설을 기반으로 만들어진 구현체가 모델이다.
머신러닝으로 모델을 만들때는 여러가지 가설들을 설정해두고(가설공간) 가설 공간안에서 만들어진 모델들의 성능평가를 통해 가장 좋은 모델을 선택하는 방식을 취한다.
위의 단계를 거쳐서 가장 좋은 모델을 선택하는 것이다. 이때 가설공간안의 모델등의 성능을 평가할때 사용하는 데이터셋은 흔히 validation data라고 하는 데이터셋을 사용한다. 이러한 성능평가에는 cross validation 등 여러 방법이 있다.
즉, hypothesis을 선택한다는 말은 model selection을 한다는 말이다
그렇다면 hyper parameter 튜닝은 무엇일까?
hyper parameter는 머신러닝의 튜닝 파라미터이다. 다만 여기서 모델안의 일반적인 파라미터와는 구분해야한다.
일반적인 파라미터라 하면 인공신경망에서 weight나 bias 를 말한다. 즉 학습이 되는 파라미터를 말한다. 즉 이 파라미터들은 모델이 학습을 진행하면서 설정하는 파라미터이지 사용자가 직접 튜닝할 수 있는 파라미터는 아니다.
그런데 hyper parameter라 하면 예를들어 회귀분석의 비용함수에서 L2 regularization이나 의사결정트리의 깊이, learning rate, 레이어 개수 등등 사용자가 직접 튜닝할 수 있는 파라미터를 의미한다.
즉, hyper parameter 을 튜닝한다는 말은 어떠한 가설로부터 모델 알고리즘을 구현할때 사용자가 hyper parameter를 적절한 값으로 바꾼다는 말이다.
요약하자면,
가설이 정해지고 그 가설을 구체화 하기 위한 모델의 아키텍쳐가 정해진다면( 모델의 hyper parameter등이 정해진다면)
데이터를 기반으로 모델 내부의 파라미터(weight, bias) 들을 이용해서 훈련을 진행한다.
추가적으로 가설을 여러개를 정해두고 각각의 가설을 모델링하여 검증을 해서 최적의 모델을 찾는 것이 머신러닝을 통한 문제해결 방식이다.
음의 로그 우도(negative log likelihood)
딥러닝의 손실함수 중 하나이다.
학습이 진행되면서 모델이 예측한 값과 실제값의 차이(손실)을 어떠한 식으로 구할지를 정하는 것이 손실함수를 선택하는 것이다. 그렇기 때문에 손실함수를 적절하게 선택하는 것은 매우 중요해 보인다.
흔히 정보이론에서 두 확률분포의 차이를 계산할때 크로스엔트로피라는 것을 사용한다고 한다.
input X가 있을때 output이 Y가 될 레이블 확률은 P(Y|X)이라 하고, 그리고 특정 파라미터 Θ를 통해 모델이 예측한 확률을 P(Y|X;Θ)라고 하면
우리는 P(Y|X) 와 P(Y|X;Θ) 확률분포에 대한 차이를 크로스 엔트로피값으로 구하여 그 값이 최소화 되는 방향으로 학습을 진행을 하게 될 것이다. 크로스 엔트로피 공식은 아래와 같다.
따라서 우리가 최소화 해야할 값은 아래와 같다.
음의 로그 우도를 손실함수로 사용하면 장점은 확률분포의 종류와 상관없이, 모든 확률분포에 적용할 수 있는 손실함수라는 것이다. 이진분류를 하기 위해 베르누이분포를 사용해서 출력 node를 sigmoid로 두는 모델 , 다중 분류를 하기 위해 다항분포를 사용하여 출력 node를 softmax로 두는 모델 모두 손실함수는 음의 로그 우도(cross-entropy)를 사용해도 좋다는 것이다.
Text Classification
nlp에서 많이 해결하는 문제 분야 중 하나는 Text Classification 이다.
Text Classification의 문제를 정의하면 input은 문장,문서이고 output은 input의 category이다.
예를 들면 기사를 보고 정치,스포츠,연예 등등의 기사 분류를 해주거나, 댓글의 긍부정 평가, 스팸메일인지 아닌지를 구분해주는 작업이 Text Classification이라고 할 수 있다.
sentence를 representation 하는 방법을 먼저 생각 해보아야 한다.
1. 문장을 토큰 단위로 쪼갠다(이때 토큰 단위는 어절 단위일수도, 형태소 단위일수도 있다)
2. 쪼갠 토큰을 one-hot-encoding 한다( 표현하려는 토큰의 인덱스만 1 나머지 인덱스는 0 으로 만든 벡터)
물론 vocab dictionary 같은 곳에 토큰들을 정수 인덱스로 보관해두어도 되지만 굳이 one-hot-encoding을 하는 이유는 3에서 각각의 토큰들에 대한 weight matrix를 만들게 되는데 이때 각 토큰의 weight를 뽑아 올때(lookup)는 one-hot-encoding이 되어 있다면 단순한 곱셈으로 해당 토큰의 weight vector를 weight matrix로부터 뽑아올 수 있기 때문이다.
3. 각 토큰에 대한 weight vector들을 matrix 형태로 만든다
이 matrix의 행의 개수는 토큰의 총 개수가 될 것이고 열의 개수는 text classification에서는 category의 개수가 된다
위의 3단계를 거치면 각 토큰이 임베딩되었다고 한다.
이렇게 토큰의 단위에서 임베딩을 하게 되면 모델에게 size(토큰의 총개수)가 일정한 input을 계속 공급할 수 있게 된다.
토큰들의 뭉치를 학습시킬때 input으로 사용해야 한다면 각 토큰들의 one-hot-encoding을 concenetate해서 각 토큰들의 weight를 look up 할 수 있는 것이다. 물론 one-hot-encoding은 0인 성분들이 많아서 효율적이지는 않다. 따라서 케라스에서는 사용자가 토큰들을 dictionary로 만들면 integer index를 넘기기만 하면 lookup을 할 수 있는 embedding layer를 제공하고 있다.
https://www.tensorflow.org/tutorials/text/word_embeddings
지금까지 서술한 내용을 실습해보기에 좋은 코랩 튜토리얼이다
이렇게 토큰을 임베딩 했다면 sentence representation을 생각해보아야 하는데 그 방법에는 대표적으로 CBoW, RN, CNN, Self-Attention, RNN 이 있다.
Language Modeling
문장을 input으로 받아서 그 input 문장이 얼마나 자연스러운지 probabillity(score) 를 output으로 주는 모델이다
정의만 보면 비지도학습처럼 보이지만 순서가 있는 지도학습으로 문제를 바꾸어서 해결할 수 있다.
'자연어처리' 카테고리의 다른 글
자연어처리(5) - Word2Vec (0) | 2020.02.19 |
---|---|
자연어처리 스터디(4)- neural language model (0) | 2020.02.05 |
자연어처리 스터디 기록(2)-임베딩의 의미 (0) | 2020.01.27 |
자연어처리 스터디 기록(1)-임베딩 (0) | 2020.01.23 |