Zoeken op website

Bereid een dataset voor voor training en validatie van een Large Language Model (LLM)


Introductie

Het genereren van een dataset voor het trainen van een taalmodel (LLM) omvat verschillende cruciale stappen om ervoor te zorgen dat het effectief is in het vastleggen van de nuances van taal. Van het selecteren van diverse tekstbronnen tot voorbewerking en het splitsen van de dataset, elke fase vereist aandacht voor detail. Bovendien is het van cruciaal belang om de omvang en complexiteit van de dataset in evenwicht te brengen om het leerproces van het model te optimaliseren. Door een goed gestructureerde dataset samen te stellen, legt men een sterke basis voor het opleiden van een LLM die in staat is om natuurlijke taal met vaardigheid en nauwkeurigheid te begrijpen en te genereren.

Deze korte handleiding helpt u bij het genereren van een classificatiegegevensset om een taalmodel (LLM) te trainen en te valideren. Hoewel de hier gemaakte dataset klein is, legt deze een solide basis voor verkenning en verdere ontwikkeling.

Voorwaarden

  • Basiskennis: Bekendheid met LLM-concepten en technieken voor gegevensvoorverwerking.
  • Gegevensbronnen: Toegang tot schone, diverse en relevante datasets in tekstformaat.
  • Toolkits: Installeer Python, bibliotheken zoals pandas, numpy en frameworks zoals TensorFlow of PyTorch.
  • Opslag: Voldoende rekenkracht voor het verwerken van grote datasets.

Datasets voor het verfijnen en opleiden van LLM's

Verschillende bronnen bieden geweldige datasets voor het verfijnen en trainen van uw LLM's. Een paar van hen staan hieronder vermeld: -

1. Kaggle: Kaggle host verschillende datasets in verschillende domeinen. U kunt datasets vinden voor NLP-taken, waaronder tekstclassificatie, sentimentanalyse en meer. Bezoek: Kaggle-datasets

2. Hugging Face-datasets: Hugging Face biedt grote datasets die speciaal zijn samengesteld voor natuurlijke taalverwerkingstaken. Ze bieden ook eenvoudige integratie met hun transformatorbibliotheek voor modeltraining. Bezoek: Datasets met knuffelende gezichten

3. Google Dataset Search: Google Dataset Search is een zoekmachine die speciaal is ontworpen om onderzoekers te helpen bij het vinden van online gegevens die vrij beschikbaar zijn voor gebruik. U kunt hier een verscheidenheid aan gegevenssets voor taalmodelleringstaken vinden. Bezoek: Google Dataset Zoeken

4.UCI Machine Learning Repository: Hoewel niet uitsluitend gericht op NLP, bevat de UCI Machine Learning Repository verschillende datasets die kunnen worden gebruikt voor taalmodellering en gerelateerde taken. Bezoek: UCI Machine Learning Repository

5.GitHub: GitHub host talloze repositories die datasets bevatten voor verschillende doeleinden, waaronder NLP. U kunt zoeken naar opslagplaatsen die verband houden met uw specifieke taak of modelarchitectuur. Bezoek: GitHub

6. Common Crawl: Common Crawl is een non-profitorganisatie die het web doorzoekt en haar archieven en datasets vrijelijk aan het publiek ter beschikking stelt. Het kan een waardevolle bron zijn voor het verzamelen van tekstgegevens voor taalmodellering. Bezoek: Common Crawl

7.OpenAI-datasets: OpenAI brengt periodiek datasets vrij voor onderzoeksdoeleinden. Deze datasets bevatten vaak grootschalige tekstcorpora die kunnen worden gebruikt voor het trainen van LLM's. Bezoek: OpenAI-datasets

Code om de gegevensset te maken en voor te bereiden

De code en het concept voor dit artikel zijn geïnspireerd op de uitstekende cursus van Sebastian Rashka, die uitgebreide inzichten biedt in het vanaf de grond opbouwen van een substantieel taalmodel.

1.We beginnen met het installeren van de benodigde pakketten,

import pandas as pd #for data processing, manipulation
import urllib.request #for downloading files from URLs zip file
import zipfile #to deal with zip file
import os #for dealing with the OS
from pathlib import Path  #for working with file paths

2. De onderstaande regels code helpen om de onbewerkte dataset te krijgen en te extraheren,

# getting the zip file from the url
url = "https://archive.ics.uci.edu/static/public/228/sms+spam+collection.zip"
data_zip_path = "sms_spam_collection.zip"
data_extracted_path = "sms_spam_collection"
data_file_path = Path(data_extracted_path) / "SMSSpamCollection.tsv"

