Transformers documentation
Nedensel dil modellemesi
Nedensel dil modellemesi
İki tür dil modellemesi vardır: nedensel (causal) ve maskeli (masked). Bu kılavuz, nedensel dil modellemesini ele alır. Nedensel dil modelleri genellikle metin üretimi için kullanılır. Bu modelleri, kendi maceranıza karar verdiğiniz metin tabanlı macera oyunları veya Copilot, CodeParrot gibi akıllı kodlama asistanları gibi yaratıcı uygulamalarda kullanabilirsiniz.
Nedensel dil modellemesi, bir token dizisindeki sonraki token'ı tahmin eder ve model yalnızca soldaki token'lara dikkat edebilir. Bu, modelin gelecekteki token'lara bakamadığı anlamına gelir. GPT-2, nedensel bir dil modelinin örneğidir.
Bu kılavuz size şunları gösterecektir:
- ELI5 veri setinin r/askscience alt kümesinde DistilGPT2 modelini ince ayarlayın.
- İnce ayarlanmış modelinizi çıkarım için kullanın.
Bu görevle uyumlu tüm mimarileri ve denetim noktalarını görmek için görev sayfasını kontrol etmenizi öneririz.
Başlamadan önce, gerekli tüm kütüphanelerin yüklendiğinden emin olun:
pip install transformers datasets evaluate
Modelinizi yükleyip toplulukla paylaşabilmeniz için Hugging Face hesabınıza giriş yapmanızı öneririz. İstendiğinde giriş yapmak için token'ınızı girin:
>>> from huggingface_hub import notebook_login
>>> notebook_login()ELI5 veri setini yükle
Önce 🤗 Datasets kütüphanesiyle ELI5-Category veri setinden ilk 5000 örneği yükleyerek başlayın. Bu, tam veri setinde eğitim için daha fazla zaman harcamadan önce deneyler yapmanıza ve her şeyin çalıştığını doğrulamanıza olanak tanır.
>>> from datasets import load_dataset
>>> eli5 = load_dataset("dany0407/eli5_category", split="train[:5000]")Veri setinin train bölümünü train_test_split yöntemiyle eğitim ve test kümesine ayırın:
>>> eli5 = eli5.train_test_split(test_size=0.2)Sonra bir örneğe göz atın:
>>> eli5["train"][0]
{'q_id': '7h191n',
'title': 'What does the tax bill that was passed today mean? How will it affect Americans in each tax bracket?',
'selftext': '',
'category': 'Economics',
'subreddit': 'explainlikeimfive',
'answers': {'a_id': ['dqnds8l', 'dqnd1jl', 'dqng3i1', 'dqnku5x'],
'text': ["The tax bill is 500 pages long and there were a lot of changes still going on right to the end. It's not just an adjustment to the income tax brackets, it's a whole bunch of changes. As such there is no good answer to your question. The big take aways are: - Big reduction in corporate income tax rate will make large companies very happy. - Pass through rate change will make certain styles of business (law firms, hedge funds) extremely happy - Income tax changes are moderate, and are set to expire (though it's the kind of thing that might just always get re-applied without being made permanent) - People in high tax states (California, New York) lose out, and many of them will end up with their taxes raised.",
'None yet. It has to be reconciled with a vastly different house bill and then passed again.',
'Also: does this apply to 2017 taxes? Or does it start with 2018 taxes?',
'This article explains both the House and senate bills, including the proposed changes to your income taxes based on your income level. URL_0'],
'score': [21, 19, 5, 3],
'text_urls': [[],
[],
[],
['https://www.investopedia.com/news/trumps-tax-reform-what-can-be-done/']]},
'title_urls': ['url'],
'selftext_urls': ['url']}Bu çok fazla görünse de, asıl ilgilendiğiniz alan text alanıdır. Dil modelleme görevlerinin güzel yanı, etiketlere (ayrıca denetimsiz görev olarak da bilinir) ihtiyaç duymamanızdır; çünkü bir sonraki kelime etikettir.
Ön işleme
Bir sonraki adım, text alt alanını işlemek için bir DistilGPT2 tokenizer yüklemektir:
>>> from transformers import AutoTokenizer
>>> tokenizer = AutoTokenizer.from_pretrained("distilbert/distilgpt2")Yukarıdaki örnekte text alanının aslında answers içinde iç içe yerleştirildiğini göreceksiniz. Bu, text alt alanını iç içe yapısından flatten metoduyla çıkarmanız gerektiği anlamına gelir:
>>> eli5 = eli5.flatten()
>>> eli5["train"][0]
{'q_id': '7h191n',
'title': 'What does the tax bill that was passed today mean? How will it affect Americans in each tax bracket?',
'selftext': '',
'category': 'Economics',
'subreddit': 'explainlikeimfive',
'answers.a_id': ['dqnds8l', 'dqnd1jl', 'dqng3i1', 'dqnku5x'],
'answers.text': ["The tax bill is 500 pages long and there were a lot of changes still going on right to the end. It's not just an adjustment to the income tax brackets, it's a whole bunch of changes. As such there is no good answer to your question. The big take aways are: - Big reduction in corporate income tax rate will make large companies very happy. - Pass through rate change will make certain styles of business (law firms, hedge funds) extremely happy - Income tax changes are moderate, and are set to expire (though it's the kind of thing that might just always get re-applied without being made permanent) - People in high tax states (California, New York) lose out, and many of them will end up with their taxes raised.",
'None yet. It has to be reconciled with a vastly different house bill and then passed again.',
'Also: does this apply to 2017 taxes? Or does it start with 2018 taxes?',
'This article explains both the House and senate bills, including the proposed changes to your income taxes based on your income level. URL_0'],
'answers.score': [21, 19, 5, 3],
'answers.text_urls': [[],
[],
[],
['https://www.investopedia.com/news/trumps-tax-reform-what-can-be-done/']],
'title_urls': ['url'],
'selftext_urls': ['url']}Her alt alan, answers önekiyle belirtildiği üzere artık ayrı bir sütundur ve text alanı artık bir listedir. Her cümleyi ayrı ayrı tokenleştirmek yerine, listeyi bir dizeye dönüştürerek bunları birlikte tokenleştirebilirsiniz.
Her örnek için string listesini birleştirip sonucu tokenlaştıran ilk ön işleme fonksiyonu aşağıdadır:
>>> def preprocess_function(examples):
... return tokenizer([" ".join(x) for x in examples["answers.text"]])Bu ön işleme fonksiyonunu tüm veri setine uygulamak için 🤗 Datasets map yöntemini kullanın. map fonksiyonunu, veri setinin birden çok öğesini aynı anda işlemek için batched=True ayarlayarak ve num_proc ile işlem sayısını artırarak hızlandırabilirsiniz. İhtiyacınız olmayan sütunları kaldırın:
>>> tokenized_eli5 = eli5.map(
... preprocess_function,
... batched=True,
... num_proc=4,
... remove_columns=eli5["train"].column_names,
... )Bu veri seti token dizilerini içerir, ancak bunlardan bazıları modelin maksimum giriş uzunluğundan daha uzundur.
Artık ikinci bir ön işleme işlevi kullanabilirsiniz
- tüm dizileri birleştirin
- Birleştirilen dizileri,
block_sizeile tanımlanan ve hem maksimum giriş uzunluğundan kısa hem de GPU RAM'iniz için yeterince kısa olan daha kısa parçalara ayırın.
>>> block_size = 128
>>> def group_texts(examples):
... # Concatenate all texts.
... concatenated_examples = {k: sum(examples[k], []) for k in examples.keys()}
... total_length = len(concatenated_examples[list(examples.keys())[0]])
... # We drop the small remainder, we could add padding if the model supported it instead of this drop, you can
... # customize this part to your needs.
... if total_length >= block_size:
... total_length = (total_length // block_size) * block_size
... # Split by chunks of block_size.
... result = {
... k: [t[i : i + block_size] for i in range(0, total_length, block_size)]
... for k, t in concatenated_examples.items()
... }
... result["labels"] = result["input_ids"].copy()
... return resultTüm veri seti üzerinde group_texts fonksiyonunu uygulayın:
>>> lm_dataset = tokenized_eli5.map(group_texts, batched=True, num_proc=4)Şimdi DataCollatorForLanguageModeling kullanarak örneklerden oluşan bir batch oluşturun. Veri setinin tamamını maksimum uzunluğa kadar doldurmak yerine, collation sırasında cümleleri batch içindeki en uzun uzunluğa dinamik olarak doldurmak daha verimlidir.
Son dizgi simgesini dolgu simgesi olarak kullanın ve mlm=False olarak ayarlayın. Bu, girdileri bir öğe sağa kaydırılmış etiketler olarak kullanacaktır:
>>> from transformers import DataCollatorForLanguageModeling
>>> tokenizer.pad_token = tokenizer.eos_token
>>> data_collator = DataCollatorForLanguageModeling(tokenizer=tokenizer, mlm=False)Eğit
Trainer ile bir modeli ince ayar yapma konusunda deneyiminiz yoksa, temel öğreticiye göz atın!
Artık modelinizi eğitmeye hazırsınız! AutoModelForCausalLM ile DistilGPT2'yi yükleyin:
>>> from transformers import AutoModelForCausalLM, TrainingArguments, Trainer
>>> model = AutoModelForCausalLM.from_pretrained("distilbert/distilgpt2")Bu noktada yalnızca üç adım kaldı:
- Eğitim hiperparametrelerinizi TrainingArguments içinde tanımlayın. Tek zorunlu parametre, modelinizi nereye kaydedeceğinizi belirleyen
output_dir'dir. Modelinizi Hub'apush_to_hub=Trueayarlayarak yükleyeceksiniz (modelinizi yüklemek için Hugging Face'e giriş yapmış olmanız gerekir). - Eğitim argümanlarını, model, veri kümeleri ve veri toplayıcıyla birlikte Trainer'a iletin.
- Modelinizi ince ayar yapmak için train() çağrın.
>>> training_args = TrainingArguments(
... output_dir="my_awesome_eli5_clm-model",
... eval_strategy="epoch",
... learning_rate=2e-5,
... weight_decay=0.01,
... push_to_hub=True,
... )
>>> trainer = Trainer(
... model=model,
... args=training_args,
... train_dataset=lm_dataset["train"],
... eval_dataset=lm_dataset["test"],
... data_collator=data_collator,
... processing_class=tokenizer,
... )
>>> trainer.train()Eğitim tamamlandıktan sonra, modelinizi değerlendirmek ve perplexity değerini almak için evaluate() yöntemini kullanın:
>>> import math
>>> eval_results = trainer.evaluate()
>>> print(f"Perplexity: {math.exp(eval_results['eval_loss']):.2f}")
Perplexity: 49.61Sonra modelinizi herkesin kullanabilmesi için push_to_hub() yöntemiyle Hub'a paylaşın:
>>> trainer.push_to_hub()Neden-sonuç dil modellemesi için bir modelin nasıl ince ayar yapılacağına dair daha ayrıntılı bir örnek için ilgili PyTorch defterine göz atın.
Çıkarım
Harika, bir model ayarladıktan sonra artık çıkarım için kullanabilirsiniz!
Metin üretmek istediğiniz bir istem belirleyin:
>>> prompt = "Somatic hypermutation allows the immune system to"Eğitimini tamamladığınız modeli çıkarım için denemenin en basit yolu, onu bir pipeline() içinde kullanmaktır. Modelinizle metin üretimi için bir pipeline örneği oluşturun ve metninizi ona iletin:
>>> from transformers import pipeline
>>> generator = pipeline("text-generation", model="username/my_awesome_eli5_clm-model")
>>> generator(prompt)
[{'generated_text': "Somatic hypermutation allows the immune system to be able to effectively reverse the damage caused by an infection.\n\n\nThe damage caused by an infection is caused by the immune system's ability to perform its own self-correcting tasks."}]Metni tokenleştirin ve input_ids değerlerini PyTorch tensörleri olarak döndürün:
>>> from transformers import AutoTokenizer
>>> tokenizer = AutoTokenizer.from_pretrained("username/my_awesome_eli5_clm-model")
>>> inputs = tokenizer(prompt, return_tensors="pt").input_idsMetin üretmek için generate() yöntemini kullanın. Farklı metin üretim stratejileri ve üretimi kontrol etmek için kullanılan parametreler hakkında daha fazla ayrıntı için Text generation strategies sayfasına göz atın.
>>> from transformers import AutoModelForCausalLM
>>> model = AutoModelForCausalLM.from_pretrained("username/my_awesome_eli5_clm-model")
>>> outputs = model.generate(inputs, max_new_tokens=100, do_sample=True, top_k=50, top_p=0.95)Oluşturulan token kimliklerini metne geri dönüştürün:
>>> tokenizer.batch_decode(outputs, skip_special_tokens=True)
["Somatic hypermutation allows the immune system to react to drugs with the ability to adapt to a different environmental situation. In other words, a system of 'hypermutation' can help the immune system to adapt to a different environmental situation or in some cases even a single life. In contrast, researchers at the University of Massachusetts-Boston have found that 'hypermutation' is much stronger in mice than in humans but can be found in humans, and that it's not completely unknown to the immune system. A study on how the immune system"]