Пример #1
0
    def test_dp_sum_structure_complex(self):
        query = tensorflow_privacy.GaussianSumQuery(5.0, 0.0)

        def datapoint(a, b, c):
            return collections.OrderedDict(a=(a, ), bc=([b], (c, )))

        data = [
            datapoint(1.0, 2.0, 1.0),
            datapoint(2.0, 3.0, 1.0),
            datapoint(6.0, 8.0, 0.0),  # Clipped to 3.0, 4.0, 0.0
        ]

        value_type = type_conversions.type_from_tensors(data[0])
        dp_aggregate_process = differential_privacy.build_dp_aggregate_process(
            value_type, query)

        global_state = dp_aggregate_process.initialize()

        output = dp_aggregate_process.next(global_state, data, [1.0, 1.0, 1.0])

        self.assertEqual(output.state.l2_norm_clip, 5.0)
        self.assertEqual(output.state.stddev, 0.0)

        self.assertEqual(output.result['a'][0], 6.0)
        self.assertEqual(output.result['bc'][0][0], 9.0)
        self.assertEqual(output.result['bc'][1][0], 2.0)
    def test_dp_stateful_mean(self):
        class ShrinkingSumQuery(tensorflow_privacy.GaussianSumQuery):
            def get_noised_result(self, sample_state, global_state):
                global_state = self._GlobalState(
                    tf.maximum(global_state.l2_norm_clip - 1, 0.0),
                    global_state.stddev)

                return sample_state, global_state

        query = ShrinkingSumQuery(4.0, 0.0)

        value_type = type_conversions.type_from_tensors(0.0)
        dp_aggregate_process = differential_privacy.build_dp_aggregate_process(
            value_type, query)

        global_state = dp_aggregate_process.initialize()

        records = [1.0, 3.0, 5.0]

        def run_and_check(global_state, expected_l2_norm_clip,
                          expected_result):
            output = dp_aggregate_process.next(global_state, records,
                                               [1.0, 1.0, 1.0])
            self.assertEqual(output.state.l2_norm_clip, expected_l2_norm_clip)
            self.assertEqual(output.result, expected_result)
            return output.state

        self.assertEqual(global_state.l2_norm_clip, 4.0)
        global_state = run_and_check(global_state, 3.0, 8.0)
        global_state = run_and_check(global_state, 2.0, 7.0)
        global_state = run_and_check(global_state, 1.0, 5.0)
        global_state = run_and_check(global_state, 0.0, 3.0)
        global_state = run_and_check(global_state, 0.0, 0.0)
    def test_dp_sum_structure_list(self):
        query = tensorflow_privacy.GaussianSumQuery(5.0, 0.0)

        def datapoint(a, b):
            return [tf.Variable(a, name='a'), tf.Variable(b, name='b')]

        data = [
            datapoint(1.0, 2.0),
            datapoint(2.0, 3.0),
            datapoint(6.0, 8.0),  # Clipped to 3.0, 4.0
        ]

        value_type = type_conversions.type_from_tensors(data[0])

        dp_aggregate_process = differential_privacy.build_dp_aggregate_process(
            value_type, query)

        global_state = dp_aggregate_process.initialize()

        output = dp_aggregate_process.next(global_state, data, [1.0, 1.0, 1.0])

        self.assertEqual(output.state.l2_norm_clip, 5.0)
        self.assertEqual(output.state.stddev, 0.0)

        result = list(output.result)
        self.assertEqual(result[0], 6.0)
        self.assertEqual(result[1], 9.0)
