Theory Projected_Gradient_Descent_Convergence

theory Projected_Gradient_Descent_Convergence
  imports Projection_Optimization
begin

section ‹Function-value convergence for projected gradient descent›

text ‹
This theory proves the standard O(1/N) function-value convergence
bound for projected gradient descent on a closed convex feasible set.

The proof follows the same telescoping structure as the unconstrained
gradient-descent convergence proof.  The only new ingredient is the
projected one-step distance estimate from the projection theory.
›


subsection ‹Monotonicity of projected gradient descent›

lemma projected_gradient_descent_objective_nonincreasing:
  fixes f :: "'a::{real_inner,heine_borel}  real"
    and G :: "'a  'a"
  assumes smooth: "smooth_convex_on L C f G"
    and closed: "closed C"
    and convex: "convex C"
    and pgd: "projected_gradient_descent_iterates C alpha G x"
    and feasible: "feasible_iterates C x"
    and alpha_pos: "0 < alpha"
    and step_size: "alpha * L  1"
  shows "nonincreasing_sequence (objective_values f x)"
  unfolding nonincreasing_sequence_def objective_values_def
proof
  fix n

  have xn_mem: "x n  C"
    using feasible by (rule feasible_iteratesD)

  have step:
    "f (x (Suc n)) - f (x n)
      
     (norm (x n - x n) ^ 2 - norm (x (Suc n) - x n) ^ 2)
      / (2 * alpha)"
    by (rule projected_gradient_descent_one_step_distance_bound_to_point[
        OF smooth closed convex pgd feasible xn_mem alpha_pos step_size])

  have rhs_nonpos:
    "(norm (x n - x n) ^ 2 - norm (x (Suc n) - x n) ^ 2)
      / (2 * alpha)  0"
    using alpha_pos by simp

  show "f (x (Suc n))  f (x n)"
    using step rhs_nonpos by linarith
qed


subsection ‹Summed function-value gaps›

lemma projected_gradient_descent_sum_function_value_gaps_bound_to_point:
  fixes f :: "'a::{real_inner,heine_borel}  real"
    and G :: "'a  'a"
  assumes smooth: "smooth_convex_on L C f G"
    and closed: "closed C"
    and convex: "convex C"
    and pgd: "projected_gradient_descent_iterates C alpha G x"
    and feasible: "feasible_iterates C x"
    and u_mem: "u  C"
    and alpha_pos: "0 < alpha"
    and step_size: "alpha * L  1"
  shows
    "(n<N. f (x (Suc n)) - f u)
      
     norm (x 0 - u) ^ 2 / (2 * alpha)
      - norm (x N - u) ^ 2 / (2 * alpha)"
proof (rule sum_progress_le_initial_gap)
  fix n
  assume "n < N"

  have step:
    "f (x (Suc n)) - f u
      
     (norm (x n - u) ^ 2 - norm (x (Suc n) - u) ^ 2)
      / (2 * alpha)"
    by (rule projected_gradient_descent_one_step_distance_bound_to_point[
        OF smooth closed convex pgd feasible u_mem alpha_pos step_size])

  have split:
    "(norm (x n - u) ^ 2 - norm (x (Suc n) - u) ^ 2)
      / (2 * alpha)
      =
     norm (x n - u) ^ 2 / (2 * alpha)
      - norm (x (Suc n) - u) ^ 2 / (2 * alpha)"
    by (simp add: diff_divide_distrib)

  show
    "f (x (Suc n)) - f u
       norm (x n - u) ^ 2 / (2 * alpha)
        - norm (x (Suc n) - u) ^ 2 / (2 * alpha)"
    using step split by simp
qed

lemma projected_gradient_descent_sum_function_value_gaps_bound_to_minimizer:
  fixes f :: "'a::{real_inner,heine_borel}  real"
    and G :: "'a  'a"
  assumes smooth: "smooth_convex_on L C f G"
    and closed: "closed C"
    and convex: "convex C"
    and pgd: "projected_gradient_descent_iterates C alpha G x"
    and feasible: "feasible_iterates C x"
    and alpha_pos: "0 < alpha"
    and step_size: "alpha * L  1"
    and minimizer: "global_min_on C f xstar"
  shows
    "(n<N. f (x (Suc n)) - f xstar)
      
     norm (x 0 - xstar) ^ 2 / (2 * alpha)
      - norm (x N - xstar) ^ 2 / (2 * alpha)"
proof -
  have xstar_mem: "xstar  C"
    using minimizer by (rule global_min_onD_mem)

  show ?thesis
    by (rule projected_gradient_descent_sum_function_value_gaps_bound_to_point[
        OF smooth closed convex pgd feasible xstar_mem alpha_pos step_size])
qed

