Using HappyTransformer for Text Generation and More
Install HappyTransformer
(From an elevated / admin shell) (With python 3, and pip, available)
pip install happytransformer
First Program
This program will download the model 'EleutherAI/gpt-neo-1.3B' which is a few gigabytes, and takes a while to download (the first time only)
And we will ask it to generate text that continues on from our prompt of "To make a cheese sandwich ".
The result will be very repetitive...
(Save this in a my-first-script.py python file. Execute it with > python my-first-script.py)
from happytransformer import HappyGeneration
# first time you run this it will take a long time to download the model 'EleutherAI/gpt-neo-1.3B' which is a few gigabytes.
happy_gen = HappyGeneration("GPT-NEO", "EleutherAI/gpt-neo-1.3B")
# as we provided no other arguments, the output will be very repetitive
result = happy_gen.generate_text("To make a cheese sandwich ")
print(result)
print(result.text)
And will probably not get you any closer to making a cheese sandwich.
Using arguments to Refine Our Text Generation
We need to provide more arguments to the generate_text method. It has a parameter. args that takes an object of type GENSettings.
Let's see how to use that...
Less repetitive
By providing an argument with the parameter no_repeat_ngram_size=2 it means than any chunk of two or more tokens won't be repeated in the output.
from happytransformer import HappyGeneration, GENSettings
generation_args = GENSettings(no_repeat_ngram_size=2)
happy_gen = HappyGeneration("GPT-NEO", "EleutherAI/gpt-neo-1.3B")
result = happy_gen.generate_text("To make a cheese sandwich ", args=generation_args)
print(result)
print(result.text)
Jargon -- I haven't described what a "token" is yet -- for now, consider it to be like "a word" though sometimes it's a fragment of a word (...for common fragments). We can see exactly what a token is when we look at tokenization, or when we look at training our GPT.
Knobs and Dials for you to explore
This time we set more than just the no_repeat_ngram_size parameter.
from happytransformer import HappyGeneration, GENSettings
# We set `no_repeat_ngram_size`, `do_sample`, `early_stopping`, `top_k`, `temperature`
generation_args = GENSettings(no_repeat_ngram_size=2, do_sample=True, early_stopping=False, top_k=50, temperature=0.7)
happy_gen = HappyGeneration("GPT-NEO", "EleutherAI/gpt-neo-1.3B")
result = happy_gen.generate_text("To make a cheese sandwich ", args=generation_args)
print(result)
print(result.text)
Here are all the parameters for GENSettings (from Happy Transformer documentation)
| Parameter | Default | Definition |
|---|---|---|
min_length |
10 | Minimum number of generated tokens |
max_length |
50 | Maximum number of generated tokens |
do_sample |
False | When True, picks words based on their conditional probability |
early_stopping |
False | When True, generation finishes if the EOS (end of stream) token is reached |
num_beams |
1 | Number of steps for each search path |
temperature |
1.0 | How sensitive the algorithm is to selecting low probability options |
top_k |
50 | How many potential answers are considered when performing sampling |
top_p |
1.0 | Min number of tokens are selected where their probabilities add up to top_p |
no_repeat_ngram_size |
0 | The size of an n-gram that cannot occur more than once. Note 0=infinity (I've determined that this is not true for one's bank balance, btw.) |
bad_words |
None | List of words/phrases that cannot be generated. |
Sources
- Happy Transformer Text Generation Settings
- Using HappyTransformer for Text Generation and More
- PIP: Pip installs Packages