본문 바로가기
카테고리 없음

topK, temperature scaling, topP

by 혜룐 2024. 5. 1.

topK

top-k-sample은 모델이 예측한 다음 토큰 확률 분포에서 확률값이 가장 높은 K깨 토큰 가운데 하나를 다음 토큰으로 선택하는 기법이다. K개 안에 있는 토큰이라면, 확률값이 낮은 케이스도 다음 토큰으로 추출될 수 있다. 띠라서 topK 샘플링은 매 수행때마다 생성결과가 달라진다. topK=1로 하는 경우 그리디서치와 똑같은 효과를 나타낸다. 가장 높은 1개의 후보만 남긴 후 여기에서 하나는 뽑는 것이기 때문에 매 순간 최선을 선택하는 것과 동일하다.

temperature scaling

모델의 다음 토큰 확률 분포를 대소 관계의 역전 없이 분포의 모양만을 바꿔서 문장을 다양하게 생성하는 기법이다. 모델의 출력 로짓(소프트맥스 변환 전 벡터)의 모든 요솟값을 temperature로 나누는 방식으로 적용한다. 

예를 들어 로짓이 [-1.0    2.0     3.0]  temperature=2라면 템퍼러쳐 스케일링 적용후 로짓은  [-0.5     1.0       1.5]가 된다. 여기에 소프트맥스를 취해 다음 단어 확률분포로 만든다. (당연히 1이라면 그대로겠지, 그리고 음수면 값이 완전히 바뀌니까 당연히 양수를 지정해야되겠지)

model.generate(

do_sample=True, top_k=50, temperature=0.01

)

0에 가까울수록 확률 분포 모양이 원래보다 뾰죡해진다. 즉 원래 컸던 확률은 더 커지고 작았던 확률은 더 작아진다는 의미이다. 그 만큼 확률값 기준으로 1등이 다음 토큰으로 뽑힐 가능성이 커진다는 말이다. 그래서 최종적인 결과물이 그리디서치로 생성한 문장과 같게된다.

생각해보면 top_k=10정도로 하고 temperature=0.01로 하면

전체 어휘에서 확률계산을 하지 않고 && 컸던 확률은 그만큼 다음 토큰으로 뽑힐 가능성이 커지기 때문에 좋은 성능을 낼수 있을거 같다.

temperature=1보다 큰값으로 하면 확률 분포가 평평해진다. 당연히 평평해기면 원래 컸던 확률과 작았던 확률 사이의 차이가 줄어드니까 topK에서 샘플링에서 선택되기 어려웠던 토큰들이 다음토큰으로 선택되어 품질이 나빠질수 있다는 말이다. 그래서 temperature=1보다 작게하면 상대적으로 정확한 문장을, 1보다 크게 하면 상대적으로 다양한 문장을 생성할수 있다.

topP = necleus sampling

top_p sampling은 확률값이 높은 순서대로 내림차순 정렬을 한 뒤 누적 확률값이 p이상인 최소 개수의 토큰집합 가운데 하나를 다음토큰으로 선택하는 기법이다. 

top=1.0으로 설정하면 확률값이 낮은 단어를 배제하지 않고 다음 단어 후보로 전체 어휘를 고려한다. top_p=0에 가까울수록 후보 토큰이 줄어들어 확률값이 높은 토큰들만 남게되 그리디서치와 비슷해진다. (top_p=0.01)

정리를 하면....

그리디서니차 빔서치는 가장 높은 확률값을 내는 문장을 생성해준다.

하지만 컨텍스트가 같을 때는 매번 같은 모앙이 나오므로 샘플링 방식을 적용해 다양한 답변을 적용해본다고 가정하면 아래처럼 파라미터를 조절할수 있다.

  • 샘플링방식 --> do_sample=True
  • 그리고 생성된 문장이 너무 짧거나 길지 않게 하고 --> min_length , max_length
  • 반복되는 토큰은 될 수 있으면 배제하며 --> repetition_penalty
  • 템퍼러쳐 스케일링으로 원래 확률분포를 조금 뾰족하게해 확률 값이 높은 토큰이 더 잘나오도록 --> temperature=0.8 (0에 가깝게)
  • topK, topP샘플링을 동시에 적용해 확률값이 낮은 토큰들은 후보 단어에서 제외 --> top_k=50, top_p=0.90