Quelle est la meilleure façon de mettre en œuvre le poids des contraintes dans TensorFlow?
Supposons que nous avons les poids
x = tf.Variable(np.random.random((5,10)))
cost = ...
Et nous utilisons le GD optimizer:
upds = tf.train.GradientDescentOptimizer(lr).minimize(cost)
session.run(upds)
Comment pouvons-nous mettre en œuvre pour exemple la non-négativité des poids?
J'ai essayé de les tailler:
upds = tf.train.GradientDescentOptimizer(lr).minimize(cost)
session.run(upds)
session.run(tf.assign(x, tf.clip_by_value(x, 0, np.infty)))
Mais cela ralentit ma formation par un facteur 50.
Quelqu'un connais un bon moyen de mettre en œuvre de telles contraintes sur les poids dans TensorFlow?
P. S.: l'équivalent Théano algorithme, j'ai eu
T.clip(x, 0, np.infty)
et il s'est passé en douceur.
- Comment sur l'utilisation de la tf.nn.relu(x) à chaque fois que vous x de référence, et de laisser le SGD gérer le reste?
- Je pense que liées GitHub question est ici.
Vous devez vous connecter pour publier un commentaire.
Vous pouvez prendre l'approche Lagrangienne et il suffit d'ajouter une pénalité pour les fonctions de la variable que vous ne voulez pas.
par exemple Pour encourager
theta
non-négatif, vous pouvez ajouter les éléments suivants à l'optimiseur de la fonction objectif.Si tout
theta
sont négatifs, alors add2loss sera positif, sinon zéro. Mise à l'échelle à une valeur raisonnable est laissé comme exercice au lecteur. Mise à l'échelle trop petite ne sera pas exercer suffisamment de pression. Trop peut rendre les choses instable.De TensorFlow 1.4, il y a un nouvel argument à
tf.get_variable
qui permet de passer d'une fonction de contrainte qui lui est appliquée après la mise à jour de l'optimiseur. Voici un exemple qui applique une contrainte de non-négativité:En exécutant
vous êtes constamment en ajoutant des nœuds du graphe et de la rendre de plus en plus lent.
En fait, vous pouvez simplement définir un
clip_op
lors de la construction du graphe et de l'exécuter à chaque fois après la mise à jour des pondérations:Il existe une solution pratique: Votre fonction de coût peut être écrit par vous, de coût élevé sur le poids est négatif. Je l'ai fait en une factorisation de matrice modèle dans TensorFlow avec python, et cela a fonctionné assez bien. Droit? Je veux dire, c'est évident. Mais personne d'autre ne le mentionne si vous pouvez y aller. EDIT: je viens de voir que la Marque Borderding a également donné une autre perte et de coût basée sur l'implémentation de la solution avant que je n'.
Et si "la meilleure façon" est voulu, comme l'OP posé, que faire alors? Bien "meilleur" peut en fait être spécifique à l'application, dans ce cas, vous auriez besoin d'essayer quelques différentes façons avec votre dataset et d'envisager votre les exigences de l'application.
Voici code du travail pour augmenter le coût pour les négatifs solution variables:
Vous êtes libre d'utiliser mon code mais s'il vous plaît donnez-moi un peu de crédit si vous choisissez de l'utiliser. Donner un lien vers cette réponse sur stackoverflow.com s'il vous plaît.
Cette conception serait considérée comme une contrainte souple, parce que vous pouvez toujours obtenir le poids est négatif, si vous le permettez, selon votre définition du coût.
Il semble que la contrainte= est aussi disponible en TF v1.4+ en tant que paramètre à tf.get_variable(), où vous pouvez passer une fonction comme la tf.clip_by_value. Cela semble être une autre contrainte souple, pas de contrainte, à mon avis, parce qu'il dépend de votre fonction fonctionne bien ou pas. Il peut également être lent, comme les autres répondeur essayé la même fonction et a signalé qu'il était lent à converger, même si ils n'ont pas utilisé la contrainte= paramètre pour ce faire. Je ne vois pas pourquoi l'un serait plus rapide que l'autre, car ils utilisent tous les deux le même écrêtage approche. Donc, si vous utilisez la contrainte= paramètre alors vous devriez vous attendre lente convergence dans le contexte de l'affiche originale de l'application.
Il serait plus agréable si TF fourni vrai dur contraintes à l'API, et laissez-TF comprendre comment appliquer cela aussi bien que pour être efficace sur le back-end. Je veux dire, j'ai vu cette façon de faire dans la programmation linéaire solveurs déjà depuis longtemps. L'application déclare une contrainte, et à l'arrière il arrive.
J'ai récemment eu ce problème ainsi. J'ai découvert que vous pouvez importer keras, qui a nice contrainte de poids fonctions de les utiliser directement dans le kernen contrainte dans tensorflow. Voici un exemple de mon code. Vous pouvez faire des choses similaires avec un noyau regularizer