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 required init(copying other: Adam, to device: Device)