Dieser Artikel wurde als Praktikum bei Nittetsu Solutions (NSSOL) verfasst.
Dieser Artikel besteht aus der folgenden Struktur.
Ich werde eine grobe Erklärung des in diesem Artikel erläuterten Modells PPLM geben.
Das Plug-and-Play-Sprachmodell (PPLM) ist das in PLUG AND PLAY LANGUAGE MODELS: EINFACHER ANSATZ ZUR KONTROLLIERTEN TEXTERZEUGUNG vorgeschlagene Modell. .. Author Implementation ist auch auf Github vorhanden.
Diese Forschung ist eine Forschung, die sich mit der Aufgabe der kontrollierten Texterzeugung befasst. Die kontrollierte Texterzeugung ist die Aufgabe, Sätze zu generieren, die den angegebenen Attributen entsprechen (Polarität wie positiv / negativ und Themen wie "Politik" und "Wissenschaft"), wenn das Sprachgenerierungsmodell Sätze generiert.
Das Tolle an PPLM ist, dass es die kontrollierte Texterzeugung realisiert, indem es ein neues kleines Modell für das vorhandene Sprachgenerierungsmodell lernt. Diese Größe kann durch einen Vergleich mit bestehenden Methoden gesehen werden. Bestehende Forschungsansätze zur kontrollierten Texterzeugung können wie folgt kategorisiert werden.
Ersteres hat eine ausreichende Leistung bei der Steuerung von Attributen, hat jedoch ein großes Problem hinsichtlich der Lernkosten. Wenn Sie neue Attribute hinzufügen möchten, müssen Sie das große Modell neu trainieren. Letzteres hat kein Problem in Bezug auf die Lernkosten, aber seine Leistung scheint der ersteren deutlich unterlegen zu sein. Das von PPLM vorgeschlagene Verfahren hat den Vorteil, dass die Lernkosten sehr niedrig sind und gleichzeitig die mit dem ersteren vergleichbare Leistung erhalten bleibt.
PPLM ist für Sprachgenerierungsmodelle vorgesehen, die Transformer als Decoder verwenden. Da GPT-2 in der Implementierung des Autors verwendet wird, wird davon ausgegangen, dass GPT-2 in Zukunft verwendet wird.
Dies ist eine Abbildung aus dem Originalpapier von PPLM (https://openreview.net/pdf?id=H1edEyBKDS). Die blauen Buchstaben ($ H_1, H_2, x_0, x_1, x_2 $) sind jedoch meine Ergänzungen.
Wenn Sie nur den schwarzen Pfeil in der Abbildung betrachten und [Attributmodell p (a | x)] ignorieren, ist das Modell ein Modell, das den ursprünglichen Transformer-Decoder (im Folgenden als Originalmodell bezeichnet) verwendet.
Das LM (Sprachmodell) in der Abbildung ist ein Stapel von L Transformer Decoder-Blöcken.
$ H_t $ enthält die Selbstaufmerksamkeits-Schlüssel- und Wertepaare, die in jedem dieser L-Layer-Blöcke auftreten. Das heißt,
PPLM schlägt zwei Methoden zur Konstruktion des Attributmodells $ p (a | x) $ vor. Einer verwendet Bag-of-Words und der andere einen Diskriminator. Hier werden wir diese mit Implementierungscode erklären.
Hier wird im Voraus eine Reihe von Schlüsselwörtern erstellt, die sich auf Attribute beziehen. Von der Autorenimplementierung bereitgestellte Attribute umfasst "Computer", "Fantasie", "Küche", "legal" , "Militär", "Politik", "positive_Wörter", "Religion", "Wissenschaft", "Raum". Zum Beispiel hat "Wissenschaft" 48 Wörter wie "Astronomie", "Atom", "Biologie", "Zelle" und "Chemikalie".
Bei gegebenem Schlüsselwortsatz $ \ {w_1, ..., w_k \} $ für ein Attribut $ a $ wird die Verteilung der Wortwahrscheinlichkeit vom ursprünglichen Modell $ p_ {t + 1} $ berechnet Die Verwendung von $ p (a | x_ {t + 1}) $, die angibt, wie plausibel das Ausgabewort $ x_ {t + 1} $ für das Attribut $ a $ ist, kann wie folgt gedacht werden: Ich kann es schaffen
Das oben erwähnte Attributmodell mit Bag-of-Words war ein einfaches Design, aber es gibt ein Problem. Das heißt, es gibt Fälle, in denen es schwierig ist, ein Attribut nur mit einer Reihe von Schlüsselwörtern auszudrücken. In solchen Fällen ist das in diesem Abschnitt beschriebene Diskriminatormodell nützlich.
Der Attributdiskriminator ist das Ausgabewort
run_pplm_discrim_train.py
class Discriminator(torch.nn.Module):
"""Transformer encoder followed by a Classification Head"""
def __init__(
self,
class_size,
pretrained_model="gpt2-medium",
cached_mode=False,
device='cpu'
):
super(Discriminator, self).__init__()
self.tokenizer = GPT2Tokenizer.from_pretrained(pretrained_model)
self.encoder = GPT2LMHeadModel.from_pretrained(pretrained_model)
self.embed_size = self.encoder.transformer.config.hidden_size
self.classifier_head = ClassificationHead(
class_size=class_size,
embed_size=self.embed_size
)
self.cached_mode = cached_mode
self.device = device
def get_classifier(self):
return self.classifier_head
def train_custom(self):
for param in self.encoder.parameters():
param.requires_grad = False
self.classifier_head.train()
def avg_representation(self, x):
mask = x.ne(0).unsqueeze(2).repeat(
1, 1, self.embed_size
).float().to(self.device).detach() #Maske wird verwendet, um 0 beim Auffüllen zu ignorieren
hidden, _ = self.encoder.transformer(x)
masked_hidden = hidden * mask
avg_hidden = torch.sum(masked_hidden, dim=1) / (
torch.sum(mask, dim=1).detach() + EPSILON
)
return avg_hidden
def forward(self, x):
if self.cached_mode:
avg_hidden = x.to(self.device)
else:
avg_hidden = self.avg_representation(x.to(self.device))
logits = self.classifier_head(avg_hidden)
probs = F.log_softmax(logits, dim=-1)
return probs
class ClassificationHead(torch.nn.Module):
"""Classification Head for transformer encoders"""
def __init__(self, class_size, embed_size):
super(ClassificationHead, self).__init__()
self.class_size = class_size
self.embed_size = embed_size
self.mlp = torch.nn.Linear(embed_size, class_size)
def forward(self, hidden_state):
logits = self.mlp(hidden_state)
return logits
Die Diskriminatorklasse besteht aus zwei Teilen: einem vorab trainierten Modell und einem zu lernenden Klassifizierungskopf. Wir trainieren das trainierte Modell überhaupt nicht um. Bei der Ausführung von PPLM
hidden, _ = self.encoder.transformer(x)
Dies ist wie eine verteilte Darstellung jedes Wortes der Eingabe x. Da dieses ausgeblendete Wort aufgrund des Auffüllens aufgrund der Stapelverarbeitung von Tensor zusätzliche Wörter enthält, maskieren Sie es, um es zu ignorieren. Dadurch wird die verteilte Darstellung der Wörter erstellt, die durch Auffüllen von 0 (masked_hidden) hinzugefügt wurden. Schließlich kann avg_hidden erhalten werden, indem die verteilten Ausdrücke in jedem Satz dieses maskierten_hidden hinzugefügt werden. Wenn Sie sich die Wörter in einem Satz als addiert vorstellen, kann dies als verteilte Darstellung des Satzes interpretiert werden. Dieses avg_hidden ist die Eingabe für ClassificationHead. ClassificationHead ist ein neuronales Netz ohne Zwischenschicht und nur Eingabe- und Ausgabeschichten. Die Anzahl der Knoten in der Eingabeebene ist die Anzahl der Dimensionen der verteilten Darstellung von avg_hidden, und die Anzahl der Knoten in der Ausgabeschicht ist die Anzahl der Attribute. Die Ausgabe ist ein Logit, das durch eine Softmax-Funktion geleitet wird, um einen weiteren logarithmischen Wert anzunehmen.
logits = self.classifier_head(avg_hidden)
probs = F.log_softmax(logits, dim=-1)
Der Wert (negative logarithmische Wahrscheinlichkeit) dieser Probs (= output_t), der der richtigen Antwortklasse (target_t) entspricht, wird zu einem Verlust, und dieser Verlust ist ein Rückschlag für das Lernen.
loss = F.nll_loss(output_t, target_t)
loss.backward(retain_graph=True)
optimizer.step()
Nach dem Erlernen des Attributmodells im vorherigen Kapitel besteht der nächste Schritt darin, PPLM tatsächlich auszuführen. Tatsächlich wird ein trainiertes Attributmodell vorbereitet. Wenn Sie also nur die Operation überprüfen möchten, müssen Sie sie nicht erneut lernen. Außerdem ist kein Lernen erforderlich, wenn das Attributmodell von Bag-of-Words verwendet wird. Wie unter Modellkonfiguration erwähnt, steuert PPLM das Ausgabewort mithilfe von $ \ tilde {H_t} $, einer aktualisierten Version von $ H_t $ des Originalmodells. Dieses Update wird tatsächlich wie folgt durchgeführt.
\begin{align}
\tilde{H_t} &= H_t + \Delta H_t \\
\Delta H_t & \leftarrow \Delta H_t + \alpha \frac{\nabla_{\Delta H_t} \log p(a | H_t + \Delta H_t)}{||\nabla_{\Delta H_t} \log p(a | H_t + \Delta H_t)||^{\gamma}}
\end{align}
$ \ Alpha, \ gamma $ sind Hyperparameter. Was wir hier tun, ist die Berechnung des Updates $ \ Delta H_t $, das die Wahrscheinlichkeit des Attributs $ a $ erhöht. Dieses $ \ Delta H_t $ selbst wird mehrmals berechnet und aktualisiert und dann zu $ H_t $ hinzugefügt. Diese Zahl soll 3-10 mal sein (der Standardwert im Implementierungscode ist 3). Dieses Update erfolgt in der pertert_past-Funktion von run_pplm.py. Schauen wir uns zunächst die Implementierung nach Attributmodell mit Bag-of-Words an.
loss = 0.0
bow_logits = torch.mm(probs, torch.t(one_hot_bow))
bow_loss = -torch.log(torch.sum(bow_logits))
loss += bow_loss
Obwohl der Prozess weggelassen wird, entspricht probs $ p_ {t + 1} $ und ist die Verteilung der Wahrscheinlichkeit aller Wörter in der Kenntnis des Sprachmodells. one_hot_bow repräsentiert jedes Wort, das zu dem Attribut-Schlüsselwort gehört, das als One-Hot-Vektor für alle Wörter in Kenntnis des Sprachmodells festgelegt ist. Die Summe der mit diesen multiplizierten bow_logits ist $ \ sum_ {i} ^ k p_ {t +, beschrieben in [Attributmodell nach Wortbeutel](Attributmodell nach Wortbeutel). 1} [w_i] Entspricht der Berechnung von $. Der negative Logarithmus dieser Summe ist bow_loss. Dieser bow_loss entspricht $ - \ log p (a | H_t + \ Delta H_t) $.
Als nächstes ist die Implementierung durch das Attributmodell unter Verwendung des Diskriminators wie folgt.
ce_loss = torch.nn.CrossEntropyLoss()
prediction = classifier(new_accumulated_hidden / (curr_length + 1 + horizon_length))
label = torch.tensor(prediction.shape[0] * [class_label],
device=device,
dtype=torch.long)
discrim_loss = ce_loss(prediction, label)
loss += discrim_loss
Der Klassifikator ist der ClassificationHead-Teil des im vorherigen Kapitel erlernten Diskriminators. Ich werde new_accumulated_hidden erklären. Die Ausgabe des verborgenen Zustands von der letzten Schicht des 12-Schicht-Transformators, berechnet durch Übergabe der aktualisierten $ \ tilde {H_t} $ an GPT-2, wird auf [Attributmodell nach Diskriminator](# nach Diskriminator) gesetzt. - Berücksichtigen Sie, wie in (Attributmodell) erläutert, die Summe der verteilten Ausdrücke. Diese Berechnung wird für das nicht aktualisierte $ H_t $ auf die gleiche Weise durchgeführt, und die Summe dieser beiden ist new_accumulated_hidden. Möglicherweise kennen Sie diesen Bereich nur, wenn Sie dem Code tatsächlich folgen. Es kann jedoch in Ordnung sein, zu erkennen, dass Sie im Klassifikator in den verborgenen Zustand eintreten. Der Standardwert für curr_length ist die Anzahl der Eingabewörter für GPT-2 im Moment, und der Standardwert für horizon_length ist 1. (horizont_length Ich verstehe nicht wirklich, welche Rolle es spielt). Das für label verwendete class_label wird vom Benutzer angegeben, wenn run_pplm.py ausgeführt wird. Zum Beispiel ein vorab zugewiesener Index für die positive Klasse. Finden Sie den Kreuzentropieverlust zwischen dieser Markierung und der Vorhersage. Der auf diese Weise berechnete Diskriminierungsverlust entspricht auch $ - \ log p (a | H_t + \ Delta H_t) $. Der Wortbeutel und das Attributmodell des Diskriminators können zusammen verwendet werden. Fügen Sie in diesem Fall bow_loss und dictim_loss hinzu.
loss = 0.0
loss += bow_loss
loss += discrim_loss
Bis hierher
kl_loss = kl_scale * (
(corrected_probs * (corrected_probs / unpert_probs).log()).sum()
)
loss += kl_loss
Hier ist korrigiert_probs $ \ tilde {p_ {t + 1}} $ und unpert_probs ist $ p_ {t + 1} $. kl_scale ist ein Hyperparameter und sollte grundsätzlich auf 0,01 gesetzt werden. Der berechnete kl_loss wird zu bow_loss, dictim_loss oder deren Summe addiert. Beim Aktualisieren von $ \ Delta H_t $ werden alle zusammen in die Gradientenrichtung verschoben.
KL-Divergenz ist die einzige Gegenmaßnahme in der Erneuerungsphase. Ein anderer Ansatz besteht darin, die Wörter nach der Berechnung von $ \ tilde {p_ {t + 1}} $ tatsächlich nach ihrer Wahrscheinlichkeit abzutasten. Die Probenahme wird wie folgt durchgeführt.
pert_probs = ((pert_probs ** gm_scale) * (unpert_probs ** (1 - gm_scale)))
pert_probs = top_k_filter(pert_probs, k=top_k, probs=True)
if torch.sum(pert_probs) <= 1:
pert_probs = pert_probs / torch.sum(pert_probs)
if sample:
last = torch.multinomial(pert_probs, num_samples=1)
else:
_, last = torch.topk(pert_probs, k=1, dim=-1)
Die erste Zeile berechnet $ \ tilde {p_ {t + 1}} ^ {\ gamma_ {gm}} {p_ {t + 1}} ^ {1- \ gamma_ {gm}} $. In der zweiten Zeile filtern wir, um nur die k Wörter mit der höchsten Wahrscheinlichkeit beizubehalten, damit Wörter mit zu geringer Wahrscheinlichkeit beim Abtasten nicht erscheinen. Die Operation in den Zeilen 3-4 ist die Operation der Division durch $ \ beta $. Die Zeilen 6 bis 7 werden gemäß der Wahrscheinlichkeitsverteilung abgetastet, und die Zeilen 8 bis 9 werden gierig Wörter mit maximaler Wahrscheinlichkeit abgetastet.
Das Obige ist die Idee von PPLM, $ H_t $ zu aktualisieren und Stichproben zu entwickeln.
Hier ist ein aktuelles Testbeispiel. Author Implementation enthält zwei Beispielanweisungen. Probieren Sie sie aus.
Zunächst zu PPLM mit Bag-of-Words. Verwenden Sie die folgenden Anweisungen des Autors als Testversion.
python run_pplm.py -B military --cond_text "The potato" --length 50 --gamma 1.5 --num_iterations 3 --num_samples 10 --stepsize 0.03 --window_length 5 --kl_scale 0.01 --gm_scale 0.99 --colorama --sample
-Β Militär gibt das Bag-of-Words-Modell des militärischen Attributs an. Hier sind die Ergebnisse.
Unperturbed generated text <|endoftext|>The potato is probably the world's most widely eaten plant. But what if it's also the most dangerous?
In the last two decades, there's been a dramatic decrease in potato crop damage from crop rot and disease. The decline, which started in
Perturbed generated text 1 <|endoftext|>The potato-flour soup that is the best way to start a weekend! The following recipe is one of several that I have been working on over the past few months. I think it is the best of them. It uses all the elements of the
Perturbed generated text 2 <|endoftext|>The potato bomb and the anti-Semitic attack that killed four Jewish students at a Jewish school in France are the most recent examples of bomb threats targeting Israeli facilities. The latest bomb threat targeting a U.S. nuclear facility, the bomb was sent out over the
Perturbed generated text 3 <|endoftext|>The potato chip explosion has been a boon to the world's food industry since its release in late March. A handful of companies have already announced plans to produce chips using the chips, including Chipotle Mexican Grill Corp.'s parent company, Taco Bell Corp.'s
Perturbed generated text 4 <|endoftext|>The potato is a very popular and delicious vegetable in many countries, but it can also cause severe health problems for people. The health of your body depends on your diet. If your diet doesn't include enough protein to get through the meal, or if you are
Perturbed generated text 5 <|endoftext|>The potato plant, which is a member of the same family as wheat, can be found around the world. It's also used to make potato chips, bread, and other food products.
The Plant
The plant grows as a seed and produces
Perturbed generated text 6 <|endoftext|>The potato bomb has been a controversial weapon for years. The device is packed with bomb-like devices and packed on a bomb-filled potato bomb. It's a bomb that detonates in the bomb-packed potato bomb and explodes in the potato bomb. So
Perturbed generated text 7 <|endoftext|>The potato has a lot in common with the human earworm: The first, and only, time you hear it, you'll hear the sound of the potato in your ear as well.
It's the first sound you hear when your cat or dog
Perturbed generated text 8 <|endoftext|>The potato salad is coming to a restaurant near you!
The new restaurant, in the heart of downtown Chicago, will be named the Potato Salad.
A photo posted by @the_mike_barnes on Aug 7, 2016 at
Perturbed generated text 9 <|endoftext|>The potato is a staple in many people's diet, and it is an easy food to make in your home.
The best potato chips in the world are made by hand using only potatoes.
The potato is a staple in many people's diet
Perturbed generated text 10 <|endoftext|>The potato bomb is an improvised explosive device, typically containing one bomb and no more than 10 grams of explosive and containing no explosive material.
Bombardment of an aircraft aircraft, a tank truck or explosive device
Bombardment of an aircraft aircraft
Generiert unabhängig Anweisungen für die Anzahl der während der Ausführung angegebenen num_samples (diesmal 10). Die rot hervorgehobenen Wörter beziehen sich auf das Attribut. Dies kann in der Standardausgabe rot angezeigt werden, indem zur Laufzeit --colorama angegeben wird. Schauen wir uns ein Generationsbeispiel an. Erstens enthält die ursprüngliche Erklärung zur unkontrollierten Modellgenerierung keine militärischen Elemente. Bei kontrollierten Sätzen wird das Wort "Bombe" häufig für 2, 6 und 10 verwendet. Ich habe jedoch nicht den Eindruck, dass es sich um eine militärische Aussage für andere Beispiele handelt. Militärische Attribute beginnend mit Die Kartoffel Der Satz mag etwas schwierig gewesen sein.
Probieren Sie ein Modell aus, das einen Attributdiskriminator verwendet. Die Ausführung ist die folgende Aussage über die Implementierung des Autors.
python run_pplm.py -D sentiment --class_label 2 --cond_text "My dog died" --length 50 --gamma 1.0 --num_iterations 10 --num_samples 10 --stepsize 0.04 --kl_scale 0.01 --gm_scale 0.95 --sample
Hier sind die Ergebnisse.
Unperturbed generated text <|endoftext|>My dog died in February, after suffering from severe arthritis. He had been suffering with a terrible cold that was causing his skin to break. I couldn't afford a replacement dog and couldn't afford to have him taken to the vet. I knew the vet would be
Perturbed generated text 1 <|endoftext|>My dog died of a heart attack at the age of 88, his son said, and her death has shocked and brought closure to the family. (Published Wednesday, March 12, 2017)
A mother who was found dead at home with a heart attack on
Perturbed generated text 2 <|endoftext|>My dog died from a rare and potentially deadly form of a rare form of sickle cell disease.
A rare form of sickle cell is called hemizygaly in the families.
The family is an important part of the game and it's
Perturbed generated text 3 <|endoftext|>My dog died after being shot.
A woman in the United States died after a man in his 20s opened fire at her home in North Carolina and injured several others.
On March 12 a neighbor heard a woman screaming. After she ran outside to
Perturbed generated text 4 <|endoftext|>My dog died of a heart attack, after suffering from a heart attack.
The title text of this page has a a a
of of the work and work in to be an in a way, that the idea of the idea to a
Perturbed generated text 5 <|endoftext|>My dog died from a rare form of cancer that was not known before.
The rare form of brain cancer called glioblastomatosis is more common in people of European descent. People of European descent are also at greater risk of glioma
Perturbed generated text 6 <|endoftext|>My dog died from anaphase and I don't know how to give birth to a child with a rare genetic condition, an important personal health gain, with health - "" " The " " " "'The'"'" The book " The word
Perturbed generated text 7 <|endoftext|>My dog died from a rare form of cancer, the Daily Mail reports. "I have a really strong desire to help others and so I am happy to have the chance to help others to be happy and to love their loved ones and that's something I love
Perturbed generated text 8 <|endoftext|>My dog died because I didn't let him go.
I have a 6-year-old, 3-year-old, 1-year-old, 2-year-old, and 2-year-old. I have a very active and
Perturbed generated text 9 <|endoftext|>My dog died of a heart attack while while while I was in the house. I had the old man's head and body, and a large one, I have my hands and feet with me. I have a good time, and the best, as I am
Perturbed generated text 10 <|endoftext|>My dog died from a rare form of cancer, scientists have found.... James M. He he is is is is a
A lot of a lot of a fun!! The Great Escape The Great Escape! The Great Escape! The Great Escape
Im Gegensatz zu Bag-of-Words können verwandte Wörter nicht hervorgehoben werden. -D Sentiment gibt einen vorgelernten "Sentiment" -Diskriminator an. Dieser Diskriminator unterscheidet zwischen zwei Klassen, "sehr positiv" und "sehr negativ", und das diesmal angegebene class_label = 2 steht für "sehr positiv". (Beachten Sie, dass "very_negative" durch Setzen von class_label = 3 angegeben werden kann.) Dies ist ein Beispiel für den Versuch, einen positiven Satz für den Anfang zu generieren, bei dem nur ein negativer Satz "Mein Hund ist gestorben" generiert zu werden scheint. Schauen wir uns jedes Beispiel an. Der generierte Text des Originalmodells ohne Attributsteuerung ist pessimistisch. Bei den kontrollierten generierten Sätzen werden 2, 5, 7 usw. relativ positive (oder eher nicht negative) Sätze generiert. Wörter wie selten und Liebe fallen auf. Da die Negative von 1, 3, 4, 6, 8, 9, 10 usw. nicht verschwunden sind oder die Sätze unnatürlich sind, ist es schwierig, sie richtig zu generieren, wenn der Satzanfang und die Attribute nicht übereinstimmen. Sie können die Situation sehen.
Das obige Beispiel war eine Kombination aus Satzanfängen und Attributen, die schwer zu generieren wären. Lassen Sie uns den Satzanfang und die Attribute etwas genauer anpassen. Setzen Sie den Anfang auf Die Kartoffel und das Attribut auf positive_Wörter.
python run_pplm.py -B positive_words --cond_text "The potato" --length 50 --gamma 1.5 --num_iterations 3 --num_samples 10 --stepsize 0.03 --window_length 5 --kl_scale 0.01 --gm_scale 0.99 --colorama --sample
Hier sind die Ergebnisse.
Unperturbed generated text <|endoftext|>The potato is probably the world's most widely eaten plant. But what if it's also the most dangerous?
In the last two decades, there's been a dramatic decrease in potato crop damage from crop rot and disease. The decline, which started in
Perturbed generated text 1 <|endoftext|>The potato-like, gluten-free, low-calorie, sweet, and nutritious sweet potato pie recipe. Easy to make, and perfect for those who love to eat sweet, healthy, and filling pie!
When my kids are home from school
Perturbed generated text 2 <|endoftext|>The potato has been a popular favorite since the 1980s. But with its recent popularity and rising popularity, is it time to eat your favorite potato again?
The potato is still a great food to enjoy and enjoy, with its healthy benefits and delicious flavor
Perturbed generated text 3 <|endoftext|>The potato chip craze is in full swing.
The popular snacks have been making the rounds in recent weeks as people seek out fresh and healthier alternatives to fried foods.
But there may have never been a better time to eat these crispy snacks than
Perturbed generated text 4 <|endoftext|>The potato is a very versatile, versatile vegetable and it is a great addition to many tasty salads, soups and stews.
The potato is the star of many salads and stirfries. I love the versatility of potatoes in many recipes.
Perturbed generated text 5 <|endoftext|>The potato is a common dish, so much so in fact that it is often served with pasta. It is often served with rice, or topped with a sweet and savoury sauce.
Serves 4
1 onion
2 cloves garlic
Perturbed generated text 6 <|endoftext|>The potato has become the new darling of American farmers in recent years. Its popularity is so great that it has even been featured in many successful television shows like "The Big Bang Theory".
But there has never been an easier way to prepare your favorite snack
Perturbed generated text 7 <|endoftext|>The potato is a favorite among the health-conscious, so what better time to try a new way to eat them? The recipe below is easy and healthy, and you can easily freeze it, freeze it for later, reheat it for breakfast or lunch,
Perturbed generated text 8 <|endoftext|>The potato salad that inspired the popular dish is one of a number of new varieties of the dish being sold at popular popular restaurants. (Photo: Thinkstock)
When it comes to classic American comfort food, a popular dish that's popular around the country
Perturbed generated text 9 <|endoftext|>The potato is a staple in many people's diet, and it is not only delicious in its own right, but is also a good protein source. It is easy to eat, nutritious, and healthy.
Potato, as we know it, originated
Perturbed generated text 10 <|endoftext|>The potato has been used as an ingredient in everything from salad dressing to soups for decades. However, it was once thought to be a poor performer in the kitchen. In recent years, scientists have shown potatoes to be a promising food source. The research shows
Der erste ursprünglich erzeugte Satz ist ein Satz, der objektive Tatsachen angibt und keinen positiven Eindruck vermittelt. Sie können sehen, dass die anderen Sätze größtenteils positiv sind (obwohl 2 nicht sicher ist, was Sie sagen, geht 3 besser vor nie ... ).
Schließlich scheint es notwendig zu sein, den Satzanfang und die Kombination von Attributen in gewissem Maße zu berücksichtigen. Dies wird in der Veröffentlichung auch als "je nach Attribut schwer zu kontrollieren" angegeben.
In diesem Experiment haben wir einen Satz mit 50 Wörtern generiert. Zu diesem Zeitpunkt dauert es nur 2-3 Sekunden, um einen Satz vom ursprünglichen GPT-2 zu erzeugen, aber es dauert ungefähr 22 Sekunden im Modell von Bag-of-Words und 95 Sekunden im Modell von dem Diskriminator. Es ist im Begriff zu nehmen. Es hängt von der verwendeten Aufgabe ab, aber der Engpass besteht darin, dass es so lange dauert, einen Satz von etwa 50 Wörtern zu erstellen. Die zu lernenden Parameter sind im Vergleich zum ursprünglichen Modell sehr gering, aber die Hyperparameter sind $ \ alpha, \ gamma $, KL-Divergenece kl_loss, $ p_ {t + 1} $, wenn $ \ Delta H_t $ aktualisiert wird. Und $ \ tilde {p_ {t + 1}} $, um $ \ gamma_ {gm} $ auszugleichen, und es wird angenommen, dass eine zu lange Ausführung einmal die Ausführungskosten beeinflusst. Ich werde. Ich denke, diese Länge ist wahrscheinlich auf die Tatsache zurückzuführen, dass die partiellen Differentialoperationen beim Aktualisieren von $ H_t $ viele Male ausgeführt werden. In einem normalen Netzwerk breitet es sich nur in Vorwärtsrichtung aus, und es gibt keine solche Operation. Dieses Problem kann gelöst werden, wenn wir ein Netzwerk konfigurieren und lernen können, das $ \ tilde {H_t} $ ausgibt, wenn $ H_t $ ohne teilweise Differenzierung eingegeben wird.
Das Update von $ H_t $, das die Hauptidee dieses Modells ist, ist auf das Sprachmodell beschränkt, das Transformer als Decoder verwendet. In Zukunft ist diese Methode möglicherweise nicht mehr verfügbar, wenn unterschiedliche Strukturen zum Mainstream werden.
In diesem Artikel haben wir PPLM erläutert, eine Methode zum Generieren von Sätzen, die bestimmten Attributen entsprechen, wenn Sätze mit einem Modell generiert werden, das Transformer als Decoder verwendet. Die Hauptidee von PPLM besteht darin, den Schlüssel und den Wert der Selbstaufmerksamkeit von Transformer rekursiv zu aktualisieren, um die Anweisung des angegebenen Attributs durch das extern verbundene Modell zu generieren. Mit dieser Idee können Sie Attribute steuern, ohne das ursprüngliche große Modell neu trainieren zu müssen. Aus den Testergebnissen ist ersichtlich, dass es zwar allgemein gesteuert werden kann, es jedoch schwierig ist, es zu generieren, wenn der Satzanfang und das Attribut nicht kompatibel sind. Es hat auch den Nachteil, dass die Ausführungszeit länger ist als die des ursprünglichen Modells.
Recommended Posts