본문 바로가기

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

Questions

질문

1. 단어 임베딩에서 다의어(Polysemy)문제는 어떻게 해결하나요?

 자, Polysemy problem, 사실 뭐 단어가 단 하나의 뜻만을 가지지는 않죠. 대부분 여러가지의 뜻이 있고, 그러면 우리는 이걸 어떻게 해결하냐. 사실 Context를 보면 되는 거죠. (이는 즉 다의어와 다른 토큰간의 관계 정보를 잃지 않으면 된다는 말같습니다.) 2가지를 생각해봐야합니다. Token representation으로 돌아가서, 우리는 각각의 Token들을 벡터로 만들었단 말이에요. 이게 굉장히 High dimentional합니다. 그 뜻은 뭐냐. 그 단어들, 그 단어들간의 관계가 굉장히 여러 가지가 될 수 있다는 거죠. 그러니까 한 토큰의 이웃들이 엄청나게 많아질 수 있다는 겁니다. 그러다 보니까, 의미가 서로 다른 것들이 있어도, 서로 다른 의미에 대한 이웃들을 다 임베딩할 수가 있는겁니다. 정보를 보존할 수 있다는 거에요. (뭐 '쓰다' 라는 단어가 있으면 뜻이 좀 많죠? 뭘 물건을 쓰다, 모자를 쓰다, 맛이 쓰다, 글을 쓰다... 만약 이게 쓰다라는 단어가 2 dim vector로 representation이 되었으면 이런 모든 Context를 고려하는게 불가능하지는 않는데 힘들어지죠. 같은 radius안에 들어가는 neighbor들의 수를 비교해보자구요. low dimentional일 때보다, 당연히 high dimentional일 때, 들어오는 neighbor들이 더 많습니다. 그러니까 다양한 Context 아래의 정보를 잃지 않을 수 있는 거죠.) 이제 문제는, 그런 다양한 임베딩 중에서 무엇을 고르느냐-가 문제가 될텐데, 이건 Sentence representation에 들어가게됩니다. 예를 들어서, CNN을 생각해보면, 어떤 Token의 representation을 뽑기 위해서, 그 Token의 앞과 뒤에 있는 Token의 representation을 보는거죠. 그러니까 Sentence representation을 뽑아내는 과정 자체가, Token representation들을 어떻게 합치느냐가 되는거고, 합칠 때, Context, 그러니까 주위 단어에 어떤 영향을 받느냐. 를 이미 고려합니다. 

2. 훈련 데이터에 없는 새로운 단어는 어떻게 표현이 되나요?

 이 질문에 답을 하기 위해서는, 어떤 레벨에서 Token을 정의했냐 를 생각해야합니다. 만약에 뭐 Char-level로 Token을 나눴다면, 모델이 Generalizing할 수도 있구요. 그에 비해서 단어나 Morph level이라면 아예 새로운 단어가 생기게 되는 거겠죠. 이런 경우에는 가장 단순하게, 새로운 단어들을 포함하는 데이터를 Fine tunning을 할 수도 있고, 아니면 새로운 단어가 들어왔을 때, 그 단어를 기존에 존재하는 임베딩을 이용해 새로 만들어주는 방식을 취할 수 도 있죠. 

3. 분류 모델 훈련 완료 후, 새로운 클래스가 등장했을 때 어떻게 해결하나요?

 자 질문이 이거죠. Hierarchical lstm을 통해 분류 모델을 완성해놨는데, 새로운 분류 클래스가 등장했다. 이걸 처음부터 re-generation하는 게 불편한데, 이걸 자동으로 add하는 구조를 갖는게 가능한가. 그렇죠 뭐 자연어가 아니더라도, 사실 분류 클래스가 추가되는 경우는 많죠. 여러가지 방식이 있습니다. 첫번째는 뭐 당연한거. 새로 추가된 클래스에 맞는 데이터 다시 모아서 새로 훈련시키는 방식. 두번째는 사실 첫번째처럼 새로운 클래스에 대한 데이터를 찾는게 힘드니까, 추가된 클래스의 예제를 조금 모아서 기존 모델의 노드들의 웨이트값은 고정시키고, 새로 추가된 Estimator(Node)들만 훈련되도록 한다가 가능하겠죠. 이 경우에 드는 생각은, 이렇게 따로 훈련된 Node들이 기존의 Node들과 균형을 가질 수 있을까 뭐 이런건데, 조금 복잡한 문제가 됩니다. 다음 시간에 더 자세히 설명드리도록 하겠습니다.

4. 임베딩에서 '가깝다'는 벡터 공간에서 코사인 유사도를 말하는 건가요? 아니면 다른 Distance metrics를 정의해서 사용하나요?

 이건 사실, 같은 CBoW를 쓰더라도 거기서 Merging을 할 때 벡터들을 Normalization했는지, 어떤 Merging을 사용했는지, NN에서는 어떻게 합치는지, 어떤 목적인지에 따라서 다 다른게 맞습니다. 그런데 이걸 다 파악하고 어떤게 최고고 이게 정리된 것도 없고, 알기도 힘들어요 그런데 뭐 대충 해보니까 코사인 유사도가 가장 괜찮아서, 코사인 유사도를 주로 사용합니다.

5. Capsule network로 텍스트 분류 문제를 사용하는건 어떤가요?

 간단히, Capsule network의 이념자체가 이런 텍스트 처리에는 별로 맞지 않습니다. 또 아직 안정적인 알고리즘도 아니구요. 결론은, 부정적입니다.

6. Attention 모델에서 전체 문장을 보지 않고 고정된 윈도우 사이즈를 정해서 하면 어떤가요?

 이것도 내일 얘기할 것 중 하나였는데, 간단하게만 미리 말하자면, 이런 문제는 보통 char-level로 데이터를 다룰 때 많이 일어나죠. 다룰 데이터가 많아지니까 전체 문장을 보면 잠재력은 올라가겠지만 연산이 과도해지고, 그렇다고 너무 작은 윈도우를 쓰면 연산은 적어지겠지만, 잠재력은 낮아질 것이고. 좋은 trade off를 찾아야하는데, 간단하지가 않습니다.

7. Self attention은 어떻게 최적화 되나요?

 최적화 자체는 기존 다른 NN들과 다를 바가 없겠죠. 다만 이것들은 Back-propagation과 Gradient descent가 기본 개념인데, 이걸 자세히 살펴보면, 먼저 계산된 Loss를 보고 그 Loss를 만든 Node를 하단 레이어부터 상단 레이어까지 스윽 훑어보면서, 이 Node는 Positive한 Contribute를 했으면 Weight를 올리고, Negative한 Contribute를 한 Node의 Weight는 내리고. 뭐 이런 방식이겠죠. 그런데 Self attention같은 경우는, 이런 Initialize된 Weight값이 학습하기 전이니까 당연히 Flat할거잖아요. 그래서 솔직히 학습 초반부에는 이게 더 좋고 나쁘고를 판단하는 행위가 힘들어요. 학습이 느린거죠. 그래서 attention weight의 Initialization이 굉장히 중요한데, 다음에 한 번 테크니컬한 논문을 볼 수 있도록 하겠습니다.

 

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

Autoregressive language modeling  (1) 2020.04.12
Overview: Language Modeling  (0) 2020.04.11
Summary  (0) 2020.04.09
Self Attention & RNN  (0) 2020.04.08
CBoW & RN & CNN  (0) 2020.04.07