내 연락처 정보
우편메소피아@프로톤메일.com
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
오늘날의 자연어 처리(NLP) 분야에서 감정 인식은 매우 중요한 응용 시나리오입니다. 지능형 고객 서비스, 소셜 미디어 분석 또는 감성 컴퓨팅 분야에서 사용자의 감정을 정확하게 식별하면 사용자 경험과 시스템의 지능 수준을 크게 향상시킬 수 있습니다. 강력한 사전 훈련된 언어 모델인 BERT(BiDirectional Encoder Representations from Transformers)는 여러 NLP 작업에서 탁월한 성능을 입증했습니다. 이번 블로그에서는 MindSpore 프레임워크를 기반으로 BERT 모델을 사용하여 대화형 감정 인식을 달성하는 방법을 자세히 소개합니다. 단계별 코드 예제와 자세한 설명을 통해 이 기술을 익히도록 도와주세요.
BERT(BiDirectional Encoder Representations from Transformers)는 Transformer 기반 양방향 인코더 표현 모델입니다. 주로 MLM(Masked Language Model)과 NSP(Next Sentence Prediction)라는 두 가지 사전 학습 작업을 통해 단어 및 문장 수준 표현을 캡처합니다.
BERT는 사전 훈련된 후에 텍스트 분류, 유사성 판단, 독해 등과 같은 다양한 다운스트림 작업에 사용될 수 있습니다.
데이터 세트 준비 부분에서는 Baidu Feipiao 팀에서 제공하는 로봇 채팅 데이터 세트를 다운로드하고 압축을 풀었습니다. 이 데이터세트는 전처리되었으며 감정 라벨을 포함하고 있습니다. 데이터의 각 행은 레이블과 단어로 구분된 텍스트로 구성됩니다. 라벨은 감정 카테고리(0은 부정적, 1은 중립, 2는 긍정적)를 나타내며, 텍스트는 사용자의 대화 내용입니다. 이 구조화된 데이터를 사용하면 감정 분류 작업을 보다 편리하게 수행할 수 있습니다.
# 下载数据集
!wget https://baidu-nlp.bj.bcebos.com/emotion_detection-dataset-1.0.0.tar.gz -O emotion_detection.tar.gz
!tar xvf emotion_detection.tar.gz
데이터 세트 형식은 다음과 같습니다.
label--text_a
0--谁骂人了?我从来不骂人,我骂的都不是人,你是人吗 ?
1--我有事等会儿就回来和你聊
2--我见到你很高兴谢谢你帮我
데이터 로딩 및 전처리는 기계 학습 프로세스에서 중요한 단계입니다.우리는 사용했었다GeneratorDataset
데이터를 로드하고 매핑 작업을 사용하여 텍스트를 모델에 허용되는 형식으로 변환합니다.구체적으로 우리는BertTokenizer
텍스트를 어휘 ID로 토큰화하고 패드 작업을 수행합니다. 그 목적은 모든 입력 시퀀스의 길이를 일관되게 유지하여 훈련 효율성과 모델 성능을 향상시키는 것입니다.
import numpy as np
from mindspore.dataset import text, GeneratorDataset, transforms
from mindnlp.transformers import BertTokenizer
def process_dataset(source, tokenizer, max_seq_len=64, batch_size=32, shuffle=True):
is_ascend = mindspore.get_context('device_target') == 'Ascend'
column_names = ["label", "text_a"]
dataset = GeneratorDataset(source, column_names=column_names, shuffle=shuffle)
type_cast_op = transforms.TypeCast(mindspore.int32)
def tokenize_and_pad(text):
if is_ascend:
tokenized = tokenizer(text, padding='max_length', truncation=True, max_length=max_seq_len)
else:
tokenized = tokenizer(text)
return tokenized['input_ids'], tokenized['attention_mask']
dataset = dataset.map(operations=tokenize_and_pad, input_columns="text_a", output_columns=['input_ids', 'attention_mask'])
dataset = dataset.map(operations=[type_cast_op], input_columns="label", output_columns='labels')
if is_ascend:
dataset = dataset.batch(batch_size)
else:
dataset = dataset.padded_batch(batch_size, pad_info={'input_ids': (None, tokenizer.pad_token_id), 'attention_mask': (None, 0)})
return dataset
tokenizer = BertTokenizer.from_pretrained('bert-base-chinese')
dataset_train = process_dataset(SentimentDataset("data/train.tsv"), tokenizer)
dataset_val = process_dataset(SentimentDataset("data/dev.tsv"), tokenizer)
dataset_test = process_dataset(SentimentDataset("data/test.tsv"), tokenizer, shuffle=False)
우리가 사용한 모델 구축 부분에서BertForSequenceClassification
감정 분류 작업을 수행합니다. 이 사전 학습된 모델은 대규모 말뭉치에 대해 학습되었으며 강력한 언어 이해 기능을 갖추고 있습니다. 사전 훈련된 가중치를 로드함으로써 감정 분류 작업에 대한 모델 성능을 크게 향상시킬 수 있습니다. 동시에 우리는 훈련 과정의 속도를 높일 뿐만 아니라 비디오 메모리 사용량을 줄여 제한된 하드웨어 리소스에서도 보다 효율적인 훈련을 달성하는 자동 혼합 정밀도 기술을 사용합니다.
옵티마이저와 평가 측정항목은 모델 학습의 중요한 구성요소입니다. 대규모 데이터와 복잡한 모델을 처리할 때 성능이 뛰어나기 때문에 Adam 옵티마이저를 선택했습니다. 평가 지표의 경우 정확도를 사용하여 모델의 성능을 측정합니다. 이러한 설정을 사용하면 훈련 중에 모델이 지속적으로 최적화되고 검증 세트에서 좋은 성능을 달성할 수 있습니다.
콜백 함수는 모델 훈련 과정에서 중요한 역할을 합니다. 두 가지 콜백 함수를 설정합니다.CheckpointCallback
그리고BestModelCallback
. 전자는 모델의 가중치를 정기적으로 저장하는 데 사용되는 반면, 후자는 가장 성능이 좋은 모델의 가중치를 자동으로 로드하는 데 사용됩니다. 이러한 콜백 함수를 통해 우리는 훈련 중에 중요한 모델 매개변수가 손실되지 않도록 하고 항상 가장 성능이 좋은 모델이 추론과 평가에 사용되도록 보장합니다.
from mindnlp.transformers import BertForSequenceClassification
from mindspore import nn
from mindnlp._legacy.amp import auto_mixed_precision
model = BertForSequenceClassification.from_pretrained('bert-base-chinese', num_labels=3)
model = auto_mixed_precision(model, 'O1')
optimizer = nn.Adam(model.trainable_params(), learning_rate=2e-5)
metric = Accuracy()
ckpoint_cb = CheckpointCallback(save_path='checkpoint', ckpt_name='bert_emotect', epochs=1, keep_checkpoint_max=2)
best_model_cb = BestModelCallback(save_path='checkpoint', ckpt_name='bert_emotect_best', auto_load=True)
trainer = Trainer(network=model, train_dataset=dataset_train,
eval_dataset=dataset_val, metrics=metric,
epochs=5, optimizer=optimizer, callbacks=[ckpoint_cb, best_model_cb])
trainer.run(tgt_columns="labels")
모델 검증 섹션에서는 검증 데이터 세트를 사용하여 모델의 성능을 평가합니다. 검증 세트에 대한 모델의 정확도를 계산함으로써 모델의 일반화 능력과 실제 효과를 이해할 수 있습니다. 이 단계는 모델 훈련 과정에서 발생할 수 있는 문제를 발견하고 그에 따른 조정 및 최적화를 수행하는 데 도움이 되기 때문에 매우 중요합니다.
evaluator = Evaluator(network=model, eval_dataset=dataset_test, metrics=metric)
evaluator.run(tgt_columns="labels")
모델 추론 섹션에서는 훈련된 모델을 사용하여 새 데이터에 대한 감정 분류를 수행하는 방법을 보여줍니다.우리는predict
텍스트를 입력하여 감정 예측을 수행하고 예측 결과를 출력하는 기능입니다. 이 단계에서는 모델의 실제 적용 기능을 보여주고 모델의 일반화 성능을 검증합니다.
dataset_infer = SentimentDataset("data/infer.tsv")
def predict(text, label=None):
label_map = {0: "消极", 1: "中性", 2: "积极"}
text_tokenized = Tensor([tokenizer(text).input_ids])
logits = model(text_tokenized)
predict_label = logits[0].asnumpy().argmax()
info = f"inputs: '{text}', predict: '{label_map[predict_label]}'"
if label is not None:
info += f" , label: '{label_map[label]}'"
print(info)
for label, text in dataset_infer:
predict(text, label)
마지막으로 사용자 정의 입력에 대한 감정 인식 모델을 사용하는 방법을 보여줍니다. 이 단계에서는 모델의 실제 적용 기능을 보여줄 뿐만 아니라 다양한 입력에서 모델의 성능을 검증합니다. 이러한 방식으로 우리는 모델의 일반화 능력과 실제 효과를 더 잘 이해할 수 있습니다.
predict("家人们咱就是说一整个无语住了 绝绝子叠buff")