J'ai soudainement commencé à étudier "Deep Learning from scratch ❷ --- traitement du langage naturel" Notez que j'ai trébuché au chapitre 5 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 décrit le réseau neuronal récurrent.
Il explique le modèle de langage et les problèmes liés à l'utilisation de CBOW comme modèle de langage. Je pense que la raison pour laquelle l'équation 5.8 est une approximation est que CBOW ignore la séquence de mots.
Puisque word2vec ignore la séquence des mots, il semble que le RNN appris dans ce chapitre soit meilleur s'il est utilisé pour des expressions distribuées, mais le RNN est né en premier, et plus tard pour augmenter le nombre de vocabulaire et améliorer la qualité. Il est intéressant de noter que word2vec a été proposé par la société, et qu'il s'agissait en fait du flux inverse.
Explication de RNN. La fonction tanh (fonction tangente bicurve) apparaît comme une fonction d'activation, mais pour une raison quelconque, il n'y a pas d'explication dans ce livre, alors cherchons sur Google pour plus de détails avec "tanh".
Une autre chose qui m'inquiétait un peu était la possibilité de revenir au début lorsque les données étaient utilisées jusqu'à la fin dans l'apprentissage par mini-lots. Dans ce cas, la fin et le début du corpus seront connectés. Cependant, en premier lieu, ce livre traite le corpus PTB comme "une grande série de données chronologiques" et ne considère même pas les sauts de phrase (voir la partie marque du scorpion au centre de la P.87). Par conséquent, il peut être inutile de s'inquiéter de la connexion entre la fin et le début.
Un peu de précaution doit être prise dans l'implémentation, car le nœud Repeat après le biais $ b $ est omis dans les figures 5-19 et 5-20. La propagation vers l'avant peut être implémentée comme le montre la figure car elle est diffusée, mais il est nécessaire de l'ajouter consciemment lors du calcul de $ db $ par propagation arrière. Juste cette partie du QA était également en teratail (teratail: why sum sum db with axis = 0 in backpropagation of RNN).
De plus, la fonction tanh qui est sortie cette fois est implémentée sans explication, mais la propagation vers l'avant peut être calculée avec numpy.tanh ()
comme dans le code du livre. Pour la rétro-propagation, la partie dt = dh_next * (1 --h_next ** 2)
est la différenciation de tanh, qui est expliquée en détail dans "Annexe A Différenciation de la fonction sigmoïde et de la fonction tanh" à la fin du livre. il y a.
De plus, à la page 205, l'histoire de «... (point 3 points)» apparaît, qui est la même que celle du «lecteur 3 points» qui apparaît à la page 34. [Chapitre 1 de ce mémo](https://qiita.com/segavvy/items/91be1d4fc66f7e322f25#13-%E3%83%8B%E3%83%A5%E3%83%BC%E3%83%A9%E3 % 83% AB% E3% 83% 8D% E3% 83% 83% E3% 83% 88% E3% 83% AF% E3% 83% BC% E3% 82% AF% E3% 81% AE% E5% AD Comme je l'ai écrit dans% A6% E7% BF% 92), il est préférable de comprendre la relation entre les tranches et les vues de ndarray plutôt que de se souvenir qu'il sera écrasé par des points de 3 points.
L'explication du code est omise, mais elle est simple et compréhensible.
La couche Time Embedding (classe TimeEmbedding
dans common / time_layers.py) boucle simplement sur $ T $ des couches Embedding.
Dans la couche Time Affine (classe TimeAffine
dans common / time_layers.py), au lieu de boucler $ T $ fois, la taille du lot $ N $ est transformée en $ T $ fois et calculée à la fois, et le résultat est l'original. Il est rendu plus efficace en le transformant en forme.
Le calque Time Softmax With Loss (classe TimeSoftmaxWithLoss
dans common / time_layers.py) est comme expliqué dans le livre, mais je craignais qu'un masque utilisant ʻignore_label` ait été implémenté. Lorsque l'étiquette de réponse correcte est -1, la perte et le gradient sont définis sur 0 et il est exclu du dénominateur $ T $ lors du calcul de $ L $, mais le processus de définition de l'étiquette de réponse correcte sur -1 est maintenant Je ne pense pas que c'était là. Je pourrai l'utiliser dans un chapitre ultérieur, je vais donc le laisser pour le moment.
Malheureusement, cette implémentation ne donne pas de bons résultats lors de l'utilisation de l'ensemble de données PTB, j'ai donc joué avec le chapitre précédent texte pré-écrit d'Aozora Bunko J'ai également arrêté d'étudier à. On dit qu'il sera amélioré dans le prochain chapitre, donc je vais l'essayer là-bas.
En passant, quand j'ai vu le code rn = np.random.randn
dans SimpleRnnlm .__ init __ ()
, je l'ai trouvé pratique car Python peut facilement mettre des fonctions dans des variables et les utiliser. En langage C, il est compliqué de mettre une fonction dans une variable (mettre un point d'entrée de fonction dans une variable) avec beaucoup de «*» et de «()», et c'est compliqué de l'utiliser, et je ne suis pas vraiment bon dans mes jours actifs. Fait: transpirer:
J'ai réussi à gérer des données chronologiques.
C'est tout pour ce chapitre. Si vous avez des erreurs, je vous serais reconnaissant de bien vouloir les signaler.