public class Adam<Model: Differentiable>: Optimizer
where
Model.TangentVector: VectorProtocol & PointwiseMultiplicative
& ElementaryFunctions & KeyPathIterable,
Model.TangentVector.VectorSpaceScalar == Float
Optimizador de Adam.
Implementa el algoritmo de optimización de Adam. Adam es un método de descenso de gradiente estocástico que calcula tasas de aprendizaje adaptativo individuales para diferentes parámetros a partir de estimaciones de momentos de primer y segundo orden de los gradientes.
Referencia: "Adam: un método para la optimización estocástica" (Kingma y Ba, 2014).
Ejemplos:
- Entrene un agente de aprendizaje por refuerzo simple:
...
// Instantiate an agent's policy - approximated by the neural network (`net`) after defining it
in advance.
var net = Net(observationSize: Int(observationSize), hiddenSize: hiddenSize, actionCount: actionCount)
// Define the Adam optimizer for the network with a learning rate set to 0.01.
let optimizer = Adam(for: net, learningRate: 0.01)
...
// Begin training the agent (over a certain number of episodes).
while true {
...
// Implementing the gradient descent with the Adam optimizer:
// Define the gradients (use withLearningPhase to call a closure under a learning phase).
let gradients = withLearningPhase(.training) {
TensorFlow.gradient(at: net) { net -> Tensor<Float> in
// Return a softmax (loss) function
return loss = softmaxCrossEntropy(logits: net(input), probabilities: target)
}
}
// Update the differentiable variables of the network (`net`) along the gradients with the Adam
optimizer.
optimizer.update(&net, along: gradients)
...
}
}
- Entrene una red generativa adversaria (GAN):
...
// Instantiate the generator and the discriminator networks after defining them.
var generator = Generator()
var discriminator = Discriminator()
// Define the Adam optimizers for each network with a learning rate set to 2e-4 and beta1 - to 0.5.
let adamOptimizerG = Adam(for: generator, learningRate: 2e-4, beta1: 0.5)
let adamOptimizerD = Adam(for: discriminator, learningRate: 2e-4, beta1: 0.5)
...
Start the training loop over a certain number of epochs (`epochCount`).
for epoch in 1...epochCount {
// Start the training phase.
...
for batch in trainingShuffled.batched(batchSize) {
// Implementing the gradient descent with the Adam optimizer:
// 1) Update the generator.
...
let 𝛁generator = TensorFlow.gradient(at: generator) { generator -> Tensor<Float> in
...
return loss
}
// Update the differentiable variables of the generator along the gradients (`𝛁generator`)
// with the Adam optimizer.
adamOptimizerG.update(&generator, along: 𝛁generator)
// 2) Update the discriminator.
...
let 𝛁discriminator = TensorFlow.gradient(at: discriminator) { discriminator -> Tensor<Float> in
...
return loss
}
// Update the differentiable variables of the discriminator along the gradients (`𝛁discriminator`)
// with the Adam optimizer.
adamOptimizerD.update(&discriminator, along: 𝛁discriminator)
}
}
Declaración
public typealias Model = Model
La tasa de aprendizaje.
Declaración
public var learningRate: Float
Un coeficiente utilizado para calcular los primeros momentos de las pendientes.
Declaración
public var beta1: Float
Un coeficiente utilizado para calcular los segundos momentos de las pendientes.
Declaración
public var beta2: Float
Un pequeño escalar agregado al denominador para mejorar la estabilidad numérica.
Declaración
public var epsilon: Float
La tasa de aprendizaje decae.
Declaración
public var decay: Float
El paso actual.
Declaración
public var step: Int
Los primeros momentos de las pesas.
Declaración
public var firstMoments: Model.TangentVector
Los segundos momentos de las pesas.
Declaración
public var secondMoments: Model.TangentVector
Declaración
public init( for model: __shared Model, learningRate: Float = 1e-3, beta1: Float = 0.9, beta2: Float = 0.999, epsilon: Float = 1e-8, decay: Float = 0 )
Parámetros
learningRate
La tasa de aprendizaje. El valor predeterminado es
1e-3
.beta1
La tasa de caída exponencial para las estimaciones del primer momento. El valor predeterminado es
0.9
.beta2
La tasa de caída exponencial para las estimaciones del segundo momento. El valor predeterminado es
0.999
.epsilon
Un pequeño escalar agregado al denominador para mejorar la estabilidad numérica. El valor predeterminado es
1e-8
.decay
La tasa de aprendizaje decae. El valor predeterminado es
0
.Declaración
public required init(copying other: Adam, to device: Device)