안녕하세요. 오늘은 한국어 언어모델에 대하여 정량평가를 진행하는 오픈소스를 소개해보려고 합니다. 언어모델의 성능을 확인할 때에 흔히 리더보드를 참고하는데요, 리더보드에 올라가 있지 않은 모델의 성능을 측정해야할 상황이 생기곤 합니다. 이럴 때 사용할 벤치마크를 소개합니다.
Ko LM Eval Harnesss
https://github.com/Beomi/ko-lm-evaluation-harness
위 repository에 있는 실행 스크립트를 사용하면, 한 줄의 command line으로도 한국어 공개 데이터셋을 사용하여 모델의 정량평가를 진행할 수 있습니다. 사용법은 위 url에 들어가면 보이는 README에 기재되어 있습니다.
./run_all.sh 모델이름 'GPU번호들'
평가하려는 모델은 Huggingface hub에서 다운받거나 cache 경로에서 불러올 수 있어야 합니다.
run_all.sh를 실행하면 run_all.sh 내 TASK 변수로 설정되어 있는 데이터셋들에 대한 정량평가가 진행됩니다.
TASKS='kobest_hellaswag,kobest_copa,kobest_boolq,kobest_sentineg,kohatespeech,kohatespeech_apeach,kohatespeech_gen_bias,korunsmile,nsmc,pawsx_ko'
평가를 원하지 않는 데이터셋이 있다면 TASK 변수에 할당된 값을 수정하여 사용해주시면 됩니다.
run_all.sh를 실행하면 results/all/ 밑에 username/모델 이름 으로 폴더가 생성되어 평가가 진행됩니다. 예를 들어 meta-llama/Llama-2-7b 모델을 평가하고자 한다면, results/all/ 밑에 meta-llama 폴더가 생기고 그 밑에 Llama-2-7b 모델이 생성되는 방식입니다.
모델은 각 데이터셋마다 네 번의 case(0 shot, 5 shot, 10 shot, 50 shot)로 평가가 진행됩니다. 각 case는 평가가 종료되면 모델 폴더 밑에 json파일로 저장됩니다.
평가가 완료되면 [결과물한눈에보기.ipynb](https://github.com/Beomi/ko-lm-evaluation-harness/blob/main/%EA%B2%B0%EA%B3%BC%EB%AC%BC%ED%95%9C%EB%88%88%EC%97%90%EB%B3%B4%EA%B8%B0.ipynb) 스크립트를 사용하여 결과물인 json 파일들을 하나의 table로 확인할 수 있습니다. 스크립트의 6번째 command 예시처럼 get_df_klue 함수에 json 파일들이 있는 모델 폴더의 실제 경로를 기입해주시면 됩니다. 함수의 두 번째 argument는 함수 내에서 실질적으로 사용하진 않기 때문에 넣어주지 않으셔도 됩니다. 실행시키면 각 데이터셋에 알맞은 metric으로 점수를 확인하실 수 있습니다.
| | 0 | 5 | 10 | 50 |
|:---------------------------------|---------:|---------:|---------:|---------:|
| kobest_boolq (macro_f1) | 0.337452 | 0.570559 | 0.585608 | 0.567486 |
| kobest_copa (macro_f1) | 0.665517 | 0.69096 | 0.686659 | 0.698672 |
| kobest_hellaswag (macro_f1) | 0.383174 | 0.379488 | 0.380637 | 0.383733 |
| kobest_sentineg (macro_f1) | 0.367966 | 0.91937 | 0.96473 | 0.947103 |
| kohatespeech (macro_f1) | 0.300627 | 0.362646 | 0.364923 | 0.287482 |
| kohatespeech_apeach (macro_f1) | 0.337667 | 0.486543 | 0.452716 | 0.335808 |
| kohatespeech_gen_bias (macro_f1) | 0.124535 | 0.489203 | 0.461098 | 0.461714 |
| korunsmile (f1) | 0.35822 | 0.367208 | 0.381937 | 0.376735 |
| nsmc (acc) | 0.50714 | 0.80386 | 0.83964 | 0.86138 |
| pawsx_ko (acc) | 0.539 | 0.4915 | 0.5225 | 0.521 |
결과물한눈에보기_korquad.ipynb에 있는 함수 실행 결과 예시
그렇다면 위 스크립트는 어떤 데이터셋을 사용하여 평가를 진행하는 걸까요? 이 스크립트에서 사용하는 데이터셋들은 실제 한국어 리더보드의 데이터셋과 어떤 차이가 있는지 궁금해서 찾아보게 되었습니다.
언어모델을 평가할 수 있는 한국어 벤치마크의 부재로 탄생한 벤치마크입니다. 벤치마크는 5개의 하위 테스크로 구성되어 있으며, Huggingface에서 누구나 사용할 수 있습니다. 아래 논문의 예시처럼, 5개의 하위 테스크는 질문에 대한 대답을 추측하거나, 긍정/부정을 구별하는 등의 요소를 평가하여 언어모델의 성능을 측정합니다.
출처 : 원문
Smilegate AI에서 공개한 한국어 혐오표현 데이터셋입니다. 모델이 주어진 문장에 대하여 정답과 얼마나 유사하게 분류(혐오표현, 악플/욕설, clean)하냐에 따라 모델 성능이 측정됩니다.
네이버 영화 리뷰 데이터셋입니다. 주어진 영화 리뷰 댓글에 대해서 영화에 대한 긍정적인 평가인지 부정적인 평가인지에 대해 모델이 정답과 얼마나 유사하게 분류하냐에 따라 모델의 성능이 측정됩니다.
구글리서치가 공개한 다국어 데이터셋입니다. 데이터셋 내 한국어 분량만 사용합니다. 원문에 의하면 데이터는 ‘challenging English paraphrase identification pairs’로 구성되어 있다고 합니다. 두 문장이 주어졌을 때, 의미가 유사하면 1이고 유사하지 않으면 0으로 라벨링하는 테스크를 모델이 수행하게 됩니다. 예를 들어 모델은 평가에서 ‘뉴욕에서 플로리다로 가는 항공편’과 ‘플로리다에서 뉴욕으로 가는 항공편’이 서로 다른 의미를 가지고 있다는 걸 구분해야 합니다.
한국어 연예 뉴스 플랫폼의 댓글에서 가져온 한국어 혐오 표현 데이터셋입니다. 이 데이터셋은 주어진 문장에 대하여 모델이 hate, offensive, and none 중 하나의 라벨을 선택하여 모델의 성능을 측정하게 됩니다.
한국어 리더보드에서는 영어 리더보드에서 사용하는 데이터셋(ARC, HellaSwag, MMLU, TruthfulQA)을 번역한 한국어 버전과 commongen 데이터셋의 한국어 버전으로 모델의 성능을 평가하고 있습니다. 블로그 글에 의하면 공정함을 위해 데이터셋을 비공개로 유지하고 있다고 합니다.
KMMLU: Measuring Massive Multitask Language Understanding in Korean
https://arxiv.org/abs/2402.11548
최근에는 영어 벤치마크를 번역한 데이터셋이 아닌 한국어의 언어적 특성과 문화적인 맥락을 고려한 벤치마크가 공개되기도 했습니다. 이처럼 언어모델(특히 한국어 모델)을 더 정교하게 평가하기 위한 여러 연구들이 활발히 이루어지고 있는 것 같습니다.
안녕하세요. 포스팅 감사히 잘 읽었습니다. 저도 현재 위와 같은 방법으로 모델에 대한 성능 평가를 진행 중인데, 로그 우도를 검사하는 과정에서 소요되는 시간이 너무 많아 무엇인가 잘못된 것이 아닌가 하는 생각이 들고 있습니다. 많게는 120시간도 넘게 소요되는 것 같네요. 작성자 분께서도 저와 같은 현상을 겪으신 것인지 궁금합니다.