[PYTHON] [Erklärung zur Implementierung] Verwendung der japanischen Version von BERT in Google Colaboratory (PyTorch)

Dieser Artikel beschreibt die Verwendung der japanischen Version von BERT mit Google Colaboratory.

Über BERT selbst, ein Buch, das ich letztes Jahr geschrieben habe

"Lernen während des Machens! Entwicklung tiefes Lernen durch PyTorch"

Es wird ausführlich in erklärt.

Wenn Sie wissen möchten, wie BERT funktioniert, lesen Sie bitte das obige Buch.

Da sich das Buch nur mit der englischen Version befasst, wird in diesem Beitrag erklärt, wie BERT in der japanischen Version verwendet wird. (Ich möchte nach diesem Artikel ungefähr zwei schreiben.)

Der Implementierungscode für diesen Beitrag befindet sich im GitHub-Repository unten.

GitHub: Verwendung der japanischen Version von BERT in Google Colaboratory: Implementierungscode Es ist 1_Japanese_BERT_on_Google_Colaboratory.ipynb.

** Serienliste ** [1] * Dieser Artikel [Erklärung zur Implementierung] Verwendung der japanischen Version von BERT in Google Colaboratory (PyTorch) [2] [Implementierung] Livedoor-Nachrichtenklassifizierung in der japanischen Version BERT: Google Colaboratory (PyTorch) [3] [Erklärung zur Implementierung] Gehirnforschung und unbeaufsichtigtes Lernen. Klassifizieren Sie MNIST nach Clustering zur Maximierung der Informationsmenge [4] [Erklärung zur Implementierung] Klassifizieren Sie lebende Nachrichten nach japanischem BERT x unbeaufsichtigtem Lernen (Clustering zur Maximierung der Informationsmenge)


Vorbereitung 1: Installieren Sie MeCab in Google Colaboratory

Installieren Sie MeCab, ein Tool zum Teilen (morphologische Analyse). Es kann nicht mit pip installiert werden, also installieren Sie es mit apt.

!apt install aptitude swig
!aptitude install mecab libmecab-dev mecab-ipadic-utf8 git make curl xz-utils file -y

Installieren Sie mecab-python3 mit pip, damit Sie MeCab von Python aus verwenden können.

!pip install mecab-python3

Installieren Sie NEologd, ein Wörterbuch, damit MeCab neue Wörter (aktuelle neue Wörter) verwenden kann. (Es wird jedoch nicht in geschultem BERT verwendet.)

!git clone --depth 1 https://github.com/neologd/mecab-ipadic-neologd.git
!echo yes | mecab-ipadic-neologd/bin/install-mecab-ipadic-neologd -n -a

Holen Sie sich den Pfad zum neuen Wortwörterbuch NEologd.

import subprocess

cmd='echo `mecab-config --dicdir`"/mecab-ipadic-neologd"'
path_neologd = (subprocess.Popen(cmd, stdout=subprocess.PIPE,
                           shell=True).communicate()[0]).decode('utf-8')

Damit ist die Vorbereitung auf die MeCab-Spezifikationen abgeschlossen.

Anmerkungen (IPAdic und UniDic)

** ipadic ** bedeutet im neuen Wortwörterbuch mecab-ipadic-neologd "IPA-Wörterbuch". Das IPA-Wörterbuch ist nach "IPA Part Lyrics System" organisiert.

Möglicherweise haben Sie zusätzlich zu IPAdic den Ausdruck ** UniDic ** gesehen. UniDic ist ein System, das vom "Kokugoken Short Unit Automatic Analysis Dictionary" organisiert wird.

Für Sudachi für die morphologische Analyse lautet das Standardwörterbuch beispielsweise UniDic.

UniDic und IPAdic haben unterschiedliche Teil-der-Sprache-Systeme. In UniDic gibt es beispielsweise kein Adjektivverb, sondern ein ** Formverb ** (UniDic-Teilesystem. % BB% F1% CE% C1 / UniDic% A4% CE% C9% CA% BB% EC% C2% CE% B7% CF)).

