논문명: CoMPM:Context Modeling with Speaker’s Pre-trained Memory Tracking for Emotion Recognition in Conversation (저자가 한국인이라서 더 반가운 논문이었다. 좋은 논문 감사드립니다.)
https://arxiv.org/abs/2108.11626
3줄 요약
- 대화속에서 감정을 잘 인식하는 게 중요해.
- 근데 지금까지는 외부 데이터(external structed data)를 써서 성능 올렸는데, 이 방법은 영어만 가능하잖아!
- CoMPM 은 pretrained memory 를 써서 성능이 1, 2등을 다퉈. 다른 언어도 쉽게 가능하구.
주장
대화 속에서 감정을 읽어내다
챗봇이나 소셜 미디어 사용의 급증으로, 대화 속에서 감정을 인식하는 건 점점 더 중요해지고 있다. 이미 수많은 연구가 'Emotion Recognition in Conversation' (이하 'ERC') 의 중요성을 뒷받침한다. 맞춤형 알람 메시지, 여론조사, 추천시스템 등 아주 다양한 분야에서 활용도가 높다고 볼 수 있다.
위 데이터셋은 대화마다 감정의 흐름을 파악해놓았다. 한국어로 의역하면, 대충 이런 느낌일 것 같은데 토익 500점의 말을 믿지 말 것.
- A: 그래, 그러니까 이게 내 식탁이었으니까 내가 새 걸로 사는 게 맞다?
- B: 그게 규칙이야.
- A: 뭔 규칙인데? 그딴 규칙은 없어. 만약 있다면, 네가 나한테 식탁을 빚진 거겠지.
- B: 그건 또 어떻게 알았대?
이전 대화들을 반영하려는 시도
나도 위 데이터를 한국어로 번역을 하면서 느낀 것은 위 아래 대화를 살펴보며 이 사람의 말이 어떤 억양과 의도였을지를 파악하게 되었다. 즉, 문맥을 살피면서 해석하는 것이 매우 중요하다고 느꼈다.
최근에 그런 시도를 모델에도 적용해왔다고 한다.
- DialogueRNN: 이전 발화들(previous utterances)과 화자의 감정(Speaker's emotion)을 추적하며 인식함.
- AGHMN: 이전 발화들을 'GRU with Attention' 으로 memory 에 요약해서 활용함.
Pretrained Language Model
최근, 외부 지식(external knowledge)을 활용하는 시도도 많아졌다. 하지만 그건 영어에서만 가능하다. 다른 언어에서도 같은 방법을 쓰려면, 비용(시간, 돈, 노력)이 많이 든다.
한편, 자연어 처리 분야에선 'Pretrained Language Model' 이 대세다. 효율성이 탁월해서 이미 전세계적으로 각자의 언어로 활용되고 있다. 게다가, Pretrained Model 을 기반 지식(knowledge bases)으로 활용하면 이점이 많다는 연구들이 존재한다.
이 점에 의거하여, 'structured external data' 에 더 이상 의존하지 않고 그 대신 'Pretrained Language Model' 에서 'feature' 를 추출하고자 하는 방향을 저자는 제시한다.
CoMPM
2가지 요소로 이뤄져 있다고 한다. 'CoM' 과 'PM' 으로 나눠졌다고 한다.
ㄱ. CoM
- 지난 대화들을 하나의 문맥으로 보고, 임베딩하는 모듈
- 과거 발화들과 현재 발화 사이에 attention 을 두고, 현재 감정 상태를 auto-regressive 한다.
ㄴ. PM
- pretrained memory module 로, 발화로부터 memory 를 꺼낸다.
- 발화들을 PM 에 넣어서 나온 임베딩 결과를 활용한다.
- 화자의 언어적 선호도와 성격을 활용하여 예측을 돕는다.
솔직히 PM 이 어떤 역할을 했을지에 대해 의문이다. 정말로 화자의 언어적 선호도와 성격을 반영하는 게 가능한가? 그걸 PM 으로 할 수 있다고? 이건, 실험을 어떻게 진행했는지를 봐야 할 것 같다.
실험
문제 정의
- u: 발화
- p: 화자 (p는 같은 사람일 수도 있고, 다른 사람일 수도 있다.)
- 최소 화자가 2명 이상이다.
모델 구조
이렇게만 보면, 어지러우니 분리해서 볼 것이다. 다만 그 전에 현재 그림이 무슨 상황인지는 알고 보자.
- 화자 A 의 감정을 추측하려고 하는 상황
- 화자 A 가 6번째로 발화를 하려고 한다.
- 화자 A 는 1번째, 3번째, 6번째 발화를 했다.
- 화자 B 는 2번째, 5번째 발화를, 화자 C 는 4번째 발화를 했다.
- 현재까지 화자는 총 3명(A, B, C)이다.
ㄱ. CoM
- 여태까지 모든 대화(화자 정보 포함)를 CoM 을 거쳐서 임베딩을 했다.
- 이게 위에서 말했던, 문맥(context)을 반영하는 방법이다.
- 입력 부분을 보면, 'SA' 와 같이 화자를 표현하는 토큰은 speical token 으로, 같은 화자면 같은 토큰을 넣어줬다고 한다.
- 모델은 Transformer Encoder 와 RoBERTa 를 사용했다고 한다.
- 감정을 예측할 땐, <CLS> 토큰을 활용했다고 한다.
최종적으로 CoM 을 통과하고 나면, Ct 라고 표현할 수 있겠다.
ㄴ. PM
- 이전에 말한 적이 없다면, 'zero-vector' 가 입력으로 들어간다.
- 이전에 말했던 발화마다 PM 을 통과한다.
- 감정 분류에 대부분 <CLS> 토큰이 쓰이니, 여기서도 결과 중 <CLS> 토큰만 쓰겠다고 한다.
최종적으로 Ki 는 PM 의 임베딩 중 <CLS> 토큰에만 해당된다.
ㄷ. Tracking Method
이제 이전에 말했던 발화들을 각각 PM 을 통과시켜 <CLS> 토큰을 구했다. 이 토큰을 가지고, 'GRU with Attention' 을 진행해보려고 한다. 개인적으로 그림이 헷갈려서, GRU 도 각각 통과시키는 건가 싶었는데 함께 통과시킨다.
- 각 발화의 <CLS> 토큰을 GRU 에 통과시킨다.
- 현재 발화로부터 가까울수록, 현재 감정 상태와 밀접한 연관이 있다고 본다.
- 그래서 Undirectional GRU 를 사용했다. layer 의 개수는 2개다.
- t: 현재 발화가 몇번째 turn 인가?
- n: 현재 화자가 지난 대화에서 몇번이나 발화를 진행했는가?
- i: 발화가 몇번째 발화인가?
예컨대, 화자 A 가 현재 6번째 발화이니 t = 6 이다. 그리고 1번째, 3번째 발화를 했던 적이 있으니 n = 2 이다. 그렇다면 k11, k32 이렇게 2개가 있다고 볼 수 있다.
ㄹ. Combination of CoM & PM
이제 결과물을 합친다. 이때 아래 공식처럼 합친다.
주의할 점은 CoM 과 PM 이 서로 다른 모델을 썼을 경우에만, Wp Matrix 를 사용한다는 것이다.
ㅁ. Emotion Prediction
최종적으로 이제 Softmax 를 취해서 분류하면 끝이다. CrossEntropy Loss 를 사용해서 학습했다고 한다.
데이터셋
ㄱ. IEMOCAP
- 화자는 10명, 대화마다 2명이다.
- 총 6개로 구분했다: happy, sad, angry, excited, frustrated and neutral
- 9:1 로 나눴고, 무작위로 나눴는데 train/dev 에는 8명, test 에는 2명이 담겨져 있다.
ㄴ. DailyDialog
- 2명의 일상 대화
- 총 7개로 구분했다: anger, disgust, fear, joy, surprise, sadness and neutral
- 82%가 넘는 대화가 'neutral' 이다. 그래서 이전 연구들도 그랬듯이 성능 측정시, 제외한다.
ㄷ. MELD
- Friends TV show 기반 데이터
- 총 7개로 구분했다: anger, disgust, sadness, joy, surprise, fear and neutrality
- sentimental class 도 3개로 제공한다: positive, negative and neutral
(emotion 과 sentiment 의 차이를 여기서 알게 되었다. emotion 은 위와 같이 분류하는 반면, sentiment 는 부정, 긍정, 중립 3가지로 나눈다.)
ㄹ. EmoryNLP
- MELD 와 같이 Friends TV show 기반 데이터
- 하지만 나누는 기준이 다르다. 총 7개다: joyful, peaceful, powerful, scared, mad, sad and neutral
- sentimental class 를 따로 제공하진 않으나, 위의 감정 분류를 통해 대강 할 수 있다. 예컨대, 긍정(joyful, peaceful, powerful), 부정(scared, mad, sad), 중립(neutral)으로 말이다.
Baselines
(길다. 넘어가도 좋다. 논문이 다른 모델에 대해서도 친절히 설명해준다. 최신 논문인데도 불구하고 이 분야에 대한 정리가 잘 되어 있다. 더 채울 부분이 없었을 수도 있고, 한국인이라 자세히 해준 것일지도?)
ㄱ. KET: Knowledge Enriched Transformer
- 과거 대화 반영: reflects contextual utterances with a hierarchical self-attention
- 외부 지식 사용: leverages external commonsense knowledge by using a context aware affective graph attention mechanism.
ㄴ. DialogueRNN
- 개인 감정 상태 추적: uses a GRUnetwork to keep track of the individual party states
- 3가지 요소가 중요하다고 가정함: 화자, 이전 대화로부터의 문맥, 감정 상태
ㄷ. RoBERTa+DialogueRNN
- 위 방법에 pretrained RoBERTa 더했음.
ㄹ. RGAT+P: relational graph attention networks
- relation graph 개념을 가져왔다고 하는데, 이 모델은 자세히 보지 않으면 모르겠음.
ㅁ. HiTrans
- 문맥과 화자에 민감한 모델 제시
- BERT 를 low level transformer 로 써서, 임베딩을 한다.
- high level 에 있는 다른 Transformer 에 feed 한다.
ㅂ. COSMIC
- 다양한 정보(Commonsense)를 활용: incorporates different elements of commonsense such as mental states, events and causal relations
- pre-trained RoBERTa 로 특징을 추출하고,
- COMET trained with ATOMIC(상식 데이터) 으로 상식을 최대한 활용한다.
ㅅ. ERMC-DisGCN
- 아예 모르겠음. 따로 찾아보자.
ㅇ. Psychological
- 상식을 Edge 로 사용하여 Graph Transformer 를 활용함.
- 미래의 문맥까지 함께 활용하여 예측함. (미래를 직접 예측하는 것이겠지?)
ㅈ. DialogueCRN
- 상황별, 화자별로 정보를 이해 및 추론한다.
ㅊ. ToDKAT
- Topic Detection 과 Commonsense 를 함께 활용함.
성능 비교
- CoMPM: CoM, PM 모두 학습에 참여했다.
- CoM or PM: 단독으로 쓰였다는 의미다.
- CoMPM(f): PM 파라미터는 학습하지 않았다(Frozen).
- CoMPM(s): PM은 처음부터(from Scratch) 학습했다.
- CoMPM(k): PM은 ConceptNet 으로부터 학습했다. 이 사이트에서 했다고 하는데, 잘 모르겠다.
얻을 수 있는 결론
- CoMPM(f) vs CoMPM(s): Frozen 한 게 전반적으로 성능이 높다. Radomly Intialized 한 건 성능을 저하시킨다. 즉, Pretrained Parameter 를 사용하는 것이 성능에 도움이 된다.
- CoMPM(s) vs Others: 다른 모델과 비교해봐도 Scratch의 성능이 낮다. 심지어 CoM 단독 성능에도 대부분 밀리고 있다. 단순히 모델의 크기가 큰 게 도움이 된 게 아니라, Pretrained Parameter 가 도움이 되었다는 실험적 결과다.
- CoMPM(f) vs CoMPM: 성능이 유사하다. 즉, Pretrained Parameter 자체로도 이미 많은 도움이 되고 있다는 말이다.
- CoMPM(k) vs CoMPM: ConceptNet 으로 학습을 하는 건 성능이 조금씩 다 떨어졌다.
결론적으로, 가장 성능이 좋았던 모델은 CoMPM(f), CoMPM 이다. 둘 다 Pretrained Memory 를 활용한 모델이다. 외부 지식 없이 1,2등의 성적을 거두었다.
사전학습모델의 영향
- 이때, PM Parameter 는 Frozen 한 채로 실험을 진행했다.
- 괄호안의 숫자는 RoBERTa + RoBERTa 의 성능을 기준으로 나타낸 차이다. 예컨대, +1.07 이면 RR 보다 성능이 약 1% 더 높다는 뜻이다.
- RR 이 RB 나 RG 보다 대체로 성능이 높은 이유로, RoBERTa 가 GPT 나 BERT 보다 pretrained memory 로서 충분한 representation 을 갖고 있기 때문이라고 한다.
- DailyDialog 는 학습 데이터가 많아서 PM 에 상관없이 W matrix 가 잘 학습해서 성능이 높은 것 같다고 말한다.
- 하지만 PM 으로 뭘 쓰든, CoM 단독보다 성능이 높은 걸 볼 수 있으니 Pretrained Memory 의 힘을 다시 강조한다.
- 한편 BR 은 CoM 단독보다 성능이 낮을 때가 있을 정도로 성능이 좋지 않다. 그 이유로 저자는, CoM 이 PM 보다 성능에 많은 영향을 끼치는 중요한 요소라는 걸 알 수 있다. (실제 구조상으로도 그래 보였다.) 그러므로, 어떻게 지식을 추출해야 할지보다 문맥을 잘 녹여낼 수 있을지가 관건이라고 한다.
학습량을 줄여본다면?
- 외부 지식을 없애서 언어의 한계를 어느 정도 해소하긴 했으나, 애초에 타 언어로 된 감성 인식 데이터가 잘 없다. 그런 데이터를 제작하는 것도 힘들다. 그래서 학습 데이터의 양을 줄여보면서, 성능이 어떻게 되는지 지켜보았다.
- MELD 는 60%, 80%까지 줄여도 성능이 각각 3% 정도밖에 하락하지 않는다.
- 개수가 적을 때는 CoMPM(f) 가 2개 데이터에서 더 성능이 좋은 걸 확인할 수 있다. 즉, 현실에서 데이터가 충분하다면 CoMPM 을 쓰고, 불충분하다면 Frozen 을 사용하는 게 좋다.
한국어 데이터에서 해봤지만, 공개는 안할거야
: 한국어 데이터를 직접 만들었고, 성능도 측정해봤는데 공개하지 않았다. 그래서 실험 결과만 첨부하고 넘어가도 될 것 같다.
확실히 한국인이 쓴 논문이라, 영어마저도 술술 읽혔다. 성능을 실제로 돌려보면서 확인해보고 싶다. 코드도 제공되어 있으니, 궁금한 사람들은 Github 에 방문해보자.
https://github.com/rungjoo/CoMPM