Transferable Multi-Domain State Generator for Task-Oriented Dialogue Systems

@changwoomon · April 30, 2021 · 6 min read

TRADE

1. 전체 프로세스

TRADE

  1. 대화를 인코더를 통해 인코딩한다.
  2. 인코딩된 대화와 슬롯으로 hh를 만들고, 이를 바탕으로 pvaluep_{value}phistp_{hist}를 생성하여 pfinalp_{final}로 슬롯에 해당하는 value를 찾는다.
  3. 대화와 슬롯으로 만들어진 hj0h_{j0}를 사용하여 phistp_{hist}를 만들고, cj0c_{j0}를 통해 slot의 value를 사용할지 결정한다.

2. Definition (Terminology)

  • UTU_{T}: User Utterence
  • RTR_{T}: System Response
  • Xt={(Utl,Rtl),...(Ut,Rt)}X_t = \{ (U_{t-l}, R_{t-l}), ... (U_{t}, R_{t})\}: Utterance-Response pair
  • D={D1,...,DN}D = \{ D_{1}, ..., D_{N} \}: Domain
  • S={S1,...,SM}S = \{ S_{1}, ..., S_{M} \}: Slot
  • YjvalueY^{value}_{j}: Value
  • B={B1,...,BT}B = \{ B_{1}, ..., B_{T} \}: Tuple

3. Utterance Encoder

utterance encoder
  • 논문에서는 Bi-directional GRU사용 (어떤 종류의 Encoder로도 대체 가능)
  • Input: Xt={(Utl,Rtl),...(Ut,Rt)}X_t = \{ (U_{t-l}, R_{t-l}), ... (U_{t}, R_{t})\}

    • 슬라이딩 윈도우처럼 ll값에 따라 tt번째 턴에는 tlt-l부터 tt까지의 대화쌍을 살펴봄
    • 베이스라인 코드에서는 tt 턴에는 처음부터 tt 턴까지 대화를 모두 봄
    • 더 구체적으로 말하자면, dialougue history 의 모든 단어concatenation 한 것
    • dembd_{emb} 차원을 지님
  • tt 턴까지의 대화쌍에서 토큰들의 관계를 알 수 있다.

4. State Generator

state generator
  • Bi-directional GRU decoder 사용
  • tt 턴까지의 대화 인코딩 hth_t에 대해 max_length(value 중 가장 토큰을 많이 가진 길이)만큼 디코더로 디코딩 진행
  • Copy mechanism을 통해 input dialougue의 정보를 활용하여 slot value를 generate
  • 처음에는 도메인-슬롯의 임베딩 sum 을 입력으로 넣어주고 이를 통해 value 의 첫 토큰이 나온다.
    다음으로는 이 토큰을 입력으로 넣어주고.. 계속하여 알맞는 value 를 뽑아낸다 (서울 + 롯데 + 호텔).
    그러다 special token 이 나오면 value 생성을 그만한다.
  • Pointer-Generator 방법 사용

    • 위에서 생성된 hj0dech^{dec}_{j0}pvocabp_{vocab}(대화와 슬롯을 봤을 때 vocab 에서는 어떤 단어와 유사한지), phistp_{hist}(대화와 슬롯을 봤을 때 이제까지의 대화 중에서는 어떤 단어와 유사한지)를 구한다.
    • Vocab의 분포dialogue history의 분포를 하나의 분포로 결합
P vocab  P history
  • PjkvocabP^{vocab}_{jk}는 Utterence Encoder에서 나타나는 (domain, slot) jj번째, kk번째 value 생성 차례의 vocab 확률 분포를 나타냄

    • 여기서 ERV×dhddE \in \R^{|V| \times d_{hdd}}를 나타내고, Trainable Embedding (vocab 개수 x dimension)
  • PjkhistoryP^{history}_{jk}는 Utterence Encoder에서 나타나는 (domain, slot) jj번째, kk번째 value 생성 차례의 history 확률 분포를 나타냄

    • 여기서 HtH_{t}는 Encode된 dialouge history를 나타냄
P final
  • PjkfinalP^{final}_{jk}PjkvocabP^{vocab}_{jk}, PjkhistoryP^{history}_{jk}Pjkgen,1PjkgenP^{gen}_{jk}, 1-P^{gen}_{jk}만큼의 확률분포를 곱해서 생성
p gen
  • PjkgenP^{gen}_{jk}는 다음 원소들로 구성됨

    • W1W_{1}: 가중치
    • hjkdech^{dec}_{jk}: (domain, slot) pair와 Utterance Encoding을 가지고 만들어진 hidden state vector
    • wjkw_{jk}: word embedding
    • cjkc_{jk}: context vector
    • ;는 concat을 나타냄

5. Slot Gate

slot gate
  • Slot Generator 에서 생성된 hj0dech^{dec}_{j0}(대화와 슬롯의 관계 정보)를 통해 phistoryp_{history}를 만들고, 이를 사용해 cj0c_{j0}(Context vecto)를 만들 수 있다. Slot Gate는 Context vector로부터 slot의 존재 여부를 알아내는 역할을 수행

    • PTR, DONTCARE, NONE 3가지 label로 출력
    • PTR이 나오면 value를 Generate
    • DONTCARE, NONE이 나오면 Ignore
G j

Slot gate GjG_{j}는 다음 원소로 구성됨

  • WgW_{g}: 가중치
  • cj0c_{j0}: Context vector(first decoder Hidden state)

6. Optimization

optimization

출처 : https://www.youtube.com/watch?v=nuclwoebdEM

  • 최종 Loss는 다음으로 구성됨

L=αLg+βLvL = \alpha L_{g} + \beta L_{v}

결과

1. Few/Zero-shot 실험 셋팅

  • Target Domain을 학습 데이터에서 제외

    • 나머지 Source Domain의 데이터로 학습 후, Target Domain에 대한 성능 측정
  • Few-Shot의 경우 Target Domain에 대한 아래 방법들로 1%의 Training data만 사용하여 학습

    • Elastic Weight Consolidation (EWC)
    • Gradient Episodic Memory (GEM)
    • Naive Fine-tuning (Naive)
few  zero

2. 실험 결과

result
  • 첫번째는 하나의 Domain만 제외(ex. Except Hotel)해서 훈련시킴

    • 이후, 제외시킨 Domain (ex. Hotel)의 1% data를 fine-tuning했을 때의 결과
    • GEM을 사용했을 때 가장 좋은 성능이 나오는 것을 알 수 있음
  • 두번째는 하나의 Domain만 훈련시킨 후 (ex. Hotel) 측정하는 방법

    • Train, Taxi Domain에서 높은값들이 나오는 이유는 Domain끼리 겹치는 slot이 존재하기 때문

평가

  • 새로운 domain(unseen domain)에 대해 robust한 모델
  • Pointer-Generator를 사용해 Open-Vocabulary 방법을 사용
  • turn마다 모든 슬롯 jj에 대해 value를 생성하는 점이 비효율적임

참고 자료

@changwoomon
(੭•̀ᴗ•̀)੭🔥