우리의 코드 안에는 max_answer_length가 존재합니다.
def post_processing_function(
examples,
features,
predictions: Tuple[np.ndarray, np.ndarray],
training_args: CustomTrainingArguments,
) -> EvalPrediction:
predictions = postprocess_qa_predictions(
examples=examples,
features=features,
predictions=predictions,
max_answer_length=data_args.max_answer_length,
output_dir=training_args.output_dir,
)
(자칭) 하이퍼 파라미터 튜닝 아티스트인 저는, 이번에도 하이퍼파라미터를 수정해보려고 합니다.
EDA를 하는 민서에게 answer_length distribution이 어떻게 되는지, 몇으로 설정하면 좋을지 물어보면서 몹시 근거를 중요시하며 튜닝하는 사람인척을 했더랬죠…
max_answer_length가 50정도면 충분하겠지? (훗, 일등 다시 우리꺼)하는 마음으로 실험을 진행했습니다.
실험결과, 충격주의, 성능의 변화가 없습니다. 혼자 가설을 세우기 시작했습니다. 첫번째 50을 넘는 긴 정답이 없을 것이다. 두번째 아직 정확도가 EM60이니까 긴 정답을 못맞추고 있는 것이다.
그럼 30이 넘는 길이의 답을 삭제해봐야겠다. length 30이 넘는 답을 모두 찾아냅니다.
no. | answer | length |
---|---|---|
mrc-0-002424 | 한 장군 놀이가 중요 무형 문화재 제44호로 지정되면서부터 자인단오-한장군 놀이 | 44 |
mrc-0-004594 | 교육 및 문화 교류를 통해 미국 사람들과 다른 국가 사람들 간의 상호 이해를 높이는 것 | 48 |
mrc-1-000870 | ≪바람 속에서 벌거벗고(Naked in the Wind)≫ | 32 |
mrc-1-000972 | '오딘(ODIN - Orbital Defense Initiative, 궤도 방어 무기)' | 49 |
mrc-0-003501 | 백병전을 통해서만 수탈이 가능하기 때문에 유저해적들이나 수탈을 목적으로 하는 플레이어들은 이들 계열 직업 | 58 |
max_answer_length=30로 생성한 결과 파일을 확인해보니,,,
두 결과 파일이 동일합니다. 그니까 성능의 변화가 없었고…
뭐지 학습이 덜 된건가???내 모델 성능 그래도 좋은데…??? 혼자 고민을 하다가 제 사수(Chat gpt)에게 질문을 던집니다.
만약 max_answer_length=30으로 설정했음에도 불구하고 생성된 답변이 30 토큰을 초과한다면, 다음과 같은 몇 가지 원인이 있을 수 있습니다:
바로 정답을 알려주는 나의 고마운 사수…고마워…근데 왜 이제 알려줘...(물어본적없음)
NLP 모델, 특히 Transformer 계열 모델(BERT, GPT 등)은 입력 텍스트를 단어 단위가 아닌 토큰 단위로 처리합니다. 여기서 토큰이란, 단순한 단어가 아니라 문장을 구성하는 기본 단위로, 단어, 부분 단어 또는 심지어 문자로 나뉠 수 있습니다. 이를 통해 모델이 고정된 크기의 벡터로 텍스트를 처리할 수 있게 됩니다.
그러니까,
“한 장군 놀이가 중요 무형 문화재 제44호로 지정되면서부터 자인단오-한장군 놀이”의 length = 23입니다.
['한', '장군', '놀이', '##가', '중요', '무형', '문화재', '제', '##44', '##호', '##로', '지정', '##되', '##면서', '##부터', '자인', '##단', '##오', '-', '한', '##장', '##군', '놀이']
가장 긴 정답인 “백병전을 통해서만 수탈이 가능하기 때문에 유저해적들이나 수탈을 목적으로 하는 플레이어들은 이들 계열 직업”의 length = 30입니다.
['백', '##병', '##전', '##을', '통해서', '##만', '수탈', '##이', '가능', '##하기', '때문', '##에', '유저', '##해', '##적', '##들이', '##나', '수탈', '##을', '목적', '##으로', '하', '##는', '플레이어', '##들', '##은', '이', '##들', '계열', '직업']
이번에는 train data의 긴 answer들을 분석해보겠습니다.
“나는 국경일에 일장기를 게양하는 것을 반대하지 않는다. 왜냐하면 우리가 일본의 통치하에 있는 한 우리는 그 통치의 명령에 복종해야 하기 때문이다.”
우리가 생각하는 length는 83이지만, 토큰화 length는 47입니다.
['나', '##는', '국경', '##일', '##에', '일', '##장', '##기', '##를', '게', '##양', '##하', '##는', '것', '##을', '반대', '##하', '##지', '않', '##는', '##다', '.', '왜냐하면', '우리', '##가', '일본', '##의', '통치', '##하', '##에', '있', '##는', '한', '우리', '##는', '그', '통치', '##의', '명령', '##에', '복종', '##해야', '하', '##기', '때문', '##이다', '.']
형태에 있어 거의 혹은 전혀 자유가 없어 다양한 번역을 창조해내기가 불가능하고 시구 구조에서도 다른 여지를 찾기 어려운 탓이다.
우리가 생각하는 length는 71이지만, 토큰화 length는 35입니다.
['형태', '##에', '있', '##어', '거의', '혹은', '전혀', '자유', '##가', '없', '##어', '다양', '##한', '번역', '##을', '창조', '##해', '##내기', '##가', '불가', '##능', '##하고', '시구', '구조', '##에서', '##도', '다른', '여지', '##를', '찾', '##기', '어려운', '탓', '##이다', '.']
결론적으로,
max_answer_length=50이면 충분할 것같네요,,,
단, 토크나이저별로 상이할 수 있습니다. 위 토크나이저는 klue/roberta-base입니다.
근데 그렇다면 우리는 eda를 할 때 토큰 단위로 해야하는걸까요? (남겨진 의문)