분석하고싶은코코

생성형 모델 옵션 설정_Transformer - GenerationConfig, (beam, greed search) 본문

머신러닝&딥러닝/NLP

생성형 모델 옵션 설정_Transformer - GenerationConfig, (beam, greed search)

코코로코코 2024. 1. 16. 13:00
반응형

잘 만든 모델이더라도 파라미터를 제대로 설정하지 않는다면 제대로된 성능을 낼 수 없습니다. 그래서 이번 포스팅에서는 Transformer의 GenerationConfig에 대해서 알아보겠습니다. 생성형 자연어 모델에 대해서 공부하다보니 모델을 불러와서 단순하게 generate함수를 호출하여 문자를 생성하지만 파라미터들은 알려주는대로 설정하다보니 '아~ 그냥 잘 생성하는구나~'라고 하고 넘어갔었습니다. 그런데 점점 공부를 할 수록 제가 원하는 형태의 생성 결과를 얻기 위해서는 이 파라미터들에 대해서 공부해야되겠다고 생각되어 이번 포스팅을 작성하게 되었습니다. 이번 포스팅은 HuggingFace - Transformer_GenerationConfig문서를 기반으로 작성하였습니다.


transformer의 text-generation에 대한 예시는 링크를 참고하시면 됩니다. 이번 포스팅에서는 Pytorch, Tensorflow에서 모두 공용으로 사용되는 주요 generationconfig에 대해서 다룹니다.

Beam-search & Greed-search

옵션 설명에 앞서 필요한 개념인 beam-search와 greedy search에 대해서 간단하게 이야기하고 옵션들에 대해서 알아보겠습니다. 두 개의 서치 방법 중 보편적으로 더 좋은 전략을 평가 받는 전략은 beam-search입니다. 그 이유는 다양성에 대한 고려가 들어갔다는데 있습니다. 아래 그림을 통해서 그 과정을 이해해보겠습니다. greedy search는 탐욕적 탐색으로 말 그대로 높은 확률만을 선택하는 과정을 거치게 됩니다. 이게 전체에 대한 고려가 아니라 그 순간순간마다 탐욕적 선택을 하게 됩니다. 따라서 아래 그림의 왼쪽의 선택을 보면 0.5인 nice를 선택했고 nice의 다음 선택지 중에서 또 가장 높은 woman을 선택하고 end-point에 도달하여 텍스트 생성이 끝났습니다. 반면에 오른쪽 그림이 beam-search과정인데 첫 분기점에서 3개의 beam이 초기화 되었고 이를 가지뻣기해 나가면서 각 가지에서는 greedy search가 적용됩니다. 그 결과 초기 beam 중에서 0.4였던 dog에서 다음 가지에 0.9 has까지 선택된 결과가 모든 beam중에서 가장 높은 socre를 받게 되어 단순한 greedy search에서는 발견할 수 없었던 'The dog has' 텍스트를 생성할 수 있게 되었습니다.

좌 - greedy search / 우 - beam-search

 

Transformer - generationconfig

앞서 알아본 텍스트 생성 전략을 바탕으로 transformer의 주요 generationconfig 옵션들에 대해서 알아보겠습니다. 더 많은 옵션들이 있으니 원하시는 분들은 허깅페이스 페이지를 참조하시면 됩니다!

 

텍스트 생성 길이(length)

  • max_length (int, optional, defaults to 20) — 생성할 토큰(텍스트)의 최대 길이를 설정합니다. 입력 prompt + max_new_tokens로 결정. 만약 max_new_tokens를 옵션으로 설정했다면 이 옵션은 무시되는 옵션이 됩니다.
  • max_new_tokens (int, optional) — 입력 prompt를 제외하고 새롭게 생성할 토큰의 수를 설정.
  • min_length (int, optional, defaults to 0) — max_length와 반대되는 옵션. 역시 min_new_tokens를 설정했다면 무시되는 옵션입니다.
  • min_new_tokens (int, optional) — max_new_toekns와 같습니다. 입력 prompt를 제외한 최소 생성 토큰 수를 설정.
  • early_stopping (bool or str, optional, defaults to False) — beam-base(beam-search 알고리즘)로 모델이 텍스트를 생성하는 기준을 설정합니다. 'True'설정시 완벽한 후보 단어가 선정된다면 생성을 중지합니다. 'False' 설정시 더 나은 후보군이 없을 확률이 있다면 스탑,'never' 설정시 더 나은 후보군이 없을 경우 중지.
  • max_time(float, optional) — 텍스트 생성에 시간을 제한하는 옵션

