W&B로 ChatGPT 감성 분석 미세 조정하기
이 글은 W&B를 활용해 ChatGPT를 감정 분석용으로 파인튜닝하는 방법을 다룹니다. 우리의 실험은 정확도를 25% 향상시키며, 실제 적용 사례도 함께 살펴봅니다. 이 글은 AI 번역본입니다. 오역이 의심되는 부분은 댓글로 알려주세요.
Created on September 15|Last edited on September 15
Comment
오늘날 데이터 중심의 세계에서 감정 분석 는 수많은 주제에 대한 대중의 의견을 파악하는 데 핵심적인 역할을 합니다. 다음과 같은 고도화된 모델은 ChatGPT, 기반으로 구축된 GPT-3.5 아키텍처는 텍스트 데이터에서 인간의 감정을 이해하고 해석하는 데 엄청난 잠재력을 제공합니다.
하지만 많은 도구와 마찬가지로, 기본 설정만으로는 감정의 미묘한 뉘앙스를 충분히 포착하지 못할 수 있으며, 특히 Reddit처럼 다양성이 큰 데이터셋에서는 그 한계가 두드러질 수 있습니다.
이 글은 감정 분석을 위해 ChatGPT를 파인튜닝하는 과정을 깊이 있게 다루며, 강력한 기능을 갖춘 Weights & Biases 플랫폼, 그리고 직면한 개선점과 과제를 심층적으로 다룹니다.
이번 글에서 다룰 내용은 다음과 같습니다:
목차
ChatGPT는 감정 분석에 어떻게 활용될 수 있을까?GPT-3.5 아키텍처 간단 개요감성 분석을 위한 ChatGPT 파인튜닝데이터 준비와 라벨링현재 보유한 데이터셋파인튜닝을 위한 감정 분석 데이터 증강 데이터셋감정 분석을 위한 고품질 학습 데이터의 중요성단계별 튜토리얼A) 기존 모델 성능 평가B) ChatGPT 모델 파인튜닝C) 새로운 모델의 성능 평가하기미세 조정 결과와 분석실무 적용 사례 및 사용 예시전문 용어와 속어 이해전자상거래 상품 후기추가 개선 사항결론
시작해 봅시다!
ChatGPT는 감정 분석에 어떻게 활용될 수 있을까?
ChatGPT의 자연어를 이해하는 능력은 감정 분석에 적합하게 만듭니다. 사전에 정의된 응답에 의존하는 전통적인 챗봇과 달리, ChatGPT는 방대한 학습 데이터를 바탕으로 실시간으로 답변을 생성하기 때문입니다.
이러한 접근 방식은 광범위한 정보에 기반해 맥락에 맞는 응답을 제공할 수 있게 합니다.
GPT-3.5 아키텍처 간단 개요
GPT-3.5 모델은 … 분야에서 중요한 진전을 이뤘습니다. 자연어 처리. 이 모델은 다음과 같은 강점을 자랑합니다 1750억 개의 파라미터이는 본질적으로 모델이 학습 단계에서 조정하는 구성 요소들입니다.
이러한 파라미터들은 GPT-3.5가 인간 언어의 미묘함과 복잡성을 포착하고 재현할 수 있도록 합니다. 여기서 “3.5”는 이전 버전에서 한 단계 정교해졌음을 의미하며, 일관되고 맥락에 맞는 응답을 생성하는 능력이 향상되었음을 나타냅니다.
이 튜토리얼에서는 GPT‑3.5를 파인튜닝하여 감성 분석의 정확도를 향상시키는 방법을 다룹니다.
감성 분석을 위한 ChatGPT 파인튜닝
파인튜닝은 ChatGPT와 같은 범용 모델을 감성 분석과 같은 특정 작업에 맞게 적응시키는 데 핵심적인 단계입니다.
ChatGPT는 폭넓은 언어 이해 능력을 바탕으로 매우 다양한 주제와 개념을 파악할 수 있습니다. 그러나 감성 분석은 단순한 문장 이해를 넘어, 주관적인 어조와 분위기, 감정을 미묘하게 파악하는 능력을 요구합니다.
비꼼을 떠올려 보세요. 비꼼을 이해하는 일은 때로는 인간에게도 까다롭습니다. 비꼼은 겉으로는 어떤 말을 하지만 실제로는 그 반대를 의미하는 표현으로, 대개 농담이나 조롱의 뉘앙스를 띱니다. 예를 들어 막 밖에 나가려는 순간 비가 내리기 시작했는데 “아, 완벽한 타이밍이네!”라고 말한다면, 사실은 아주 안 좋은 타이밍이라는 뜻이므로 아마 비꼬는 표현일 것입니다.
이제 기계가 이것을 이해하려 한다고 생각해 보세요. 특별한 학습이 없다면, 당신이 “완벽해”라고 말했기 때문에 비가 와서 진짜로 기뻐한다고 오해할 수 있습니다. 바로 여기에서 ChatGPT 같은 모델을 파인튜닝하는 것이 중요해집니다.
기본 상태의 ChatGPT는 많은 텍스트를 이해하는 데 꽤 뛰어납니다. 인간 대부분이 평생 읽을 양보다 더 많은 데이터를 학습했죠. 하지만 비꼼은 미묘하고 종종 맥락이 필요합니다. 따라서 ChatGPT가 비꼼을 제대로 파악하도록 하려면, 비꼬는 문장의 다양한 예시에 충분히 노출시켜 반복적으로 패턴을 학습하게 해야 합니다.
하지만 문제는 여기 있습니다. 비꼼은 어디서나 똑같이 보이지 않습니다. 문화나 상황에 따라 한곳에서는 비꼰 표현이 다른 곳에서는 진지한 말일 수 있습니다. 그래서 일반적인 지식만으로는 충분하지 않습니다. 모델이 비꼼의 장난스러운 비틀림과 미묘한 뉘앙스를 제대로 이해하려면 구체적인 예시가 필요합니다.
요약하면, ChatGPT가 인간처럼 비꼼을 이해하려면 그에 대한 추가 학습이 필요합니다. 마치 어떤 사람이 코미디언의 유머 감각을 이해하기 시작하려면 코미디 쇼를 여러 편 봐야 하는 것과 같습니다.
데이터 준비와 라벨링
현재 보유한 데이터셋
이 튜토리얼에서는 Reddit 데이터셋을 활용하여 캐글, 다음을 통해 이용 가능 링크이 데이터셋에는 두 개의 핵심 열이 있습니다. clean_comment(감정이 담긴 텍스트)와 이에 대응하는 category(감정 레이블)입니다.

