آدم

public class Adam<Model: Differentiable>: Optimizer
where
  Model.TangentVector: VectorProtocol & PointwiseMultiplicative
    & ElementaryFunctions & KeyPathIterable,
  Model.TangentVector.VectorSpaceScalar == Float

بهینه ساز آدام.

الگوریتم بهینه سازی آدام را پیاده سازی می کند. Adam یک روش نزولی گرادیان تصادفی است که نرخ‌های یادگیری تطبیقی ​​فردی را برای پارامترهای مختلف از برآورد لحظه‌های درجه اول و دوم گرادیان‌ها محاسبه می‌کند.

مرجع: "آدام: روشی برای بهینه سازی تصادفی" (کینگما و با، 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

    نرخ فروپاشی نمایی برای لحظه 1 تخمین می زند. مقدار پیش فرض 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)