티스토리 뷰

딥러닝

LLM 평가

shannon. 2024. 3. 12. 19:44
반응형

개요 

자연어 처리 영역에서 LLM의 성능을 평가하는 것은 중요한 측면입니다. 이 평가를 위한 주요 도구 중 하나는 ROUGE(Recall-Oriented Understudy for Gisting Evaluation) 측정항목입니다. ROUGE는 주로 LLM의 텍스트 생성 품질을 평가하는 데 사용됩니다.

GPT-2와 같은 LLM은 종종 텍스트 완성이나 요약과 같은 작업에 참여합니다. 생성된 텍스트의 효율성은 확장성 및 일관성 문제로 인해 사람의 판단만으로는 효과적으로 측정할 수 없습니다. 예를 들어, 아래 코드를 실행하여 다음 프롬프트에 따라 텍스트를 생성하세요. 여기에 어떤 점수를 할당할 수 있는지 생각해 보고 다양한 텍스트에 점수를 매기는 표준화된 측정 기준을 생각해 보세요.

# Generate text based on a prompt for Text Completion
result = generator("Purple is the best color because", 
    max_length=15, 
    num_return_sequences=1, 
    pad_token_id=generator.tokenizer.eos_token_id)
    
# Display the generated text
print("Text Completion Response:\n" + result[0]['generated_text'] + "\n")

개인적인 선호도 등의 요인으로 인해 인간의 판단에만 근거하여 일관된 점수를 보장하는 것은 어렵습니다. ROUGE와 같은 정량적 지표가 작용하는 곳입니다.

루즈란 무엇인가요? 

ROUGE 는 기계 생성 텍스트를 일련의 참조(일반적으로 사람이 생성)와 비교하는 측정항목 집합입니다. ROUGE의 주요 초점은 기계 생성 텍스트와 참조 텍스트 간의 n-gram, 단어 시퀀스 및 단어 쌍의 중첩을 측정하는 것입니다.

ROUGE 지표 유형 

  • ROUGE-N: 기계 생성 텍스트와 참조 텍스트 사이의 n-gram 중첩을 측정합니다. 예를 들어 ROUGE-1은 유니그램(단일 단어)의 중복을 나타내고 ROUGE-2는 바이그램(두 단어 구문) 등을 나타냅니다.
  • ROUGE-L: 가장 긴 공통 부분 수열(LCS)에 중점을 둡니다. 두 텍스트 모두에 나타나는 가장 긴 단어 순서를 고려하고 짧고 분산된 단어보다 긴 하위 순서를 더 많이 보상합니다.

ROUGE 점수 이해 

실제로 ROUGE를 이해하려면 기계 생성 요약과 인간 참조를 고려하십시오. 요약이 "The cat sat on a mat"이고 참조가 "My cat sits on the mat"인 경우 ROUGE-1은 개별 단어의 중복을 평가하고 ROUGE-2는 두 단어 구문을 평가하며 ROUGE- L은 가장 긴 공통 단어 문자열을 순서대로 살펴봅니다.

 

ROUGE 점수가 높을수록 중첩 정도가 높음을 나타내며 일반적으로 텍스트 생성 품질이 더 우수함을 나타냅니다. 그러나 ROUGE 점수는 분리된 것이 아니라 맥락에 따라 해석되어야 한다는 점에 유의하는 것이 중요합니다. 높은 점수가 항상 품질 및 일관성에 대한 인간의 판단과 연관되는 것은 아닙니다.

ROUGE는 유용한 도구이지만 한계가 있습니다. 생성된 텍스트의 의미론적 정확성을 고려하지 않습니다. 예를 들어, 두 개의 요약이 의미상 유사할 수 있지만 표현이 다를 수 있으므로 ROUGE 점수가 낮아질 수 있습니다.

 으로 LLM 평가하기

프로그래밍 방식으로 ROUGE 측정항목을 사용하여 LLM을 평가하는 방법을 살펴보겠습니다. LLM을 사용하여 생성된 노래 가사가 있고 테스트 데이터 세트에 세대를 추가했다고 가정합니다. ROUGE를 사용하여 생성된 가사를 다음과 같이 예상 가사와 비교할 수 있습니다.

참고: 로컬 환경에서 다음 코드를 실행하려면 터미널에서 실행하여 rouge및 패키지를 설치하십시오.pandaspip install rouge pandas

from rouge import Rouge 
import pandas as pd

# Import the lyrics dataset which contains the generated and true lyrics
lyrics_df = pd.read_csv('/app/gpt2_generated_lyrics.csv')

# Instantiate the Rouge class
rouge = Rouge() 

