Bases: BaseScheduler
Scheduler with linear interpolation between start and end values.
This scheduler linearly interpolates between a start value and an end value
over a specified number of steps. After reaching the end value, it remains
constant. Linear scheduling is useful when you want predictable, uniform
changes in parameter values.
Mathematical Formula
\[v(t) = \begin{cases}
v_0 + (v_{end} - v_0) \times \frac{t}{T}, & \text{if } t < T \\
v_{end}, & \text{if } t \geq T
\end{cases}\]
where:
- \(v_0\) is the start_value
- \(v_{end}\) is the end_value
- \(T\) is n_steps
- \(t\) is the current step count
Parameters:
Name |
Type |
Description |
Default |
start_value
|
float
|
Starting parameter value.
|
required
|
end_value
|
float
|
|
required
|
n_steps
|
int
|
Number of steps to reach the final value.
|
required
|
Raises:
Type |
Description |
ValueError
|
If n_steps is not positive.
|
Linear Decay
| scheduler = LinearScheduler(start_value=1.0, end_value=0.0, n_steps=5)
for i in range(7): # Go beyond n_steps to see clamping
value = scheduler.step()
print(f"Step {i+1}: {value:.2f}")
# Output: 0.80, 0.60, 0.40, 0.20, 0.00, 0.00, 0.00
|
Warmup Strategy
| warmup_scheduler = LinearScheduler(
start_value=0.0, end_value=0.1, n_steps=100
)
# Use for learning rate warmup
for epoch in range(100):
lr = warmup_scheduler.step()
# Set learning rate in optimizer
|
MCMC Integration
| step_scheduler = LinearScheduler(
start_value=0.1, end_value=0.001, n_steps=1000
)
# Use in MCMC sampler
sampler = LangevinDynamics(
energy_function=energy_fn,
step_size=step_scheduler
)
|
Source code in torchebm/core/base_scheduler.py
| class LinearScheduler(BaseScheduler):
r"""
Scheduler with linear interpolation between start and end values.
This scheduler linearly interpolates between a start value and an end value
over a specified number of steps. After reaching the end value, it remains
constant. Linear scheduling is useful when you want predictable, uniform
changes in parameter values.
!!! info "Mathematical Formula"
$$v(t) = \begin{cases}
v_0 + (v_{end} - v_0) \times \frac{t}{T}, & \text{if } t < T \\
v_{end}, & \text{if } t \geq T
\end{cases}$$
where:
- \(v_0\) is the start_value
- \(v_{end}\) is the end_value
- \(T\) is n_steps
- \(t\) is the current step count
Args:
start_value (float): Starting parameter value.
end_value (float): Target parameter value.
n_steps (int): Number of steps to reach the final value.
Raises:
ValueError: If n_steps is not positive.
!!! example "Linear Decay"
```python
scheduler = LinearScheduler(start_value=1.0, end_value=0.0, n_steps=5)
for i in range(7): # Go beyond n_steps to see clamping
value = scheduler.step()
print(f"Step {i+1}: {value:.2f}")
# Output: 0.80, 0.60, 0.40, 0.20, 0.00, 0.00, 0.00
```
!!! tip "Warmup Strategy"
```python
warmup_scheduler = LinearScheduler(
start_value=0.0, end_value=0.1, n_steps=100
)
# Use for learning rate warmup
for epoch in range(100):
lr = warmup_scheduler.step()
# Set learning rate in optimizer
```
!!! example "MCMC Integration"
```python
step_scheduler = LinearScheduler(
start_value=0.1, end_value=0.001, n_steps=1000
)
# Use in MCMC sampler
sampler = LangevinDynamics(
energy_function=energy_fn,
step_size=step_scheduler
)
```
"""
def __init__(self, start_value: float, end_value: float, n_steps: int):
r"""
Initialize the linear scheduler.
Args:
start_value (float): Starting parameter value.
end_value (float): Target parameter value.
n_steps (int): Number of steps to reach the final value.
Raises:
ValueError: If n_steps is not positive.
"""
super().__init__(start_value)
if n_steps <= 0:
raise ValueError(f"n_steps must be positive, got {n_steps}")
self.end_value = end_value
self.n_steps = n_steps
self.step_size: float = (end_value - start_value) / n_steps
def _compute_value(self) -> float:
r"""
Compute the linearly interpolated value.
Returns:
float: The interpolated value, clamped to end_value after n_steps.
"""
if self.step_count >= self.n_steps:
return self.end_value
else:
return self.start_value + self.step_size * self.step_count
|
end_value
instance-attribute
n_steps
instance-attribute
step_size
instance-attribute
step_size: float = (end_value - start_value) / n_steps
_compute_value
_compute_value() -> float
Compute the linearly interpolated value.
Returns:
Name | Type |
Description |
float |
float
|
The interpolated value, clamped to end_value after n_steps.
|
Source code in torchebm/core/base_scheduler.py
| def _compute_value(self) -> float:
r"""
Compute the linearly interpolated value.
Returns:
float: The interpolated value, clamped to end_value after n_steps.
"""
if self.step_count >= self.n_steps:
return self.end_value
else:
return self.start_value + self.step_size * self.step_count
|