[실험] Slot Gate 추가(3진분류 -> 2진분류 2번) #44
karim-moon
started this conversation in
Experiments
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
-
문제정의
TRADE논문에 제시되어있는 3진분류(none, don't care, ptr)보다 2진분류 2번을 통해 하나의 게이트가 하나의 문제만을 해결하도록 한다면 모델의 성능이 더욱 올라갈 수 있을것이라 생각하였다.
또한 주어진 데이터에서 value중 가장 많은 클래스가 don't care이며 none과 don't care를 잘 걸러낸다면 모델의 성능과 스코어가 올라갈것이라 예상하였다.
해결 아이디어
gate가 늘어나며 코드에서 수정이 되어야하는 부분이 몇군데 있다.
data_utils.py
베이스 라인의 OpenVocabDSTFeature는 gating_id가 1개이므로 None_gating_id, Care_gating_id로 갯수를 늘림
preprocessor.py
TRADEPreprocessor 클래스
init
45가지 쌍의 슬롯 메타가 none인지, none이 아닌지 알려주는 라벨 벡터와 don't care인지 don'care가 아닌지 구분하는 벡터가
모델의 input으로 들어가기때문에 gating2id를 추가해주었다.
마찬가지로 예측값을 변환할 때 각 value를 통해 변환되므로 id2gating역시 두가지로 나누었다.
_convert_example_to_feature
gating2id를 거진 값들이 45개 원소를 가진 벡터형태로 gating_ids가 만들어지기 때문에 gating_id역시 나누었다.
return부분에 기존 사용되던 OpenVocabDSTFeature 대신 OpenVocabDSTFeatureDoublegat 데이터 클래스에 선언
recover_state
기존 gate_list만 받았던 함수를 none을 분류하는 none_list, don't care를 분류하는 care_list를 입력받도록 수정
예측치를 텍스트 결과로 변환시 하나의 게이트 입력으로 처리하는 것이 아닌 None_id2gating, Care_id2gating으로 나누어 처리
collate_fn
마찬가지로 배치단위로 모델에 두개의 게이트값을 주어야하기 때문에 None_gating_ids, Care_gating_ids를 추가하였다.
return 역시 수정!!
model.py
SlotGenerator 클래스
init
3개의 클래스(none, ptr, don't care)로 구분하는 Linear layer를 두개로 나누어 각각 2진분류를 하도록 분리하였다.
forward
gating이 일어나는 경우는 전체 컨텍스트 벡터와 decoder가 계산될 때( k == 0 )이므로 역시 두개의 분리된 Linear layer를 거치고 logit을 만든다.
view(batch_size, J(슬롯페어 쌍 갯수 = 45), 게이트의 경우의수(none, not_none or don't care, others) = 2)이므로 기존 args.n_gate를 2로 수정하였다.
!!!return 역시 none_gate_output, care_gate_output으로 수정된다.
train.py
loss 클래스 생성
none 분류 gate와 don't care 분류 gate가 서로 다른 값을 갖기때문에 loss function을 두가지로 분류하였다. (CrossEntropyLoss)
loss 계산
loss가 계산되는 부분 역시 두가지로 나뉘는 부분과 최종 계산시 loss_gen, loss_none, loss_care를 더해주는 형식으로 진행하였다.
inference.py
batch에서 none_ids, care_ids가 포함되어있기때문에 가장 확률이 높은 값을 max로 뽑아내어 각각 list로 만들고 이를 통해 gating이 이루어진다.
진행상황
#16 을 참조해주세요!!
변경사항 : 3개의 gate를 2개로 줄일 때 인코더를 bert를 사용
결과
기준(baseline)
3 gate(none, don't care, ptr) score
오히려 베이스라인보다 점수가 떨어진걸 확인할 수 있다.
생각해보면 정답파일은 none이 제외된, don't care와 ptr로 이루어진 파일일 것이다. 만약 베이스라인 모델이 이미 none을 충분히 잘 걸러낼 수 있는 모델이라면 none을 잘 걸러내는 일은 무의미할 수 있을것이다.
2gate(none, don't care)
게이트를 하나 줄였기때문에 성능이 올라갔다기보단 GRUEncoder를 BERT로 교체하였다.
성능 향상은 bert 인코더 때문일것으로 추측된다.
3개의 게이트를 2개로 줄였지만 사실 ptr게이트는 inference에 영향을 미치지 않고 layer또한 따로 존재하기때문에 3gate와는 별반 다를것이 없을것이다.
후속 실험
Special mission에서도 나와있듯이 yes와 no를 구분하는 게이트를 분리하여 진행을 해볼 수 있을것이다.
Beta Was this translation helpful? Give feedback.
All reactions