adam

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

Pengoptimal Adam.

Menerapkan algoritma optimasi Adam. Adam adalah metode penurunan gradien stokastik yang menghitung kecepatan pembelajaran adaptif individu untuk parameter berbeda dari perkiraan momen gradien orde pertama dan kedua.

Referensi: “Adam: Metode Optimasi Stokastik” (Kingma dan Ba, 2014).

Contoh:

  • Latih agen pembelajaran penguatan sederhana:
...
// 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)
    ...
    }
}
  • Latih jaringan permusuhan generatif (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)
        }
}       
  • Pernyataan

    public typealias Model = Model
  • Kecepatan pembelajaran.

    Pernyataan

    public var learningRate: Float
  • Koefisien yang digunakan untuk menghitung momen pertama gradien.

    Pernyataan

    public var beta1: Float
  • Koefisien yang digunakan untuk menghitung momen kedua gradien.

    Pernyataan

    public var beta2: Float
  • Skalar kecil ditambahkan ke penyebut untuk meningkatkan stabilitas numerik.

    Pernyataan

    public var epsilon: Float
  • Penurunan kecepatan pembelajaran.

    Pernyataan

    public var decay: Float
  • Langkah saat ini.

    Pernyataan

    public var step: Int
  • Momen pertama Libra.

    Pernyataan

    public var firstMoments: Model.TangentVector
  • Momen kedua dari bobot.

    Pernyataan

    public var secondMoments: Model.TangentVector
  • Pernyataan

    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
    )

    Parameter

    learningRate

    Kecepatan pembelajaran. Nilai defaultnya adalah 1e-3 .

    beta1

    Tingkat peluruhan eksponensial untuk perkiraan momen pertama. Nilai defaultnya adalah 0.9 .

    beta2

    Tingkat peluruhan eksponensial untuk perkiraan momen ke-2. Nilai defaultnya adalah 0.999 .

    epsilon

    Skalar kecil ditambahkan ke penyebut untuk meningkatkan stabilitas numerik. Nilai defaultnya adalah 1e-8 .

    decay

    Penurunan kecepatan pembelajaran. Nilai defaultnya adalah 0 .

  • Pernyataan

    public func update(_ model: inout Model, along direction: Model.TangentVector)
  • Pernyataan

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