lemma projected_gradient_descent_sum_function_value_gaps_bound_to_point_initial:
  fixes f :: "'a::{real_inner,heine_borel}  real"
    and G :: "'a  'a"
  assumes smooth: "smooth_convex_on L C f G"
    and closed: "closed C"
    and convex: "convex C"
    and pgd: "projected_gradient_descent_iterates C alpha G x"
    and feasible: "feasible_iterates C x"
    and u_mem: "u  C"
    and alpha_pos: "0 < alpha"
    and step_size: "alpha * L  1"
  shows
    "(n<N. f (x (Suc n)) - f u)
       norm (x 0 - u) ^ 2 / (2 * alpha)"
proof -
  have telescoped:
    "(n<N. f (x (Suc n)) - f u)
      
     norm (x 0 - u) ^ 2 / (2 * alpha)
      - norm (x N - u) ^ 2 / (2 * alpha)"
    by (rule projected_gradient_descent_sum_function_value_gaps_bound_to_point[
        OF smooth closed convex pgd feasible u_mem alpha_pos step_size])

  have terminal_nonneg:
    "0  norm (x N - u) ^ 2 / (2 * alpha)"
    using alpha_pos by simp

  show ?thesis
    using telescoped terminal_nonneg by linarith
qed

lemma projected_gradient_descent_sum_function_value_gaps_bound_to_minimizer_initial:
  fixes f :: "'a::{real_inner,heine_borel}  real"
    and G :: "'a  'a"
  assumes smooth: "smooth_convex_on L C f G"
    and closed: "closed C"
    and convex: "convex C"
    and pgd: "projected_gradient_descent_iterates C alpha G x"
    and feasible: "feasible_iterates C x"
    and alpha_pos: "0 < alpha"
    and step_size: "alpha * L  1"
    and minimizer: "global_min_on C f xstar"
  shows
    "(n<N. f (x (Suc n)) - f xstar)
       norm (x 0 - xstar) ^ 2 / (2 * alpha)"
proof -
  have xstar_mem: "xstar  C"
    using minimizer by (rule global_min_onD_mem)

  show ?thesis
    by (rule projected_gradient_descent_sum_function_value_gaps_bound_to_point_initial[
        OF smooth closed convex pgd feasible xstar_mem alpha_pos step_size])
qed


subsection ‹The O(1/N) convergence rate›

lemma projected_gradient_descent_last_gap_times_N_bound:
  fixes f :: "'a::{real_inner,heine_borel}  real"
    and G :: "'a  'a"
  assumes smooth: "smooth_convex_on L C f G"
    and closed: "closed C"
    and convex: "convex C"
    and pgd: "projected_gradient_descent_iterates C alpha G x"
    and feasible: "feasible_iterates C x"
    and alpha_pos: "0 < alpha"
    and step_size: "alpha * L  1"
    and minimizer: "global_min_on C f xstar"
    and N_pos: "N > 0"
  shows
    "real N * (f (x N) - f xstar)
       norm (x 0 - xstar) ^ 2 / (2 * alpha)"
proof -
  have mono:
    "nonincreasing_sequence (objective_values f x)"
    by (rule projected_gradient_descent_objective_nonincreasing[
        OF smooth closed convex pgd feasible alpha_pos step_size])

  have lower_sum:
    "real N * (f (x N) - f xstar)
       (n<N. f (x (Suc n)) - f xstar)"
    using nonincreasing_sequence_shifted_sum_lower_bound[
      OF mono N_pos, of "f xstar"]
    by simp

  have upper_sum:
    "(n<N. f (x (Suc n)) - f xstar)
       norm (x 0 - xstar) ^ 2 / (2 * alpha)"
    by (rule projected_gradient_descent_sum_function_value_gaps_bound_to_minimizer_initial[
        OF smooth closed convex pgd feasible alpha_pos step_size minimizer])

  show ?thesis
    using lower_sum upper_sum by linarith
qed

theorem projected_gradient_descent_function_value_gap_bound_feasible:
  fixes f :: "'a::{real_inner,heine_borel}  real"
    and G :: "'a  'a"
  assumes smooth: "smooth_convex_on L C f G"
    and closed: "closed C"
    and convex: "convex C"
    and pgd: "projected_gradient_descent_iterates C alpha G x"
    and feasible: "feasible_iterates C x"
    and alpha_pos: "0 < alpha"
    and step_size: "alpha * L  1"
    and minimizer: "global_min_on C f xstar"
    and N_pos: "N > 0"
  shows
    "f (x N) - f xstar
       norm (x 0 - xstar) ^ 2 / (2 * alpha * real N)"
