작성자 : 건국대학교 응용통계학과 정재윤
컴퓨터가 자연어를 이해하기 위해 필요한 과정인 parsing은 이미 이전의 강의에서 여러번 다뤘으니 깊게 설명하지는 않겠습니다. 위의 이미지는 parsing의 종류에 대해서 직관적으로 이해할 수 있게 cs224n에서 제공하는 이미지입니다. 왼쪽이 Bag of word를 표현하는 것입니다. 오른쪽은 언어학자들이 표현하는 parsing 방식으로 오늘 다룰 내용입니다.
본격적으로 설명하기에 앞서 Compositionality의 의미에 대해서 먼저 알아보겠습니다. 사전적인 뜻으로는 '구성'을 의미합니다. 그림과 같이 작은 부품들이 모여서 하나의 새로운 것을 만든다는 것을 내포하는 단어인거죠. 이는 언어적인 측면에서도 보입니다. 즉, 여러 개의 단어들을 이용하여 하나의 문장 혹은 새로운 단어로 표현 가능하게 됩니다. 반대로 생각한다면 컴퓨터는 모르는 단어를 자신이 아는 단어로 표현하여 읽어낼 수 있다로 볼 수 있습니다.
대표적인 예시가 위의 그림인데요. snowboarder와 A person on a snowboard는 같은 의미임에도 불구하고 후자는 여러개의 단어들을 사용해서 하나의 단어로 표현한 것을 알 수 있습니다.
즉, 언어를 단어의 조각들로 파악하고 이러한 구조를 세워 그 의미를 찾아보자는 것이 이번 강의의 주내용인 것입니다. (사족으로 하나 알아두셨으면 하는 점은 언어가 재귀적으로 가능하냐에 대한 것인데요. 인간의 언어라고 하는 것이 무한할 수 없기에 불가능하다 가능하다로 이야기가 많다고 합니다.)
이제 구체적으로 어떻게 문장을 vector space에 맵핑하는지 알아봅시다. 각 단어들을 Tree RNN에 넣어서 일련의 과정을 통해 문장의 의미를 추출하여 최종 벡터를 구하게 됩니다. 규칙은 그림과 같습니다. 이러한 Tree RNN 구조는 RNN구조보다 의미파악에 있어서 훨씬 유용합니다.
RNN의 경우, Tree RNN과는 달리 단어들을 합친 문장의 의미를 파악하는데에는 한계를 가집니다. RNN은 여러 layer를 거친 뒤, 최종 벡터를 파악하는 데에 중점을 두고 있기 때문이죠. 반면 Tree RNN의 구조는 마지막에 집중하는 것이 아닌 관계에 집중하고 있는 구조입니다.
구체적으로 Tree RNN에 대해서 이야기해보겠습니다. 우선 Tree RNN을 진행하기 위해서는 크게 2가지가 선행되어야 합니다. 첫 째로 단어의 의미를 알고 있어야하고, 둘 째로 단어들이 결합하는 방식에 대해서 알아야 합니다.
단어를 모두 안다는 가정하에 규칙에 대해서 알아봅시다. 우선 두 벡터를 NN에 태워서 (8,3)이라는 부모 벡터와 1.3이라는 score를 구합니다. 여기서 부모 벡터는 c1과 c2를 concat하여 공식과 같은 방식으로 구하게 됩니다. 이 때 중요한 건 어떤 부모 벡터를 구하든 모두 같은 W를 사용한다는 점입니다.
score는 조합할 단어를 선택할 때 반영하는 값입니다. 즉, 단어를 선택하는 기준으로 해당 단어가 얼마나 말이 되는지를 평가합니다.
우선 인접한 단어들의 조합을 통해 부모 벡터와 score를 greedily하게 모두 구합니다. 그리고 score가 높은 단어들로 다음 부모 벡터와 score값을 계산합니다. 이렇게 되면 아래와 같은 그림이 나오게 됩니다.
이 과정을 부모벡터가 가장 위에 하나만 남을 때까지 계속해서 반복하게 됩니다. 즉, 아래의 그림과 같이 나올 때까지 계속 진행하는 것입니다.
이러한 모델의 backpropagation은 일반적인 backpropagation과 크게 차이가 없습니다. 이런 과정을 거치면 simple Tree RNN은 그렇게 성능이 떨어지지는 않지만, 앞서 W가 모든 노드에서 동일하다는 단점을 가집니다. 즉, 언어가 복잡하고 고차 구성이며 긴 문장으로 들어오면 적절하지 못하다는 것이죠. 또한 인풋 단어간 상호작용이 없다는 점과 조합 함수가 모든 경우에 대해서 동일 하기 때문에 다양성이 떨어지게 됩니다.
simple Tree RNN은 이러한 단점을 가지기에 사람들은 더 나은 모델을 고안했습니다. 그 모델이 바로 Syntactically-United RNN이라는 모델입니다. 이전의 simple Tree RNN과 가장 큰 차이점은 모든 조합에서 똑같이 사용되었던 행렬 W를 각기 다르게 설정한다는 점입니다.
그러나 이런 방식으로 진행할 때의 문제는 바로 speed입니다. 아무래도 각 matrix를 찾아야하기에 학습에 시간이 오래걸리게 됩니다. 이에 대한 해결법으로 나온 것이 바로 PCFG방식입니다. PCFG란 한 문장에 k개의 문장 구조를 만들고 적절한 문장 구조를 바탕으로 학습을 진행하는 방식입니다. 즉, 만든 문장 구조를 바탕으로 Tree RNN에 적용하는 방식입니다.
그림과 같이 연산을 진행하는 모델이 바로 MV-RNN이다. MV-RNN에서 중요한 점은 단어에 대한 정보를 단순히 벡터에 국한하지 않았다는 점입니다. 단어의 Matrix를 만들어 정보의 손실을 줄이는 방법을 선택하여 문장의 의미를 더 담을 수 있게 만들었습니다.
과정은 이러합니다. 우선 각 단어의 벡터와 행렬을 준비합니다. 한 단어의 벡터와 다른 단어의 행렬을 연산을 통해 값을 구해줍니다. 그리고 나온 벡터값을 일련의 함수처리를 통해 최종값을 구해줍니다.
RNTN에 대해서 설명하려면 감성분석에 대해서 잠깐 언급해야 합니다. 전통적으로 감성분석은 꾸준히 발전했습니다. 따라서 굳이 새로운 모델을 만들지 않아도 love, great과 같은 단어를 찾아서 의미를 부여하면 꽤나 높은 성능을 갖기 때문입니다. 하지만 아래와 같이 조롱이 섞인 문장의 경우, 그 안의 감성을 잘못 찾았습니다.
이러한 문제는 MV-RNN에서도 계속해서 발견되면서 이를 분석하기 위한 새로운 모델이 필요했습니다. 그래서 제시된 모델이 바로 RNTN입니다.
오른쪽의 그림이 RNTN의 구조입니다. 즉, 핵심은 계속된 행렬의 계산이 아닌 Tensor(3차원)으로 연산을 진행하면서 정보의 양은 동일하면서 파라미터를 줄여 연산 속도를 줄이는 것입니다.
이렇게 만들어진 RNTN은 일반적인 데이터셋에서는 큰 효과를 못 얻었지만 TreeBank에 관한 데이터셋에서는 큰 Accuracy를 얻었습니다.
지금까지 여러 TreeRNN에 대해서 알아봤습니다. 굉장히 좋은 것 같으나 현재 저희들의 인식에서는 조금 생소한 개념이었던 것 같습니다. 그 이유는 현실적으로 TreeRNN을 사용하기 어렵기 때문입니다. 대표적인 이유는 GPU연산이 힘들기 때문입니다. 동일하게 병렬적 연산이 진행되는 것이 아닌 연산의 구조나 Tree모델이 다르다는 점 때문입니다. 또한 데이터 구축이 일반 데이터보다 훨씬 어렵기 때문입니다.
투빅스 14기 한유진
Tree RNN과 이어 발전된 모델들을 잘 설명해주셔서 좋았습니다. 좋은 강의감사합니다!
투빅스 15기 이수민
투빅스 15기 김동현
Structure prediction with simple Tree RNN:
vector space에 word vector를 뿌려놓으면서, 그냥 바로 같은 vector space에 넣습니다. 그럼 recursive한 구조는 tree structure를 구성해주어야 한다는 어려움이 따르고, rnn을 통한 구조는 phrase를 prefix context없이 잡아내지도 못하고, 마지막 결과 vector가 마지막 단어에 좌우된다는 단점이 있습니다.
Syntactically-United RNN:
기본적인 syntactic structure를 위해서는 symbolic Context-Free Grammar (CFG) backbone이 좋았습니다. 그리고 discrete syntactic category를 사용했고, 다른 syntactic environment에서는 다른 composition matrix를 사용하게 해주는 것이 훨씬 좋은 결과를 내었습니다. 그리고 더 좋은 semantic의 결과를 볼 수 있었습니다.
Recursion Neural Tensor Network RNTN:
일반적으로 sentiment analysis는 단어들을 잘 뽑아내는 것으로 잘 동작합니다. 긴 document에 대해서도 detection accuracy는 90% 수준으로 높습니다. 하지만, the movie should have been funnier and more entertaining같은 문장은 negative meaning이지만, funnier, entertaining과 같은 단어들만 본다면 positive하게 분류할 가능성이 있습니다. hard negation과 같은 문장들은 부정확하여 이를 해결하기 위해 더 좋은 모델이 필요했습니다.
attention을 뽑을 때 1 x n, n x n, n x 1의 vector 두개 (주로 단어들의 vector)와 matrix 하나를 중간에 끼워서 쓰는데, 이걸 다르게 생각해서 matrix가 아닌 3-dim tensor를 끼워서 사용합니다. 그래서 많은 정보를 잘 interact해서 잡아내도록 합니다.
투빅스 15기 조효원
투빅스 15기 조준혁
투빅스 14기 이정은
처음 접해보는 Tree RNN에 대해 알 수 있던 강의였습니다. 감사합니다! : )
투빅스 14기 강재영