pub struct PrivateHyperparameterOptimizer<T: Float + Debug + Send + Sync + 'static> { /* private fields */ }Expand description
Privacy-preserving hyperparameter optimizer
Implementations§
Source§impl<T: Float + Debug + Send + Sync + 'static> PrivateHyperparameterOptimizer<T>
impl<T: Float + Debug + Send + Sync + 'static> PrivateHyperparameterOptimizer<T>
Sourcepub fn new(
config: PrivateHPOConfig<T>,
parameterspace: ParameterSpace<T>,
) -> Result<Self>
pub fn new( config: PrivateHPOConfig<T>, parameterspace: ParameterSpace<T>, ) -> Result<Self>
Create new private hyperparameter optimizer.
The objective’s global sensitivity must be declared in
config.sensitivity_bounds (under "objective", or as the only entry).
Every evaluation releases its objective under a differentially private
noise mechanism whose scale is sensitivity / epsilon, so an undeclared
sensitivity has no safe default: substituting 1.0 silently rescales the
noise, and every epsilon reported afterwards would describe a guarantee
the run did not deliver. Construction therefore fails instead of guessing,
whether or not private_model_selection is set.
Sourcepub fn seed_for_tests(&mut self, seed: u64)
pub fn seed_for_tests(&mut self, seed: u64)
Seed every stochastic component deterministically (tests only).
The sub-seeds are domain-separated. Seeding the objective’s noise mechanism and the selection mechanism from the same seed makes both draw the same underlying uniform stream, so the evaluation that receives the largest objective noise also receives the largest selection noise – the private selection then reproduces the exact argmax and looks deterministic when it is not. That correlation is an artefact of the test harness, not of the mechanisms, and this is where it is avoided.
Sourcepub fn total_privacy_cost(&self) -> PrivacyBudget
pub fn total_privacy_cost(&self) -> PrivacyBudget
The epsilon spent so far across every objective release and the private selection.
This used to be privacy_accountant() -> &MomentsAccountant. That
accountant was constructed from base_privacyconfig’s DP-SGD parameters
(noise_multiplier, batch_size, dataset_size) and then never
stepped, so it reported the spend of a training run that had not
happened while the hyperparameter search’s real, pure-epsilon spend was
tracked entirely by HPOBudgetManager. A moments accountant models
subsampled-Gaussian composition and is the wrong primitive for the
Laplace / exponential releases this optimizer performs, so it is gone
rather than fed fabricated (sigma, q) pairs. Read the real ledger here
or in PrivateHPOResults::total_privacy_cost.
Sourcepub fn budget_manager(&self) -> &HPOBudgetManager
pub fn budget_manager(&self) -> &HPOBudgetManager
The budget manager.
Sourcepub fn private_objective(&self) -> &PrivateObjective<T>
pub fn private_objective(&self) -> &PrivateObjective<T>
The private objective, including the noise mechanism and the scale it last used.
Sourcepub fn optimize(
&mut self,
objective_fn: ObjectiveFn<T>,
) -> Result<PrivateHPOResults<T>>
pub fn optimize( &mut self, objective_fn: ObjectiveFn<T>, ) -> Result<PrivateHPOResults<T>>
Optimize hyperparameters with differential privacy.
The final configuration is chosen by the configured private selection
mechanism when private_model_selection is set. When it is not, the
exact argmax is returned and PrivateHPOResults::selection records
was_private: false so the caller cannot mistake it for a private
choice.
Auto Trait Implementations§
impl<T> !RefUnwindSafe for PrivateHyperparameterOptimizer<T>
impl<T> !UnwindSafe for PrivateHyperparameterOptimizer<T>
impl<T> Freeze for PrivateHyperparameterOptimizer<T>where
T: Freeze,
impl<T> Send for PrivateHyperparameterOptimizer<T>
impl<T> Sync for PrivateHyperparameterOptimizer<T>
impl<T> Unpin for PrivateHyperparameterOptimizer<T>where
T: Unpin,
impl<T> UnsafeUnpin for PrivateHyperparameterOptimizer<T>where
T: UnsafeUnpin,
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> Pointable for T
impl<T> Pointable for T
impl<T> Read<Exclusive, BecauseExclusive> for Twhere
T: ?Sized,
Source§impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
Source§fn to_subset(&self) -> Option<SS>
fn to_subset(&self) -> Option<SS>
self from the equivalent element of its
superset. Read moreSource§fn is_in_subset(&self) -> bool
fn is_in_subset(&self) -> bool
self is actually part of its subset T (and can be converted to it).Source§fn to_subset_unchecked(&self) -> SS
fn to_subset_unchecked(&self) -> SS
self.to_subset but without any property checks. Always succeeds.Source§fn from_subset(element: &SS) -> SP
fn from_subset(element: &SS) -> SP
self to the equivalent element of its superset.