Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Ensemble Strategy #30

Closed
Kingthegarden opened this issue Mar 2, 2022 · 6 comments
Closed

Ensemble Strategy #30

Kingthegarden opened this issue Mar 2, 2022 · 6 comments
Assignees

Comments

@Kingthegarden
Copy link
Contributor

Kingthegarden commented Mar 2, 2022

앙상블 방안

오늘(20.03.02.) 회의에서 나온 다양한 의견들을 바탕으로 이번주 실험을 하면서 고민해야 하는 점을 정리해서 올립니다.

1. 토크나이저가 다른 두 모델 (담당 : 재우, 영민)

  • 토크나이저가 다르면, 학습 데이터를 생성하는 과정에서 max_len이 달라집니다. 따라서 토크나이징된 텍스트의 길이가 다른 경우, 어떠한 방법으로 접근해야 하는 것이 좋은지 실험 후 공유 부탁드립니다.

2. 같은 토크나이저(max_len이 같은)를 사용하고, 다른 task를 학습한 두 모델 (담당 : 정원)

  • 오늘 논의에서 train, infer, cv scoring 등 다양한 부분에서 앙상블을 시도할 수 있다는 의견이 나왔습니다. 제가 생각한 실험 진행하고, 공유하겠습니다.
@Kingthegarden Kingthegarden added the good first issue Good for newcomers label Mar 2, 2022
@Kingthegarden Kingthegarden self-assigned this Mar 2, 2022
@Kingthegarden
Copy link
Contributor Author

1번의 경우, 토크나이저가 다르고 max_len이 다르다면, 다른 위치에 다른 단어, 다른 값을 가지고 있습니다. 또한, 길이가 짧은 토크나이저의 경우에는 문장 끝에 padding이 되어 앙상블 시, 오히려 정답인 단어의 pred값을 낮출 수 있다고 생각합니다. 따라서, max_len 길이만을 조절하여 앙상블하는 것은 틀린 방향이라고 생각합니다. 이 점은 ELECTRA(QA)와 DEBERTA-v3(NER)의 앙상블 실험 결과를 공유하겠습니다.
2번에서 저는 infer 과정에서 fold 마다 앙상블을 진행하고 ner task 방식으로 scoring을 진행하는 방향으로 실험하겠습니다. 이 때, 토크나이저는 DEBERTA-v3 토크나이저를 사용하고, 추후에 QA task 모델도 NER task 모델과 함께 oof 방식으로 최적의 best_th를 찾을 수 있도록 실험을 진행하겠습니다.

@ympaik87
Copy link
Contributor

ympaik87 commented Mar 3, 2022

저는 1번에서 가장 마지막 부분 evaluate 에서 서로의 모델이 예측한 자리값 기준으로 앙상블을 해보려고 합니다.
예를 들어,
현 Evaluation 방식:

Suppose we have an instance:

| ground-truth | prediction    |
|--------------|---------------|
| 0 3; 3 5     | 2 5; 7 9; 2 3 |

These spans give the sets of indices:
| ground-truth | prediction |
|--------------|------------|
| 0 1 2 3 4    | 2 3 4 7 8  |


We therefore compute:
prediciton1:
- TP = size of {2, 3, 4} = 3
- FN = size of {0, 1} = 2
- FP = size of {7, 8} = 2

제안 방식:

| ground-truth | prediction1   | prediction2    | 
|--------------|---------------|----------------|
| 0 3; 3 5     | 2 5; 7 9; 2 3 |    1 4         |


| ground-truth | prediction1  | prediction2  | prediction 1&2 | 
|--------------|--------------|--------------|----------------|
| 0 1 2 3 4    | 2 3 4 7 8    | 1 2 3 4      |      2 3 4     |


prediciton 1&2:
- TP = size of {2, 3, 4} = 3
- FN = size of {0, 1} = 1
- FP = size of {} = 0

여기서 각 모델별로 나온 prediction location을 1과 0으로 놓고 평균, 일정 threshold 이상이면 prediciton 자리 값으로 변환하는 함수를 구현하려고 합니다.

위와 같은 방식의 장점은 1) 각 모델별로 상이한 tokenizer를 상관하지 않아도 되고 (높은 범용성) 2) 각 모델의 최종 결과를 가지고 앙상블 하기에 모델 유무에 따른 성능 평가가 용이 할 것으로 기대하고 있습니다.

여기에 대한 코멘트 있으면 부탁할게요!

@Kingthegarden
Copy link
Contributor Author

넵 일단, 단순 max_len을 맞춰서 preds를 앙상블하면 성능이 하락되는 것을 확인했습니다. (기존 : .882 -> 877 )
참고하셔서 진행하시면 될 것 같습니다.

@Kingthegarden
Copy link
Contributor Author

Kingthegarden commented Mar 5, 2022

2번째 실험은, NER(.85) + QA(.15), best_th로 infer한 결과 oof CV는 향상되었으나, LB는 별다른 성능향상이 없었습니다. 아무래도 영민님이 말씀하신대로 QA, NER task의 scoring 방식의 차이에서 나타나는 문제인 것 같습니다. 또한, deberta QA도 roberta와 같은 문제가 발생하였습니다. 다음 회의때, QA & NER scoring에 대한 논의가 필요할 것 같습니다.

@jerife
Copy link
Member

jerife commented Mar 6, 2022

회의때 언급한 것 처럼 모델을 수정하여 같은 크기의 출력을 나오게 한다고 해도 tokenizer마다 token들이 다르기 때문에 옳지 않다고 생각해,
다른 방식으로 접근해보려 합니다.

각 모델마다 예측한 char값을 기반으로 average를 구해보려고 합니다.

ground-truth: hi i'm jaewoo

ground-truth prediction1 prediction2 prediction1&2
0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1 0.2, 0.2, 0, 0, 0, 0, 0, 0.7, 0.7, 0.7, 0.7, 0.7, 0.7 0.1, 0.1, 0, 0, 0, 0, 0, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5 0.15, 0.15, 0, 0, 0, 0, 0, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6

char을 기반으로하면 tokenizer에 관한 문제도 관여하지 않아도 될것 이라 생각합니다.
다만 우려되는 점은 trim과 같은 부분을 각 모델마다 어떻게 처리하는지입니다.

일단 시도해본후 다시한번 결과 공유하겠습니다!

@ympaik87
Copy link
Contributor

ympaik87 commented Mar 7, 2022

회의때 언급한 것 처럼 모델을 수정하여 같은 크기의 출력을 나오게 한다고 해도 tokenizer마다 token들이 다르기 때문에 옳지 않다고 생각해, 다른 방식으로 접근해보려 합니다.

각 모델마다 예측한 char값을 기반으로 average를 구해보려고 합니다.

ground-truth: hi i'm jaewoo

ground-truth prediction1 prediction2 prediction1&2
0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1 0.2, 0.2, 0, 0, 0, 0, 0, 0.7, 0.7, 0.7, 0.7, 0.7, 0.7 0.1, 0.1, 0, 0, 0, 0, 0, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5 0.15, 0.15, 0, 0, 0, 0, 0, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6

char을 기반으로하면 tokenizer에 관한 문제도 관여하지 않아도 될것 이라 생각합니다. 다만 우려되는 점은 trim과 같은 부분을 각 모델마다 어떻게 처리하는지입니다.

일단 시도해본후 다시한번 결과 공유하겠습니다!

좋은 시도입니다. 결과가 기대되는군요!

@jerife jerife added session log and removed good first issue Good for newcomers labels Mar 9, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

3 participants