텍스트 생성 전략(Strategy)

  • do_sample (bool, optional, defaults to False) — 샘플링을 진행할지에 대한 선택. 진행하지 않는다면 Greedy search를 의미함.
  • num_beams (int, optional, defaults to 1) — beam-search 전략입니다. 1을 선택한다면 beam-search알고리즘을 사용하지 않는 것으로 보면됩니다. 이 옵션을 높일수록 생성할 텍스트가 다양할 수 있지만 그만큼 엉뚱한 텍스트를 생성할 가능성이 높아집니다.
  • num_beam_groups (int, optional, defaults to 1) — beam의 다양성 확보를 하기 위한 그룹 옵션 자세한 설명은 링크를 참조하라고 합니다.

텍스트 생성 logits

  • temperature (float, optional, defaults to 1.0) — 확률에 대한 첨도를 설정하는 것이라 생각하시면 됩니다. 값이 높을수록 확률이 높은 후보군의 확률이 높아집니다.
  • top_k (int, optional, defaults to 50) — 후보군 단어중 k개에 대해서만 샘플링을 진행하게 됩니다. 고르게 확률이 분포되어 있다면 좋은 후보군을 놓칠 가능성이 있습니다.
  • top_p (float, optional, defaults to 1.0) — 후보군 단어들의 확률의 합을 통해 후보군 단어를 정합니다. 0.95로 설정시 상위 후보군부터 누적 확률이 95%가 되는 단어까지가 샘플링 후보군이 됩니다.
  • typical_p (float, optional, defaults to 1.0) — 각beam에서 나온 후보군의 다음 랜덤 단어들에 대해서 누적 확률을 고려하는 옵션으로 보입니다.(정확한 옵션에 대한 이해인지는 모르겠습니다.)
  • epsilon_cutoff (float, optional, defaults to 0.0) — 설정한 값 이상의 토큰들만 샘플링을 진행하게 됩니다. 3e-4 ~ 9e-4로 추천하고, 자세한 내용은 링크를 참조하라고 하네요.
  • diversity_penalty (float, optional, defaults to 0.0) — beam의 다양성 패널티를 설정하는 값입니다. 위쪽에 있는 beam_group에 대한 설정을 했을때 유효한 옵션이라고 합니다.
  • repetition_penalty (float, optional, defaults to 1.0) — 반복에 대한 패널티를 설정하는 옵션이라고 합니다. 1은 패널티가 없는 것을 의미한다고 합니다. 자세한 내용은 링크에 있습니다.
  • length_penalty (float, optional, defaults to 1.0) — beam-base 알고리즘의 길이 패널티를 의미합니다. beam-search에서 길이가 짧을수록 누적확률이 높을 수 밖에 없습니다. 이를 해결하기 위한 값으로 설정할 수 있습니다. 긴 시퀀스에 대해서는 0보다 큰 값을, 짧은 시퀀스에 대해서는 0보다 작은 값을 권장한다고 합니다.
  • no_repeat_ngram_size (int, optional, defaults to 0) — n-gram에 대한 단어가 다시 등장하지 않도록 설정하는 옵션입니다. 예를들어 2옵션으로 '블로그 포스팅'이라는 단어가 한 번 생성됐다면 이후에는 이 '블로그 포스팅'은 생성하지 않습니다.

 

+ 그 외

  • decoder_start_token_id (int, optional) — 디코딩 작업의 시작 토큰을 강제할 수 있는 옵션입니다.
반응형