LeanMachineLearning exposition

Bandits.UCB.expectation_pullCount_le'๐Ÿ”—

This page has the declaration's own card below, then its dependency graph, then a card for each dependency (type dependencies first, then the rest of the transitive closure). For a theorem, the graph and the dependency cards only follow its statement's dependencies (its proof is replaced by sorry, so what it proves doesn't depend on how); for everything else, both the type and the body/value are followed, since their content is part of what later declarations build on.

Minimal Lean file

expectation_pullCount_le'๐Ÿ”—

LemmaBandits.UCB.expectation_pullCount_le'

Bound on the expectation of the number of pulls of each arm by the UCB algorithm.

๐Ÿ”—theorem
Bandits.UCB.expectation_pullCount_le'.{u_1} {K : โ„•} {hK : 0 < K} {c : โ„} {ฮฝ : ProbabilityTheory.Kernel (Fin K) โ„} [ProbabilityTheory.IsMarkovKernel ฮฝ] {ฮฉ : Type u_1} {mฮฉ : MeasurableSpace ฮฉ} {P : MeasureTheory.Measure ฮฉ} [MeasureTheory.IsProbabilityMeasure P] {A : โ„• โ†’ ฮฉ โ†’ Fin K} {R : โ„• โ†’ ฮฉ โ†’ โ„} {ฯƒ2 : NNReal} (h : Learning.IsAlgEnvSeq A R (ucbAlgorithm hK (c * โ†‘ฯƒ2)) (Learning.stationaryEnv ฮฝ) P) (hฮฝ : โˆ€ (a : Fin K), ProbabilityTheory.HasSubgaussianMGF (fun x => x - โˆซ (x : โ„), id x โˆ‚ฮฝ a) ฯƒ2 (ฮฝ a)) (hฯƒ2 : ฯƒ2 โ‰  0) (hc : 0 < c) (a : Fin K) (h_gap : 0 < gap ฮฝ a) (n : โ„•) : โˆซโป (ฯ‰ : ฮฉ), โ†‘(Learning.pullCount A a n ฯ‰) โˆ‚P โ‰ค ENNReal.ofReal (8 * c * โ†‘ฯƒ2 * Real.log (โ†‘n + 1) / gap ฮฝ a ^ 2 + 1) + 1 + 2 * constSum c n
Bandits.UCB.expectation_pullCount_le'.{u_1} {K : โ„•} {hK : 0 < K} {c : โ„} {ฮฝ : ProbabilityTheory.Kernel (Fin K) โ„} [ProbabilityTheory.IsMarkovKernel ฮฝ] {ฮฉ : Type u_1} {mฮฉ : MeasurableSpace ฮฉ} {P : MeasureTheory.Measure ฮฉ} [MeasureTheory.IsProbabilityMeasure P] {A : โ„• โ†’ ฮฉ โ†’ Fin K} {R : โ„• โ†’ ฮฉ โ†’ โ„} {ฯƒ2 : NNReal} (h : Learning.IsAlgEnvSeq A R (ucbAlgorithm hK (c * โ†‘ฯƒ2)) (Learning.stationaryEnv ฮฝ) P) (hฮฝ : โˆ€ (a : Fin K), ProbabilityTheory.HasSubgaussianMGF (fun x => x - โˆซ (x : โ„), id x โˆ‚ฮฝ a) ฯƒ2 (ฮฝ a)) (hฯƒ2 : ฯƒ2 โ‰  0) (hc : 0 < c) (a : Fin K) (h_gap : 0 < gap ฮฝ a) (n : โ„•) : โˆซโป (ฯ‰ : ฮฉ), โ†‘(Learning.pullCount A a n ฯ‰) โˆ‚P โ‰ค ENNReal.ofReal (8 * c * โ†‘ฯƒ2 * Real.log (โ†‘n + 1) / gap ฮฝ a ^ 2 + 1) + 1 + 2 * constSum c n

Code

lemma expectation_pullCount_le'
    (h : IsAlgEnvSeq A R (ucbAlgorithm hK (c * ฯƒ2)) (stationaryEnv ฮฝ) P)
    (hฮฝ : โˆ€ a, HasSubgaussianMGF (fun x โ†ฆ x - (ฮฝ a)[id]) ฯƒ2 (ฮฝ a))
    (hฯƒ2 : ฯƒ2 โ‰  0) (hc : 0 < c) (a : Fin K) (h_gap : 0 < gap ฮฝ a) (n : โ„•) :
    โˆซโป ฯ‰, pullCount A a n ฯ‰ โˆ‚P โ‰ค
      ENNReal.ofReal (8 * c * ฯƒ2 * log (n + 1) / gap ฮฝ a ^ 2 + 1) + 1 + 2 * constSum c n
Type uses (6)
Body uses (12)
Used by (1)

Actions: Source ยท Open Issue

Proof
by
  have hA := h.measurable_action
  have hR := h.measurable_feedback
  by_cases hn_zero : n = 0
  ยท simp [hn_zero]
  let C a : โ„• := โŒˆ8 * c * ฯƒ2 * log (n + 1) / gap ฮฝ a ^ 2โŒ‰โ‚Š
  have : Nonempty (Fin K) := Fin.pos_iff_nonempty.mp hK
  have h_set_1 b : MeasurableSet {a_1 | 0 < pullCount A a b a_1 โˆง
      (ฮฝ a)[id] < empMean A R a b a_1 - ucbWidth A (c * ฯƒ2) a b a_1} := by
    change MeasurableSet ({a_1 | 0 < pullCount A a b a_1} โˆฉ
      {a_1 | (ฮฝ a)[id] < empMean A R a b a_1 - ucbWidth A (c * ฯƒ2) a b a_1})
    exact (measurableSet_lt (by fun_prop) (by fun_prop)).inter
      (measurableSet_lt (by fun_prop) (by fun_prop))
  have h_set_2 b : MeasurableSet {a | 0 < pullCount A (bestArm ฮฝ) b a โˆง
      empMean A R (bestArm ฮฝ) b a + ucbWidth A (c * ฯƒ2) (bestArm ฮฝ) b a < (ฮฝ (bestArm ฮฝ))[id]} := by
    change MeasurableSet ({a | 0 < pullCount A (bestArm ฮฝ) b a} โˆฉ
      {a | empMean A R (bestArm ฮฝ) b a + ucbWidth A (c * ฯƒ2) (bestArm ฮฝ) b a < (ฮฝ (bestArm ฮฝ))[id]})
    exact (measurableSet_lt (by fun_prop) (by fun_prop)).inter
      (measurableSet_lt (by fun_prop) (by fun_prop))
  have h_meas_1 b : Measurable fun h โ†ฆ {s | 0 < pullCount A a s h โˆง (ฮฝ a)[id] <
      empMean A R a s h - ucbWidth A (c * ฯƒ2) a s h}.indicator (1 : โ„• โ†’ โ„•) b := by
    simp only [id_eq, Set.indicator_apply, Set.mem_setOf_eq, Pi.one_apply]
    exact Measurable.ite (h_set_1 _) (by fun_prop) (by fun_prop)
  have h_meas_2 b : Measurable fun h โ†ฆ {s | 0 < pullCount A (bestArm ฮฝ) s h โˆง
      empMean A R (bestArm ฮฝ) s h + ucbWidth A (c * ฯƒ2) (bestArm ฮฝ) s h <
          (ฮฝ (bestArm ฮฝ))[id]}.indicator (1 : โ„• โ†’ โ„•) b := by
    simp only [id_eq, Set.indicator_apply, Set.mem_setOf_eq, Pi.one_apply]
    exact Measurable.ite (h_set_2 _) (by fun_prop) (by fun_prop)
  calc โˆซโป ฯ‰, pullCount A a n ฯ‰ โˆ‚P
  _ โ‰ค โˆซโป ฯ‰, C a + 1 +
      โˆ‘ s โˆˆ range n,
        {s | 0 < pullCount A (bestArm ฮฝ) s ฯ‰ โˆง
          empMean A R (bestArm ฮฝ) s ฯ‰ + ucbWidth A (c * ฯƒ2) (bestArm ฮฝ) s ฯ‰ <
            (ฮฝ (bestArm ฮฝ))[id]}.indicator (1 : โ„• โ†’ โ„•) s +
      โˆ‘ s โˆˆ range n,
        {s | 0 < pullCount A a s ฯ‰ โˆง (ฮฝ a)[id] <
          empMean A R a s ฯ‰ - ucbWidth A (c * ฯƒ2) a s ฯ‰}.indicator (1 : โ„• โ†’ โ„•) s โˆ‚P := by
    refine lintegral_mono_ae ?_
    have hCa : C a โ‰  0 := by
      simp only [ne_eq, Nat.ceil_eq_zero, not_le, C]
      have : 0 < log (n + 1) := log_pos (by simp; grind)
      positivity
    filter_upwards [pullCount_ae_le_add_two h hc.le a h_gap n (C a) hCa (Nat.le_ceil _)] with ฯ‰ hฯ‰
    simp only [id_eq, Nat.cast_sum]
    norm_cast
  _ โ‰ค (C a : โ„โ‰ฅ0โˆž) + 1 +
      โˆ‘ s โˆˆ range n,
        P {ฯ‰ | 0 < pullCount A (bestArm ฮฝ) s ฯ‰ โˆง
          empMean A R (bestArm ฮฝ) s ฯ‰ + ucbWidth A (c * ฯƒ2) (bestArm ฮฝ) s ฯ‰ < (ฮฝ (bestArm ฮฝ))[id]} +
      โˆ‘ s โˆˆ range n,
        P {ฯ‰ | 0 < pullCount A a s ฯ‰ โˆง (ฮฝ a)[id] <
          empMean A R a s ฯ‰ - ucbWidth A (c * ฯƒ2) a s ฯ‰} := by
    simp only [id_eq, Nat.cast_sum]
    rw [lintegral_add_left (by fun_prop), lintegral_add_left (by fun_prop)]
    simp only [lintegral_const, measure_univ, mul_one]
    rw [lintegral_finsetSum _ (by fun_prop), lintegral_finsetSum _ (by fun_prop)]
    gcongr with k hk k hk
    ยท rw [โ† lintegral_indicator_one]
      swap; ยท exact h_set_2 _
      gcongr with h
      simp [Set.indicator_apply]
    ยท rw [โ† lintegral_indicator_one]
      swap; ยท exact h_set_1 _
      gcongr with h
      simp [Set.indicator_apply]
  _ โ‰ค (C a : โ„โ‰ฅ0โˆž) + 1 +
      โˆ‘ s โˆˆ range n, 1 / ((s : โ„โ‰ฅ0โˆž) + 1) ^ (c - 1) +
      โˆ‘ s โˆˆ range n, 1 / ((s : โ„โ‰ฅ0โˆž) + 1) ^ (c - 1) := by
    gcongr with s hs s hs
    ยท refine (measure_mono ?_).trans (prob_ucbIndex_le h hฮฝ hฯƒ2 (by positivity) (bestArm ฮฝ) s)
      grind
    ยท refine (measure_mono ?_).trans (prob_ucbIndex_ge h hฮฝ hฯƒ2 (by positivity) a s)
      grind
  _ โ‰ค ENNReal.ofReal (8 * c * ฯƒ2 * log (n + 1) / gap ฮฝ a ^ 2 + 1) + 1 + 2 * constSum c n := by
    rw [two_mul, add_assoc, constSum]
    gcongr
    simp only [C]
    rw [โ† ENNReal.ofReal_natCast]
    refine ENNReal.ofReal_le_ofReal ?_
    refine (Nat.ceil_lt_add_one ?_).le
    have : 0 โ‰ค log (n + 1) := log_nonneg (by simp)
    positivity

Dependency graph

Type dependencies (6)

IsAlgEnvSeq๐Ÿ”—

StructureLearning.IsAlgEnvSeq

An algorithm-environment sequence: a sequence of actions and feedbacks generated by an algorithm interacting with an environment.

๐Ÿ”—structure
Learning.IsAlgEnvSeq.{u_1, u_2, u_3} {๐“ : Type u_1} {๐“จ : Type u_2} {ฮฉ : Type u_3} {m๐“ : MeasurableSpace ๐“} {m๐“จ : MeasurableSpace ๐“จ} {mฮฉ : MeasurableSpace ฮฉ} (A : โ„• โ†’ ฮฉ โ†’ ๐“) (Y : โ„• โ†’ ฮฉ โ†’ ๐“จ) (alg : Algorithm ๐“ ๐“จ) (env : Environment ๐“ ๐“จ) (P : MeasureTheory.Measure ฮฉ) [MeasureTheory.IsFiniteMeasure P] : Prop
Learning.IsAlgEnvSeq.{u_1, u_2, u_3} {๐“ : Type u_1} {๐“จ : Type u_2} {ฮฉ : Type u_3} {m๐“ : MeasurableSpace ๐“} {m๐“จ : MeasurableSpace ๐“จ} {mฮฉ : MeasurableSpace ฮฉ} (A : โ„• โ†’ ฮฉ โ†’ ๐“) (Y : โ„• โ†’ ฮฉ โ†’ ๐“จ) (alg : Algorithm ๐“ ๐“จ) (env : Environment ๐“ ๐“จ) (P : MeasureTheory.Measure ฮฉ) [MeasureTheory.IsFiniteMeasure P] : Prop

Code

structure IsAlgEnvSeq
    (A : โ„• โ†’ ฮฉ โ†’ ๐“) (Y : โ„• โ†’ ฮฉ โ†’ ๐“จ) (alg : Algorithm ๐“ ๐“จ) (env : Environment ๐“ ๐“จ)
    (P : Measure ฮฉ) [IsFiniteMeasure P] : Prop where
  /-- The action sequence is measurable. -/
  measurable_action n : Measurable (A n) := by fun_prop
  /-- The feedback sequence is measurable. -/
  measurable_feedback n : Measurable (Y n) := by fun_prop
  /-- The first action has the correct law. -/
  hasLaw_action_zero : HasLaw (fun ฯ‰ โ†ฆ (A 0 ฯ‰)) alg.p0 P
  /-- The first feedback has the correct conditional distribution. -/
  hasCondDistrib_feedback_zero : HasCondDistrib (Y 0) (A 0) env.ฮฝ0 P
  /-- The next action has the correct conditional distribution given the history. -/
  hasCondDistrib_action n :
    HasCondDistrib (A (n + 1)) (history A Y n) (alg.policy n) P
  /-- The next feedback has the correct conditional distribution given the history and
  next action. -/
  hasCondDistrib_feedback n :
    HasCondDistrib (Y (n + 1)) (fun ฯ‰ โ†ฆ (history A Y n ฯ‰, A (n + 1) ฯ‰))
      (env.feedback n) P
Type uses (3)
Used by (111)

Actions: Source ยท Open Issue

ucbAlgorithm๐Ÿ”—

DefinitionBandits.ucbAlgorithm

The UCB algorithm.

๐Ÿ”—def
Bandits.ucbAlgorithm {K : โ„•} (hK : 0 < K) (c : โ„) : Learning.Algorithm (Fin K) โ„
Bandits.ucbAlgorithm {K : โ„•} (hK : 0 < K) (c : โ„) : Learning.Algorithm (Fin K) โ„

Code

noncomputable
def ucbAlgorithm (hK : 0 < K) (c : โ„) : Algorithm (Fin K) โ„ :=
  detAlgorithm (UCB.nextArm hK c) (by fun_prop) โŸจ0, hKโŸฉ
Type uses (1)
Body uses (3)
Used by (16)

Actions: Source ยท Open Issue

stationaryEnv๐Ÿ”—

DefinitionLearning.stationaryEnv

A stationary environment, in which the distribution of the next feedback depends only on the last action.

๐Ÿ”—def
Learning.stationaryEnv.{u_1, u_2} {๐“ : Type u_1} {๐“จ : Type u_2} {m๐“ : MeasurableSpace ๐“} {m๐“จ : MeasurableSpace ๐“จ} (ฮฝ : ProbabilityTheory.Kernel ๐“ ๐“จ) [ProbabilityTheory.IsMarkovKernel ฮฝ] : Environment ๐“ ๐“จ
Learning.stationaryEnv.{u_1, u_2} {๐“ : Type u_1} {๐“จ : Type u_2} {m๐“ : MeasurableSpace ๐“} {m๐“จ : MeasurableSpace ๐“จ} (ฮฝ : ProbabilityTheory.Kernel ๐“ ๐“จ) [ProbabilityTheory.IsMarkovKernel ฮฝ] : Environment ๐“ ๐“จ

Code

def stationaryEnv (ฮฝ : Kernel ๐“ ๐“จ) [IsMarkovKernel ฮฝ] : Environment ๐“ ๐“จ := obliviousEnv fun _ โ†ฆ ฮฝ
Type uses (1)
Body uses (1)
Used by (81)

Actions: Source ยท Open Issue

gap๐Ÿ”—

DefinitionBandits.gap

Gap of an action a: difference between the highest mean of the actions and the mean of a.

๐Ÿ”—def
Bandits.gap.{u_1} {๐“ : Type u_1} {m๐“ : MeasurableSpace ๐“} (ฮฝ : ProbabilityTheory.Kernel ๐“ โ„) (a : ๐“) : โ„
Bandits.gap.{u_1} {๐“ : Type u_1} {m๐“ : MeasurableSpace ๐“} (ฮฝ : ProbabilityTheory.Kernel ๐“ โ„) (a : ๐“) : โ„

Code

noncomputable
def gap (ฮฝ : Kernel ๐“ โ„) (a : ๐“) : โ„ := (โจ† i, (ฮฝ i)[id]) - (ฮฝ a)[id]
Used by (27)

Actions: Source ยท Open Issue

pullCount๐Ÿ”—

DefinitionLearning.pullCount

Number of times action a was chosen up to time t (excluding t).

๐Ÿ”—def
Learning.pullCount.{u_1, u_3} {๐“ : Type u_1} {ฮฉ : Type u_3} [DecidableEq ๐“] (A : โ„• โ†’ ฮฉ โ†’ ๐“) (a : ๐“) (t : โ„•) (ฯ‰ : ฮฉ) : โ„•
Learning.pullCount.{u_1, u_3} {๐“ : Type u_1} {ฮฉ : Type u_3} [DecidableEq ๐“] (A : โ„• โ†’ ฮฉ โ†’ ๐“) (a : ๐“) (t : โ„•) (ฯ‰ : ฮฉ) : โ„•

Code

noncomputable
def pullCount (A : โ„• โ†’ ฮฉ โ†’ ๐“) (a : ๐“) (t : โ„•) (ฯ‰ : ฮฉ) : โ„• :=
  #(filter (fun s โ†ฆ A s ฯ‰ = a) (range t))
Used by (146)

Actions: Source ยท Open Issue

constSum๐Ÿ”—

DefinitionBandits.UCB.constSum

A sum that appears in the UCB regret upper bound.

๐Ÿ”—def
Bandits.UCB.constSum (c : โ„) (n : โ„•) : ENNReal
Bandits.UCB.constSum (c : โ„) (n : โ„•) : ENNReal

Code

noncomputable
def constSum (c : โ„) (n : โ„•) : โ„โ‰ฅ0โˆž := โˆ‘ s โˆˆ range n, 1 / ((s : โ„โ‰ฅ0โˆž) + 1) ^ (c - 1)
Used by (4)

Actions: Source ยท Open Issue

All dependencies, transitively (15)

Algorithm๐Ÿ”—

StructureLearning.Algorithm

A stochastic, sequential algorithm.

๐Ÿ”—structure
Learning.Algorithm.{u_4, u_5} (๐“ : Type u_4) (๐“จ : Type u_5) [MeasurableSpace ๐“] [MeasurableSpace ๐“จ] : Type (max u_4 u_5)
Learning.Algorithm.{u_4, u_5} (๐“ : Type u_4) (๐“จ : Type u_5) [MeasurableSpace ๐“] [MeasurableSpace ๐“จ] : Type (max u_4 u_5)

Code

structure Algorithm (๐“ ๐“จ : Type*) [MeasurableSpace ๐“] [MeasurableSpace ๐“จ] where
  /-- Policy or sampling rule: distribution of the next action. -/
  policy : (n : โ„•) โ†’ Kernel (Iic n โ†’ ๐“ ร— ๐“จ) ๐“
  /-- The policy is a Markov kernel. -/
  [h_policy : โˆ€ n, IsMarkovKernel (policy n)]
  /-- Distribution of the first action. -/
  p0 : Measure ๐“
  /-- The first action distribution is a probability measure. -/
  [hp0 : IsProbabilityMeasure p0]
Used by (216)

Actions: Source ยท Open Issue

Environment๐Ÿ”—

StructureLearning.Environment

A stochastic environment.

๐Ÿ”—structure
Learning.Environment.{u_4, u_5} (๐“ : Type u_4) (๐“จ : Type u_5) [MeasurableSpace ๐“] [MeasurableSpace ๐“จ] : Type (max u_4 u_5)
Learning.Environment.{u_4, u_5} (๐“ : Type u_4) (๐“จ : Type u_5) [MeasurableSpace ๐“] [MeasurableSpace ๐“จ] : Type (max u_4 u_5)

Code

structure Environment (๐“ ๐“จ : Type*) [MeasurableSpace ๐“] [MeasurableSpace ๐“จ] where
  /-- Distribution of the next observation as function of the past history. -/
  feedback : (n : โ„•) โ†’ Kernel ((Iic n โ†’ ๐“ ร— ๐“จ) ร— ๐“) ๐“จ
  /-- The feedback kernels are Markov kernels. -/
  [h_feedback : โˆ€ n, IsMarkovKernel (feedback n)]
  /-- Distribution of the first observation given the first action. -/
  ฮฝ0 : Kernel ๐“ ๐“จ
  /-- The initial observation kernel is a Markov kernel. -/
  [hp0 : IsMarkovKernel ฮฝ0]
Used by (128)

Actions: Source ยท Open Issue

history๐Ÿ”—

DefinitionLearning.history

History of the algorithm-environment sequence up to time n.

๐Ÿ”—def
Learning.history.{u_1, u_2, u_3} {๐“ : Type u_1} {๐“จ : Type u_2} {ฮฉ : Type u_3} (A : โ„• โ†’ ฮฉ โ†’ ๐“) (Y : โ„• โ†’ ฮฉ โ†’ ๐“จ) (n : โ„•) (ฯ‰ : ฮฉ) : โ†ฅ(Finset.Iic n) โ†’ ๐“ ร— ๐“จ
Learning.history.{u_1, u_2, u_3} {๐“ : Type u_1} {๐“จ : Type u_2} {ฮฉ : Type u_3} (A : โ„• โ†’ ฮฉ โ†’ ๐“) (Y : โ„• โ†’ ฮฉ โ†’ ๐“จ) (n : โ„•) (ฯ‰ : ฮฉ) : โ†ฅ(Finset.Iic n) โ†’ ๐“ ร— ๐“จ

Code

def history (A : โ„• โ†’ ฮฉ โ†’ ๐“) (Y : โ„• โ†’ ฮฉ โ†’ ๐“จ) (n : โ„•) (ฯ‰ : ฮฉ) : Iic n โ†’ ๐“ ร— ๐“จ :=
  fun i โ†ฆ (A i ฯ‰, Y i ฯ‰)
Used by (72)

Actions: Source ยท Open Issue

detAlgorithm๐Ÿ”—

DefinitionLearning.detAlgorithm

A deterministic algorithm, which chooses the action given by the function nextAction.

๐Ÿ”—def
Learning.detAlgorithm.{u_1, u_2} {๐“ : Type u_1} {๐“จ : Type u_2} {m๐“ : MeasurableSpace ๐“} {m๐“จ : MeasurableSpace ๐“จ} (nextA : (n : โ„•) โ†’ (โ†ฅ(Finset.Iic n) โ†’ ๐“ ร— ๐“จ) โ†’ ๐“) (h_next : โˆ€ (n : โ„•), Measurable (nextA n)) (action0 : ๐“) : Algorithm ๐“ ๐“จ
Learning.detAlgorithm.{u_1, u_2} {๐“ : Type u_1} {๐“จ : Type u_2} {m๐“ : MeasurableSpace ๐“} {m๐“จ : MeasurableSpace ๐“จ} (nextA : (n : โ„•) โ†’ (โ†ฅ(Finset.Iic n) โ†’ ๐“ ร— ๐“จ) โ†’ ๐“) (h_next : โˆ€ (n : โ„•), Measurable (nextA n)) (action0 : ๐“) : Algorithm ๐“ ๐“จ

Code

noncomputable
def detAlgorithm (nextA : (n : โ„•) โ†’ (Iic n โ†’ ๐“ ร— ๐“จ) โ†’ ๐“)
    (h_next : โˆ€ n, Measurable (nextA n)) (action0 : ๐“) :
    Algorithm ๐“ ๐“จ where
  policy n := Kernel.deterministic (nextA n) (h_next n)
  p0 := Measure.dirac action0
Type uses (1)
Used by (15)

Actions: Source ยท Open Issue

nextAction๐Ÿ”—

DefinitionLearning.RoundRobin.nextAction

Action chosen by the Round-Robin algorithm at time n + 1. This is action (n + 1) % K.

๐Ÿ”—def
Learning.RoundRobin.nextAction {K : โ„•} (hK : 0 < K) (n : โ„•) : Fin K
Learning.RoundRobin.nextAction {K : โ„•} (hK : 0 < K) (n : โ„•) : Fin K

Code

noncomputable
def RoundRobin.nextAction (hK : 0 < K) (n : โ„•) : Fin K := โŸจ(n + 1) % K, Nat.mod_lt _ hKโŸฉ
Used by (14)

Actions: Source ยท Open Issue

max๐Ÿ”—

DefinitionFunction.max

The maximum value of a tuple.

๐Ÿ”—def
Function.max.{u_1, u_2} {ฮน : Type u_1} {ฮฑ : Type u_2} [LinearOrder ฮฑ] [Fintype ฮน] [Nonempty ฮน] (f : ฮน โ†’ ฮฑ) : ฮฑ
Function.max.{u_1, u_2} {ฮน : Type u_1} {ฮฑ : Type u_2} [LinearOrder ฮฑ] [Fintype ฮน] [Nonempty ฮน] (f : ฮน โ†’ ฮฑ) : ฮฑ

Code

abbrev max : ฮฑ := univ.sup' univ_nonempty f
Used by (8)

Actions: Source ยท Open Issue

exists_argmax๐Ÿ”—

Lemmaexists_argmax

No docstring.

๐Ÿ”—theorem
exists_argmax.{u_1, u_2} {ฮน : Type u_1} {ฮฑ : Type u_2} [LinearOrder ฮฑ] [Fintype ฮน] [Nonempty ฮน] (f : ฮน โ†’ ฮฑ) : โˆƒ i, f i = Function.max f
exists_argmax.{u_1, u_2} {ฮน : Type u_1} {ฮฑ : Type u_2} [LinearOrder ฮฑ] [Fintype ฮน] [Nonempty ฮน] (f : ฮน โ†’ ฮฑ) : โˆƒ i, f i = Function.max f

Code

lemma exists_argmax : โˆƒ i, f i = f.max
Type uses (1)
Used by (3)

Actions: Source ยท Open Issue

Proof
by
  obtain โŸจi, -, hiโŸฉ := Finset.exists_mem_eq_sup' (by simp : Finset.univ.Nonempty) f
  exact โŸจi, hi.symmโŸฉ

argmax๐Ÿ”—

Definitionargmax

The index of the maximum value of a tuple.

๐Ÿ”—def
argmax.{u_1, u_2} {ฮน : Type u_1} {ฮฑ : Type u_2} [LinearOrder ฮฑ] [Fintype ฮน] [Nonempty ฮน] (f : ฮน โ†’ ฮฑ) : ฮน
argmax.{u_1, u_2} {ฮน : Type u_1} {ฮฑ : Type u_2} [LinearOrder ฮฑ] [Fintype ฮน] [Nonempty ฮน] (f : ฮน โ†’ ฮฑ) : ฮน

Code

noncomputable def argmax := (exists_argmax f).choose
Body uses (2)
Used by (17)

Actions: Source ยท Open Issue

sumRewards'๐Ÿ”—

DefinitionLearning.sumRewards'

Sum of rewards of arm a up to (and including) time n.

๐Ÿ”—def
Learning.sumRewards'.{u_1} {๐“ : Type u_1} [DecidableEq ๐“] (n : โ„•) (h : โ†ฅ(Finset.Iic n) โ†’ ๐“ ร— โ„) (a : ๐“) : โ„
Learning.sumRewards'.{u_1} {๐“ : Type u_1} [DecidableEq ๐“] (n : โ„•) (h : โ†ฅ(Finset.Iic n) โ†’ ๐“ ร— โ„) (a : ๐“) : โ„

Code

noncomputable
def sumRewards' (n : โ„•) (h : Iic n โ†’ ๐“ ร— โ„) (a : ๐“) :=
  โˆ‘ s, if (h s).1 = a then (h s).2 else 0
Used by (9)

Actions: Source ยท Open Issue

pullCount'๐Ÿ”—

DefinitionLearning.pullCount'

Number of pulls of arm a up to (and including) time n. This is the number of entries in h in which the arm is a.

๐Ÿ”—def
Learning.pullCount'.{u_1, u_2} {๐“ : Type u_1} {R : Type u_2} [DecidableEq ๐“] (n : โ„•) (h : โ†ฅ(Finset.Iic n) โ†’ ๐“ ร— R) (a : ๐“) : โ„•
Learning.pullCount'.{u_1, u_2} {๐“ : Type u_1} {R : Type u_2} [DecidableEq ๐“] (n : โ„•) (h : โ†ฅ(Finset.Iic n) โ†’ ๐“ ร— R) (a : ๐“) : โ„•

Code

noncomputable
def pullCount' (n : โ„•) (h : Iic n โ†’ ๐“ ร— R) (a : ๐“) := #{s | (h s).1 = a}
Used by (29)

Actions: Source ยท Open Issue

empMean'๐Ÿ”—

DefinitionLearning.empMean'

Empirical mean of arm a at time n.

๐Ÿ”—def
Learning.empMean'.{u_1} {๐“ : Type u_1} [DecidableEq ๐“] (n : โ„•) (h : โ†ฅ(Finset.Iic n) โ†’ ๐“ ร— โ„) (a : ๐“) : โ„
Learning.empMean'.{u_1} {๐“ : Type u_1} [DecidableEq ๐“] (n : โ„•) (h : โ†ฅ(Finset.Iic n) โ†’ ๐“ ร— โ„) (a : ๐“) : โ„

Code

noncomputable
def empMean' (n : โ„•) (h : Iic n โ†’ ๐“ ร— โ„) (a : ๐“) :=
  (sumRewards' n h a) / (pullCount' n h a)
Body uses (2)
Used by (18)

Actions: Source ยท Open Issue

ucbWidth'๐Ÿ”—

DefinitionBandits.ucbWidth'

The exploration bonus of the UCB algorithm, which corresponds to the width of a confidence interval.

๐Ÿ”—def
Bandits.ucbWidth' {K : โ„•} (c : โ„) (n : โ„•) (h : โ†ฅ(Finset.Iic n) โ†’ Fin K ร— โ„) (a : Fin K) : โ„
Bandits.ucbWidth' {K : โ„•} (c : โ„) (n : โ„•) (h : โ†ฅ(Finset.Iic n) โ†’ Fin K ร— โ„) (a : Fin K) : โ„

Code

noncomputable def ucbWidth' (c : โ„) (n : โ„•) (h : Iic n โ†’ Fin K ร— โ„) (a : Fin K) : โ„ :=
  โˆš(2 * c * log (n + 2) / pullCount' n h a)
Body uses (1)
Used by (6)

Actions: Source ยท Open Issue

nextArm๐Ÿ”—

DefinitionBandits.UCB.nextArm

Arm pulled by the UCB algorithm at time n + 1.

๐Ÿ”—def
Bandits.UCB.nextArm {K : โ„•} (hK : 0 < K) (c : โ„) (n : โ„•) (h : โ†ฅ(Finset.Iic n) โ†’ Fin K ร— โ„) : Fin K
Bandits.UCB.nextArm {K : โ„•} (hK : 0 < K) (c : โ„) (n : โ„•) (h : โ†ฅ(Finset.Iic n) โ†’ Fin K ร— โ„) : Fin K

Code

noncomputable
def UCB.nextArm (hK : 0 < K) (c : โ„) (n : โ„•) (h : Iic n โ†’ Fin K ร— โ„) : Fin K :=
  have : Nonempty (Fin K) := Fin.pos_iff_nonempty.mp hK
  if n < K - 1 then RoundRobin.nextAction hK n else
  argmax (fun a โ†ฆ empMean' n h a + ucbWidth' c n h a)
Body uses (4)
Used by (7)

Actions: Source ยท Open Issue

measurable_nextArm๐Ÿ”—

LemmaBandits.UCB.measurable_nextArm

No docstring.

๐Ÿ”—theorem
Bandits.UCB.measurable_nextArm {K : โ„•} (hK : 0 < K) (c : โ„) (n : โ„•) : Measurable (nextArm hK c n)
Bandits.UCB.measurable_nextArm {K : โ„•} (hK : 0 < K) (c : โ„) (n : โ„•) : Measurable (nextArm hK c n)

Code

lemma UCB.measurable_nextArm (hK : 0 < K) (c : โ„) (n : โ„•) : Measurable (nextArm hK c n)
Type uses (1)
Body uses (9)
Used by (3)

Actions: Source ยท Open Issue

Proof
by
  refine Measurable.ite (by simp) (by fun_prop) ?_
  have : Nonempty (Fin K) := Fin.pos_iff_nonempty.mp hK
  unfold ucbWidth'
  fun_prop

obliviousEnv๐Ÿ”—

DefinitionLearning.obliviousEnv

An oblivious environment, in which the distribution of the next feedback depends only on the last action, but in a possibly time-dependent manner.

๐Ÿ”—def
Learning.obliviousEnv.{u_1, u_2} {๐“ : Type u_1} {๐“จ : Type u_2} {m๐“ : MeasurableSpace ๐“} {m๐“จ : MeasurableSpace ๐“จ} (ฮฝ : โ„• โ†’ ProbabilityTheory.Kernel ๐“ ๐“จ) [โˆ€ (n : โ„•), ProbabilityTheory.IsMarkovKernel (ฮฝ n)] : Environment ๐“ ๐“จ
Learning.obliviousEnv.{u_1, u_2} {๐“ : Type u_1} {๐“จ : Type u_2} {m๐“ : MeasurableSpace ๐“} {m๐“จ : MeasurableSpace ๐“จ} (ฮฝ : โ„• โ†’ ProbabilityTheory.Kernel ๐“ ๐“จ) [โˆ€ (n : โ„•), ProbabilityTheory.IsMarkovKernel (ฮฝ n)] : Environment ๐“ ๐“จ

Code

def obliviousEnv (ฮฝ : โ„• โ†’ Kernel ๐“ ๐“จ) [โˆ€ n, IsMarkovKernel (ฮฝ n)] : Environment ๐“ ๐“จ where
  feedback n := (ฮฝ (n + 1)).prodMkLeft _
  ฮฝ0 := ฮฝ 0
Type uses (1)
Used by (10)

Actions: Source ยท Open Issue