# Print examples of generated and expected lyrics to understand how they differ
print("Generated:" + lyrics_df['Generated_Lyrics'][0] + "\n")

print("Expected:" + lyrics_df['Expected_Lyrics'][0] + "\n")

# Calculate and return average ROUGE scores between generated and expected lyrics
scores = rouge.get_scores(lyrics_df['Generated_Lyrics'], 
                lyrics_df['Expected_Lyrics'], avg=True)

# Print the header of the table
print("{:<10} {:<15} {:<15} {:<15}".format('', 'Recall', 'Precision', 'F-1 Score'))

# Print ROUGE-1 scores in a formatted row
print("{:<10} {:<15} {:<15} {:<15}".format('ROUGE-1',
                                           round(scores['rouge-1']['r'], 4),
                                           round(scores['rouge-1']['p'], 4),
                                           round(scores['rouge-1']['f'], 4)))

# Print ROUGE-L scores in a formatted row
print("{:<10} {:<15} {:<15} {:<15}".format('ROUGE-L',
                                           round(scores['rouge-l']['r'], 4),
                                           round(scores['rouge-l']['p'], 4),
                                           round(scores['rouge-l']['f'], 4)))

위 코드에서 ROUGE를 사용하여 LLM을 평가한 방법을 분석해 보겠습니다.

  • 1~2행: 라이브러리와 라이브러리 Rouge에서 클래스를 가져옵니다 .  클래스는 생성된 텍스트를 참조 텍스트와 비교하여 텍스트 생성 작업(예: 번역 또는 요약)의 ​​품질을 평가하는 데 사용됩니다. 라이브러리 는 데이터 조작 및 분석에 사용됩니다.rougepandasRougepandas
  • 5 행 :pandas .  gpt2_generated_lyrics.csv파일에는 언어 모델(예: )에 의해 생성된 가사 열과 Generated_Lyrics실제 노래 가사(예: )를 포함하여 노래 가사에 대한 데이터가 포함되어 있습니다 Expected_Lyrics.
  • 8행: 클래스 의 객체를 인스턴스화합니다 Rouge. 이 개체는 특히 텍스트 생성과 관련된 작업의 경우 자연어 처리의 일반적인 평가 지표인 ROUGE 점수를 계산하는 데 사용됩니다.
  • 11-13행: DataFrame에서 Generated_Lyrics해당 및 해당 예제를 인쇄합니다 . Expected_Lyrics이는 생성된 가사가 예상 가사와 질적으로 어떻게 비교되는지 이해하기 위해 수행됩니다.
  • 16~17행: 전체 데이터세트에 대해 생성된 가사와 예상 가사 사이의 평균 ROUGE 점수를 계산하고 저장합니다.  get_scores방법은 생성된 가사와 예상 가사의 각 쌍에 대해 재현율, 정밀도 및 F-1 점수와 같은 측정값을 포함하는 ROUGE 점수를 계산한 다음 평균을 냅니다.
  • 20행: ROUGE 점수를 표시할 테이블의 형식화된 헤더를 인쇄합니다. 테이블에는 측정항목 이름, 재현율, 정밀도 및 F-1 점수 열이 포함됩니다.
  • 23-26행: 재현율, 정밀도 및 F-1 점수에 대한 측정값을 포함하여 평균 ROUGE-1 점수(생성된 텍스트와 예상 텍스트 사이의 유니그램 중첩에 중점을 둡니다)를 형식화된 행에 인쇄합니다. 소수점 네 자리.
  • 29-32행: 마찬가지로, 재현율, 정밀도 및 F-1 점수에 대한 측정값을 다시 포함하여 평균 ROUGE-L 점수(생성된 텍스트와 예상 텍스트 사이의 가장 긴 공통 하위 시퀀스에 초점을 맞춤)를 서식이 지정된 행에 인쇄합니다. 각각 소수점 이하 4자리로 반올림되었습니다.

참고: 위 코드를 실행하면 생성된 가사의 ROUGE-N 및 ROUGE-L 점수가 0.50 주변에 군집된 것을 볼 수 있습니다. 텍스트 생성 모델을 평가하는 맥락에서 이는 일반적으로 좋은 점수로 간주됩니다. 이는 본질적으로 생성된 가사의 n-그램(ROGE-N의 경우)과 가장 긴 공통 하위 시퀀스(ROGE-L의 경우)의 약 50%가 예상 가사의 항목과 일치함을 의미합니다.

위의 코드를 자유롭게 수정하여 LLM이 데이터 세트의 다양한 행을 확인하여 다양한 노래에 대한 텍스트를 완성한 방법을 확인하세요 lyrics_df.

