NLP(63)는 Baichuan-7b 모델을 사용하여 문자 관계 분류 작업을 미세 조정합니다.

과제 소개

  문자 관계 분류는 특정 관계 목록에서 텍스트의 두 문자 사이의 관계를 판단하는 것을 말합니다. 개인 관계인 샘플을 亲戚 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에서 제공하는 관계 분류 프롬프트
  프롬프트의 힘을 과소 평가하지 마십시오. 미세 조정 모델을 사용하는 과정에서 저자는 내가 작성한 프롬프트를 발견했습니다. 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 입니다. / , 모두의 관심을 환영합니다 ~

참조

  1. 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/
  2. 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/
  3. 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/
  4. 수백억 개의 대형 모델을 훈련시키는 방법을 알려주는 Baichuan-13B 보모 튜토리얼 미세 조정: https://mp.weixin.qq.com/s/ZBY6kbogHjbCQvZBzNEqag
  5. HuggingFace 데이터 세트 people_relation_classification: https://huggingface.co/datasets/jclian91/people_relation_classification

추천

출처blog.csdn.net/jclian91/article/details/132005919