본문 바로가기

머신러닝/[딥러닝을 이용한 자연어 처리]

Long Term Dependency

학습목표

Neural N-gram Language Model이 해결하지 못한 장기의존성 문제를 해결해봅니다.

핵심키워드

  • Neural N-gram Language Model
  • 데이터 희소성(Data Sparsity)
  • 장기의존성(Long-Term Dependency)
  • Convolution Language Model
  • Recurrent Language Model
  • Recurrent Memory Networks

학습하기

 앞에서 Neural N-gram Language Model을 봤는데, 이게 데이터 희소성 문제는 연속 공간으로 임베딩시켜서 해결했지만, 아직 장기의존성문제는 해결을 못했습니다. 기존 N-gram이 왜 해결을 못했었는지에 대해 다시 생각해보면, 딱 N개의 토큰만 보기때문이죠. 그래서 N의 크기를 높이면 장기의존성은 해결되는데, 데이터 희소성 문제는 커지고. 그런데 Neural N-gram의 경우, 데이터 희소성 문제가 이미 사라졌어요. 그러니까 N을 막 늘리면 장기의존성이 해결될거에요. 그런데 문제가 또있죠. N을 막 키우게되면 모델 자체가 굉장히 커진다는 말인데, 이 말은 모델의 Param 개수가 증가한다는 말이고, 이렇게되면 그에 비례해 데이터셋도 커져야합니다. 당연한거죠. Estimate해야하는 Param수가 커졌으니 샘플이 많아야하는 것. 그런데 우리의 데이터셋은 한계가 있습니다. 그럼 이제 어떻게 할까요.

 첫번째로 Conv Language Model을 생각해볼 수 있습니다. Conv는 어떤 토큰을 기준으로 양쪽에 있는 토큰들을 쳐다보고, 또 한층 더 쌓으면 더 멀리 떨어진 토큰들을 쳐다보고 하는 역활을 할 수 있었죠. 그런 Conv 중 우리는 Dilated conv를 활용할겁니다. 더 빨리, 더 많이 보기 위해서. 그런데, 이렇게 하고나니 여태 봤던 N-gram과는 뭔가가 다릅니다. 기존 방법론들은 결국 N번째 토큰을 스코어링 하기위해, 1번째부터 N-1번째 토큰을 봤는데, Conv를 활용한 지금은 N번째 토큰을 스코어링 하기위해 이전에 토큰만 보는게 아니라 자기 자신과 미래의 토큰들까지도 보고 있거든요. 이를 해결하기 위해서, 미래의 단어들에 대해서는 마스크 아웃을 시행합니다. 이게 발전되서 ByteNet, PixelCNN, WaveNet 등이 나왔습니다. 특히 WaveNet은 구글 어시스턴트에도 적용되어있는데, Speech generating의 수준이 정말 놀랍습니다. 

 쨋든 이렇게 만들어진 스코어링 모델들은 결국 문장을 Generating하는 모델로 연결될 수 있습니다. <BOS>, Beginning of Sentence라는 스페셜 토큰과 함께 첫 단어가 들어오면, 다음에 올 수 있는 단어들 중 가장 확률이 높은 단어를 추출하고, 전체 단어들을 이용해 또 다음 단어를 추출하고 반복하다가 <EOS>, End of Sentence가 들어오면 예측을 종료하는. 굉장히 당연하죠. 쨋든 우리는 이제 N사이즈를 늘리는 효과, 그러니까 컨텍스트를 늘리는 방법에 대해서 알아봐야합니다.

 CBoW는 토큰의 순서는 무시하고, 그냥 토큰들이 막 섞여있다고 생각하고, Token representation을 뽑아낸 다음 Average를 취했었죠. 같은 아이디어를 쓰되, 다만 매번 다음 토큰을 예측하기전, 이전의 토큰들에 대한 Representation을 사용하게되겠죠. 다만, 이 CBoW가 Text classification에서는 굉장히 효과적인데, 이 순서가 중요한 Language model에서는 성능이 그렇게 좋지않습니다. 문장 분류는 대개 의미에 중점을 두는 건데요. 이게 문장이냐 스포츠냐 긍정이냐 부정이냐. 그런데 Language model에서는 의미뿐아니라 구조자체가 중요하다보니까, 순서가 무시하는 이런 Sentence representation은 적합하지 않은거죠. 다만, Token representation은 잘 찾아준다. Word embedding 자체는 굉장히 좋은거에요. 스코어링에는 별로지만.

 실제 Language model에서 잘 쓰이는건 Recurrent model이죠.  N-gram은 장기의존성이 문제니까, 컨텍스트를 늘려야하니까, Recurrent Net이 좋겠다 라는 생각으로 나온건데요. 다만 여기선 미래의 토큰들을 사용할 수는 없으니까 Bidirection은 쓰지않고 one-direction model을 사용해야겠죠. 현재는 이게 가장 쓰이는 모델입니다. Speech recognition, Keyboard auto-complete 등에서 잘 쓰이죠. 

 이제 Attention에 대해 봐야하는데, Recurrent Net의 문제가 문장이 길어지면 길어질수록 문장을 축약하는게 힘들어진다는거죠. 생각해보죠. RNN은 시퀀스 데이터가 주욱 들어오면 이걸 벡터 하나로 뭉쳐요. 만약 앞에 나왔던 컨텍스트 토큰들이 적으면 이 압축이 별게없지만, 토큰이 많으면 많아질수록, 얘가 어려워지겠죠. 기억해야할 내용이 많아지고, 파라미터가 많아지고, 데이터셋이 많이 필요하게되고.. 그런데 Attention 메커니즘은 매 스텝마다 중요한 내용에 밑줄을 긋는거니까, 하나의 벡터로 축약할 이유가 없다는 거죠. 아 그러면, RNN을 돌리고, Attention을 써서, 가장 중요한 친구들을 따로 뽑아서, 다음 토큰을 계산하는데 사용하자. 이렇게 함으로써, RNN이 앞의 모든 토큰들을 벡터 하나로 축약해야할 필요가 없어지는거죠.

 그러니까 n+1번째 토큰에 대한 Representation을 찾을 때, 그전의 RNN 출력 단 하나만 쓰는게 아니라, 앞의 모든 RNN출력물 중에서 중요한, Weight가 높았던 토큰들을 종합해서 n+1번째 토큰에 대한 representation을 구하는거죠. 이걸 Recurrent Memory Net, RMN이라고 부릅니다. 이게 굉장히 잘됬어요. 구글 번역기에도 Recurrent와 Self attention을 같이 결합해 사용하는 모델이 적용되어있습니다. 이상입니다.

'머신러닝 > [딥러닝을 이용한 자연어 처리]' 카테고리의 다른 글

Summary  (0) 2020.04.18
Questions  (0) 2020.04.17
Neural N-Gram Language Model  (0) 2020.04.14
N-Gram Language Models  (0) 2020.04.13
Autoregressive language modeling  (1) 2020.04.12