Berbagi teknologi

[MindSpore Learning Check-in] Praktek Penerapan Prinsip dan Praktek LLM-Menerapkan Dialog BERT Pengenalan Emosi Berdasarkan MindSpore

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Dalam bidang pemrosesan bahasa alami (NLP) saat ini, pengenalan emosi adalah skenario penerapan yang sangat penting. Baik dalam layanan pelanggan yang cerdas, analisis media sosial, atau di bidang komputasi emosional, mengidentifikasi emosi pengguna secara akurat dapat meningkatkan pengalaman pengguna dan tingkat kecerdasan sistem secara signifikan. BERT (Representasi Encoder Dua Arah dari Transformers), sebagai model bahasa terlatih yang kuat, telah menunjukkan kinerja luar biasa dalam berbagai tugas NLP. Di blog ini, kami akan memperkenalkan secara detail cara menggunakan model BERT untuk mencapai pengenalan emosi percakapan berdasarkan kerangka MindSpore. Bantu Anda menguasai teknik ini dengan contoh kode langkah demi langkah dan penjelasan mendetail.

Pengenalan model

BERT (BiDirectional Encoder Representations from Transformers) adalah model representasi encoder dua arah berbasis Transformer. Ini terutama menangkap representasi tingkat kata dan kalimat melalui dua tugas pra-pelatihan: Masked Language Model (MLM) dan Next Sentence Prediction (NSP).

  • Model Bahasa Tertopeng: Secara acak menutupi 15% kata dalam korpus, dan model perlu memprediksi kata-kata yang disamarkan tersebut.
  • Prediksi Kalimat Berikutnya: Model perlu memprediksi apakah terdapat hubungan berurutan antara dua kalimat.

Setelah BERT dilatih sebelumnya, BERT dapat digunakan untuk berbagai tugas hilir, seperti klasifikasi teks, penilaian kesamaan, pemahaman bacaan, dll.

Persiapan kumpulan data

Pada bagian persiapan kumpulan data, kami mengunduh dan mendekompresi kumpulan data obrolan robot yang disediakan oleh tim Baidu Feipiao. Kumpulan data ini telah diproses sebelumnya dan berisi label emosi. Setiap baris data terdiri dari label dan teks tersegmentasi kata. Label mewakili kategori emosi (0 berarti negatif, 1 berarti netral, 2 berarti positif), dan teks merupakan isi percakapan pengguna. Dengan menggunakan data terstruktur ini, kita dapat melakukan tugas klasifikasi sentimen dengan lebih nyaman.

# 下载数据集
!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
  • 1
  • 2
  • 3

Format kumpulan datanya adalah sebagai berikut:

label--text_a
0--谁骂人了?我从来不骂人,我骂的都不是人,你是人吗 ?
1--我有事等会儿就回来和你聊
2--我见到你很高兴谢谢你帮我
  • 1
  • 2
  • 3
  • 4

Pemuatan data dan prapemrosesan

Pemuatan dan prapemrosesan data merupakan langkah penting dalam proses pembelajaran mesin.kami menggunakanGeneratorDataset untuk memuat data dan menggunakan operasi pemetaan untuk mengubah teks menjadi format yang dapat diterima oleh model.Secara khusus, kami menggunakanBertTokenizer Tokenisasikan teks ke dalam ID kosakata dan lakukan operasi pad. Tujuannya adalah untuk memastikan bahwa panjang semua urutan masukan konsisten, sehingga meningkatkan efisiensi pelatihan dan kinerja model.

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)
  • 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
  • 31
  • 32

Masukkan deskripsi gambar di sini

Bangunan model

Di bagian pembuatan model yang kami gunakanBertForSequenceClassification untuk melakukan tugas klasifikasi emosi. Model terlatih ini telah dilatih pada korpora skala besar dan memiliki kemampuan pemahaman bahasa yang kuat. Dengan memuat bobot yang telah dilatih sebelumnya, kami dapat meningkatkan performa model secara signifikan pada tugas klasifikasi emosi. Pada saat yang sama, kami menggunakan teknologi presisi campuran otomatis, yang tidak hanya mempercepat proses pelatihan, namun juga mengurangi penggunaan memori video, sehingga mencapai pelatihan yang lebih efisien dengan sumber daya perangkat keras yang terbatas.

Pengoptimal dan metrik evaluasi merupakan komponen penting dalam pelatihan model. Kami memilih pengoptimal Adam karena kinerjanya yang luar biasa ketika menangani data berskala besar dan model yang kompleks. Dalam hal indikator evaluasi, kami menggunakan akurasi untuk mengukur kinerja model. Dengan pengaturan ini, kami dapat memastikan bahwa model terus dioptimalkan selama pelatihan dan mencapai performa yang baik pada set validasi.

Fungsi panggilan balik memainkan peran penting dalam proses pelatihan model. Kami menyiapkan dua fungsi panggilan balik:CheckpointCallbackDanBestModelCallback . Yang pertama digunakan untuk menyimpan bobot model secara teratur, sedangkan yang terakhir secara otomatis memuat bobot model yang berperforma terbaik. Melalui fungsi panggilan balik ini, kami memastikan bahwa parameter model yang penting tidak hilang selama pelatihan dan model dengan kinerja terbaik selalu digunakan untuk inferensi dan evaluasi.

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")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

Validasi model

Di bagian validasi model, kami menggunakan kumpulan data validasi untuk mengevaluasi performa model. Dengan menghitung keakuratan model pada set validasi, kita dapat memahami kemampuan generalisasi dan pengaruh aktual model. Langkah ini sangat penting karena dapat membantu kita menemukan kemungkinan masalah dalam proses pelatihan model dan melakukan penyesuaian serta pengoptimalan yang sesuai.

evaluator = Evaluator(network=model, eval_dataset=dataset_test, metrics=metric)
evaluator.run(tgt_columns="labels")
  • 1
  • 2

Penalaran model

Bagian inferensi model menunjukkan cara menggunakan model terlatih untuk melakukan klasifikasi sentimen pada data baru.Kami mendefinisikan apredict Fungsi yang melakukan prediksi emosi dengan memasukkan teks dan mengeluarkan hasil prediksi. Langkah ini menunjukkan kemampuan penerapan praktis model dan memverifikasi performa generalisasi model.

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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

Masukkan deskripsi gambar di sini

Data inferensi khusus

Terakhir, kami menunjukkan cara menggunakan model pengenalan emosi pada masukan khusus. Langkah ini tidak hanya mendemonstrasikan kemampuan penerapan praktis model, namun juga memverifikasi performa model dengan masukan yang berbeda. Dengan cara ini, kita dapat lebih memahami kemampuan generalisasi dan efek sebenarnya dari model tersebut.

predict("家人们咱就是说一整个无语住了 绝绝子叠buff")
  • 1

Masukkan deskripsi gambar di sini