[PYTHON] PPLM: Eine einfache Deep-Learning-Technik zum Generieren von Sätzen mit bestimmten Attributen

Einführung

Dieser Artikel wurde als Praktikum bei Nittetsu Solutions (NSSOL) verfasst.

Dieser Artikel besteht aus der folgenden Struktur.

Überblick

Ich werde eine grobe Erklärung des in diesem Artikel erläuterten Modells PPLM geben.

Was ist ein Plug-and-Play-Sprachmodell?

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.

Was ist erstaunlich an PPLM?

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.

Modellkonfiguration

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.

pplm_architecture.png

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, $ H_t = [({K_t} ^ {(1)}, { V_t} ^ {(1)}), ..., ({K_t} ^ {(l)}, {V_t} ^ {(l)})] $ Hier sind $ {K_t} ^ {(i)} und {V_t} ^ {(i)} $ die Schlüssel- und Wertepaare, die zu einem bestimmten Zeitpunkt vom Decoderblock der i-ten Schicht erstellt wurden. Im ursprünglichen Modell wird dieses $ H_t $ zusammen mit der Wortausgabe zum vorherigen Zeitpunkt an LM übergeben. Mit anderen Worten $ o_{t+1}, H_{t+1} = \text{LM}(x_t, H_t) $ $ o_ {t + 1} $ ist die Ausgabe von LM, und nach linearer Umwandlung durch die Matrix $ W $ wie folgt wird die Wahrscheinlichkeitsverteilung aller Wörter $ p_ {t + 1} $ durch Anwenden der Softmax-Funktion erhalten. Ich werde. $ x_ {t + 1} $ folgt dieser Verteilung. $ x_{t+1} \sim p_{t+1} = \text{Softmax}(W o_{t+1}) $ Das ursprüngliche Modell besteht darin, Wörter auf diese Weise nacheinander zu generieren. Dies ist die Geschichte von PPLM. In PPLM empfängt das verbundene Attributmodell $ H_t $ und $ p (a | x_ {t + 1} gibt an, wie plausibel $ x_ {t + 1} $ für das angegebene Attribut $ a $ ist. ) Aktualisiere $ H_t $ so, dass $ größer ist. Da $ \ tilde {p_ {t + 1}} $ basierend auf $ \ tilde {H_t} $ neu berechnet wird, das aus diesem $ H_t $ aktualisiert wird, ändert sich die Verteilung der Wortwahrscheinlichkeit. In der Abbildung hatte die Ausgabe von $ p_3 $ aus dem Originalmodell eine hohe Wahrscheinlichkeit von "ok", aber $ \ tilde {p_3} $ hatte eine hohe Wahrscheinlichkeit von "lecker". Ist gezeichnet.

Entwerfen und Lernen des PPLM-Attributmodells

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.

Attributmodell von Bag-of-Words

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 $ p(a|x_{t+1}) = \sum_{i}^k p_{t+1}[w_i] $ Die rechte Seite dieser Gleichung stellt die Wahrscheinlichkeit dar, dass ein Wort im Schlüsselwortsatz erscheint, dh die Wahrscheinlichkeit, dass ein Wort erscheint, das sich auf das gewünschte Attribut bezieht. Ich habe es nicht in der Originalarbeit geschrieben,p(a|x_{t+1})(Dies ist in der Zeitungp(a|x)Ist geschrieben als)p(a|p_{t+1})Als Attribut der Verteilung der WortwahrscheinlichkeitaEs kann leichter zu verstehen sein, ob es für geeignet ist. Darüber hinaus verfügt das Attributmodell unter Verwendung des Wortbeutels im Gegensatz zu dem später beschriebenen Diskriminator nicht über Lernparameter und trainiert nicht.

Attributmodell nach Diskriminator

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 AusgabewortxAttribute vonaRepräsentiert die Einzigartigkeitp(a|x)Selbst-Aufmerksamkeitsschlüssel,WertepaarH_tVerwenden vonp(a|H_t)Neu interpretieren als. Mit anderen WortenH_tWird als Eingabe und Attribute empfangenaWir werden einen Diskriminator lernen, der die Wahrscheinlichkeit von zurückgibt. In der Implementierung gibt dieser Diskriminator den Logarithmus der Wahrscheinlichkeitsverteilung für alle Attribute zurück. Werfen wir einen Blick auf den tatsächlichen Code unten.

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 PPLMp(a|x)(Genauerp(a|H_t)) Wird nur für den ClassificationHead-Teil verwendet. Ich werde die Verarbeitung von Discriminator erklären. Eingabe x ist ein Mini-Batch und ein Tensor, in dem Sätze, die jedes Wort nach ID darstellen, für die Batch-Größe aufgereiht sind. Dies wird vom vorab trainierten Modell verarbeitet und versteckt ausgegeben.

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()