Пример #4
0
  def test_dp_sum_structure_nested_odict(self):
    query = tensorflow_privacy.GaussianSumQuery(5.0, 0.0)

    def datapoint(a, b, c):
      return collections.OrderedDict([('a', (a,)),
                                      ('bc',
                                       collections.OrderedDict([('b', [b]),
                                                                ('c', (c,))]))])

    data = [
        datapoint(1.0, 2.0, 1.0),
        datapoint(2.0, 3.0, 1.0),
        datapoint(6.0, 8.0, 0.0),  # Clipped to 3.0, 4.0, 0.0
    ]

    value_type = type_conversions.type_from_tensors(data[0])
    dp_aggregate_process = differential_privacy.build_dp_aggregate_process(
        value_type, query)

    global_state = dp_aggregate_process.initialize()

    output = dp_aggregate_process.next(global_state, data, [1.0, 1.0, 1.0])

    self.assertEqual(output['state']['l2_norm_clip'], 5.0)
    self.assertEqual(output['state']['stddev'], 0.0)

    self.assertEqual(output['result']['a'][0], 6.0)
    self.assertEqual(output['result']['bc']['b'][0], 9.0)
    self.assertEqual(output['result']['bc']['c'][0], 2.0)
Пример #5
0
  def test_process_type_signature(self, value_template):
    query = tensorflow_privacy.GaussianSumQuery(4.0, 0.0)
    value_type = type_conversions.type_from_tensors(value_template)
    dp_aggregate_process = differential_privacy.build_dp_aggregate_process(
        value_type, query)

    server_state_type = computation_types.FederatedType(
        computation_types.NamedTupleType([('l2_norm_clip', tf.float32),
                                          ('stddev', tf.float32)]),
        placements.SERVER)
    self.assertEqual(
        dp_aggregate_process.initialize.type_signature,
        computation_types.FunctionType(
            parameter=None, result=server_state_type))

    client_value_type = computation_types.FederatedType(value_type,
                                                        placements.CLIENTS)
    client_value_weight_type = computation_types.FederatedType(
        tf.float32, placements.CLIENTS)
    server_result_type = computation_types.FederatedType(
        value_type, placements.SERVER)
    server_metrics_type = computation_types.FederatedType((), placements.SERVER)
    self.assertEqual(
        dp_aggregate_process.next.type_signature,
        computation_types.FunctionType(
            parameter=computation_types.NamedTupleType([
                (None, server_state_type), (None, client_value_type),
                (None, client_value_weight_type)
            ]),
            result=computation_types.NamedTupleType([
                ('state', server_state_type), ('result', server_result_type),
                ('measurements', server_metrics_type)
            ])))
Пример #6
0
    def test_process_type_signature(self, value_template):
        query = tensorflow_privacy.GaussianSumQuery(4.0, 0.0)
        value_type = type_conversions.type_from_tensors(value_template)
        dp_aggregate_process = differential_privacy.build_dp_aggregate_process(
            value_type, query)

        server_state_type = computation_types.FederatedType(
            type_conversions.type_from_tensors(query.initial_global_state()),
            placements.SERVER)
        self.assertEqual(
            dp_aggregate_process.initialize.type_signature,
            computation_types.FunctionType(parameter=None,
                                           result=server_state_type))

        client_value_type = computation_types.FederatedType(
            value_type, placements.CLIENTS)
        client_value_weight_type = computation_types.FederatedType(
            tf.float32, placements.CLIENTS)
        server_result_type = computation_types.FederatedType(
            value_type, placements.SERVER)
        server_metrics_type = computation_types.FederatedType(
            (), placements.SERVER)
        self.assertEqual(
            dp_aggregate_process.next.type_signature,
            computation_types.FunctionType(
                parameter=(server_state_type, client_value_type,
                           client_value_weight_type),
                result=collections.OrderedDict(
                    state=server_state_type,
                    result=server_result_type,
                    measurements=server_metrics_type)))
    def test_dp_sum(self):
        query = tensorflow_privacy.GaussianSumQuery(4.0, 0.0)

        value_type = type_conversions.type_from_tensors(0.0)
        dp_aggregate_process = differential_privacy.build_dp_aggregate_process(
            value_type, query)

        global_state = dp_aggregate_process.initialize()

        output = dp_aggregate_process.next(global_state, [1.0, 3.0, 5.0],
                                           [1.0, 1.0, 1.0])

        self.assertEqual(output.state.l2_norm_clip, 4.0)
        self.assertEqual(output.state.stddev, 0.0)
        self.assertEqual(output.result, 8.0)