3.Vervolgens gebruiken we de 'with'-instructie voor zowel het openen van de URL als het openen van het lokale bestand.

# Downloading the file
with urllib.request.urlopen(url) as response:
    with open(data_zip_path, "wb") as out_file:
        out_file.write(response.read())
Unzipping the file
with zipfile.ZipFile(data_zip_path, "r") as zip_ref:
    zip_ref.extractall(data_extracted_path)

4.De onderstaande code zorgt ervoor dat het gedownloade bestand correct wordt hernoemd met het ".tsv"-bestand

# Add .tsv file extension
original_file_path = Path(data_extracted_path) / "SMSSpamCollection"
os.rename(original_file_path, data_file_path)
print(f"File downloaded and saved as {data_file_path}")

Na succesvolle uitvoering van deze code krijgen we het bericht "Bestand gedownload en opgeslagen als sms_spam_collection/SMSSpamCollection.tsv"

5.Gebruik de pandas-bibliotheek om de opgeslagen dataset te laden en de gegevens verder te verkennen.

raw_text_df = pd.read_csv(data_file_path, sep="\t", header=None, names=["Label", "Text"])
raw_text_df.head()
print(raw_text_df["Label"].value_counts())

Etiket\nham 4825\nSpam 747\nNaam: count, dtype: int64

6.Laten we een functie definiëren met panda's om een evenwichtige dataset te genereren. In eerste instantie tellen we het aantal 'spam'-berichten en gaan we vervolgens verder met het willekeurig nemen van dezelfde steekproef om af te stemmen op het totale aantal spamgevallen.

def create_balanced_dataset(df):
  # Count the instances of "spam"
  num_spam_inst = raw_text_df[raw_text_df["Label"] == "spam"].shape[0]
  # Randomly sample "ham' instances to match the number of 'spam' instances
  ham_subset_df = raw_text_df[raw_text_df["Label"] == "ham"].sample(num_spam, random_state=123)
  # Combine ham "subset" with "spam"
  balanced_df = pd.concat([ham_subset_df, raw_text_df[raw_text_df["Label"] == "spam"]])
  return balanced_df

balanced_df = create_balanced_dataset(raw_text_df)

Laten we een value_count doen om de tellingen van 'spam' en 'ham' te controleren

print(balanced_df["Label"].value_counts())

Etiket\nham 747\nspam 747\nNaam: count, dtype: int64

Zoals we kunnen zien, is het dataframe nu in evenwicht.

#change the 'label' data to integer class
balanced_df['Label']= balanced_df['Label'].map({"ham":1, "spam":0})

7.Net, zullen we een functie schrijven die de dataset willekeurig zal splitsen om te trainen, te testen en te valideren.

def random_split(df, train_frac, valid_frac):
    df = df.sample(frac = 1, random_state = 123).reset_index(drop=True)
    train_end = int(len(df) * train_frac)
    valid_end = train_end + int(len(df) * valid_frac)

    train_df = df[:train_end]
    valid_df = df[train_end:valid_end]

    test_df = df[valid_end:]

    return train_df,valid_df,test_df

train_df, valid_df, test_df = random_split(balanced_df, 0.7, 0.1)

Sla vervolgens de gegevensset lokaal op.

train_df.to_csv("train_df.csv", index=None)
valid_df.to_csv("valid_df.csv", index=None)
test_df.to_csv("test_df.csv", index=None)

Conclusie

Het bouwen van een groot taalmodel (LLM) is vrij complex. Met dit steeds evoluerende AI-veld en nieuwe technologieën die opkomen, worden de dingen echter minder ingewikkeld. Van het leggen van de basis met robuuste algoritmen tot het verfijnen van hyperparameters en het beheren van enorme datasets, elke stap is van cruciaal belang bij het creëren van een model dat in staat is om mensachtige tekst te begrijpen en te genereren.

Een cruciaal aspect van het opleiden van LLM's is het creëren van hoogwaardige datasets. Dit omvat het zoeken naar diverse en representatieve tekstcorpora, het voorbewerken ervan om consistentie en relevantie te garanderen, en, misschien wel het belangrijkste, het samenstellen van uitgebalanceerde datasets om vooroordelen te voorkomen en de modelprestaties te verbeteren.

Hiermee kwamen we aan het einde van het artikel en begrepen we hoe gemakkelijk het is om een classificatiedataset te maken van een gescheiden bestand. We raden ten zeerste aan om dit artikel als basis te gebruiken en complexere gegevens te maken.

We hopen dat je het artikel leuk vond om te lezen!

Verwijzingen

  • Referentie van de code

Gerelateerde artikelen: