[PYTHON] Negative / positive Beurteilung von Sätzen durch BERT und Visualisierung von Gründen

1. Zuallererst

Ich lese ** "Developmental Deep Learning mit PyTorch" **. Dieses Mal habe ich BERT in Kapitel 8 studiert, daher möchte ich meine eigene Zusammenfassung ausgeben.

2. Was ist BERT?

Im Jahr 2018, dem Jahr nach der Ankündigung von Transformer, wurde ** BERT ** schließlich mit einer Genauigkeit angekündigt, die den Menschen selbst im Bereich der Verarbeitung natürlicher Sprache übertrifft. Es war.

BERT war in der Lage, alle Aufgaben der Verarbeitung natürlicher Sprache mit Feinabstimmung zu bewältigen, und erreichte in 11 Arten von Aufgaben eine überwältigende SoTA.

スクリーンショット 2020-07-30 13.31.18.png

Dies ist das Modelldiagramm von BERT im Papier. Es sieht kompliziert aus, weil es in Längsrichtung des Wortes erweitert ist, aber in einfachen Worten ist es dasjenige, das nur den Encoder-Teil von ** Transformer ** extrahiert. Was ist der Unterschied zwischen BERT und Transformer? Es ist ** Vorlernen mit 2 Arten von Aufgaben ** und ** Feinabstimmung ** ** 2-Stufen-Lernen ** entsprechend der gewünschten Aufgabe.

** 1) Vorlernen mit 2 Arten von Aufgaben ** スクリーンショット 2020-07-31 17.54.40.png

Die Aufgabe, 15% eines Wortes in einem Satz zu maskieren und dieses Wort zu erraten (** Masked Language Model ) und die Aufgabe, festzustellen, ob die Kontexte zweier Sätze miteinander verbunden sind ( Next Satz Vorhersage **) ** Gleichzeitig lernen **.

Setzen Sie ** [CLS] ** an den Anfang des eingegebenen Satzes und fügen Sie ** eingebettete Ausdrücke hinzu, um die erste oder zweite Aussage in den beiden Sätzen ** und ** [SEP] ** dazwischen darzustellen. Einstellen.

Durch das Erlernen dieser beiden Aufgaben ** die Fähigkeit, Wörter entsprechend dem Kontext in Merkmalsvektoren umzuwandeln ** und ** die Fähigkeit zu bestimmen, ob Sätze semantisch verbunden sind ** (ungefähr die Bedeutung von Sätzen) Erwerben Sie die Fähigkeit zu verstehen).

Das Vorlernen, das diesen Boden trainiert, kostet eine Menge Berechnungskosten, und es scheint, dass es ungefähr 4 Tage dauert, selbst wenn Sie 4 TPUs verwenden, aber wenn jemand es einmal tut, wird es sich in ein Netzwerk verwandeln, das verschiedene Aufgaben mit Feinabstimmung lösen kann. Du kannst es schaffen.

** 2) Feinabstimmung ** スクリーンショット 2020-07-31 17.54.57.png

Mit dem ** Vorlerngewicht als Anfangswert ** wird eine Feinabstimmung mit beschrifteten Daten durchgeführt. Da der Hintergrund durch Vorlernen erheblich trainiert wurde, ist es möglich, aus einer kleinen Menge von Satzdaten ** ein Modell mit guter Leistung zu erstellen. Dem Papier zufolge betrug der Rechenaufwand für die Feinabstimmung für verschiedene Aufgaben mit einer einzelnen TPU weniger als eine Stunde.

Nachfolgend sind die 11 NLP-Aufgaben aufgeführt, die BERT SoTA aufgezeichnet hat.

Datensatz Art Überblick
MNLI Inferenz Implikationen von Prämisse und Hypothese/Widerspruch/Beurteilung entweder neutral
QQP Ähnlichkeitsurteil Implikationen von Prämisse und Hypothese/Widerspruch/Beurteilung entweder neutral
QNLI Inferenz Ein Satz-Frage-Paar wird übergeben, um festzustellen, ob der Satz eine Antwort enthält
SST-2 1 Satzklassifikation Satz positiv/Negative Emotionsanalyse
CoLA 1 Satzklassifikation Stellen Sie fest, ob der Satz grammatikalisch korrekt ist
STS-B Ähnlichkeitsurteil Punktzahl 1, wie ähnlich die beiden Sätze in Bezug auf die Bedeutung sind~Bestimmt durch 5
MRPC Ähnlichkeitsurteil Bestimmen Sie, ob die beiden Sätze semantisch gleich sind
RTE Inferenz Bestimmen Sie, ob zwei Sätze implizieren
SQuAD v1.1 Inferenz Sagen Sie voraus, wo sich die Antwort in einem Satz befindet, der eine Frage und eine Antwort enthält
SQuAD v2.0 Inferenz v1.1 plus die Option, dass es keine Antwort gibt
SWAG Inferenz Wählen Sie den Satz nach dem angegebenen Satz aus 4 Auswahlmöglichkeiten

** 3) Sonstige Unterschiede ** -In Transformer wird die Positionsinformation eines Wortes als Wert bestehend aus sin und cos in Positive Encoder angegeben, aber in BERT wird sie gelernt.

3. Dieses Mal zu implementierendes Modell

スクリーンショット 2020-08-01 13.11.12.png

Dieses Mal werden wir das ** vorab trainierte Modell ** von BERT verwenden, um eine Feinabstimmung ** der Aufgabe der Bestimmung des Negativs / Positivs von Sätzen durchzuführen. Es gibt zwei Arten von BERT-Modellen mit unterschiedlichen Modellgrößen. Dieses Mal verwenden wir das kleinere Modell namens Base.

Es gibt zwei BERT-Ausgänge, ** zur Identifizierung ** und ** zur Token-Ebene **, und dieses Mal werden wir die vollständig verbundenen Schichten zur Identifizierung verbinden und eine negative / positive Beurteilung vornehmen. Der verwendete Datensatz ist ** IMDb ** (Internet Movie Dataset), der zusammenfasst, ob der Inhalt der Filmkritik (auf Englisch) positiv oder negativ ist.

Wenn Sie eine Bewertung für einen Film eingeben, bestimmen Sie durch Training des Modells, ob die Bewertung positiv oder negativ ist, und lassen Sie die gegenseitige Aufmerksamkeit der Überprüfungswörter das Wort verdeutlichen, auf dem die Entscheidung basiert.

4. Modellcode

from bert import get_config, BertModel, set_learned_params

#Lesen Sie die JOSN-Datei mit den Modelleinstellungen als Objektvariable
config = get_config(file_path="./data/bert_config.json")

#Erstellen Sie ein BERT-Modell
net_bert = BertModel(config)

#Stellen Sie trainierte Parameter im BERT-Modell ein
net_bert = set_learned_params(
    net_bert, weights_path="./data/pytorch_model.bin")

Erstellen Sie ein BERT-Modell und legen Sie vorab trainierte Gewichtsparameter fest.

class BertForIMDb(nn.Module):
    '''Ein Modell, das den Teil, der das Positive und Negative von IMDb beurteilt, mit dem BERT-Modell verbindet'''

    def __init__(self, net_bert):
        super(BertForIMDb, self).__init__()

        #BERT-Modul
        self.bert = net_bert  #BERT-Modell

        #Positive / negative Vorhersage zum Kopf hinzugefügt
        #Der Eingang ist die Dimension des Ausgangsmerkmals von BERT, und der Ausgang ist positiv und negativ.
        self.cls = nn.Linear(in_features=768, out_features=2)

        #Verarbeitung der Gewichtsinitialisierung
        nn.init.normal_(self.cls.weight, std=0.02)
        nn.init.normal_(self.cls.bias, 0)

    def forward(self, input_ids, token_type_ids=None, attention_mask=None, output_all_encoded_layers=False, attention_show_flg=False):
        '''
        input_ids: [batch_size, sequence_length]Liste der Wort-IDs von Sätzen
        token_type_ids: [batch_size, sequence_length]Die ID, die angibt, ob jedes Wort der erste oder der zweite Satz ist
        attention_mask: Maskierung, die genauso funktioniert wie die Transformer-Maske.
        output_all_encoded_Ebenen: Geben Sie an, ob alle 12 Transformatoren in einer Liste oder nur die letzten in der endgültigen Ausgabe zurückgegeben werden sollen
        attention_show_flg:Self-Flag zur Rückgabe des Aufmerksamkeitsgewichts
        '''

        #Vorwärtsausbreitung des grundlegenden Modellteils von BERT
        #Vorwärts verbreiten
        if attention_show_flg == True:
            '''attention_Zum Zeitpunkt der Show Aufmerksamkeit_Probs kehren auch zurück'''
            encoded_layers, pooled_output, attention_probs = self.bert(
                input_ids, token_type_ids, attention_mask, output_all_encoded_layers, attention_show_flg)
        elif attention_show_flg == False:
            encoded_layers, pooled_output = self.bert(
                input_ids, token_type_ids, attention_mask, output_all_encoded_layers, attention_show_flg)

        #Erstes Wort des Eingabesatzes[CLS]Klassifizieren Sie Positive und Negative anhand der Funktionen von
        vec_0 = encoded_layers[:, 0, :]
        vec_0 = vec_0.view(-1, 768)  #Größe[batch_size, hidden_In Größe konvertieren
        out = self.cls(vec_0)

        # attention_Zum Zeitpunkt der Show Aufmerksamkeit_Probs (letzter) kehren ebenfalls zurück
        if attention_show_flg == True:
            return out, attention_probs
        elif attention_show_flg == False:
            return out

Es ist ein Modell, das das BERT-Modell mit dem linearen Modell verbindet, das das Negativ / Positiv von IMDb bestimmt. Da das Aktualisieren des Gewichtungsparameters auf allen Ebenen von BertLayer sehr umfangreich ist, wird es nur auf der letzten Ebene (12. Ebene) von BertLayer und der hinzugefügten linearen Ebene durchgeführt.

5. Ganzer Code und Ausführung

Der gesamte Code wurde in Google Colab erstellt und auf Github veröffentlicht. Wenn Sie ihn also selbst ausprobieren möchten, klicken Sie auf diesen ** "Link" **. Sie können es verschieben, indem Sie auf BERT_IMDb_run.ipynb) und oben auf dem angezeigten Blatt auf die Schaltfläche "Colab on Web" klicken.

Als ich den Code ausführte, lernte ich nur 2 Epochen, aber die Genauigkeitsrate der Testdaten betrug ungefähr 90%. Letztes Mal habe ich die gleiche Aufgabe mit Transfomer erledigt, aber die korrekte Antwortrate lag zu diesem Zeitpunkt bei etwa 85%, also ** + 5 Punkte Verbesserung ** Es ist geworden.

Übrigens, was die Klarstellung der Urteilsgrundlage betrifft, スクリーンショット 2020-08-01 14.05.21.png Klären Sie mit dieser Art von Gefühl, welches Wort als Grundlage für die Beurteilung verwendet wurde.

(Referenz) ・ Lernen während des Machens! Deep Learning von PyTorchGründliche Erklärung des Papiers von "BERT", dem König der Verarbeitung natürlicher Sprache

Recommended Posts

Negative / positive Beurteilung von Sätzen durch BERT und Visualisierung von Gründen
Negative / positive Beurteilung von Sätzen und Visualisierung von Gründen durch Transformer
Erstellung eines negativen / positiven Klassifikators mit BERT
Analyse von Finanzdaten durch Pandas und deren Visualisierung (2)
Analyse von Finanzdaten durch Pandas und deren Visualisierung (1)
Visualisierung von Daten anhand einer erklärenden Variablen und einer objektiven Variablen
Visualisierung von Daten nach Präfektur
Visualisierung der von numpy erstellten Matrix
Beurteilung, ob durch Listeneinschlussnotation
Negative / Positive Analyse 1 Anwendung der Textanalyse
Aggregation und Visualisierung akkumulierter Zahlen
[Python] Ich habe das Tagebuch eines Mannes im ersten Jahr des Arbeitslebens analysiert und das Arbeitsleben positiv / negativ beurteilt.
Korrelationsvisualisierung der Merkmalsmenge und der Zielvariablen
[Japanische Version] Beurteilung der Wortähnlichkeit für Polynomwörter mit ELMo und BERT
Bestimmen Sie anhand des Bildes des Shiba-Hundes anhand des Bildes des Shiba-Hundes, ob es sich um ein Kind handelt