Cet article a été rédigé dans le cadre d'un stage chez Nittetsu Solutions (NSSOL).
Cet article se compose de la structure suivante.
Je vais donner une explication approximative du modèle PPLM expliqué dans cet article.
Le modèle de langage Plug and Play (PPLM) est le modèle proposé dans MODÈLES DE LANGAGE PLUG AND PLAY: UNE APPROCHE SIMPLE POUR LA GÉNÉRATION DE TEXTE CONTRÔLÉE. .. Author Implementation existe également sur Github.
Cette recherche est une recherche qui aborde la tâche de génération de texte contrôlée. La génération de texte contrôlée consiste à générer des phrases qui correspondent aux attributs spécifiés (polarité telle que positive / négative et sujets tels que «politique» et «science») lorsque le modèle de génération de langage génère des phrases.
L'avantage de PPLM est qu'il réalise une génération de texte contrôlée simplement en apprenant un nouveau petit modèle pour le modèle de génération de langage existant. Cette grandeur peut être vue en la comparant aux méthodes existantes. Les approches de recherche existantes pour la génération de texte contrôlée peuvent être classées comme suit.
Le premier a des performances suffisantes pour contrôler les attributs, mais présente un problème majeur en termes de coût d'apprentissage. Lorsque vous souhaitez ajouter de nouveaux attributs, vous devez recycler le grand modèle. Ce dernier n'a aucun problème en termes de coût d'apprentissage, mais ses performances semblent nettement inférieures aux premières. La méthode proposée par PPLM présente l'avantage que le coût d'apprentissage est très faible tout en conservant des performances comparables à la première.
PPLM est destiné aux modèles de génération de langage qui utilisent Transformer comme décodeur. Puisque GPT-2 est utilisé dans l'implémentation de l'auteur, il sera décrit en supposant que GPT-2 sera utilisé à l'avenir.
Il s'agit d'une figure tirée de l'article original de PPLM (https://openreview.net/pdf?id=H1edEyBKDS). Cependant, les lettres bleues ($ H_1, H_2, x_0, x_1, x_2 $) sont mes ajouts.
Si vous regardez uniquement la flèche noire dans la figure et ignorez [Modèle d'attribut p (a | x)], ce sera un modèle utilisant le Transformer Decoder original (ci-après dénommé le modèle original).
Le LM (Language Model) de la figure est une pile de blocs L Transformer Decoder.
$ H_t $ contient les paires clé et valeur d'auto-attention qui se produisent dans chacun de ces blocs de couche L. V_t} ^ {(1)}), ..., ({K_t} ^ {(l)}, {V_t} ^ {(l)})] $$
Ici, $ {K_t} ^ {(i)} et {V_t} ^ {(i)} $ sont les paires Clé et Valeur créées par le bloc Decoder de la i-ième couche à un certain moment.
Dans le modèle d'origine, ce $ H_t $ est passé à LM avec le mot produit à l'instant précédent. En d'autres termes
PPLM propose deux méthodes pour la construction du modèle d'attribut $ p (a | x) $. L'un utilise Bag-of-Words et l'autre utilise un discriminateur. Ici, nous allons les expliquer avec le code d'implémentation.
Ici, un ensemble de mots-clés liés aux attributs est créé à l'avance. Attributs fournis dans l'implémentation de l'auteur comprend "ordinateurs", "fantaisie", "cuisine", "juridique" , "militaire", "politique", "mots_ positifs", "religion", "science", "espace". Par exemple, «science» comprend 48 mots tels que «astronomie», «atome», «biologie», «cellule» et «chimique».
Étant donné l'ensemble de mots clés $ \ {w_1, ..., w_k \} $ pour un attribut $ a $, la distribution de la vraisemblance des mots calculée par le modèle d'origine $ p_ {t + 1} $ L'utilisation de $ p (a | x_ {t + 1}) $, qui représente la plausibilité du mot de sortie $ x_ {t + 1} $ pour l'attribut $ a
Le modèle d'attribut utilisant le sac de mots mentionné ci-dessus était une conception simple, mais il y a un problème. Autrement dit, il existe des cas où il est difficile d'exprimer un attribut uniquement avec un ensemble de mots-clés. Dans de tels cas, le modèle discriminateur décrit dans cette section est utile.
Le discriminateur d'attribut est le mot de sortie
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() #le masque est utilisé pour ignorer 0 dans le remplissage
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
La classe Discriminator se compose de deux parties: un modèle pré-entraîné et un ClassificationHead à apprendre. Nous ne recyclons pas du tout le modèle formé. Lors de l'exécution de PPLM
hidden, _ = self.encoder.transformer(x)
Ce caché est comme une représentation distribuée de chaque mot d'entrée x. Ensuite, puisque ce masqué contient des mots supplémentaires en raison du remplissage dû au traitement par lots de Tensor, masquez-le pour l'ignorer. Cela fera la représentation distribuée des mots ajoutés par padding 0 (masked_hidden). Enfin, avg_hidden peut être obtenu en ajoutant les expressions distribuées dans chaque phrase de ce masked_hidden. Si vous pensez que les mots d'une phrase sont additionnés, cela peut être interprété comme une représentation distribuée de la phrase. Cet avg_hidden est l'entrée de ClassificationHead. ClassificationHead est un réseau neuronal sans couche intermédiaire et uniquement des couches d'entrée et de sortie. Le nombre de nœuds dans la couche d'entrée est le nombre de dimensions de la représentation distribuée de avg_hidden, et le nombre de nœuds dans la couche de sortie est le nombre d'attributs. La sortie est un logit, qui est passé par une fonction softmax pour prendre une valeur logarithmique supplémentaire.
logits = self.classifier_head(avg_hidden)
probs = F.log_softmax(logits, dim=-1)
La valeur (probabilité logarithmique négative) de ce probs (= output_t) correspondant à la classe de réponse correcte (target_t) devient une perte, et cette perte est un backprop pour l'apprentissage.
loss = F.nll_loss(output_t, target_t)
loss.backward(retain_graph=True)
optimizer.step()
Après avoir appris le modèle d'attribut dans le chapitre précédent, l'étape suivante consiste à exécuter réellement PPLM. En fait, un modèle d'attribut entraîné est préparé, donc si vous souhaitez simplement vérifier l'opération, vous n'avez pas besoin de la réapprendre. De plus, aucun apprentissage n'est requis lors de l'utilisation du modèle d'attributs par sac de mots. Comme mentionné dans [Configuration du modèle](# Configuration du modèle), PPLM contrôle le mot de sortie en utilisant $ \ tilde {H_t} $ qui est une version mise à jour de $ H_t $ du modèle d'origine. Cette mise à jour se fait en fait comme suit.
\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 $ sont des hyper paramètres. Ce que nous faisons ici, c'est le calcul de la mise à jour $ \ Delta H_t $ qui augmente la probabilité de l'attribut $ a $. Ce $ \ Delta H_t $ lui-même est calculé et mis à jour plusieurs fois, puis ajouté à $ H_t $. Ce nombre est dit être 3 à 10 fois (la valeur par défaut dans le code d'implémentation est 3). Cette mise à jour est effectuée dans la fonction perturb_past de run_pplm.py. Tout d'abord, examinons l'implémentation par Attribute Model en utilisant Bag-of-Words.
loss = 0.0
bow_logits = torch.mm(probs, torch.t(one_hot_bow))
bow_loss = -torch.log(torch.sum(bow_logits))
loss += bow_loss
Bien que le processus soit omis, probs équivaut à $ p_ {t + 1} $ et est la distribution de la probabilité de tous les mots dans la connaissance du modèle de langage. one_hot_bow représente chaque mot appartenant au mot-clé d'attribut défini comme un vecteur unique pour tous les mots dans la connaissance du modèle de langage. La somme des bow_logits multipliée par ceux-ci est $ \ sum_ {i} ^ k p_ {t + décrite dans [Attribute Model by Bag-of-Words](-attribute-model by # bag-of-words). 1} [w_i] Correspond au calcul de $. La logarithmique négative de cette somme est bow_loss. Cette bow_loss correspond à $ - \ log p (a | H_t + \ Delta H_t) $.
Ensuite, l'implémentation par le modèle d'attribut utilisant le discriminateur est la suivante.
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
Le classificateur est la partie ClassificationHead du discriminateur appris dans le chapitre précédent. Je vais expliquer new_accumulated_hidden. La sortie d'état masqué de la dernière couche du transformateur à 12 couches calculée en donnant le $ \ tilde {H_t} $ mis à jour à GPT-2 est définie sur [Modèle d'attribut par discriminateur](# par discriminateur -Comme avec avg_hidden expliqué dans (modèle-attribut), considérez la somme des expressions distribuées. Faites ceci pour le $ H_t $ non mis à jour de la même manière, et ajoutez les deux ensemble pour obtenir new_accumulated_hidden. Vous ne connaissez peut-être pas cette zone à moins que vous ne suiviez réellement le code, mais il peut être correct de reconnaître que vous entrez dans l'état caché dans le classificateur. La valeur par défaut pour curr_length est le nombre de mots d'entrée pour GPT-2 pour le moment, et la valeur par défaut pour horizon_length est 1. Le class_label utilisé pour le label est donné par l'utilisateur lorsque run_pplm.py est exécuté. Par exemple, un index pré-assigné pour la classe positive. Trouvez la perte d'entropie croisée entre cette étiquette et la prédiction. La perte discrim_loss ainsi calculée correspond également à $ - \ log p (a | H_t + \ Delta H_t) $. Le sac de mots et le modèle d'attribut du discriminateur peuvent être utilisés ensemble. Dans ce cas, ajoutez bow_loss et discrim_loss.
loss = 0.0
loss += bow_loss
loss += discrim_loss
Jusqu'ici
kl_loss = kl_scale * (
(corrected_probs * (corrected_probs / unpert_probs).log()).sum()
)
loss += kl_loss
Ici, corrected_probs est $ \ tilde {p_ {t + 1}} $ et unpert_probs est $ p_ {t + 1} $. kl_scale est un hyper paramètre, et en gros, il devrait être défini sur 0,01. Le kl_loss calculé est ajouté à bow_loss, discrim_loss ou à leur somme. Lors de la mise à jour de $ \ Delta H_t $, tous sont déplacés ensemble dans la direction du dégradé.
KL-Divergence est la seule contre-mesure au stade de la conception du renouvellement. Une autre approche consiste à échantillonner les mots en fonction de leur probabilité après avoir calculé $ \ tilde {p_ {t + 1}}
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)
La première ligne calcule $ \ tilde {p_ {t + 1}} ^ {\ gamma_ {gm}} {p_ {t + 1}} ^ {1- \ gamma_ {gm}} $. Dans la deuxième ligne, nous filtrons pour ne conserver que les k mots avec la plus grande probabilité afin que les mots avec une probabilité trop faible n'apparaissent pas lors de l'échantillonnage. L'opération sur les lignes 3-4 est l'opération de division par $ \ beta $. Les lignes 6 à 7 sont échantillonnées selon la distribution de vraisemblance et les lignes 8 à 9 échantillonnent avidement les mots avec le maximum de vraisemblance.
Ce qui précède est l'idée de PPLM de mettre à jour $ H_t $ et de concevoir un échantillonnage.
Voici un exemple de test réel. Author Implementation a deux exemples d'instructions, alors essayez-les.
Tout d'abord, à propos de PPLM utilisant Bag-of-Words. Utilisez les instructions suivantes mises en œuvre par l'auteur à titre d'essai.
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
-Β militaire spécifie le modèle Bag-of-Words de l'attribut militaire. Voici les résultats.
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
Génère des instructions indépendantes pour le nombre de num_samples spécifié au moment de l'exécution (10 cette fois). Les mots surlignés en rouge sont liés à l'attribut. Cela peut être affiché en rouge sur la sortie standard en spécifiant --colorama à l'exécution. Regardons un exemple de génération. Premièrement, il n'y a aucun élément militaire dans la déclaration de génération de modèle non contrôlée d'origine. Pour les phrases contrôlées, le mot «bombe» est souvent trouvé pour 2, 6 et 10. Cependant, je n'ai pas l'impression que les autres exemples sont des déclarations militaires. Attributs militaires commençant par La pomme de terre La phrase a peut-être été un peu difficile.
Essayez un modèle qui utilise un discriminateur d'attribut. L'exécution est la déclaration suivante de la mise en œuvre de l'auteur.
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
Voici les résultats.
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
Contrairement à Bag-of-Words, les mots associés ne peuvent pas être mis en évidence. -D sentiment spécifie un discriminateur de «sentiment» pré-appris. Ce discriminateur discrimine deux classes, "very_positive" et "very_negative", et le class_label = 2 spécifié cette fois représente "very_positive". (Notez que "very_negative" peut être spécifié en définissant class_label = 3). Ceci est un exemple de tentative de générer une phrase positive pour le début qui semble générer uniquement une phrase négative "Mon chien est mort". Regardons chaque exemple. Le texte généré du modèle d'origine sans contrôle d'attribut est pessimiste. Quant aux phrases générées contrôlées, 2, 5, 7 etc. sont générées des phrases relativement positives (ou plutôt non négatives). Des mots tels que rare et amour ressortent. Puisque les négatifs de 1, 3, 4, 6, 8, 9, 10 etc. n'ont pas disparu ou que les phrases ne sont pas naturelles, il est difficile de les générer correctement si le début de la phrase et les attributs ne correspondent pas. Vous pouvez voir la situation.
L'exemple ci-dessus était une combinaison de débuts de phrase et d'attributs qui seraient difficiles à générer. Associons un peu plus le début de la phrase et les attributs. Définissez le début sur The potato et l'attribut sur positive_words.
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
Voici les résultats.
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
La première phrase originale générée est une phrase qui énonce des faits objectifs et ne donne pas une impression positive. Vous pouvez voir que les autres phrases sont pour la plupart positives (bien que 2 ne soit pas sûr de ce que vous dites, 3 est mieux précédé de jamais ... ).
Après tout, il semble qu'il soit nécessaire de considérer dans une certaine mesure le début de la phrase et la combinaison des attributs. Ceci est également indiqué dans le document comme "difficile à contrôler en fonction de l'attribut".
Dans cette expérience, nous avons généré une phrase de 50 mots. À ce moment-là, il ne faut que 2-3 secondes pour générer une phrase par le GPT-2 d'origine, mais cela prend environ 22 secondes dans le modèle par Bag-of-Words et 95 secondes dans le modèle par le discriminateur. C'est sur le point de prendre. Cela dépend de la tâche utilisée, mais le goulot d'étranglement est qu'il faut tellement de temps pour créer une phrase d'environ 50 mots. Les paramètres à apprendre sont très peu nombreux par rapport au modèle d'origine, mais les hyper paramètres sont $ \ alpha, \ gamma $, KL-Divergenece kl_loss, $ p_ {t + 1} $ lors de la mise à jour de $ \ Delta H_t $. Et $ \ tilde {p_ {t + 1}} $ pour équilibrer $ \ gamma_ {gm} $, et on pense que prendre trop de temps à exécuter une fois affectera le coût de réglage. Je vais. Je soupçonne que cette longueur est due au fait que les opérations différentielles partielles sont effectuées plusieurs fois lors de la mise à jour de $ H_t $. Dans un réseau normal, il se propage uniquement dans le sens aller, et une telle opération n'existe pas. Ce problème peut être résolu si nous pouvons configurer et apprendre un réseau qui génère $ \ tilde {H_t} $ lorsque $ H_t $ est entré sans différenciation partielle.
La mise à jour de $ H_t $, qui est l'idée principale de ce modèle, est limitée au modèle de langage qui utilise Transformer comme décodeur. À l'avenir, cette méthode pourrait ne pas être disponible si différentes structures deviennent courantes.
Dans cet article, nous avons expliqué PPLM, une méthode pour générer des phrases qui correspondent à des attributs spécifiés lors de la génération de phrases avec un modèle qui utilise Transformer comme décodeur. L'idée principale de PPLM est de mettre à jour de manière récursive la clé et la valeur de l'attention personnelle de Transformer dans le sens de la génération d'instructions avec des attributs spécifiés par un modèle externe connecté. Cette idée vous permet de contrôler les attributs sans avoir à recycler le grand modèle d'origine. D'après les résultats du test, on peut voir que bien qu'il puisse être contrôlé en général, il est difficile de le générer si le début de la phrase et l'attribut ne sont pas compatibles. Il présente également l'inconvénient que le temps d'exécution sera plus long que le modèle d'origine.
Recommended Posts