Cet article est le cinquième jour du "Calendrier de l'Avent Money Forward 2015". Désolé d'être en retard
Intro Je sens que l'enthousiasme dans ce domaine s'accélère, car des géants de l'informatique tels que Googe, Microsoft et IBM ont rendu les systèmes d'apprentissage automatique open source. À mon avis (peut-être l'espoir), le 3ème boom de l'IA a pris racine avant l'hiver, et nous sommes maintenant au stade de la prise de conscience de créer des services qui «utilisent l'apprentissage automatique pour le rendre naturel + le différencier». N'est-ce pas?
J'ai donc consacré ces derniers mois d'activités de contribution exclusivement à suivre des MOOC et à lire la série MLP.
Ce que j'ai ressenti là-dedans était également dans Le chemin le plus court pour les adultes qui travaillent qui ont évité les mathématiques de commencer à étudier l'apprentissage automatique. À tout le moins, si vous n’êtes pas habitué à manipuler les matrices et les vecteurs, même si vous manipulez la matrice légèrement pendant le cours, il est facile de vous familiariser avec ce que vous faites maintenant (guillemet). Je me suis spécialisé dans l'ingénierie de contrôle et la mécatronique à l'université, donc j'avais une certaine formation, mais je luttais encore (excusez-moi parce que j'avais un blanc de quatre ans). J'ai eu du mal moi-même, donc c'est dur pour les personnes au même poste ou sans expérience! D'un point de vue légèrement supérieur, j'aimerais écrire sur l'apprentissage automatique en utilisant des vecteurs et des matrices avec des exemples.
C'est simplement parce que la vitesse d'exécution (d'apprentissage) est rapide. Si vous n'utilisez pas de matrice, vous utiliserez for-loop pour entraîner chaque échantillon, mais lorsque n> 1000, la vitesse d'apprentissage diminuera considérablement. En effet, Octave et Python, qui sont des langages interprétés, entraînent une surcharge pour chacun pendant une minute. Par conséquent, il est recommandé d'étudier avec une matrice plutôt qu'avec une boucle for.
Pour référence, je présenterai les performances lorsque j'ai essayé d'implémenter l'apprentissage des données MNIST (28x28 pixels) du modèle MLP (perceptron multicouche) à la fois en version matricielle et en version phrase.
Prenons une simple régression logistique. Cette fois, vectorisons l'intégrale minute de z et du gradient.
Le vecteur z (chaque élément) avant de plonger dans la fonction d'activation peut être calculé comme suit. Ce qui précède est d'abord implémenté avec une instruction for, mais le but est de l'implémenter sous une forme qui utilise une matrice.
Autrement dit, nous voulons faire de z la forme suivante avec une seule commande.
Et chacune des colonnes ci-dessus peut être transformée comme suit. Veuillez le reconnaître comme ** une telle chose **.
Comme mentionné ci-dessus, chaque élément de z est le produit interne du vecteur x et du vecteur thêta. Pour exprimer cela avec x et thêta sans utiliser l'instruction for, créez X comme si chaque vecteur x (translocation) était superposé sur une ligne comme indiqué ci-dessous.
Ensuite, vous pouvez créer une formule simple comme celle ci-dessous.
Si vous implémentez cela avec Octave / python, vous pouvez obtenir une forme soignée comme indiqué ci-dessous.
octave.m
z = X * theta;
python.py
#Avec la méthode utilisant numpy
np.dot(theta, X)
Afin de trouver le paramètre optimal, nous voulons trouver une valeur qui rend la différenciation partielle pour chaque paramètre de la fonction d'évaluation 0, ou un paramètre qui est en dessous du seuil, nous devons donc implémenter la formule de différenciation partielle.
Quand ceci est vectorisé
Maintenant, pour transformer cela, vous pouvez d'abord utiliser les règles suivantes. Veuillez le reconnaître comme ** une telle chose **.
La matrice dans laquelle x est aligné est la transposition de X introduite dans la vectorisation de z, donc
Par conséquent, vous pouvez écrire un différentiel partiel vectorisé de la fonction de coût comme indiqué ci-dessous.
Je l'appellerai brièvement comme suit.
octave.m
h = activate_function(z)
grad = 1 / m * (X'*(h-y))
python.py
h = activate_function(z)
grad = 1/m * np.dot(X.T, h-y)
Ce qui précède est l'explication de la vectorisation. Je voudrais apporter un complément au cœur des débutants avec cela. Cependant, je n'ai pas l'impression de faire une erreur, alors j'aimerais beaucoup entendre vos opinions et commentaires.
Recommended Posts