Адам

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

Адам оптимизатор.

Реализует алгоритм оптимизации Адама. Адам — это метод стохастического градиентного спуска, который вычисляет индивидуальные скорости адаптивного обучения для различных параметров на основе оценок моментов градиентов первого и второго порядка.

Ссылка: «Адам: метод стохастической оптимизации» (Кингма и Ба, 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)