과제 소개
문자 관계 분류는 특정 관계 목록에서 텍스트의 두 문자 사이의 관계를 판단하는 것을 말합니다. 개인 관계인 샘플을 亲戚 1837年6月20日,威廉四世辞世,他的侄女维多利亚即位。
예로 들어 엔터티 1 이고 엔터티 2입니다. 저자가 틈틈이 샘플 데이터 3881개를 직접 표기하여 분포도는 다음과 같다 . 설정합니다. 기사 NLP(21) 의 실제 캐릭터 관계 추출 전투에서 당시 2,900개 이상의 레이블링된 데이터가 있었고 BERT 벡터 추출 + BiGRU + Attention 모델을 사용하여 얻은 평균 F1 값은 78.97%였습니다 . article NLP (40 2) 문자 관계 분류 재시도에서 BERT 미세 조정(분류 작업으로)의 도움으로 얻은 평균 F1 값은 82.69%입니다. 기사 NLP(45) R-BERT's 문자 관계 분류 시도 및 케라스 코드 재생산에서는 관계 분류 작업 전용 R-BERT 모델의 도움으로 중국 로베르타 모델에서 얻은 F1 값은 85.35%이다 . Baichuan-7b를 나타내는 대형 모델(대형 언어 모델, LLM)의 중국 모델, 개인 관계 분류 작업을 미세 조정하여 성능을 확인합니다.亲戚
威廉四世
维多利亚
좋은 팁
모델 미세 조정을 시작하기 전에 좋은 프롬프트(Prompt)가 필요합니다. 우리는 GPT-4를 사용합니다:
프롬프트의 힘을 과소 평가하지 마십시오. 미세 조정 모델을 사용하는 과정에서 저자는 내가 작성한 프롬프트를 발견했습니다. GPT-4에서 제시한 것과는 달랐습니다. 즉, 트레이닝 결과의 F1 값에 3-4%의 차이가 있을 수 있습니다. Prompt 프로젝트의 중요성을 알 수 있습니다!
모델 미세 조정
위의 프롬프트를 사용하여 데이터 세트를 처리합니다(다중 대화 작업으로). 형식은 다음과 같습니다.
{
"conversation_id": 1,
"category": "relation classification",
"conversation": [
{
"human": "给定以下标签:['不确定', '夫妻', '父母', '兄弟姐妹', '上下级', '师生', '好友', '同学', '合作', '同一个人', '情侣', '祖孙', '同门', '亲戚'],请在以下句子中分析并分类实体之间的关系:'与李源澄论戴东原书'在这个句子中,戴东原和李源澄之间的关系应该属于哪个标签?",
"assistant": "不知道"
}
]
}
모델 미세 조정을 위해 Firefly 프레임워크를 사용하고 URL을 방문하십시오: https://github.com/yangjianxin1/Firefly 이 기사는 기본 모델로 Baichuan-7b를 기반으로 하며 QLora 교육을 사용합니다. 교육 매개변수는 다음과 같습니다. :
{
"output_dir": "output/firefly-baichuan-7b-people",
"model_name_or_path": "/home/test/baichun_7b",
"train_file": "./data/train.jsonl",
"num_train_epochs": 5,
"per_device_train_batch_size": 8,
"gradient_accumulation_steps": 2,
"learning_rate": 2e-4,
"max_seq_length": 256,
"logging_steps": 100,
"save_steps": 100,
"save_total_limit": 1,
"lr_scheduler_type": "constant_with_warmup",
"warmup_steps": 100,
"lora_rank": 64,
"lora_alpha": 16,
"lora_dropout": 0.05,
"gradient_checkpointing": true,
"disable_tqdm": false,
"optim": "paged_adamw_32bit",
"seed": 42,
"fp16": true,
"report_to": "tensorboard",
"dataloader_num_workers": 0,
"save_strategy": "steps",
"weight_decay": 0,
"max_grad_norm": 0.3,
"remove_unused_columns": false
}
명령줄을 사용하여 torchrun --nproc_per_node=2 train_qlora.py --train_args_file train_args/qlora/baichuan-7b-sft-qlora.json
훈련하고 훈련 시간은 약 20분이며 최종 훈련 손실은 0.0273입니다.
Firefly 프레임워크의 merge_lora.py에 모델 파일 경로를 설정하고 어댑터의 가중치를 Baichuan-7b 모델과 병합하고 병합하여 새 파일을 얻습니다 firefly-baichuan-7b-people-merge
.
Firefly 프레임워크에서 script/chat/single_chat.py 파일을 모방하여 API 호출 방식의 single_chat_server.py 파일에 다시 작성합니다. 코드는 다음과 같습니다.
# -*- coding: utf-8 -*-
# @place: Pudong, Shanghai
# @file: single_chat_server.py
# @time: 2023/7/25 22:27
from transformers import AutoModelForCausalLM, AutoTokenizer
import torch
# 单轮对话web服务
from flask import Flask, request, jsonify
app = Flask("single_chat_server")
@app.route('/people_rel_cls', methods=['POST'])
def predict():
req_dict = request.json
text, people1, people2 = req_dict["text"], req_dict["people1"], req_dict["people2"]
text = text.strip()
content = f"给定以下标签:['不确定', '夫妻', '父母', '兄弟姐妹', '上下级', '师生', '好友', '同学', " \
f"'合作', '同一个人', '情侣', '祖孙', '同门', '亲戚']," \
f"请在以下句子中分析并分类实体之间的关系:'{
text}'" \
f"在这个句子中,{
people1}和{
people2}之间的关系应该属于哪个标签?"
print(content)
input_ids = tokenizer(content, return_tensors="pt", add_special_tokens=False).input_ids.to(device)
with torch.no_grad():
outputs = model.generate(
input_ids=input_ids, max_new_tokens=max_new_tokens, do_sample=True,
top_p=top_p, temperature=temperature, repetition_penalty=repetition_penalty,
eos_token_id=tokenizer.eos_token_id
)
outputs = outputs.tolist()[0][len(input_ids[0]):]
response = tokenizer.decode(outputs)
print(outputs, response)
response = response.strip().replace(text, "").replace('</s>', "").replace('<s>', "").strip()
return jsonify({
"result": response})
if __name__ == '__main__':
model_name = "/home/test/Firefly/script/checkpoint/firefly-baichuan-7b-people-merge"
max_new_tokens = 5
top_p = 0.9
temperature = 0.01
repetition_penalty = 1.0
device = 'cuda:0'
input_pattern = '<s>{}</s>'
model = AutoModelForCausalLM.from_pretrained(
model_name,
trust_remote_code=True,
low_cpu_mem_usage=True,
torch_dtype=torch.float16,
).to(device).eval()
tokenizer = AutoTokenizer.from_pretrained(
model_name,
trust_remote_code=True,
# llama不支持fast
use_fast=False if model.config.model_type == 'llama' else True
)
print("model loaded!")
app.run(host="0.0.0.0", port=5000, threaded=True)
API 호출 방법을 사용하여 테스트 세트에서 모델 평가를 수행할 수 있습니다.
결과 비교
서로 다른 모델의 평가 결과(BERT 시대 전후의 모델 방법 포함)(모두 당시 모델의 SOTA 결과이거나 SOTA 결과에 가깝습니다)는 다음과 같습니다.
모델 방식 | 기본 모델 | F1 값 | 설명하다 |
---|---|---|---|
BERT 벡터 추출 + BiGRU + Attention | BiGRU+주의 | 78.97% | BERT 모델은 특징 추출로 처리 |
BERT cls 미세 조정 | 버트 | 82.69% | 텍스트 분류 작업으로 처리 |
R-BERT | 중국어-로버타-wwm-ext | 85.35% | BERT 시대의 관계형 분류 모델의 표현 |
R-BERT | 중국어-로버타-wwm-ext-large | 87.22% | BERT 시대의 관계형 분류 모델의 표현 |
큐로라 | 바이촨-7b | 88.25% | 다른 매개변수는 위에 나와 있습니다(epoch=5). |
큐로라 | 바이촨-7b | 89.15% | 다른 매개변수는 위에 나와 있습니다(epoch=10). |
문제가 있다
대형 모델 시대에 접어들면서 대형 모델은 기존 NLP 작업의 범위를 뛰어넘어 더욱 일반화되었으며, 위의 결과를 통해 기존 NLP 작업에서 대형 모델(Baichuan-7b)을 사용할 수 있음을 어렵지 않게 확인할 수 있습니다. (예: 저자 자신의 개인 관계 데이터 세트)는 더 나은 결과를 얻었고 우리의 인식과 일치하는 새로운 SOTA에 도달했습니다.
그러나 작성자의 모델을 미세 조정하는 과정에서 문제점이나 추가 검증이 필요한 부분도 많이 발견되었으며 그 기록은 다음과 같습니다.
- Baichuan-7b 모델은 SOTA 결과를 얻었지만 동일한 훈련 프레임워크와 훈련 매개변수를 사용하여 Baichuan-13B-Base 모델은 성능이 좋지 않거나 심지어 좋지 않았습니다.
- 학습 결과에 대한 다른 프롬프트의 영향, 예를 들어 저자가 작성한 프롬프트와 GPT-4가 작성한 프롬프트는 최종 결과에서 3-4%의 차이로 큰 차이가 있습니다.
- 동일한 모델에서 full, lora, qlora 세 가지 형태의 SFT를 사용하면 학습 결과가 어떻게 다릅니까?
앞으로 저자는 Baichuan-13B-Base를 미세 조정하기 위해 다양한 훈련 프레임워크를 사용하려고 노력할 것입니다.
요약 및 공유
이 기사는 Baichuan-7b 모델을 사용하여 문자 관계 분류 작업을 미세 조정하는 방법을 주로 소개하고 BERT 시대의 모델과 비교하여 새로운 SOTA에 도달했습니다. 단순, 주로 전통적인 NLP 문자에 대한 LLM의 성능을 테스트하기 위한 것
입니다. 이는 저자가 주목하고 구축해 온 데이터 세트이기도 한 저자 자신의 문자 관계 데이터 세트에 대한 효과 개선이기도 합니다. 이번에는 대형 모델이 또 한 번 충격을 줬습니다!
이 기사에서 사용된 개인 관계 데이터 세트는 HuggingFace Datasets에 오픈 소스로 제공되었으며 URL은 https://huggingface.co/datasets/jclian91/people_relation_classification 입니다 .
제 개인 블로그 URL은 https://percent4.github.io 입니다. / , 모두의 관심을 환영합니다 ~
참조
- NLP 실전(21) 캐릭터 관계 추출 : https://percent4.github.io/2023/07/08/NLP%EF%BC%88%E4%BA%8C%E5%8D%81%E4 % B8%80%EF%BC%89%E4%BA%BA%E7%89%A9%E5%85%B3%E7%B3%BB%E6%8A%BD%E5%8F%96%E7%9A % 84%E4%B8%80%E6%AC%A1%E5%AE%9E%E6%88%98/
- NLP(forty-two) 문자 관계 분류의 또 다른 시도: https://percent4.github.io/2023/07/10/NLP%EF%BC%88%E5%9B%9B%E5%8D%81%E4 %BA%8C%EF%BC%89%E4%BA%BA%E7%89%A9%E5%85%B3%E7%B3%BB%E5%88%86%E7%B1%BB%E7%9A %84%E5%86%8D%E6%AC%A1%E5%B0%9D%E8%AF%95/
- NLP(forty-five) R-BERT의 문자 관계 분류 및 Keras 코드 재생산 시도: https://percent4.github.io/2023/07/10/NLP%EF%BC%88%E5%9B% 9B%E5 %8D%81%E4%BA%94%EF%BC%89R-BERT%E5%9C%A8%E4%BA%BA%E7%89%A9%E5%85%B3%E7%B3% BB%E5 %88%86%E7%B1%BB%E4%B8%8A%E7%9A%84%E5%B0%9D%E8%AF%95%E5%8F%8AKEras%E4%BB%A3% E7%A0 %81%E5%A4%8D%E7%8E%B0/
- 수백억 개의 대형 모델을 훈련시키는 방법을 알려주는 Baichuan-13B 보모 튜토리얼 미세 조정: https://mp.weixin.qq.com/s/ZBY6kbogHjbCQvZBzNEqag
- HuggingFace 데이터 세트 people_relation_classification: https://huggingface.co/datasets/jclian91/people_relation_classification