Es ist drei Jahre her, seit ich zu einem neuen Absolventen kam und anfing, IT zu lernen, und zweieinhalb Jahre, seit ich anfing, maschinelles Lernen und tiefes Lernen zu lernen.

Herr F., ein Senior, der seit meiner neuen Anstellung mein Mentor ist, stammt aus Indonesien, kann aber besser Japanisch als ich.

Herr F., ein indonesischer Mentor, sagte mir, dass Sudachis Standard kein Adjektiv, sondern ein Bild ist, und er sagte: "Eine solche Grammatik lernen Japaner in der Schule nicht. Ich war überrascht.

Vorbereitung 2: Überprüfen des Betriebs von MeCab

Lassen Sie uns nun den Text teilen (morphologische Analyse) und die Funktionsweise von MeCab überprüfen.

Der Text ist "Ich mag maschinelles Lernen." Lasst uns.

Das erste ist, wenn das neue Wortwörterbuch NEologd nicht verwendet wird.

import MeCab

m=MeCab.Tagger("-Ochasen")

text = "Ich mag maschinelles Lernen."

text_segmented = m.parse(text)
print(text_segmented)

(Ausgabe)

Ich bin meine Nomenklatur-Gleichbedeutend-Allgemeines
Ha ha ist ein Assistent-Hilfe
Maschine Kikai Maschine Nomen-Allgemeines
Gakushu lernen Nomenklatur lernen-Verbindung ändern
Gaga ist Assistentin-Fallassistent-Allgemeines
Lieblingsnomenklatur-Adjektiv Verbstamm
Es ist der Tod. Hilfsverb Spezial / Tod Grundform
.. .. .. Symbol-Phrase
EOS

** - Ochasen ** in MeCab.Tagger ("-Ochasen") ist eine Ausgabeoption. Dies, Wenn ** - Owakati ** gesetzt ist, wird nur die Division ausgegeben. Wenn ** - Oyomi ** eingestellt ist, wird nur der Messwert ausgegeben.

m=MeCab.Tagger("-Owakati")
text_segmented = m.parse(text)
print(text_segmented)

Die Ausgabe ist `Ich mag maschinelles Lernen. `` ist.

m=MeCab.Tagger("-Oyomi")
text_segmented = m.parse(text)
print(text_segmented)

Wenn, ist die Ausgabe `Watashihakikaigakushugaskides. `` ist.

Als nächstes wird das neue Wortwörterbuch NEologd verwendet.

m=MeCab.Tagger("-Ochasen -d "+str(path_neologd))  #Pfad zu NEologd hinzugefügt

text = "Ich mag maschinelles Lernen."

text_segmented = m.parse(text)
print(text_segmented)

(Ausgabe)

Ich bin meine Nomenklatur-Gleichbedeutend-Allgemeines
Ha ha ist ein Assistent-Hilfe
Maschinelles Lernen Kikaigakushu Nomenklatur für maschinelles Lernen-Proprietäre Nomenklatur-Allgemeines
Gaga ist Assistentin-Fallassistent-Allgemeines
Lieblingsnomenklatur-Adjektiv Verbstamm
Es ist der Tod. Hilfsverb Spezial / Tod Grundform
.. .. .. Symbol-Phrase
EOS

Um NEologd verwenden zu können, habe ich MeCab.Tagger eine Option mit -d hinzugefügt und den Pfad zu NEologd angegeben.

Wenn ich das neue Wortwörterbuch nicht verwendete, wurde das Wort "maschinelles Lernen" in "maschinelles" und "Lernen" getrennt. Mit dem neuen Wortwörterbuch wird es zu "maschinellem Lernen" (proprietäre Nomenklatur) und einem Wort.

Dies liegt daran, dass der Fachbegriff "maschinelles Lernen" im neuen Wortwörterbuch registriert ist.

