Je voudrais utiliser un réseau de neurones pour prédire une valeur scalaire qui est la somme d'une fonction des valeurs d'entrée et d'une valeur aléatoire (je suppose une distribution gaussienne) dont la variance dépend également des valeurs d'entrée. Maintenant, j'aimerais avoir un réseau de neurones qui a deux sorties - la première sortie devrait approcher la partie déterministe - la fonction, et la deuxième sortie devrait approximer la variance de la partie aléatoire, en fonction des valeurs d'entrée. De quelle fonction de perte ai-je besoin pour former un tel réseau?
(Ce serait bien s'il y avait un exemple avec Python pour Tensorflow, mais je suis également intéressé par les réponses générales. Je ne sais pas non plus comment écrire quelque chose comme du code Python - aucun des exemples que je trouvé jusqu'à présent montre comment traiter les sorties individuelles de la fonction de perte.)
3 Réponses :
Vous pouvez utiliser l'abandon pour cela. Avec une couche d'exclusion, vous pouvez faire plusieurs prédictions différentes en fonction de différents paramètres dont les nœuds ont abandonné. Ensuite, vous pouvez simplement compter les résultats et interpréter le résultat comme une mesure de l'incertitude.
Pour plus de détails, lisez:
Gal, Yarin et Zoubin Ghahramani. " Le décrochage en tant qu'approximation bayésienne: représentation de l'incertitude du modèle dans l'apprentissage en profondeur ." conférence internationale sur l'apprentissage automatique. 2016.
Merci! Approche intéressante et créative mais semble assez difficile à mettre en œuvre. Comme je n'ai rien trouvé que je pouvais emporter, j'ai trouvé quelque chose par moi-même. Que pensez-vous de l'approche directe consistant à utiliser simplement le NN pour approximer la moyenne et la variance directement à l'aide de mean_squared_error: colab.research.google.com/drive/… ?
Lorsque vous utilisez le décrochage pour estimer l'incertitude (ou toute autre méthode de régularisation stochastique), assurez-vous de consulter également nos travaux récents sur la fourniture d'une approximation sans échantillonnage du décrochage de Monte-Carlo.
https://arxiv.org/pdf/1908.00598.pdf
Nous suivons essentiellement votre idée. Traitez les activations comme des variables aléatoires, puis propagez la moyenne et la variance en utilisant la propagation d'erreur vers la couche de sortie. Par conséquent, nous obtenons deux résultats - la moyenne et la variance .
Comme je n'ai rien trouvé de simple à mettre en œuvre, j'ai écrit quelque chose moi-même, qui modélise explicitement: voici une fonction de perte personnalisée qui tente de prédire la moyenne et la variance . Cela semble fonctionner, mais je ne sais pas si cela fonctionne bien dans la pratique, et j'apprécierais vos commentaires. Voici ma fonction de perte:
def meanAndVariance(y_true: tf.Tensor , y_pred: tf.Tensor) -> tf.Tensor : """Loss function that has the values of the last axis in y_true approximate the mean and variance of each value in the last axis of y_pred.""" y_pred = tf.convert_to_tensor(y_pred) y_true = math_ops.cast(y_true, y_pred.dtype) mean = y_pred[..., 0::2] variance = y_pred[..., 1::2] res = K.square(mean - y_true) + K.square(variance - K.square(mean - y_true)) return K.mean(res, axis=-1)
La dimension de sortie est le double de la dimension de l'étiquette - moyenne et variance de chaque valeur de l'étiquette. La fonction de perte se compose de deux parties: une erreur quadratique moyenne dont la moyenne correspond approximativement à la moyenne de la valeur d'étiquette, et la variance qui se rapproche de la différence entre la valeur et la moyenne prévue.