public class Adam<Model: Differentiable>: Optimizer
where
Model.TangentVector: VectorProtocol & PointwiseMultiplicative
& ElementaryFunctions & KeyPathIterable,
Model.TangentVector.VectorSpaceScalar == Float
آدم محسن.
ينفذ خوارزمية التحسين آدم. آدم هي طريقة نزول متدرجة عشوائية تحسب معدلات التعلم التكيفي الفردية لمعلمات مختلفة من تقديرات لحظات التدرج من الدرجة الأولى والثانية.
المرجع: "آدم: طريقة للتحسين العشوائي" (Kingma and Ba, 2014).
أمثلة:
- تدريب وكيل التعلم المعزز البسيط:
...
// 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)
...
}
}
- تدريب شبكة الخصومة التوليدية (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)
}
}
تصريح
public typealias Model = Model
معدل التعلم.
تصريح
public var learningRate: Float
معامل يستخدم لحساب اللحظات الأولى من التدرجات.
تصريح
public var beta1: Float
معامل يستخدم لحساب العزوم الثانية للتدرجات.
تصريح
public var beta2: Float
كمية صغيرة تضاف إلى المقام لتحسين الاستقرار العددي.
تصريح
public var epsilon: Float
انخفاض معدل التعلم.
تصريح
public var decay: Float
الخطوة الحالية.
تصريح
public var step: Int
اللحظات الأولى للأوزان.
تصريح
public var firstMoments: Model.TangentVector
اللحظات الثانية من الأوزان.
تصريح
public var secondMoments: Model.TangentVector
تصريح
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 )
حدود
learningRate
معدل التعلم. القيمة الافتراضية هي
1e-3
.beta1
معدل الانحلال الأسي لتقديرات اللحظة الأولى. القيمة الافتراضية هي
0.9
.beta2
معدل الانحلال الأسي لتقديرات اللحظة الثانية. القيمة الافتراضية هي
0.999
.epsilon
كمية صغيرة تضاف إلى المقام لتحسين الاستقرار العددي. القيمة الافتراضية هي
1e-8
.decay
انخفاض معدل التعلم. القيمة الافتراضية هي
0
.تصريح
public required init(copying other: Adam, to device: Device)