τα στοιχεία επικοινωνίας μου
Ταχυδρομείο[email protected]
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Στο σημερινό πεδίο επεξεργασίας φυσικής γλώσσας (NLP), η αναγνώριση συναισθημάτων είναι ένα πολύ σημαντικό σενάριο εφαρμογής. Είτε στην έξυπνη εξυπηρέτηση πελατών, στην ανάλυση των μέσων κοινωνικής δικτύωσης ή στον τομέα των συναισθηματικών υπολογιστών, η ακριβής αναγνώριση των συναισθημάτων των χρηστών μπορεί να βελτιώσει σημαντικά την εμπειρία χρήστη και το επίπεδο νοημοσύνης του συστήματος. Το BERT (Bidirectional Encoder Representations from Transformers), ως ένα ισχυρό προεκπαιδευμένο μοντέλο γλώσσας, έχει επιδείξει την εξαιρετική του απόδοση σε πολλαπλές εργασίες NLP. Σε αυτό το ιστολόγιο, θα παρουσιάσουμε λεπτομερώς τον τρόπο χρήσης του μοντέλου BERT για την επίτευξη αναγνώρισης συναισθημάτων συνομιλίας με βάση το πλαίσιο MindSpore. Σας βοηθά να κατακτήσετε αυτήν την τεχνική με παραδείγματα κώδικα βήμα προς βήμα και λεπτομερείς εξηγήσεις.
Το BERT (Αμφίδρομες Αναπαραστάσεις Κωδικοποιητή από Μετασχηματιστές) είναι ένα μοντέλο αναπαράστασης αμφίδρομου κωδικοποιητή που βασίζεται σε μετασχηματιστή. Αποτυπώνει κυρίως αναπαραστάσεις σε επίπεδο λέξεων και προτάσεων μέσω δύο προεκπαιδευτικών εργασιών: Μοντέλο μάσκας γλώσσας (MLM) και Πρόβλεψη επόμενης πρότασης (NSP).
Αφού το 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
Μετατρέψτε το κείμενο σε ένα αναγνωριστικό λεξιλογίου και εκτελέστε μια λειτουργία pad. Ο σκοπός αυτού είναι να διασφαλιστεί ότι το μήκος όλων των ακολουθιών εισόδου είναι συνεπές, βελτιώνοντας έτσι την αποτελεσματικότητα της εκπαίδευσης και την απόδοση του μοντέλου.
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 optimizer λόγω της εξαιρετικής του απόδοσης όταν ασχολούμαστε με δεδομένα μεγάλης κλίμακας και πολύπλοκα μοντέλα. Όσον αφορά τους δείκτες αξιολόγησης, χρησιμοποιούμε την ακρίβεια για να μετρήσουμε την απόδοση του μοντέλου. Με αυτές τις ρυθμίσεις, μπορούμε να διασφαλίσουμε ότι το μοντέλο βελτιστοποιείται συνεχώς κατά τη διάρκεια της εκπαίδευσης και επιτυγχάνει καλή απόδοση στο σύνολο επικύρωσης.
Οι λειτουργίες επανάκλησης διαδραματίζουν σημαντικό ρόλο στη διαδικασία εκπαίδευσης του μοντέλου. Ρυθμίζουμε δύο λειτουργίες επανάκλησης: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")