public class Adam<Model: Differentiable>: Optimizer
where
Model.TangentVector: VectorProtocol & PointwiseMultiplicative
& ElementaryFunctions & KeyPathIterable,
Model.TangentVector.VectorSpaceScalar == Float
อดัม ออพติไมเซอร์
ใช้อัลกอริธึมการปรับให้เหมาะสมของ Adam อดัมเป็นวิธีการสุ่มไล่ระดับที่คำนวณอัตราการเรียนรู้แบบปรับตัวของแต่ละบุคคลสำหรับพารามิเตอร์ที่ต่างกันจากการประมาณค่าโมเมนต์การไล่ระดับสีลำดับที่หนึ่งและที่สอง
อ้างอิง: “อดัม: วิธีการเพิ่มประสิทธิภาพสุ่ม” (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
อัตราการสลายตัวแบบเอกซ์โปเนนเชียลสำหรับการประมาณช่วงเวลาที่ 1 ค่าเริ่มต้นคือ
0.9
beta2
อัตราการสลายตัวแบบเอ็กซ์โปเนนเชียลสำหรับการประมาณช่วงเวลาที่ 2 ค่าเริ่มต้นคือ
0.999
epsilon
สเกลาร์ขนาดเล็กถูกเพิ่มเข้าไปในตัวส่วนเพื่อปรับปรุงความเสถียรของตัวเลข ค่าเริ่มต้นคือ
1e-8
decay
อัตราการเรียนรู้ลดลง ค่าเริ่มต้นคือ
0
คำประกาศ
public required init(copying other: Adam, to device: Device)