Selbst in der neuen Wortwörterbuchversion wird nur die Division ausgegeben, wenn Sie ** - Owakati ** festlegen.

m=MeCab.Tagger("-Owakati -d "+str(path_neologd))  #Pfad zu NEologd hinzugefügt
text_segmented = m.parse(text)
print(text_segmented)

Die Ausgabe ist `Ich mag maschinelles Lernen. `` Es wird sein.

Vorbereitung 3: Bereiten Sie das trainierte Modell und die morphologische Analyse der japanischen Version von BERT vor

Bereiten Sie nun das trainierte Modell und die morphologische Analyse der japanischen Version von BERT vor.

Das BERT-Modell meines Buches "Learn while make! Development Deep Learning von PyTorch"](https://www.amazon.co.jp/dp/4839970254/) kann ebenfalls verwendet werden, wurde hier jedoch kürzlich als Standard verwendet. Ich werde das Modell von Hugging Face verwenden.

Umarmen bedeutet auf Japanisch umarmen.

Das BERT-Modell verwendet HuggingFace, gelernte Parameter auf Japanisch und Morphologische Analyse (Tokenizer) zum Zeitpunkt des Lernens Was Herr Masatoshi Suzuki an der Tohoku-Universität veröffentlicht hat (Professor Inui Suzuki Laboratory) Ich werde benützen.

Diese japanische Version des trainierten Modells der Tohoku-Universität wurde in die OSS ** -Transformatoren ** von HuggingFace integriert, sodass sie direkt von Transformatoren verwendet werden kann.

Installieren Sie zuerst die Transformatoren Version 2.9 mit pip.

!pip install transformers==2.9.0

Hinweis Die Transformatoren wurden am 8. Mai 2020 von 2,8 auf 2,9 aufgerüstet. In Version 2.8 ist der Dateipfad zu japanischen Daten ein Fehler. Installieren Sie daher unbedingt 2.9.

Importieren Sie jetzt PyTorch, BERT-Modell und Tokenizer (zu schreibende Klasse) für BERT auf Japanisch.

import torch
from transformers.modeling_bert import BertModel
from transformers.tokenization_bert_japanese import BertJapaneseTokenizer

Bereiten Sie einen Tokenizer für Japanisch vor. Geben Sie als Argument'bert-base-japanese-Whole-Word-Masking' als Argument an.

#Es ist ein Tokenizer, der in das Formular schreibt
tokenizer = BertJapaneseTokenizer.from_pretrained('bert-base-japanese-whole-word-masking')

Bereiten Sie ein geschultes Modell auf Japanisch vor.

#BERTs japanisch erlerntes Parametermodell
model = BertModel.from_pretrained('bert-base-japanese-whole-word-masking')
print(model)

Das Folgende ist eine kurze Überprüfung der Ergebnisse des Ausgabemodells.

BertModel(
  (embeddings): BertEmbeddings(
    (word_embeddings): Embedding(32000, 768, padding_idx=0)
    (position_embeddings): Embedding(512, 768)
    (token_type_embeddings): Embedding(2, 768)
    (LayerNorm): LayerNorm((768,), eps=1e-12, elementwise_affine=True)
    (dropout): Dropout(p=0.1, inplace=False)
  )
  (encoder): BertEncoder(

・ ・ ・

Überprüfen Sie hier die Einstellungen (Konfiguration) des japanischen Versionsmodells.

from transformers import BertConfig

#Tohoku Universität_Überprüfen Sie die Einstellungen der japanischen Version
config_japanese = BertConfig.from_pretrained('bert-base-japanese-whole-word-masking')
print(config_japanese)

Die Ausgabe ist unten.

BertConfig {
  "architectures": [
    "BertForMaskedLM"
  ],
  "attention_probs_dropout_prob": 0.1,
  "hidden_act": "gelu",
  "hidden_dropout_prob": 0.1,
  "hidden_size": 768,
  "initializer_range": 0.02,
  "intermediate_size": 3072,
  "layer_norm_eps": 1e-12,
  "max_position_embeddings": 512,
  "model_type": "bert",
  "num_attention_heads": 12,
  "num_hidden_layers": 12,
  "pad_token_id": 0,
  "type_vocab_size": 2,
  "vocab_size": 32000
}

Wenn Sie sich die Einstellungen ansehen, sehen Sie, dass der Wortvektor 768 Dimensionen hat, die maximale Anzahl von Wörtern (Unterwörtern) 512 beträgt, die Anzahl von BERT-Ebenen 12 beträgt und die Vokabulargröße 32.000 beträgt.

Mit dem oben Gesagten haben wir ein Modell vorbereitet, für das Japanisch gelernt wurde, und einen Tokenizer für Japanisch, der verwendet werden soll, bevor es in das Modell eingefügt wird.

Behandle Sätze mit der japanischen Version BERT

Lassen Sie uns abschließend die Sätze mit der japanischen Version von BERT behandeln.

"Ich habe die Firma losgeworden." "Ich habe Nackenschmerzen, nur wegen Telearbeit." "Die Firma wurde gefeuert."

Bereiten Sie drei Sätze vor.

Vergleichen Sie dann die Drei-Wort-Vektoren von ** "Kubi" **, ** "Kubi" ** und ** "Entlassung" ** in jedem Satz.

BERT zeichnet sich dadurch aus, dass sich der Wortvektor je nach Kontext ändert, also im ersten und zweiten Satz Das gleiche Wort ** "Kubi" ** hat eine andere 768-dimensionale Vektordarstellung.

** Und ich bin froh, wenn das "Kubi" im ersten Satz näher am "Entlassen" im dritten Satz liegt als das "Kubi" im zweiten Satz. ** **.

Messen wir die Ähnlichkeit von Wortvektoren anhand der Kosinusähnlichkeit.

Lassen Sie es uns implementieren. Bereiten Sie zuerst einen Satz vor.

text1 = "Ich habe die Firma losgeworden."
text2 = "Mein Nacken tut nur wegen Telearbeit weh."
text3 = "Die Firma wurde entlassen."

Verarbeiten Sie text1 mit der japanischen Version des separaten Tokenizers von BERT.

#Trennen und in ID konvertieren
input_ids1 = tokenizer.encode(text1, return_tensors='pt')  #pt steht für PyTorch

print(tokenizer.convert_ids_to_tokens(input_ids1[0].tolist()))  #Satz
print(input_ids1)  # id

Die Ausgabe ist

['[CLS]', 'Unternehmen', 'Zu', 'Hals', 'Zu', 'Wurde', 'Ta', '。', '[SEP]']
tensor([[    2,   811,    11, 13700,     7,    58,    10,     8,     3]])

Es wird sein.

Das Wort "Kubi" war das dritte und ich fand die ID 13700.

Verarbeiten Sie den zweiten und dritten Satz auf die gleiche Weise. Die Ausgabe von jedem ist wie folgt.

['[CLS]', 'Tele', '##Arbeit', 'Gerade', 'damit', 'Hals', 'Aber', 'Schmerzen', '##ich', '。', '[SEP]']
tensor([[    2,  5521,  3118,  4027,    12, 13700,    14,  4897, 28457,     8,
             3]])

['[CLS]', 'Unternehmen', 'Zu', 'Entlassung', 'Sa', 'Re', 'Ta', '。', '[SEP]']
tensor([[   2,  811,   11, 7279,   26,   20,   10,    8,    3]])

Ich fand, dass der zweite Satz "Kubi" der fünfte und der dritte Satz "Entlassung" der dritte war.

Geben Sie nun diesen identifizierten Inhalt in das japanische BERT-Modell ein und berechnen Sie den Ausgabevektor.

#Eingabe in das japanische BERT-Modell
result1 = model(input_ids1)

print(result1[0].shape)
print(result1[1].shape)

#Ergebnis ist Sequenz_output, pooled_output, (hidden_states), (attentions)ist.
#Allerdings versteckt_Zustände und Aufmerksamkeiten sind optional und werden nicht standardmäßig ausgegeben.

Die Ausgabe ist torch.Size([1, 9, 768]) torch.Size([1, 768]) Es wird sein.

9 steht für die Anzahl der Wörter (Anzahl der Unterwörter) im ersten Satz. 768 ist die eingebettete Dimension des Wortes. Da also das "Kubi" im ersten Satz im dritten war, ist der Wortvektor result1[0][0][3][:] Es wird sein.

Darüber hinaus, was bei der Berechnung des BERT-Modells ausgegeben wird outputs # sequence_output, pooled_output, (hidden_states), (attentions) (Hidden_states und Attentions sind jedoch optional und werden nicht standardmäßig ausgegeben.)

Referenz Erläuterung des BerT-Modells vorwärts

Ebenso finden Sie die Wortvektoren für "Kubi" (fünfter) im zweiten Satz und "Entlassung" (dritter) im dritten Satz.

#Eingabe in das japanische BERT-Modell
result2 = model(input_ids2)
result3 = model(input_ids3)

word_vec1 = result1[0][0][3][:]  #"Kubi" im ersten Satz (dritter)
word_vec2 = result2[0][0][5][:]  #"Kubi" im zweiten Satz (fünfter)
word_vec3 = result3[0][0][3][:]  #"Entlassung" im dritten Satz (dritter)

Lassen Sie uns zum Schluss die Ähnlichkeit finden.

#Finden Sie Kosinusähnlichkeit
cos = torch.nn.CosineSimilarity(dim=0)
cos_sim_12 = cos(word_vec1, word_vec2)
cos_sim_13 = cos(word_vec1, word_vec3)

print(cos_sim_12)
print(cos_sim_13)

Die Ausgabe ist tensor(0.6647, grad_fn=<DivBackward0>) tensor(0.7841, grad_fn=<DivBackward0>)

ist geworden.

Daher lautet der von BERT verarbeitete Wortausdruck Die Ähnlichkeit zwischen "Kubi" im ersten Satz und "Kubi" im zweiten Satz beträgt 0,66. Die Ähnlichkeit zwischen "Kubi" im ersten Satz und "Entlassung" im dritten Satz beträgt 0,78.

Und Sie können sehen, dass das "Kubi" im ersten Satz nahe an der "Entlassung" im dritten Satz liegt (hoher Grad an Ähnlichkeit).

Mit BERT konnten wir bestätigen, dass dasselbe Wort "Kubi" zu einem Wortvektor geworden ist, dessen Bedeutung sich je nach Kontext geändert hat.

Wie oben erwähnt, [Erklärung zur Implementierung] Verwendung der japanischen Version von BERT in Google Colaboratory (PyTorch).


[Anmerkungen] Das von mir geleitete Entwicklungsteam der AI-Technologieabteilung sucht Mitglieder. Klicken Sie hier, wenn Sie interessiert sind

[Haftungsausschluss] Der Inhalt dieses Artikels selbst ist die Meinung / Übermittlung des Autors, nicht die offizielle Meinung des Unternehmens, zu dem der Autor gehört.


Verweise ● Verwenden Sie mecab ipadic-NEologd mit Google Colaboratory

Recommended Posts

[Erklärung zur Implementierung] Verwendung der japanischen Version von BERT in Google Colaboratory (PyTorch)
Verwendung des japanischen Spacy-Modells mit Google Colaboratory
So verwenden Sie Google Colaboratory
Verwendung von Google Colaboratory und Verwendungsbeispiel (PyTorch × DCGAN)
So überprüfen Sie die Version von Django
Verwendung von Google Test in C-Sprache
Grundlagen von PyTorch (1) - Verwendung von Tensor-
Verwendung der C-Bibliothek in Python
Zusammenfassung der Verwendung von MNIST mit Python
Holen Sie sich das Ergebnis der umgekehrten GeoCoding auf Japanisch mit dem Java SDK von GoogleMapsAPI.
[PyTorch] Verwendung von BERT - Feinabstimmung japanischer vorab trainierter Modelle zur Lösung von Klassifizierungsproblemen
[Erklärung zur Implementierung] Klassifizieren Sie Livedoor-Nachrichten nach japanischem BERT x unbeaufsichtigtem Lernen (Clustering zur Maximierung der Informationsmenge): Google Colaboratory (PyTorch)
So laden Sie Dateien in Google Drive mit Google Colaboratory
Verwendung der Exist-Klausel in Django Queryset
Verwendung des in Lobe in Python erlernten Modells
Ich kann den Darknet-Befehl in Google Colaboratory nicht verwenden!
Verwendung des Generators
Wie benutzt man den Dekorateur?
So finden Sie die optimale Anzahl von Clustern für k-means
Verwendung der Methode __call__ in der Python-Klasse
Vergleich der Verwendung von Funktionen höherer Ordnung in Python 2 und 3
Hinweise zur Verwendung von Marshmallow in der Schemabibliothek
[Super einfach! ] So zeigen Sie den Inhalt von Wörterbüchern und Listen einschließlich Japanisch in Python an
So zeichnen Sie einfach die Struktur eines neuronalen Netzwerks in Google Colaboratory mit "convnet-drawer"
Übergeben des Ausführungsergebnisses eines Shell-Befehls in einer Liste in Python (nicht blockierende Version)
Verwendung der Zip-Funktion
So bestimmen Sie die Existenz eines Selenelements in Python
Verwendung des optparse-Moduls
Wie Sie die interne Struktur eines Objekts in Python kennen
Zusammenfassung der Verwendung von pandas.DataFrame.loc
Verwendung von Klassen in Theano
So ändern Sie die Farbe nur der mit Tkinter gedrückten Taste
So zeigen Sie Formeln in Latex an, wenn Sie sympy (> = 1.4) in Google Colaboratory verwenden
Verwendung von SQLite in Python
So überprüfen Sie die Speichergröße einer Variablen in Python
Zusammenfassung der Verwendung von pyenv-virtualenv
So erhalten Sie die Python-Version
Verwenden Sie PyCaret, um den Preis von Gebrauchtwohnungen in Tokio vorherzusagen!
Verwendung von Sternchen (*) in Python. Vielleicht ist das alles? ..
[Einführung in Python] Wie verwende ich den Operator in in der for-Anweisung?
So überprüfen Sie die Speichergröße eines Wörterbuchs in Python
Wie man MySQL mit Python benutzt
So ermitteln Sie die Scheitelpunktkoordinaten eines Features in ArcPy
Erklärt, wie TensorFlow 2.X mit der Implementierung von VGG16 / ResNet50 verwendet wird
Verwendung von ChemSpider in Python
Verwendung von Jupyter am Frontend von Spacon ITO
Die erste künstliche Intelligenz. So überprüfen Sie die installierte Version von Tensorflow.
Wie nutzt man maschinelles Lernen für die Arbeit? 01_ Den Zweck des maschinellen Lernens verstehen
Verwendung von PubChem mit Python
So aktualisieren Sie die Python-Version von Cloud Shell in GCP
Zusammenfassung der Verwendung von csvkit
Verwendung des ConfigParser-Moduls
So richten Sie die Entwicklungsumgebung von ev3dev ein [Windows-Version]
Umgang mit Japanisch mit Python
Verwendung der in .mako (.html) direkt in mako definierten Renderfunktion
Ergänzung zur Erklärung von vscode
So rufen Sie PyTorch in Julia an
So führen Sie den Übungscode des Buches "Profitable KI mit Python erstellen" in Google Colaboratory aus
So überprüfen Sie automatisch, ob der in Google Colaboratory geschriebene Code dem Python-Codierungsstandard "pep8" entspricht.
Kopieren und Einfügen des Inhalts eines Blattes im JSON-Format mit einer Google-Tabelle (mithilfe von Google Colab)