J'ai soudainement commencé à étudier "Deep Learning from scratch ❷ --- traitement du langage naturel" Notez que j'ai trébuché au chapitre 4 est.
L'environnement d'exécution est macOS Catalina + Anaconda 2019.10, et la version Python est 3.7.4. Pour plus de détails, reportez-vous au Chapitre 1 de ce mémo.
Ce chapitre est une accélération du modèle Word2vec CBOW créé au chapitre 3.
Le premier est l'accélération de la couche d'entrée à la couche intermédiaire. Cette partie joue le rôle d'incorporer pour convertir les mots en expressions distribuées, mais comme la couche MatMul est inutile, remplacez-la par la couche Embedding.
La couche d'intégration est simple, mais la partie qui ajoute $ dW $ lorsque idx est dupliqué dans l'implémentation de rétropropagation peut être un peu déroutante. Dans le livre, il est repris dans la figure 4-5, et l'explication est omise comme "Réfléchissons à la raison pour laquelle l'ajout est fait par vous-même".
Alors, j'y ai pensé en le comparant au calcul de rétropropagation pour la couche MatMul. En effet, le calque Embedding doit avoir le même résultat que le calque MatMul.
Tout d'abord, remplacez $ idx $ dans la figure 4-5 par $ x $ dans la couche MatMul.
\begin{align}
idx &=
\begin{pmatrix}
0\\
2\\
0\\
4\\
\end{pmatrix}\\
\\
x &=
\begin{pmatrix}
1 & 0 & 0 & 0 & 0 & 0 & 0\\
0 & 0 & 1 & 0 & 0 & 0 & 0\\
1 & 0 & 0 & 0 & 0 & 0 & 0\\
0 & 0 & 0 & 0 & 1 & 0 & 0\\
\end{pmatrix}
\end{align}
La formule de rétropropagation pour la couche MatMul est $ \ frac {\ partial L} {\ partial W} = x ^ T \ frac {\ partial L} {\ partial y} $ (voir page 33), donc Figure 4-5 Si vous le remplacez par la notation de, il devient $ dw = x ^ Tdh $. En appliquant ici $ x $ et $ dh $ dans la figure 4-5 pour calculer $ dW $, nous obtenons: En fait, je voulais faire $ dh $ comme le montre la Fig. 4-5, mais je ne peux pas exprimer la nuance de ● comme un livre, donc ici je l'exprime avec $ ●, ◆, a, b $.
\begin{align}
dW &= x^Tdh\\
\\
\begin{pmatrix}
? & ? & ? \\
○ & ○ & ○ \\
●_1 & ●_2 & ●_3 \\
○ & ○ & ○ \\
◆_1 & ◆_2 & ◆_3 \\
○ & ○ & ○ \\
○ & ○ & ○ \\
\end{pmatrix}
&=
\begin{pmatrix}
1 & 0 & 1 & 0\\
0 & 0 & 0 & 0\\
0 & 1 & 0 & 0\\
0 & 0 & 0 & 0\\
0 & 0 & 0 & 1\\
0 & 0 & 0 & 0\\
0 & 0 & 0 & 0\\
\end{pmatrix}
\begin{pmatrix}
a_1 & a_2 & a_3 \\
●_1 & ●_2 & ●_3 \\
b_1 & b_2 & b_3 \\
◆_1 & ◆_2 & ◆_3 \\
\end{pmatrix}\\
\end{align}
Comme vous pouvez le voir à partir du calcul, la deuxième ligne ($ ● _1 ● _2 ● _3
\begin{align}
\begin{pmatrix}
a_1 + b_1 & a_2 + b_2 & a_3 + b_3 \\
○ & ○ & ○ \\
●_1 & ●_2 & ●_3 \\
○ & ○ & ○ \\
◆_1 & ◆_2 & ◆_3 \\
○ & ○ & ○ \\
○ & ○ & ○ \\
\end{pmatrix}
&=
\begin{pmatrix}
1 & 0 & 1 & 0\\
0 & 0 & 0 & 0\\
0 & 1 & 0 & 0\\
0 & 0 & 0 & 0\\
0 & 0 & 0 & 1\\
0 & 0 & 0 & 0\\
0 & 0 & 0 & 0\\
\end{pmatrix}
\begin{pmatrix}
a_1 & a_2 & a_3 \\
●_1 & ●_2 & ●_3 \\
b_1 & b_2 & b_3 \\
◆_1 & ◆_2 & ◆_3 \\
\end{pmatrix}
\end{align}
En d'autres termes, vous pouvez voir que nous ajoutons les première et troisième lignes de $ dh $. La même chose que le calcul de cette couche MatMul doit être implémentée dans la couche Embedding, il est donc nécessaire de l'ajouter.
Vient ensuite l'amélioration de la couche intermédiaire à la couche de sortie. L'idée de l'échantillonnage négatif pour réduire considérablement l'apprentissage avec des exemples négatifs est intéressante.
Il n'y avait pas de grosse pierre d'achoppement, mais dans le livre, l'explication de la rétropropagation de la couche Embedding Dot est omise car ce n'est "pas un problème difficile, alors réfléchissons-y par vous-même", donc je vais résumer ici un peu. regarder.
Dans la figure 4-12, si vous ne découpez que la partie du calque Embedding Dot, ce sera comme suit.
Ce que fait le nœud de point, c'est multiplier chaque élément et ajouter les résultats. Par conséquent, considérons la rétro-propagation en se décomposant en un nœud de multiplication (voir "1.3.4.1 nœud de multiplication" au chapitre 1) et un nœud de somme (voir "1.3.4.4 nœud de somme" au chapitre 1). Ensuite, il aura la forme suivante. Les lettres bleues sont de retour de la propagation.
En revenant au diagramme de nœud de point précédent, cela ressemble à ceci:
C'est OK s'il est implémenté comme indiqué sur cette figure, mais comme la forme de «dout» ne correspond pas à «h» et «target_W» telle quelle, le produit de chaque élément ne peut pas être calculé par «*» de NumPy. Par conséquent, faites d'abord correspondre les formes avec dout.reshape (dout.shape [0], 1)
puis calculez le produit. Si vous l'implémentez de cette manière, vous pouvez voir qu'il devient le code de ʻEmbeddingDot.backwad () `dans le livre.
La mise en œuvre de l'apprentissage n'est pas particulièrement trébuchante. J'utilise le corpus PTB dans le livre, mais j'aime le japonais après tout, alors j'ai essayé d'apprendre avec le texte pré-écrit d'Aozora Bunko comme au chapitre 2. C'était.
Pour obtenir le corpus, utilisez la version modifiée de dataset / aozorabunko.py
au lieu de dataset / ptb.py
. Pour plus d'informations sur cette source et ce mécanisme, reportez-vous au [Chapitre 2, «Amélioration de la méthode basée sur le décompte»](https://qiita.com/segavvy/items/52feabbf7867020e117d#24- Amélioration de la méthode basée sur le décompte). Je l'ai écrit, alors veuillez vous y référer.
ch04 / train.py
a également été modifié pour utiliser le corpus d'Aozora Bunko comme suit. Les changements sont ceux avec «★» dans les commentaires.
ch04/train.py
# coding: utf-8
import sys
sys.path.append('..')
from common import config
#Lors de l'exécution sur GPU, supprimez le commentaire ci-dessous (cupy requis)
# ===============================================
# config.GPU = True
# ===============================================
from common.np import *
import pickle
from common.trainer import Trainer
from common.optimizer import Adam
from cbow import CBOW
from skip_gram import SkipGram
from common.util import create_contexts_target, to_cpu, to_gpu
from dataset import aozorabunko #★ Changé pour utiliser le corpus d'Aozora Bunko
#Paramètres des hyper paramètres
window_size = 5
hidden_size = 100
batch_size = 100
max_epoch = 10
#Lire les données
corpus, word_to_id, id_to_word = aozorabunko.load_data('train') #★ Changer de corpus
vocab_size = len(word_to_id)
contexts, target = create_contexts_target(corpus, window_size)
if config.GPU:
contexts, target = to_gpu(contexts), to_gpu(target)
#Génération de modèles etc.
model = CBOW(vocab_size, hidden_size, window_size, corpus)
# model = SkipGram(vocab_size, hidden_size, window_size, corpus)
optimizer = Adam()
trainer = Trainer(model, optimizer)
#Commencer à apprendre
trainer.fit(contexts, target, max_epoch, batch_size)
trainer.plot()
#Enregistrez les données dont vous avez besoin pour une utilisation ultérieure
word_vecs = model.word_vecs
if config.GPU:
word_vecs = to_cpu(word_vecs)
params = {}
params['word_vecs'] = word_vecs.astype(np.float16)
params['word_to_id'] = word_to_id
params['id_to_word'] = id_to_word
pkl_file = 'cbow_params.pkl' # or 'skipgram_params.pkl'
with open(pkl_file, 'wb') as f:
pickle.dump(params, f, -1)
De plus, il a fallu environ 8 heures pour apprendre dans l'environnement à portée de main.
Vient ensuite la confirmation du résultat. J'ai changé un peu ch04 / eval.py
pour pouvoir essayer différents mots de l'entrée standard. «★» est la partie modifiée.
ch04/eval.py
# coding: utf-8
import sys
sys.path.append('..')
from common.util import most_similar, analogy
import pickle
pkl_file = 'cbow_params.pkl'
# pkl_file = 'skipgram_params.pkl'
with open(pkl_file, 'rb') as f:
params = pickle.load(f)
word_vecs = params['word_vecs']
word_to_id = params['word_to_id']
id_to_word = params['id_to_word']
#tâche la plus similaire ★ Changement de la requête en entrée standard
while True:
query = input('\n[similar] query? ')
if not query:
break
most_similar(query, word_to_id, id_to_word, word_vecs, top=5)
#tâche d'analogie ★ Changement de la requête en entrée standard
print('-'*50)
while True:
query = input('\n[analogy] query? (3 words) ')
if not query:
break
a, b, c = query.split()
analogy(a, b, c, word_to_id, id_to_word, word_vecs)
Voici les résultats de divers essais.
Commencez par rechercher des mots similaires. À titre de comparaison, j'ai également énuméré celui basé sur le décompte que j'ai essayé au chapitre 2. De plus, la taille de la fenêtre de CBOW était de 5 dans le code du livre, mais j'ai également essayé 2, ce qui est identique à la base de comptage.
Mots similaires | Base de comptage du chapitre 2 (Taille de la fenêtre: 2) |
CBOW (Taille de la fenêtre: 5) |
CBOW (Taille de la fenêtre: 2) |
---|---|---|---|
tu | femme: 0.6728986501693726 femme: 0.6299399137496948 K: 0.6205178499221802 père: 0.5986840128898621 je: 0.5941839814186096 |
tu: 0.7080078125 femme: 0.6748046875 femme: 0.64990234375 Jeune femme: 0.63330078125 je: 0.62646484375 |
femme: 0.7373046875 tu: 0.7236328125 femme: 0.68505859375 La personne: 0.677734375 prof: 0.666015625 |
Année | Anti: 0.8162745237350464 cent: 0.8051895499229431 Minutes: 0.7906433939933777 Huit: 0.7857747077941895 Cercle: 0.7682645320892334 |
Cercle: 0.78515625 Minutes: 0.7744140625 Année: 0.720703125 siècle: 0.70751953125 30h30: 0.70361328125 |
Tsubo: 0.71923828125 Mètre: 0.70947265625 Minutes: 0.7080078125 Minutesの: 0.7060546875 Secondes: 0.69091796875 |
voiture | porte: 0.6294019222259521 Porte: 0.6016885638237 Voiture: 0.5859153270721436 porte: 0.5726617574691772 rideau: 0.5608214139938354 |
Haut du corps: 0.74658203125 Entrepôt: 0.744140625 Bâtiment de style occidental: 0.7353515625 Escaliers: 0.7216796875 porte: 0.71484375 |
Escaliers: 0.72216796875 Voiture: 0.7216796875 la grotte: 0.716796875 souterrain: 0.7138671875 porte: 0.71142578125 |
Toyota | Toyotais not found | Toyotais not found | Toyotais not found |
Matin | nuit: 0.7267987132072449 Autour: 0.660172164440155 Le midi: 0.6085118055343628 soirée: 0.6021789908409119 La prochaine fois: 0.6002975106239319 |
soirée: 0.65576171875 Kunimoto: 0.65576171875 la première: 0.65087890625 Tenchobushi: 0.6494140625 Suivant: 0.64501953125 |
soirée: 0.68115234375 Le midi: 0.66796875 Hier soir: 0.6640625 nuit: 0.64453125 À l'intérieur de la porte: 0.61376953125 |
école | Tokyo: 0.6504884958267212 Plus haute: 0.6290650367736816 Lycée: 0.5801640748977661 Université: 0.5742003917694092 Embarquement: 0.5358142852783203 |
Université: 0.81201171875 Embarquement: 0.732421875 Sumita: 0.7275390625 étudiant: 0.68212890625 Lycée: 0.6767578125 |
Lycée: 0.69677734375 Université: 0.68701171875 récemment: 0.6611328125 Tokyo: 0.65869140625 ici: 0.65771484375 |
Zashiki | Étude: 0.6603355407714844 Côté Sou: 0.6362787485122681 Chambre: 0.6142982244491577 chambre: 0.6024710536003113 cuisine: 0.6014574766159058 |
sol: 0.77685546875 bureau: 0.76513671875 seuil: 0.76513671875 Hall principal: 0.744140625 entrée: 0.73681640625 |
bureau: 0.69970703125 sol: 0.68603515625 椽: 0.6796875 Étude: 0.6748046875 Zojigaya: 0.6708984375 |
kimono | Le crâne: 0.5216895937919617 noir: 0.5200990438461304 vêtements: 0.5096032619476318 洋vêtements: 0.48781922459602356 chapeau: 0.4869200587272644 |
Éviter: 0.68896484375 sueur froide: 0.6875 Éveiller: 0.67138671875 sous-vêtements: 0.6708984375 Ce qui signifie: 0.662109375 |
Costume: 0.68359375 Tourisme: 0.68212890625 coton: 0.6787109375 Jouer: 0.66259765625 硯: 0.65966796875 |
je | Maître: 0.6372452974319458 Supplémentaire: 0.5826579332351685 Kaneda: 0.4684762954711914 ils: 0.4676626920700073 Labyrinthe: 0.4615904688835144 |
Maître: 0.7861328125 ils: 0.7490234375 Supplémentaire: 0.71923828125 Chat: 0.71728515625 Inévitable: 0.69287109375 |
Maître: 0.80517578125 ils: 0.6982421875 Chat: 0.6962890625 femme: 0.6923828125 Lessing: 0.6611328125 |
Criminel | Fantôme: 0.6609077453613281 Voleurs: 0.6374931931495667 Membre: 0.6308270692825317 cette personne: 0.6046633720397949 Se plonger: 0.5931873917579651 |
La prochaine fois: 0.7841796875 patron: 0.75439453125 cette personne: 0.74462890625 bijoux: 0.74169921875 je: 0.73779296875 |
Pêche au poisson: 0.77392578125 cette personne: 0.74072265625 Bientôt disponible: 0.7392578125 Ballon léger: 0.7021484375 Maladie intraitable: 0.70166015625 |
commande | Parler: 0.6200630068778992 Consultation: 0.5290789604187012 Occupé: 0.5178924202919006 La gentillesse: 0.5033778548240662 Conférence: 0.4894390106201172 |
Rappel: 0.6279296875 Évaluation: 0.61279296875 diplômé: 0.611328125 Assemblée générale: 0.6103515625 luxe: 0.607421875 |
Consultation: 0.65087890625 Conseil: 0.63330078125 Évaluation: 0.62451171875 Démission: 0.61474609375 Proposition: 0.61474609375 |
Pistolet sans arme | Obsolète: 0.7266454696655273 Démodé: 0.6771457195281982 vu: 0.6735808849334717 Souffle du nez: 0.6516652703285217 ignorance: 0.650424063205719 |
Croyance: 0.7353515625 Top tri: 0.7294921875 Protagoniste: 0.693359375 Née: 0.68603515625 À vendre: 0.68603515625 |
position: 0.724609375 À portée de main: 0.71630859375 Route suivante: 0.71142578125 Visage: 0.70458984375 Matière: 0.69921875 |
Chat | Amen: 0.6659030318260193 Nobujo: 0.5759447813034058 Sumi: 0.5374482870101929 Statut: 0.5352671146392822 d'habitude: 0.5205280780792236 |
Sagesse: 0.728515625 je: 0.71728515625 Image: 0.70751953125 dyspepsie: 0.67431640625 Gourmandise: 0.66796875 |
je: 0.6962890625 Lycée: 0.6513671875 amour: 0.64306640625 ils: 0.63818359375 Porc: 0.6357421875 |
Alcool | livre: 0.5834404230117798 thé: 0.469807893037796 Du repos: 0.4605821967124939 Manger: 0.44864168763160706 barre: 0.4349029064178467 |
Boisson: 0.6728515625 querelle: 0.6689453125 nourriture: 0.66259765625 Yamakoshi: 0.646484375 Soba: 0.64599609375 |
Violon: 0.63232421875 Salaire mensuel: 0.630859375 médicament: 0.59521484375 Grenade: 0.59521484375 Kira: 0.5947265625 |
cuisine | Écheveau: 0.5380040407180786 Signe: 0.5214874744415283 original: 0.5175281763076782 Loi: 0.5082278847694397 Boutique: 0.5001937747001648 |
salle: 0.68896484375 Histoire: 0.615234375 roman: 0.59912109375 Arts littéraires: 0.5947265625 prendre: 0.59033203125 |
magazine: 0.666015625 Cabine: 0.65625 Forgeron: 0.61376953125 musiques: 0.6123046875 Kimono: 0.6083984375 |
C'est assez déroutant comme c'était le cas au chapitre 2. Aucune supériorité ou infériorité ne peut être donnée. La zone où les «chats» apparaissent dans «moi-même» montre le biais du corpus. Il semble que la raison en soit que la taille du corpus soit trop petite, car il n'utilise que les œuvres de Soseki Natsume, Kenji Miyazawa et Ranpo Edogawa.
Vient ensuite le problème de l'analogie.
Par problème d'analogie | CBOW (taille de la fenêtre: 5) | CBOW (taille de la fenêtre: 2) |
---|---|---|
Homme:Roi=femme:? | Nu: 5.25390625 Absent: 4.2890625 Zu: 4.21875 Ruru: 3.98828125 merde: 3.845703125 |
Gros oiseau: 3.4375 Chaque moment: 3.052734375 porte arrière: 2.9140625 Kage: 2.912109375 Pilier de plancher: 2.873046875 |
corps:visage=Voiture:? | Officier de police: 6.5 porte: 5.83984375 Deux personnes: 5.5625 Police: 5.53515625 Chef: 5.4765625 |
porte: 3.85546875 trou: 3.646484375 Lumière électrique: 3.640625 Police: 3.638671875 épaule: 3.6328125 |
aller:viens=parler:? | Dire: 4.6640625 Onze: 4.546875 Treize: 4.51171875 Ecoutez: 4.25 demander: 4.16796875 |
Ecoutez: 4.3359375 Regrettable: 4.14453125 Miya: 4.11328125 Dire: 3.671875 Onze: 3.55078125 |
nourriture:Manger=livre:? | Avoir: 4.3671875 Demander: 4.19140625 popularité: 4.1328125 route de montagne: 4.06640625 recevoir: 3.857421875 |
Rapide: 3.51171875 Aller: 3.357421875 Dire: 3.2265625 Ecoutez: 3.2265625 Commencez à devenir visqueux: 3.17578125 |
été:chaud=hiver:? | Accumuler: 5.23828125 Teru: 4.171875 viens: 4.10546875 Partout: 4.05859375 Aller: 3.978515625 |
Onze: 4.29296875 Fini: 3.853515625 Treize: 3.771484375 Devenir: 3.66015625 Mal: 3.66015625 |
Soudain, le premier problème est un mélange de scores faibles mais de résultats angoissants. Des données d'entraînement insuffisantes peuvent provoquer des choses effrayantes. J'ai l'impression d'avoir un aperçu du contexte de la demande récente d'une «IA explicable».
D'autres résultats sont également en lambeaux, mais à peine les bonnes réponses ont été mélangées dans "body: face = car:?" Et "go: come = speak:?". L'apparition de «policiers» et de «policiers» dans des «automobiles» est probablement due à Ranpo Edogawa.
Après tout, j'aurais dû utiliser docilement la version japonaise de Wikipédia, mais c'est une chose diabolique: la sueur: il y a beaucoup de gens qui essaient Wikipédia, donc si vous êtes intéressé, "wikipedia Japanese corpus" Veuillez essayer Google avec.
Le jugement négatif / positif du courrier est expliqué comme un exemple d'apprentissage par transfert, mais avec les connaissances de ce chapitre, même si les mots peuvent être convertis en vecteurs de longueur fixe, les phrases telles que le courrier ne peuvent pas être converties en vecteurs de longueur fixe. .. Par conséquent, nous ne pouvons pas encore contester une telle tâche.
Aussi, en ce qui concerne la qualité des expressions distribuées, dans le cas du japonais, la qualité de l'écriture pré-séparation semble avoir un grand effet. Certains modèles d'expressions distribuées japonais ont été publiés, mais lorsque l'on considère leur apprentissage par transfert, je pense qu'il est indispensable d'utiliser le même mécanisme d'écriture divisionnaire (logique, contenu du dictionnaire, paramètres, etc.). .. Dans ce cas, cela signifie-t-il que l'apprentissage par transfert ne peut pas être facilement réalisé avec des tâches qui traitent de termes techniques spécifiques à l'industrie ou à des entreprises individuelles, par exemple? Le japonais, c'est beaucoup de travail.
La première moitié de ce livre est enfin terminée, mais étant donné que le chapitre 1 était une critique du premier volume, il se peut qu'il en soit encore environ 1/3. La destination semble longue ...
C'est tout pour ce chapitre. Si vous avez des erreurs, je vous serais reconnaissant de bien vouloir les signaler.