processus
Dans l'expérience FedAvg sous le framework fédéré tensorflow, un morceau de code intercepte toujours une sortie anormale:
for predicted_y in batch_predicted_y:
max = -1000
flag = -1
for j in range(10):
if predicted_y[j] > max:
max = predicted_y[j]
flag = j
if(flag==-1):
sys.exit()
p.append(flag)
Et ce code est dans la fonction manuscrite eval(model)
pour calculer la précision du modèle
#验证模型准确率
loss,acc = eval(federated_model)
J'ai donc passé 30 minutes à vérifier cette fonction et je n'ai trouvé aucune erreur.
Enfin, du début à la fin d'une inspection de fonction, on constate que le problème n'est pas la façon dont la fonction est écrite, mais que le paramètre de modèle passé est NaN:
Donc, selon le débogage de la pile d'appels, batch_train()
le résultat trouvé est normal, et local_train()
le résultat est NaN
def batch_train(initial_model, batch, learning_rate):
model_vars = collections.OrderedDict([
(name, tf.Variable(name=name, initial_value=value))
for name, value in initial_model.items()
])
optimizer = tf.keras.optimizers.SGD(learning_rate)
def _train_on_batch(model_vars, batch):
with tf.GradientTape() as tape:
loss = forward_pass(model_vars, batch)
grads = tape.gradient(loss, model_vars)
optimizer.apply_gradients(
zip(tf.nest.flatten(grads), tf.nest.flatten(model_vars)))
return model_vars
return _train_on_batch(model_vars, batch)
# 设备训练
def local_train(initial_model, learning_rate, all_batches):
def batch_fn(model, batch):
return batch_train(model, batch, learning_rate)
model=initial_model
model=tff.sequence_reduce(all_batches,model, batch_fn)
return model
Pensez ensuite à local_train()
la signification de la batch_train()
fonction, elle appelle la fonction pour chaque lot et le modèle est constamment mis à jour. Ensuite, le problème réside dans le processus itératif de mise à jour du modèle: un paramètre d'itération passe à NaN, qui peut être un nombre au-delà de la plage de représentation.
J'ai donc essayé de modifier le taux d'apprentissage de 0,1 à 0,01, et finalement les paramètres du modèle étaient normaux.
for round_num in range(ROUND):
learning_rate = 0.01 / (1+round_num)
L'entraînement suivant est également normal, mais le taux d'apprentissage est trop faible et l'apprentissage trop lent Vous pouvez ajuster le taux d'apprentissage de manière appropriée.
Pour résumer
J'ai rencontré une situation dans laquelle les paramètres du modèle deviennent NaN en raison de paramètres de taux d'apprentissage incorrects. Cette fois, je ne m'attendais pas à ce que la plupart du temps soit passé à vérifier si la fonction était mal écrite. Aucun résultat n'a été trouvé. Enfin, une recherche de tapis a été effectuée. utilisé pour trouver le bogue. Dans ma colère, le blog Shuibian enregistre les heures perdues par le débogage, puis ajoute un résumé en profondeur de l'impact du taux d'apprentissage sur la formation des modèles (et creuser des trous).