파인튜닝을 위한 감정 분석 데이터 증강 데이터셋
그럼에도 불구하고, 정교해진 ChatGPT 파인튜닝 프로세스는 최적의 학습을 위해 특정한 데이터 구조를 요구한다는 점을 유의해야 합니다. 아래는 제공된 기준에 따른 대표적인 데이터 형식입니다 ChatGPT 문서:
{"messages": [{"role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What's the capital of France?"}, {"role": "assistant", "content": "Paris, as if everyone doesn't know that already."}]}{"messages": [{"role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "Who wrote 'Romeo and Juliet'?"}, {"role": "assistant", "content": "Oh, just some guy named William Shakespeare. Ever heard of him?"}]}{"messages": [{"role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "How far is the Moon from Earth?"}, {"role": "assistant", "content": "Around 384,400 kilometers. Give or take a few, like that really matters."}]}
감정 분석을 위한 고품질 학습 데이터의 중요성
고품질 학습 데이터 감정 분석에서 이는 결정적입니다. 모델이 감정의 미묘한 뉘앙스를 정확히 구분하도록 학습시키기 때문입니다. 품질이 낮은 데이터는 오해를 불러일으켜 분석의 효과를 떨어뜨릴 수 있습니다. 반면, 포괄적이고 잘 정제된 데이터는 다양한 실제 환경 전반에서 모델의 일반화 능력을 크게 높일 수 있습니다. 우리가 사용하는 데이터셋은 이 점을 잘 보여 줍니다. 일부 항목은 뉘앙스가 워낙 섬세해서 사람조차도 감정을 판별하기 어려울 정도이기 때문입니다.
단계별 튜토리얼
A) 기존 모델 성능 평가
1단계: 필수 라이브러리 설치 및 임포트
!pip install openai!pip install wandb!pip install git+https://github.com/wandb/wandb.git@openai-finetuningimport osimport openaiimport wandbimport pandas as pdimport jsonfrom openai import OpenAIfrom wandb.integration.openai import WandbLogger
2단계: OpenAI API 키 설정
openai.api_key = "Insert your OpenAI API key here”
3단계: 감정 분석 데이터셋 불러오기 및 전처리
filename = "Insert the path to your data set here"# Read the CSVdf = pd.read_csv(filename)# Drop rows with NaN values in 'clean_comment' and 'category'df.dropna(subset=['clean_comment', 'category'], inplace=True)# Sample 100 rows from the datasetdf = df.sample(100)
4단계: 새로운 Weights & Biases 프로젝트 초기화
이 절에서는 새로 도입된 기능을 활용하여 WandbLogger() 함수로, W&B와 OpenAI의 통합을 간소화하도록 설계되었습니다. 이 도구는 ChatGPT를 포함한 OpenAI 모델의 파인튜닝 프로세스를 향상시키도록 맞춤화되어 있으며, 보다 단순하고 효율적인 절차를 제공합니다. 학습 과정 추적 및 모니터링, 성능 지표 시각화및 ���로 다른 실험 설정 비교
그 WandbLogger() 함수는 모델 파인튜닝의 세부 요소를 효율적으로 관리하고 분석할 수 있도록, 일관되고 사용자 친화적인 환경을 제공하는 데 핵심적인 역할을 합니다.
WandbLogger.sync(project="chatgpt3.5-fine-tuning-for-Sentiment-Analysis")
5단계: 모델을 테스트할 새 샘플 선택하기
df = df.sample(100)
6단계: 모델 응답을 감정 값으로 변환하는 함수와 그 반대 변환 함수 정의하기
def convert_response_to_sentiment(response):response = response.lower()if 'positive' in response:return 1elif 'negative' in response:return -1elif 'neutral' in response:return 0else:return -1 # Unknown sentimentdef convert_numeric_to_string_sentiment(value):if value == 1:return "positive"elif value == -1:return "negative"elif value == 0:return "neutral"else:return "unknown"
7단계: 기존 모델의 성능 평가하기
client = openai.Client()correct_predictions = 0loop_count = 0 # Counter for loop iterationsresults = []# Iterate over each row in the DataFramefor index, row in df.iterrows():loop_count += 1 # Increment the loop counttext = row['clean_comment'] # Adjusted column nametry:completion = client.chat.completions.create(model="gpt-3.5-turbo",messages=[{"role": "system", "content": "What is the sentiment of the following text? Please respond with 'positive', 'negative', or 'neutral'."},{"role": "user", "content": text},])response = completion.choices[0].message.contentpredicted_sentiment = convert_response_to_sentiment(response)results.append({"sentiment": text,"labeled_prediction": convert_numeric_to_string_sentiment(row['category']),"old_model_prediction": response})# Check if the predicted sentiment matches the actual sentimentif predicted_sentiment == row['category']: # Adjusted column namecorrect_predictions += 1# Print the current progress using loop_counttotal_rows = len(df)print(f"Processed {loop_count}/{total_rows} rows.")except Exception as e:print(f"Error on index {index}: {e}")continue
8단계: 기존 정확도 계산하기
accuracy = (correct_predictions / total_rows) * 100
9단계: 기존 정확도를 W&B에 로깅하기
wandb.log({"Old Accuracy": accuracy})print(f'Model Accuracy before: {accuracy:.2f}%')
출력: 기존 모델 정확도: 48.00%
B) ChatGPT 모델 파인튜닝
10단계: DataFrame을 원하는 JSONL 형식으로 변환하기
output_filename = "insert the directory in which to save the newly processed data set "# Convert DataFrame to the desired JSONL formatwith open(output_filename, "w") as file:for _, row in df.iterrows():# Map the target to its corresponding string labeltarget_label = {0: 'neutral',1: 'positive', # Corrected the spelling here-1: 'negative'}.get(row['category'], 'unknown')data = {"messages": [{"role": "system","content": "What is the sentiment of the following text? Please respond with 'positive', 'negative', or 'neutral'."},{"role": "user","content": row['clean_comment']},{"role": "assistant","content": target_label}]}# Write each data point as a separate line in the JSONL filefile.write(json.dumps(data) + "\n")
11단계: 생성한 파일을 OpenAI에 업로드하기
training_file = client.files.create(file=open(output_filename, "rb"),purpose='fine-tune')training_file_id = training_file.id
12단계: 새로운 파인튜닝 작업 생성하기
fine_tuning_job = client.fine_tuning.jobs.create(training_file=training_file_id,model="gpt-3.5-turbo")job_id = fine_tuning_job.id
C) 새로운 모델의 성능 평가하기
13단계: 새로운 모델의 성능 평가하기
새 모델 ID는 OpenAI를 통해 이메일로 발송됩니다.
model_id = "Insert here the new model’s ID"correct_predictions = 0loop_count = 0 # Counter for loop iterationsloop_index = 0 # Initialize loop_index# Iterate over each row in the DataFrame for the new modelfor index, row in df.iterrows():loop_count += 1 # Increment the loop counttext = row['clean_comment'] # Adjusted column nametry:completion = client.chat.completions.create(model=model_id,messages=[{"role": "system", "content": "What is the sentiment of the following text? Please respond with 'positive', 'negative', or 'neutral'."},{"role": "user", "content": text},])response = completion.choices[0].message.contentpredicted_sentiment = convert_response_to_sentiment(response)results[loop_index].update({"new_model_prediction": response})loop_index += 1 # Increment the loop index# Check if the predicted sentiment matches the actual sentimentif predicted_sentiment == row['category']: # Adjusted column namecorrect_predictions += 1# Print the current progress using loop_countprint(f"Processed {loop_count}/{total_rows} rows.")except Exception as e:print(f"Error on index {index}: {e}")continue
14단계: 새로운 정확도 계산하기
accuracy = (correct_predictions / total_rows) * 100
15단계: 새로운 정확도를 W&B에 기록하기
wandb.log({"New Accuracy": accuracy})print(f'Model Accuracy after: {accuracy:.2f}%')
출력: 모델 정확도 이후: 73.00%
16단계: W&B에서 신규 대비 기존 결과 비교 표 만들기
# Convert results list to DataFramedf_results = pd.DataFrame(results)# Log the entire DataFrame as a table to W&Bwandb.log({"results_table": wandb.Table(dataframe=df_results)})
17단계: Weights & Biases 실행 마무리
wandb.finish()
미세 조정 결과와 분석
처리가 완료되면 Weights & Biases (W&B) 링크가 생성됩니다. 이 링크를 클릭하여 로그에 접근하고 실험 결과를 확인하세요.

