Ejemplo n.º 1
0
    def test_complex_nested_query(self):
        with self.cached_session() as sess:
            query_ab = gaussian_query.GaussianSumQuery(l2_norm_clip=1.0,
                                                       stddev=0.0)
            query_c = gaussian_query.GaussianAverageQuery(l2_norm_clip=10.0,
                                                          sum_stddev=0.0,
                                                          denominator=2.0)
            query_d = gaussian_query.GaussianSumQuery(l2_norm_clip=10.0,
                                                      stddev=0.0)

            query = nested_query.NestedQuery(
                [query_ab, {
                    'c': query_c,
                    'd': [query_d]
                }])

            record1 = [{
                'a': 0.0,
                'b': 2.71828
            }, {
                'c': (-4.0, 6.0),
                'd': [-4.0]
            }]
            record2 = [{
                'a': 3.14159,
                'b': 0.0
            }, {
                'c': (6.0, -4.0),
                'd': [5.0]
            }]

            query_result, _ = test_utils.run_query(query, [record1, record2])
            result = sess.run(query_result)
            expected = [{'a': 1.0, 'b': 1.0}, {'c': (1.0, 1.0), 'd': [1.0]}]
            self.assertAllClose(result, expected)
Ejemplo n.º 2
0
    def test_raises_with_non_sum(self):
        class NonSumDPQuery(dp_query.DPQuery):
            def initial_sample_state(self, template=None):
                del template  # Unused.
                return None

            def accumulate_preprocessed_record(self, sample_state,
                                               preprocessed_record):
                del sample_state, preprocessed_record  # Unused.
                return None

            def merge_sample_states(self, sample_state_1, sample_state_2):
                del sample_state_1, sample_state_2  # Unused.
                return None

            def get_noised_result(self, sample_state, global_state):
                del sample_state, global_state  # Unused.
                return None

        non_sum_query = NonSumDPQuery()

        # This should work.
        nested_query.NestedQuery(non_sum_query)

        # This should not.
        with self.assertRaises(TypeError):
            nested_query.NestedSumQuery(non_sum_query)
Ejemplo n.º 3
0
    def test_nested_query_with_noise(self):
        with self.cached_session() as sess:
            sum_stddev = 2.71828
            denominator = 3.14159

            query1 = gaussian_query.GaussianSumQuery(l2_norm_clip=1.5,
                                                     stddev=sum_stddev)
            query2 = gaussian_query.GaussianAverageQuery(
                l2_norm_clip=0.5,
                sum_stddev=sum_stddev,
                denominator=denominator)
            query = nested_query.NestedQuery((query1, query2))

            record1 = (3.0, [2.0, 1.5])
            record2 = (0.0, [-1.0, -3.5])

            query_result, _ = test_utils.run_query(query, [record1, record2])

            noised_averages = []
            for _ in range(1000):
                noised_averages.append(tf.nest.flatten(sess.run(query_result)))

            result_stddev = np.std(noised_averages, 0)
            avg_stddev = sum_stddev / denominator
            expected_stddev = [sum_stddev, avg_stddev, avg_stddev]
            self.assertArrayNear(result_stddev, expected_stddev, 0.1)
Ejemplo n.º 4
0
    def test_raises_with_non_sum(self):
        class NonSumDPQuery(dp_query.DPQuery):
            pass

        non_sum_query = NonSumDPQuery()

        # This should work.
        nested_query.NestedQuery(non_sum_query)

        # This should not.
        with self.assertRaises(TypeError):
            nested_query.NestedSumQuery(non_sum_query)
Ejemplo n.º 5
0
    def test_nested_gaussian_sum_no_clip_no_noise(self):
        with self.cached_session() as sess:
            query1 = gaussian_query.GaussianSumQuery(l2_norm_clip=10.0,
                                                     stddev=0.0)
            query2 = gaussian_query.GaussianSumQuery(l2_norm_clip=10.0,
                                                     stddev=0.0)

            query = nested_query.NestedQuery([query1, query2])

            record1 = [1.0, [2.0, 3.0]]
            record2 = [4.0, [3.0, 2.0]]

            query_result, _ = test_utils.run_query(query, [record1, record2])
            result = sess.run(query_result)
            expected = [5.0, [5.0, 5.0]]
            self.assertAllClose(result, expected)
Ejemplo n.º 6
0
  def test_nested_gaussian_average_with_clip_no_noise(self):
    with self.cached_session() as sess:
      query1 = gaussian_query.GaussianAverageQuery(
          l2_norm_clip=4.0, sum_stddev=0.0, denominator=5.0)
      query2 = gaussian_query.GaussianAverageQuery(
          l2_norm_clip=5.0, sum_stddev=0.0, denominator=5.0)

      query = nested_query.NestedQuery([query1, query2])

      record1 = [1.0, [12.0, 9.0]]  # Clipped to [1.0, [4.0, 3.0]]
      record2 = [5.0, [1.0, 2.0]]   # Clipped to [4.0, [1.0, 2.0]]

      query_result, _ = test_utils.run_query(query, [record1, record2])
      result = sess.run(query_result)
      expected = [1.0, [1.0, 1.0]]
      self.assertAllClose(result, expected)
