NLP에 있어서 전처리 과정들에 대해서 배웠다. 모델이 바로 단어들을 받아들일수가 없기 때문에 이 단어들을 숫자화를 시켜줘야 하는데 그러한 방법중에 bag of words, word embedding이 있다. bag of words를 쓰게되면 각 단어를 표현하는데 차원의 수가 너무 커지게 된다. 왜냐하면 단어를 원핫 인코딩하여서 사용하게 되는데 이럴때에 차원의 크기는 사전의 크기와 동일해지기 때문이다.
이를 해결하는것이 word embedding 이다. 이것을 통해서 각 단어를 특정 차원으로 축소하여 사용할수 있다. 여기서 pretrained word embedding이 있는데, 각 단어의 뜻에 따라서 미리 벡터차원 내에서 학습된것이다. 대표적으로 word2vec과 glove가 있다. glove는 단어의 뜻을 유추할때 좀더 광범위한 범위에서 유추한 것이다.
기본적인 RNN구조는 이미 dl basics에서 배웠다. 여기서는 거기에 더해서 좀더 세부적인 작동을 다루었다. 기본적인 rnn의 경우 back propagation시에 gradient exploding, gradient vanishing등이 발생한다. 그래서 exploding을 방지하고자 하퍼볼릭 탄젠트 활성화 함수를 쓰고, gradient vanishing을 막고자 truncated bptt등을 사용한다.
거기서도 성능이 잘나오지 않아서 나온게 LSTM으로써 이것을 사용하면 좀더 gradient vanishing 문제에 잘 대응할수 있게된다. 여기에 연산비용을 줄인것이 GRU이다.
기본적인 seq2seq구조라 함은 many to many 구조인데 인코더 부분과 디코더 부분이 나눠져서 있는 모델이다. 보통 기계번역에 많이 사용한다.
이런 모델이 있을때에 인코더 부분에서 디코더 부분으로 정보가 하나의 백터를통해서 넘겨지게 된다. 그럴때에 정보의 병목현상이 발생함으로써 충분한 정보를 인코더에서 디코더로 보내지 못하게 된다. 그래서 제안된것이 attention이다.
attention을 사용함으로써 디코더 부분에서 각각의 히든스테이트들이 인코더 내에서 필요한 특정 히든스테이트들을 선별적으로 골라서 사용을 할수 있게 된다. 이런 선별적으로 고르는 과정은 코사인 유사도를 통하게 된다. 즉 점곱을 통해서 모든 인코더의 히든스테이트들에 대해서 로짓 값을 구하게 된다. 그후 소프트맥스를 통과하며 모든 인코더의 히든스테이트들에 대한 확률분포를 구한다. 그리고 그 각각의 히든스테이트들의 확률값과 각각의 히든스테이트 벡터들을 곱하여 최종 어텐션 스코어를 구한다.
이렇게 구한 어텐션 값을 디코더에 있던 히든스테이트 값과 더해져서 최종 값이 출력되게 된다.
Beam Search란 디코더에서 문장 생성시에 greedy generation을 택하는데에 대한 문제점에 대한 해결로서 나온 방법론이다. greedy한 방법 채택시에 각각의 단어가 생성시에 해당 위치에서 가장 확률이 높은 단어로 확정되게 된다. 만약 그랬을시에 중간에 한번이라도 잘못된 단어가 나오게 되면 최종적으로 매우 잘못된 결과가 나오게 된다.
그렇기 때문에 이를 해결하기 위해서 exhaustive search가 사용될수 있으나, 이것은 너무 많은 연산비용이 들기 때문에 실용적이지 않다. 왜냐하면 모든 단어에대한 모든 시나리오를 고려해야 하기 때문이다.
이에대한 타협점으로 나온것이 Beam Search인데 이는 k개 가장 높은 가능성에 대해서만 탐색을 하는 방식이다.
이럴경우 언제 decoding이 끝나게 되는지 의문을 가질수 있다. 그래서 나온 방법 2가지가 특정 후보의 수가 완성되면 끝나는 경우가 있고, 아니면 특정 타임스텝이 경과한 후에 끝내는 방법이 있다.
BLEU score는 생성된 문장에대한 정확도를 평가하는 척도이다. 기존에 사용되던 accuracy나 recall을 n-gram형태에 대입해서 사용시에 제대로된 문장에대한 정확도평가를 하기가 힘들었기에 그것에대한 대안적 방법으로 나온것이 BLEU score이다. 일단 1~4까지의 n-gram에대해 accuracy 값을 매기고 거기에 대해서 기하 평균을 취한다. 그 후에 brevity penality라고 하여서 출력문장의 길이에따른 패널티를 먹이게 한다.
팀원들과 돌아가면서 본인이 맡은 강의에 대해서 발표하였다. 발표하며 질문을 통해서 강의 내용이외의 것들에 대해서도 생각을 해볼수 있었다. 또한 앞으로 어떤식으로 같이 공부를 할지에 대해서도 토의하였고, 결과적으로 각자 NLP관련 하나의 논문을 정해서 읽은후에 발표를 하기로 하였다.
이외에도 필수과제에, 실습코드등에 대해서도 서로간에 논의하며 모르는부분을 배울수있었다.
필수과제의 경우 처음것을 생각보다 쉬웠으나, 그후 2,3 과제에 있어서는 시간이 상당량 소모되었다. 단순코드의 에러도 있었지만, 그 순서와 어떤식으로 동작하는지에 대한 이해하기가 상당히 힘들었다. 그래도 나중에 오피스아워에서 설명을 듣고나니 어느정도 이해가 되긴 하였다. 그러나 나중에 필수과제 정답을보고서 다시한번 공부해야할 필요성을 느낀다.
이번주는 오직 NLP강의만 공부한것같은 느낌이다. 와중에 필수과제, 실습, 시각화등의 강의및 과제가 있었지만, 나는 오직 NLP이론에 집중한것 같다.
왜인지는 모르겠으나 처음에 1~3강정도는 무슨말일지 잘 모르고 대충 지나갔지만, 어텐션 부분에서부터 집중하고 들었다. 아마도 그전부터 어텐션이 중요하다는말을 여러군데서 들어서 그런것 같다.
강의를보고, 거기에대한 참고자료만 보더라도 하루의 대부분의 시간이 소요되어서 다른부분은 제대로 공부할틈이 없었다. 특히 코드는 거의보지 못했기 때문에 약간 걱정이된다.
그러나 그나마 마지막 3개의 강의는 어느정도 이해를 했기 때문에 많은 소득을 올렸다고 생각한다. 실은 지금까지 이론강의에서 제대로 이해하고 지나간 강의가 그렇게 많지가 않았다. DL수학부터 시작해서, DL basic, pytorch강의등은 정말 한번 강의보는 식으로만 지나갔지만 처음으로 NLP에서 이해하며 들었다.
그렇게 이해가 되고나니까 이제 NLP에 많은 흥미가 생겼다. 처음에는 NLP선택시에 큰 이유없이 NLP가 나중에 혼자 프로젝트 하더라도 데이터 구하는게 좀더 용이할것 같다는 막연한 이유였지만, 이제는 그렇지가 않게되었다.
앞으로쭉 NLP를 공부하게 될텐데 계속 이런식으로 이해하며 지나가야겠다.