2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Nykypäivän luonnollisen kielen käsittelyn (NLP) alalla tunteiden tunnistus on erittäin tärkeä sovellusskenaario. Olipa kyseessä älykäs asiakaspalvelu, sosiaalisen median analyysi tai tunteiden laskeminen, käyttäjien tunteiden tarkka tunnistaminen voi parantaa huomattavasti käyttökokemusta ja järjestelmän älykkyyttä. BERT (Bidirectional Encoder Representations from Transformers) on tehokas esikoulutettu kielimalli, joka on osoittanut erinomaisen suorituskyvyn useissa NLP-tehtävissä. Tässä blogissa esittelemme yksityiskohtaisesti, kuinka BERT-mallia käytetään MindSpore-kehykseen perustuvan keskustelutunteen tunnistamiseen. Auta hallitsemaan tämä tekniikka vaiheittaisilla koodiesimerkeillä ja yksityiskohtaisilla selityksillä.
BERT (Bidirectional Encoder Representations from Transformers) on muuntajapohjainen kaksisuuntaisen kooderin esitysmalli. Se kaappaa pääasiassa sana- ja lausetason esityksiä kahdella esiopetustehtävällä: Masked Language Model (MLM) ja Next Sentence Prediction (NSP).
Kun BERT on esikoulutettu, sitä voidaan käyttää useisiin loppupään tehtäviin, kuten tekstin luokitteluun, samankaltaisuuden arviointiin, luetun ymmärtämiseen jne.
Tietojoukon valmisteluosassa latasimme ja purimme Baidu Feipiao -tiimin toimittaman robottikeskustelutietojoukon. Tämä tietojoukko on esikäsitelty ja sisältää tunnetunnisteita. Jokainen tietorivi koostuu tunnisteesta ja sanasegmentoidusta tekstistä. Tunniste edustaa tunneluokkaa (0 tarkoittaa negatiivista, 1 tarkoittaa neutraalia, 2 tarkoittaa positiivista) ja teksti on käyttäjän keskustelusisältöä. Käyttämällä tätä strukturoitua dataa voimme suorittaa tunteiden luokittelutehtäviä kätevämmin.
# 下载数据集
!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
Tietojoukon muoto on seuraava:
label--text_a
0--谁骂人了?我从来不骂人,我骂的都不是人,你是人吗 ?
1--我有事等会儿就回来和你聊
2--我见到你很高兴谢谢你帮我
Tietojen lataaminen ja esikäsittely ovat tärkeitä vaiheita koneoppimisprosessissa.me käytimmeGeneratorDataset
ladata tiedot ja käyttää kartoitustoimintoja muuntaaksesi tekstin mallin hyväksymään muotoon.Nimenomaan käytimmeBertTokenizer
Muokkaa teksti sanastotunnukseksi ja suorita näppäimistötoiminto. Tämän tarkoituksena on varmistaa, että kaikkien syöttösekvenssien pituus on johdonmukainen, mikä parantaa harjoittelun tehokkuutta ja mallin suorituskykyä.
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)
Käytössämme mallirakennusosassaBertForSequenceClassification
tunteiden luokittelutehtävien suorittamiseen. Tämä esikoulutettu malli on koulutettu laajamittaisille korpusille ja sillä on vahvat kielen ymmärtämisominaisuudet. Kuormaamalla esikoulutettuja painoja voimme parantaa merkittävästi mallin suorituskykyä tunteiden luokittelutehtävissä. Samaan aikaan käytämme automaattista sekoitettua tarkkuustekniikkaa, joka paitsi nopeuttaa harjoitusprosessia, myös vähentää videomuistin käyttöä, mikä tehostaa harjoittelua rajoitetuilla laitteistoresursseilla.
Optimoijat ja arviointimittarit ovat tärkeitä komponentteja mallikoulutuksessa. Valitsimme Adam-optimoijan sen erinomaisen suorituskyvyn vuoksi suuren mittakaavan datan ja monimutkaisten mallien käsittelyssä. Arviointiindikaattoreiden osalta käytämme tarkkuutta mittaamaan mallin suorituskykyä. Näillä asetuksilla voimme varmistaa, että mallia optimoidaan jatkuvasti harjoittelun aikana ja että se saavuttaa hyvän suorituskyvyn validointisarjassa.
Takaisinsoittotoiminnot ovat tärkeässä roolissa mallin koulutusprosessissa. Asetimme kaksi takaisinsoittotoimintoa:CheckpointCallback
jaBestModelCallback
. Ensin mainittua käytetään säännöllisesti mallin painojen säästämiseen, kun taas jälkimmäinen lataa automaattisesti parhaiten suoriutuneen mallin painot. Näiden takaisinkutsutoimintojen avulla varmistamme, että tärkeitä malliparametreja ei menetetä koulutuksen aikana ja että päättelyssä ja arvioinnissa käytetään aina parhaiten toimivaa mallia.
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")
Mallin validointiosiossa käytämme validointitietojoukkoa mallin suorituskyvyn arvioimiseen. Laskemalla mallin tarkkuuden validointijoukossa voimme ymmärtää mallin yleistyskyvyn ja todellisen vaikutuksen. Tämä vaihe on erittäin tärkeä, koska se voi auttaa meitä löytämään mahdolliset ongelmat mallin koulutusprosessissa ja tekemään vastaavat säädöt ja optimoinnit.
evaluator = Evaluator(network=model, eval_dataset=dataset_test, metrics=metric)
evaluator.run(tgt_columns="labels")
Mallin päättelyosiossa näytetään, kuinka harjoitettua mallia käytetään uusien tietojen tunteiden luokitteluun.Määritimme apredict
Toiminto, joka ennustaa tunteita syöttämällä tekstiä ja tulostaa ennustustuloksia. Tämä vaihe osoittaa mallin käytännön sovellusmahdollisuudet ja varmistaa mallin yleistyssuorituskyvyn.
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)
Lopuksi näytämme, kuinka mallia käytetään tunteiden tunnistamiseen mukautetulla syötteellä. Tämä vaihe ei ainoastaan osoita mallin käytännön sovellusmahdollisuuksia, vaan myös varmistaa mallin suorituskyvyn eri syötteillä. Näin voimme paremmin ymmärtää mallin yleistyskykyä ja todellista vaikutusta.
predict("家人们咱就是说一整个无语住了 绝绝子叠buff")