Les approches traditionnelles du développement sont difficiles à maintenir lors de l'utilisation de modèles complexes d'apprentissage automatique en production. Le développement sur un ordinateur portable ou une machine locale peut être lent à former le modèle d'apprentissage automatique pour les ingénieurs d'apprentissage en profondeur. En conséquence, nous utilisons généralement des machines cloud avec un matériel plus puissant pour former et exécuter nos modèles d'apprentissage automatique. C'est une bonne pratique car nous faisons abstraction du calcul complexe et faisons à la place des requêtes AJAX si nécessaire. Dans ce didacticiel, nous mettrons à la disposition d'autres services un modèle d'apprentissage approfondi pré-formé nommé Word2Vec en créant une API REST à partir de zéro.
Conditions préalables
- Une instance de serveur Ubuntu 16.04 avec au moins 4 Go de RAM. À des fins de test et de développement, vous pouvez choisir une instance avec 4 Go de RAM
- Comprendre comment utiliser le système d'exploitation Linux pour créer / naviguer / modifier des dossiers et des fichiers
- Un
sudo
utilisateur
Que sont les incorporations de mots?
L'incorporation de mots est un développement récent dans le traitement du langage naturel et l'apprentissage en profondeur qui a révolutionné les deux domaines en raison de progrès rapides. Les incorporations de mots sont essentiellement des vecteurs qui correspondent chacun à un seul mot de sorte que les vecteurs signifient les mots. Cela peut être démontré par certains phénomènes tels que le vecteur de king - queen = boy - girl
. Les vecteurs de mots sont utilisés pour tout construire, des moteurs de recommandation aux chat-bots qui comprennent réellement la langue anglaise.
Les intégrations de mots ne sont pas aléatoires; ils sont générés par la formation d'un réseau neuronal. Une récente mise en œuvre puissante d'intégration de mots provient de Google, nommée Word2Vec, qui est formée en prédisant les mots qui apparaissent à côté d'autres mots dans une langue. Par exemple, pour le mot "cat"
, le réseau neuronal prédira les mots "kitten"
et "feline"
. Cette intuition des mots apparaissant les uns à côté des autres nous permet de les placer dans l'espace vectoriel.
Cependant, dans la pratique, nous avons tendance à utiliser les modèles pré-formés d'autres grandes sociétés telles que Google afin de prototyper rapidement et de simplifier les processus de déploiement. Dans ce didacticiel, nous allons télécharger et utiliser les incorporations de mots pré-formés Word2Vec de Google. Nous pouvons le faire en exécutant la commande suivante dans notre répertoire de travail.
wget http://magnitude.plasticity.ai/word2vec/GoogleNews-vectors-negative300.magnitude
Installation des packages Flask et Magnitude
Le modèle d'intégration de mots que nous avons téléchargé est dans un .magnitude
format. Ce format nous permet d'interroger le modèle efficacement à l'aide de SQL, et est donc le format d'intégration optimal pour les serveurs de production. Puisque nous devons être en mesure de lire le .magnitude
format, nous allons installer le pymagnitude
package. Nous installerons également flask
pour servir plus tard les prévisions d'apprentissage en profondeur faites par le modèle.
pip3 install pymagnitude flask
Nous l'ajouterons également à notre outil de suivi des dépendances avec la commande suivante. Cela crée un fichier nommé requirements.txt
et enregistre nos bibliothèques Python afin que nous puissions les réinstaller ultérieurement.
pip3 freeze > requirements.txt
Interrogation du modèle Word2Vec
Pour commencer, nous allons créer un fichier pour gérer l'ouverture et l'interrogation du mot incorporations.
touch model.py
Ensuite, nous ajouterons les lignes suivantes model.py
pour importer la magnitude.
from pymagnitude import Magnitude
vectors = Magnitude('GoogleNews-vectors-negative300.magnitude')
Nous pouvons jouer avec le pymagnitude
package et le modèle d'apprentissage en profondeur en utilisant la query
méthode, fournissant un argument pour un mot.
cat_vector = vectors.query('cat')
print(cat_vector)
Pour le cœur de notre API, nous allons définir une fonction pour renvoyer la différence de sens entre deux mots. C'est l'épine dorsale de la plupart des solutions d'apprentissage en profondeur pour des choses telles que les moteurs de recommandation (c'est-à-dire montrer du contenu avec des mots similaires).
Nous pouvons jouer avec cette fonction en utilisant les fonctions similarity
et most_similar
.
print(vectors.similarity("cat", "dog"))
print(vectors.most_similar("cat", topn=100))
Nous implémentons le calculateur de similarité comme suit. Cette méthode sera appelée par l'API Flask dans la section suivante. Notez que cette fonction renvoie une valeur réelle entre 0 et 1.
def similarity(word1, word2):
return vectors.similarity(word1, word2)
Création d'une API REST
Nous allons créer notre serveur dans un fichier nommé service.py
avec le contenu suivant. Nous importons flask
et request
gérons nos capacités de serveur et nous importons le similarity
moteur du module que nous avons écrit plus tôt.
from flask import Flask, request
from model import similarity
app = Flask(__name__)
@app.route("/", methods=['GET'])
def welcome():
return "Welcome to our Machine Learning REST API!"
@app.route("/similarity", methods=['GET'])
def similarity_route():
word1 = request.args.get("word1")
word2 = request.args.get("word2")
return str(similarity(word1, word2))
if __name__ == "__main__":
app.run(port=8000, debug=True)
Notre serveur est plutôt simple, mais peut facilement être étendu en créant plus de routes à l'aide du @app.route
décorateur.
Passer des appels API
Nous pouvons exécuter notre serveur Flask en exécutant les commandes suivantes pour activer notre environnement virtuel, installer nos packages et exécuter son fichier Python associé.
source venv/bin/activate
pip3 install -r requirements.txt
python3 service.py
Notre serveur sera disponible sur localhost:8000
. Nous pouvons interroger notre base de données sur localhost:8000/similarity?word1=cat&word2=dog
et afficher la réponse soit dans notre navigateur, soit via un autre client AJAX.