آدم

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 func update(_ model: inout Model, along direction: Model.TangentVector)
  • تصريح

    public required init(copying other: Adam, to device: Device)