새 모델은 예측 정확도가 25% 크게 향상되었습니다. 이전 모델의 정확도가 48%였던 반면, 업데이트된 버전은 73%에 도달했습니다.
또한 100개 항목으로 구성된 표를 만들어 Weights & Biases 도구(16단계)를 사용해 저장했습니다. 이 표는 네 개의 열로 구성되어 있습니다: Sentiment, Labeled Prediction, Old Model Prediction, New Model Prediction. 수작업으로 확인함으로써 모델이 개선된 사례를 정확히 찾아낼 수 있습니다.
모델 평가의 복잡성은 W&B를 통해 더 간단해집니다. 다양한 정확도와 출력이 담긴 여러 표를 저장하고 비교할 수 있습니다. 미세 조정 과정을 조정하면서 개선점과 퇴보를 손쉽게 모니터링할 수 있어, 가능한 가장 높은 모델 정확도에 도달하는 과정을 효율화합니다.
예를 들어, 표시된 표에서 새 모델은 이전 모델이 잘못 분류했던 두 번째, 네 번째, 일곱 번째 행의 감성 레이블을 정확히 예측했습니다. 따라서 모델의 예측이 개선된 점과 함께 강점과 약점을 명확히 확인할 수 있습니다.
실무 적용 사례 및 사용 예시
전문 용어와 속어 이해
페이스북, 트위터, 레딧과 같은 소셜 미디어 플랫폼은 플랫폼별 속어, 밈, 특수 주제, 약어 등으로 특징지어지는 고유한 언어를 갖고 있습니다. 미세 조정을 통해 모델이 이러한 일상어를 정확히 해석하고 응답할 수 있어, 감성 이해도가 향상됩니다.
전자상거래 상품 후기
전자상거래 플랫폼은 상품 후기를 분석해 평점이 높은 제품이나 판매자를 식별하고, 그에 맞춰 추천 알고리즘을 조정할 수 있습니다.
추가 개선 사항
고작 100개의 학습 샘플만으로도 모델 성능이 25%나 개선되는 유의미한 결과를 확인했습니다. 이 초기 성과는 고무적이며 모델의 적응 능력을 잘 보여줍니다. 다만, 앞으로의 확장 가능성이 매우 크다는 점을 잊지 말아야 합니다. 대부분의 머신러닝 모델과 마찬가지로, 학습 데이터의 깊이와 다양성은 모델의 정밀도와 견고성과 밀접한 상관관계를 갖습니다.
예를 들어 학습 샘플을 1,000개 또는 10,000개로 늘리면 정확도가 향상될 뿐 아니라, 더 다양한 상황과 미묘한 뉘앙스를 처리할 수 있는 역량도 강화됩니다. 이처럼 방대한 데이터셋은 감정, 전문 용어, 맥락의 더 넓은 스펙트럼을 포괄하므로, 모델이 미세한 차이를 식별하는 능력을 높이고 오탐지나 누락을 줄이는 데 도움이 됩니다.
더욱이 학습 세트가 커지면 모델의 일반화 능력이 향상되어 특정 데이터 하위 집합에 과적합되는 현상을 최소화할 수 있습니다. 학습 규모를 확대해 가면서 모델이 어떻게 발전하는지 살펴보는 것도 흥미로울 것입니다. 소규모 샘플만으로도 유의미한 개선이 확인된 만큼, 학습 데이터를 정교화하고 확장하는 데 지속적으로 투자해야 한다는 강력한 근거가 됩니다.
결론
ChatGPT와 같은 강력한 모델을 미세 조정하는 것은 감성 분석처럼 특화된 작업에 매우 유망한 접근입니다. Weights & Biases의 지원을 바탕으로 진행한 우리의 탐구는 과제별 학습의 중요성뿐 아니라, 제한된 데이터 샘플만으로도 달성할 수 있는 잠재적 성능 향상이 매우 크다는 점을 보여 주었습니다.
감성 분석의 영역은 풍자적 어조를 이해하는 일부터 플랫폼별 은어를 해독하는 일까지 복잡성이 산재해 있습니다. 지속적인 발전과 정교해진 미세 조정 과정을 통해 ChatGPT와 같은 모델은 기업, 연구자, 개발자에게 없어서는 안 될 도구가 될 수 있습니다.
모델을 정교화해 나가는 여정은 중요한 교훈을 일깨워 줍니다. AI의 세계에서는 언제나 개선과 혁신의 여지가 존재합니다.
Add a comment