Führen Sie PPLM aus

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\log p(a | H_t + \Delta H_t)Ist berechnet (\log p(a | H_t + \Delta H_t) = - \text{loss}), Dann durch Finden des Gradienten\Delta H_tKann aktualisiert werden, aber dies allein funktioniert nicht. Was ich bisher gedacht habe istp(a|x)(Oderp(a|H_t)) Wurde gerade erhöht.p(x)Es betrachtet sich nicht. Daher besteht die Möglichkeit, dass der erzeugte Satz unnatürlich ist. Dieses Problem wird durch zwei Ansätze gelöst. Eine ist die KL-Divergenz zwischen $ p_ {t + 1} $ und $ \ tilde {p_ {t + 1}} $ $ \text{kl_loss} = \sum_i \tilde{p_{t+1}}[w_i] \log{ \frac{ \tilde{p_{t+1}}[w_i] }{ p_{t+1}[w_i] } } $ Ist es kleiner zu machen. Werfen wir einen Blick auf die Implementierung.

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. $ x_{t+1} \sim \frac{1}{\beta} \left( \tilde{p_{t+1}}^{\gamma_{gm}} {p_{t+1}}^{1-\gamma_{gm}} \right) $ Diese Stichprobe bedeutet, dass nicht nur die aktualisierte Verteilung $ \ tilde {p_ {t + 1}} $, sondern auch die $ p_ {t + 1} $ vor der Aktualisierung bei der Stichprobe berücksichtigt wird. $ \ Beta $ ist ein Normalisierungskoeffizient zur Ermittlung als bloße Wahrscheinlichkeitsverteilung und $ \ tilde {p_ {t + 1}} ^ {\ gamma_ {gm}} {p_ {t + 1}} ^ {1- \ Es ist die Summe von gamma_ {gm}} $. $ \ Gamma_ {gm} $ ist ein Hyperparameter, und wenn sich $ \ gamma_ {gm} $ 1 nähert, nähert es sich $ \ tilde {p_ {t + 1}} $, und wenn es sich 0 nähert, nähert es sich $ p_ {t + 1}. Es nähert sich $. Eigentlich scheint es, dass $ \ gamma_ {gm} $ auf $ 0.8 \ sim 0.95 $ gesetzt werden sollte. Mit anderen Worten, die Verteilung nach dem Update sollte nur wenig berücksichtigt werden, und die Verteilung vor dem Update sollte stark berücksichtigt werden. Die Implementierung ist wie folgt.

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.

Testbeispiel

Hier ist ein aktuelles Testbeispiel. Author Implementation enthält zwei Beispielanweisungen. Probieren Sie sie aus.

Beispiel für ein PPLM-Modell mit vielen Worten

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.

Beispiel eines Diskriminator-PPLM-Modells

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.

Versuchen Sie ein Beispiel, das etwas einfacher zu generieren scheint

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.

Verbesserungspunkte

Lange Ausführungszeit

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.

Beschränkt auf Transformer-Nutzungsmodelle

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.

Zusammenfassung

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.

Verweise

Was ich gelesen habe

Andere / verwandte Literatur

Recommended Posts

PPLM: Eine einfache Deep-Learning-Technik zum Generieren von Sätzen mit bestimmten Attributen
Generiere Pokemon mit Deep Learning
Versuchen Sie, ein Deep Learning / Neuronales Netzwerk mit Scratch aufzubauen
[Evangelion] Versuchen Sie, mit Deep Learning automatisch Asuka-ähnliche Linien zu erzeugen
Ich habe versucht, in einem tief erlernten Sprachmodell zu schreiben
"Minecraft, wo Yaji fliegt" Generieren Sie geeigneten Text mit Deep Learning ~ Daten sammeln ~
"Minecraft wo der Yaji fliegt" Generiere passenden Text mit Deep Learning ~ Move with mod ~
Ich habe versucht, die Strichzeichnung mit Deep Learning aus dem Bild zu extrahieren
Führen Sie eine Twitter-Suche in Python durch und versuchen Sie, Sätze mit der Markov-Kette zu generieren.
Schritte zum schnellen Erstellen einer umfassenden Lernumgebung auf einem Mac mit TensorFlow und OpenCV
Eine Geschichte über die Vorhersage des Wechselkurses mit Deep Learning
Ich möchte mit verstärkendem Lernen einen Berg besteigen
Learning Deep Forest, ein neues Lerngerät, das mit DNN vergleichbar ist
Einführung in das maschinelle Lernen mit Simple Perceptron
Generieren Sie mit apg ein leicht zu merkendes Passwort
Wie man ein einfaches Flappy Bird-Spiel mit Pygame macht
Ich habe das Toho-Projekt mit Deep Learning aufgenommen ... ich wollte.
Deep Kernel Learning mit Pyro
Versuchen Sie Deep Learning mit FPGA
Einführung in Deep Learning ~ Lernregeln ~
Tiefe Stärkung des Lernens 1 Einführung in die Stärkung des Lernens
Einführung in Deep Learning ~ Backpropagation ~
Generieren Sie mithilfe von Cabocha automatisch "IOB2-Tag-Corpus" -Lerndaten
Rubyist hat versucht, eine einfache API mit Python + Flasche + MySQL zu erstellen
Ich habe versucht, Deep Learning mit Spark × Keras × Docker skalierbar zu machen
Rails-Benutzer versuchen, mit Django eine einfache Blog-Engine zu erstellen
Ich suchte mit Deep Learning nach einer ähnlichen Karte von Hearthstone
Einführung in Deep Learning (2) - Versuchen Sie Ihre eigene nichtlineare Regression mit Chainer-
So erstellen Sie mit AWS Lambda eine serverlose API für maschinelles Lernen