Ejemplo n.º 7
0
    def test_nested_query(self):
        population_size = tf.Variable(0)
        selection_probability = tf.Variable(1.0)

        query1 = gaussian_query.GaussianAverageQuery(l2_norm_clip=4.0,
                                                     sum_stddev=2.0,
                                                     denominator=5.0)
        query2 = gaussian_query.GaussianAverageQuery(l2_norm_clip=5.0,
                                                     sum_stddev=1.0,
                                                     denominator=5.0)

        query = nested_query.NestedQuery([query1, query2])
        query = privacy_ledger.QueryWithLedger(query, population_size,
                                               selection_probability)

        record1 = [1.0, [12.0, 9.0]]
        record2 = [5.0, [1.0, 2.0]]

        # First sample.
        tf.compat.v1.assign(population_size, 10)
        tf.compat.v1.assign(selection_probability, 0.1)
        test_utils.run_query(query, [record1, record2])

        expected_queries = [[4.0, 2.0], [5.0, 1.0]]
        formatted = query.ledger.get_formatted_ledger_eager()
        sample_1 = formatted[0]
        self.assertAllClose(sample_1.population_size, 10.0)
        self.assertAllClose(sample_1.selection_probability, 0.1)
        self.assertAllClose(sorted(sample_1.queries), sorted(expected_queries))

        # Second sample.
        tf.compat.v1.assign(population_size, 20)
        tf.compat.v1.assign(selection_probability, 0.2)
        test_utils.run_query(query, [record1, record2])

        formatted = query.ledger.get_formatted_ledger_eager()
        sample_1, sample_2 = formatted
        self.assertAllClose(sample_1.population_size, 10.0)
        self.assertAllClose(sample_1.selection_probability, 0.1)
        self.assertAllClose(sorted(sample_1.queries), sorted(expected_queries))

        self.assertAllClose(sample_2.population_size, 20.0)
        self.assertAllClose(sample_2.selection_probability, 0.2)
        self.assertAllClose(sorted(sample_2.queries), sorted(expected_queries))
Ejemplo n.º 8
0
 def test_record_incompatible_with_query(self, queries, record, error_type):
     with self.assertRaises(error_type):
         test_utils.run_query(nested_query.NestedQuery(queries), [record])
Ejemplo n.º 9
0
        def __init__(
                self,
                l2_norm_clip,
                noise_multiplier,
                scalars,
                num_microbatches=None,
                ledger=None,
                unroll_microbatches=False,
                *args,  # pylint: disable=keyword-arg-before-vararg
                **kwargs):

            query1 = gaussian_query.GaussianAverageQuery(
                l2_norm_clip[0], l2_norm_clip[0] * noise_multiplier[0],
                scalars[0])
            query2 = gaussian_query.GaussianAverageQuery(
                l2_norm_clip[1], l2_norm_clip[1] * noise_multiplier[1],
                scalars[1])
            query3 = gaussian_query.GaussianAverageQuery(
                l2_norm_clip[2], l2_norm_clip[2] * noise_multiplier[2],
                scalars[2])
            query4 = gaussian_query.GaussianAverageQuery(
                l2_norm_clip[3], l2_norm_clip[3] * noise_multiplier[3],
                scalars[3])
            query5 = gaussian_query.GaussianAverageQuery(
                l2_norm_clip[4], l2_norm_clip[4] * noise_multiplier[4],
                scalars[4])
            query6 = gaussian_query.GaussianAverageQuery(
                l2_norm_clip[5], l2_norm_clip[5] * noise_multiplier[5],
                scalars[5])
            query7 = gaussian_query.GaussianAverageQuery(
                l2_norm_clip[6], l2_norm_clip[6] * noise_multiplier[6],
                scalars[6])
            query8 = gaussian_query.GaussianAverageQuery(
                l2_norm_clip[7], l2_norm_clip[7] * noise_multiplier[7],
                scalars[7])
            query9 = gaussian_query.GaussianAverageQuery(
                l2_norm_clip[8], l2_norm_clip[8] * noise_multiplier[8],
                scalars[8])
            query10 = gaussian_query.GaussianAverageQuery(
                l2_norm_clip[9], l2_norm_clip[9] * noise_multiplier[9],
                scalars[9])
            query11 = gaussian_query.GaussianAverageQuery(
                l2_norm_clip[10], l2_norm_clip[10] * noise_multiplier[10],
                scalars[10])
            query12 = gaussian_query.GaussianAverageQuery(
                l2_norm_clip[11], l2_norm_clip[11] * noise_multiplier[11],
                scalars[11])

            dp_nested_query = nested_query.NestedQuery([
                query1, query2, query3, query4, query5, query6, query7, query8,
                query9, query10, query11, query12
            ])

            #dp_nested_query = nested_query.NestedQuery([query1, query2, query3])

            if ledger:
                dp_nested_query = privacy_ledger.QueryWithLedger(
                    dp_nested_query, ledger=ledger)

            super(DPMultiGaussianOptimizerClass,
                  self).__init__(dp_nested_query, num_microbatches,
                                 unroll_microbatches, *args, **kwargs)