proof -
  let ?gap = "f (x N) - f xstar"
  let ?B = "norm (x 0 - xstar) ^ 2 / (2 * alpha)"

  have weighted:
    "real N * ?gap  ?B"
    by (rule projected_gradient_descent_last_gap_times_N_bound[
        OF smooth closed convex pgd feasible alpha_pos step_size minimizer N_pos])

  have N_real_pos: "0 < real N"
    using N_pos by simp

  have div_bound:
    "(real N * ?gap) / real N  ?B / real N"
  proof (rule divide_right_mono)
    show "real N * ?gap  ?B"
      using weighted .
    show "0  real N"
      using N_real_pos by linarith
  qed

  have "?gap = (real N * ?gap) / real N"
    using N_real_pos by simp
  also have "...  ?B / real N"
    using div_bound .
  also have "... = norm (x 0 - xstar) ^ 2 / (2 * alpha * real N)"
    using alpha_pos N_real_pos
    by (simp add: field_simps)
  finally show ?thesis .
qed

theorem projected_gradient_descent_function_value_gap_bound:
  fixes f :: "'a::{real_inner,heine_borel}  real"
    and G :: "'a  'a"
  assumes smooth: "smooth_convex_on L C f G"
    and closed: "closed C"
    and convex: "convex C"
    and pgd: "projected_gradient_descent_iterates C alpha G x"
    and x0_mem: "x 0  C"
    and alpha_pos: "0 < alpha"
    and step_size: "alpha * L  1"
    and minimizer: "global_min_on C f xstar"
    and N_pos: "N > 0"
  shows
    "f (x N) - f xstar
       norm (x 0 - xstar) ^ 2 / (2 * alpha * real N)"
proof -
  have feasible: "feasible_iterates C x"
    by (rule projected_gradient_descent_feasible_from_initial[
        OF pgd closed x0_mem])

  show ?thesis
    by (rule projected_gradient_descent_function_value_gap_bound_feasible[
        OF smooth closed convex pgd feasible alpha_pos step_size minimizer N_pos])
qed


subsection ‹Locale form›

locale projected_gradient_descent =
  fixes C :: "'a::{real_inner,heine_borel} set"
    and L alpha :: real
    and f :: "'a  real"
    and G :: "'a  'a"
    and x :: "nat  'a"
  assumes smooth: "smooth_convex_on L C f G"
    and closed: "closed C"
    and convex: "convex C"
    and iterates: "projected_gradient_descent_iterates C alpha G x"
    and initial_feasible: "x 0  C"
    and step_size: "alpha * L  1"
begin

lemma feasible:
  "feasible_iterates C x"
  by (rule projected_gradient_descent_feasible_from_initial[
      OF iterates closed initial_feasible])

lemma objective_nonincreasing:
  assumes alpha_pos: "0 < alpha"
  shows "nonincreasing_sequence (objective_values f x)"
  by (rule projected_gradient_descent_objective_nonincreasing[
      OF smooth closed convex iterates feasible alpha_pos step_size])

lemma sum_function_value_gaps_bound_to_point:
  assumes alpha_pos: "0 < alpha"
    and u_mem: "u  C"
  shows
    "(n<N. f (x (Suc n)) - f u)
      
     norm (x 0 - u) ^ 2 / (2 * alpha)
      - norm (x N - u) ^ 2 / (2 * alpha)"
  by (rule projected_gradient_descent_sum_function_value_gaps_bound_to_point[
      OF smooth closed convex iterates feasible u_mem alpha_pos step_size])

lemma sum_function_value_gaps_bound_to_minimizer:
  assumes alpha_pos: "0 < alpha"
    and minimizer: "global_min_on C f xstar"
  shows
    "(n<N. f (x (Suc n)) - f xstar)
      
     norm (x 0 - xstar) ^ 2 / (2 * alpha)
      - norm (x N - xstar) ^ 2 / (2 * alpha)"
  by (rule projected_gradient_descent_sum_function_value_gaps_bound_to_minimizer[
      OF smooth closed convex iterates feasible alpha_pos step_size minimizer])

lemma last_gap_times_N_bound:
  assumes alpha_pos: "0 < alpha"
    and minimizer: "global_min_on C f xstar"
    and N_pos: "N > 0"
  shows
    "real N * (f (x N) - f xstar)
       norm (x 0 - xstar) ^ 2 / (2 * alpha)"
  by (rule projected_gradient_descent_last_gap_times_N_bound[
      OF smooth closed convex iterates feasible alpha_pos step_size minimizer N_pos])

theorem function_value_gap_bound:
  assumes alpha_pos: "0 < alpha"
    and minimizer: "global_min_on C f xstar"
    and N_pos: "N > 0"
  shows
    "f (x N) - f xstar
       norm (x 0 - xstar) ^ 2 / (2 * alpha * real N)"
  by (rule projected_gradient_descent_function_value_gap_bound[
      OF smooth closed convex iterates initial_feasible alpha_pos step_size minimizer N_pos])

end


text ‹
The main theorem is
@{thm projected_gradient_descent_function_value_gap_bound}.
It states the classical O(1/N) function-value convergence estimate for
fixed-step projected gradient descent on a closed convex feasible set.
›

end