결론 

이 시점에서 우리는 맞춤형 텍스트 생성 기능 활용부터 성능 평가에 이르기까지 대규모 언어 모델에 대한 탄탄한 이해를 구축했습니다. 이 여정을 통해 우리는 대규모 언어 모델을 워크플로에 효과적으로 통합하는 데 필요한 기술과 통찰력을 갖추게 되었고, 복잡한 언어 작업을 자신감 있고 정확하게 처리할 수 있는 능력을 향상시켰습니다.

 

#두가지 모델 루즈로 평가

from transformers import pipeline
from rouge import Rouge 

german_proverb = "Anfangen ist leicht, beharren eine Kunst"

correct_translation = "To begin is easy, to persist is an art."

# FLAN-T5-Small test

flan_pipe = pipeline("text2text-generation", model="google/flan-t5-small")

flan_result = flan_pipe("Translate to English: " + german_proverb)[0]['generated_text']

# Display the generated text
print("Flan Translation: " + flan_result + "\n")

# mT0-small test

mt0_pipe = pipeline("text2text-generation", model="bigscience/mt0-small")

mt0_result = mt0_pipe("Translate to English: " +  german_proverb)[0]['generated_text']

# Display the generated text
print("MT0 Translation: " + mt0_result + "\n")

# ROUGE-1 Evaluation

rouge = Rouge()

# Calculate and return average ROUGE scores between generated and expected translation
flan_scores = rouge.get_scores(flan_result, 
                correct_translation, avg=True)

mt0_scores = rouge.get_scores(mt0_result, 
                correct_translation, avg=True)

# Print the header of the table
print("{:<10} {:<15} {:<15} {:<15}".format('', 'Recall', 'Precision', 'F-1 Score'))

# Print ROUGE-1 scores in a formatted row
print("{:<10} {:<15} {:<15} {:<15}".format('flan',
                                           round(flan_scores['rouge-1']['r'], 4),
                                           round(flan_scores['rouge-1']['p'], 4),
                                           round(flan_scores['rouge-1']['f'], 4)))

# Print ROUGE-1 scores in a formatted row
print("{:<10} {:<15} {:<15} {:<15}".format('mt0',
                                           round(mt0_scores['rouge-1']['r'], 4),
                                           round(mt0_scores['rouge-1']['p'], 4),
                                           round(mt0_scores['rouge-1']['f'], 4)))

설명
솔루션의 각 줄에서 무슨 일이 일어나고 있는지 분석해 보겠습니다.

1~2행:pipeline 변환기 라이브러리에서 함수를 가져오고 라이브러리 Rouge에서 클래스를 가져 옵니다 rouge. 이 기능은 라이브러리 pipeline의 모델에 대해 사용하기 쉬운 인터페이스를 만드는 데 사용되며 특히 번역 및 요약에서 텍스트 생성 작업을 평가하는 데 사용됩니다.transformersRouge

4-6행: 독일 속담과 정확한 영어 번역을 정의합니다. 이는 번역 모델을 테스트하고 성능을 평가하는 데 사용됩니다.

10-15행: 모델을 사용하여 번역 파이프라인을 초기화 google/flan-t5-small하고 독일 속담을 영어로 번역합니다. 결과는 에 저장된 flan_result후 인쇄됩니다.

17-24행: 모델을 사용하여 다른 번역 파이프라인을 초기화하고 bigscience/mt0-small동일한 독일어 속담을 영어로 번역합니다. 결과는 에 저장된 mt0_result후 인쇄됩니다.

28-35행: ROUGE 평가자를 초기화합니다. 이 도구는 생성된 번역을 올바른 번역과 비교하여 품질을 평가하는 데 사용됩니다. FLAN-T5-Small 및 mTO-small 모델에 의해 생성된 번역에 대한 평균 루즈 점수를 올바른 번역과 비교하여 계산합니다.

37-50행: ROUGE 점수를 표시할 테이블의 헤더를 인쇄합니다. 테이블에는 모델 이름, 재현율, 정밀도 및 F-1 점수에 대한 열이 있습니다. 두 모델 모두에 해당하는 ROUGE-1 점수를 인쇄합니다.

반응형

'딥러닝' 카테고리의 다른 글

AI-102  (0) 2024.03.16
시험 AI-900  (0) 2024.03.16
modeling 없이 chatGPT를 만드는 방법  (0) 2024.02.20
torch, book  (0) 2024.01.12
Gen AI 소개  (1) 2024.01.06
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/06   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30
글 보관함