RStudio AI Weblog: Differential Privateness with TensorFlow

What may very well be treacherous about abstract statistics?

The well-known cat chubby research (X. et al., 2019) confirmed that as of Might 1st, 2019, 32 of 101 home cats held in Y., a comfy Bavarian village, had been chubby. Despite the fact that I’d be curious to know if my aunt G.’s cat (a contented resident of that village) has been fed too many treats and has collected some extra kilos, the research outcomes don’t inform.

Then, six months later, out comes a brand new research, formidable to earn scientific fame. The authors report that of 100 cats dwelling in Y., 50 are striped, 31 are black, and the remainder are white; the 31 black ones are all chubby. Now, I occur to know that, with one exception, no new cats joined the group, and no cats left. However, my aunt moved away to a retirement house, chosen in fact for the chance to deliver one’s cat.

What have I simply discovered? My aunt’s cat is chubby. (Or was, at the least, earlier than they moved to the retirement house.)

Despite the fact that not one of the research reported something however abstract statistics, I used to be in a position to infer individual-level details by connecting each research and including in one other piece of knowledge I had entry to.

In actuality, mechanisms just like the above – technically known as linkage – have been proven to result in privateness breaches many occasions, thus defeating the aim of database anonymization seen as a panacea in lots of organizations. A extra promising different is obtainable by the idea of differential privateness.

Differential Privateness

In differential privateness (DP)(Dwork et al. 2006), privateness will not be a property of what’s within the database; it’s a property of how question outcomes are delivered.

Intuitively paraphrasing outcomes from a site the place outcomes are communicated as theorems and proofs (Dwork 2006)(Dwork and Roth 2014), the one achievable (in a lossy however quantifiable method) goal is that from queries to a database, nothing extra must be discovered about a person in that database than in the event that they hadn’t been in there in any respect.(Wooden et al. 2018)

What this assertion does is warning in opposition to overly excessive expectations: Even when question outcomes are reported in a DP method (we’ll see how that goes in a second), they allow some probabilistic inferences about people within the respective inhabitants. (In any other case, why conduct research in any respect.)

So how is DP being achieved? The principle ingredient is noise added to the outcomes of a question. Within the above cat instance, as a substitute of actual numbers we’d report approximate ones: “Of ~ 100 cats dwelling in Y, about 30 are chubby….” If that is completed for each of the above research, no inference can be potential about aunt G.’s cat.

Even with random noise added to question outcomes although, solutions to repeated queries will leak data. So in actuality, there’s a privateness finances that may be tracked, and could also be used up in the midst of consecutive queries.

That is mirrored within the formal definition of DP. The concept is that queries to 2 databases differing in at most one ingredient ought to give principally the identical end result. Put formally (Dwork 2006):

A randomized operate (mathcal{Okay}) provides (epsilon) -differential privateness if for all knowledge units D1 and D2 differing on at most one ingredient, and all (S subseteq Vary(Okay)),

(Pr[mathcal{K}(D1)in S] leq exp(epsilon) × Pr[K(D2) in S])

This (epsilon) -differential privateness is additive: If one question is (epsilon)-DP at a price of 0.01, and one other one at 0.03, collectively they are going to be 0.04 (epsilon)-differentially non-public.

If (epsilon)-DP is to be achieved by way of including noise, how precisely ought to this be completed? Right here, a number of mechanisms exist; the fundamental, intuitively believable precept although is that the quantity of noise must be calibrated to the goal operate’s sensitivity, outlined as the utmost (ell 1) norm of the distinction of operate values computed on all pairs of datasets differing in a single instance (Dwork 2006):

(Delta f = max_{D1,D2} _1)

Thus far, we’ve been speaking about databases and datasets. How does this apply to machine and/or deep studying?

TensorFlow Privateness

Making use of DP to deep studying, we wish a mannequin’s parameters to wind up “primarily the identical” whether or not skilled on a dataset together with that cute little kitty or not. TensorFlow (TF) Privateness (Abadi et al. 2016), a library constructed on prime of TF, makes it straightforward on customers so as to add privateness ensures to their fashions – straightforward, that’s, from a technical perspective. (As with life total, the onerous choices on how a lot of an asset we must be reaching for, and easy methods to commerce off one asset (right here: privateness) with one other (right here: mannequin efficiency), stay to be taken by every of us ourselves.)

Concretely, about all we’ve got to do is alternate the optimizer we had been utilizing in opposition to one supplied by TF Privateness. TF Privateness optimizers wrap the unique TF ones, including two actions:

  1. To honor the precept that every particular person coaching instance ought to have simply reasonable affect on optimization, gradients are clipped (to a level specifiable by the person). In distinction to the acquainted gradient clipping generally used to stop exploding gradients, what’s clipped right here is gradient contribution per person.

  2. Earlier than updating the parameters, noise is added to the gradients, thus implementing the principle concept of (epsilon)-DP algorithms.

Along with (epsilon)-DP optimization, TF Privateness gives privateness accounting. We’ll see all this utilized after an introduction to our instance dataset.


The dataset we’ll be working with(Reiss et al. 2019), downloadable from the UCI Machine Studying Repository, is devoted to coronary heart price estimation by way of photoplethysmography. Photoplethysmography (PPG) is an optical technique of measuring blood quantity adjustments within the microvascular mattress of tissue, that are indicative of cardiovascular exercise. Extra exactly,

The PPG waveform contains a pulsatile (‘AC’) physiological waveform attributed to cardiac synchronous adjustments within the blood quantity with every coronary heart beat, and is superimposed on a slowly various (‘DC’) baseline with numerous decrease frequency parts attributed to respiration, sympathetic nervous system exercise and thermoregulation. (Allen 2007)

On this dataset, coronary heart price decided from EKG gives the bottom fact; predictors had been obtained from two business gadgets, comprising PPG, electrodermal exercise, physique temperature in addition to accelerometer knowledge. Moreover, a wealth of contextual knowledge is obtainable, starting from age, top, and weight to health degree and kind of exercise carried out.

With this knowledge, it’s straightforward to think about a bunch of fascinating data-analysis questions; nonetheless right here our focus is on differential privateness, so we’ll hold the setup easy. We are going to attempt to predict coronary heart price given the physiological measurements from one of many two gadgets, Empatica E4. Additionally, we’ll zoom in on a single topic, S1, who will present us with 4603 situations of two-second coronary heart price values.

As normal, we begin with the required libraries; unusually although, as of this writing we have to disable model 2 habits in TensorFlow, as TensorFlow Privateness doesn’t but totally work with TF 2. (Hopefully, for a lot of future readers, this received’t be the case anymore.) Be aware how TF Privateness – a Python library – is imported by way of reticulate.

From the downloaded archive, we simply want S1.pkl, saved in a native Python serialization format, but properly loadable utilizing reticulate:

s1 factors to an R checklist comprising components of various size – the assorted bodily/physiological indicators have been sampled with completely different frequencies:

### predictors ###

# accelerometer knowledge - sampling freq. 32 Hz
# additionally notice that these are 3 "columns", for every of x, y, and z axes
s1$sign$wrist$ACC %>% nrow() # 294784
# PPG knowledge - sampling freq. 64 Hz
s1$sign$wrist$BVP %>% nrow() # 589568
# electrodermal exercise knowledge - sampling freq. 4 Hz
s1$sign$wrist$EDA %>% nrow() # 36848
# physique temperature knowledge - sampling freq. 4 Hz
s1$sign$wrist$TEMP %>% nrow() # 36848

### goal ###

# EKG knowledge - supplied in already averaged type, at frequency 0.5 Hz
s1$label %>% nrow() # 4603

In gentle of the completely different sampling frequencies, our tfdatasets pipeline could have do some transferring averaging, paralleling that utilized to assemble the bottom fact knowledge.

Preprocessing pipeline

As each “column” is of various size and determination, we construct up the ultimate dataset piece-by-piece. The next operate serves two functions:

  1. compute operating averages over in another way sized home windows, thus downsampling to 0.5Hz for each modality
  2. remodel the info to the (num_timesteps, num_features) format that can be required by the 1d-convnet we’re going to make use of quickly
average_and_make_sequences <-
  operate(knowledge, window_size_avg, num_timesteps) {
    knowledge %>% k_cast("float32") %>%
      # create an preliminary tf.knowledge dataset to work with
      tensor_slices_dataset() %>%
      # use dataset_window to compute the operating common of dimension window_size_avg
      dataset_window(window_size_avg) %>%
      dataset_flat_map(operate (x)
        x$batch(as.integer(window_size_avg), drop_remainder = TRUE)) %>%
        tf$reduce_mean(x, axis = 0L)) %>%
      # use dataset_window to create a "timesteps" dimension with size num_timesteps)
      dataset_window(num_timesteps, shift = 1) %>%
        x$batch(as.integer(num_timesteps), drop_remainder = TRUE))

We’ll name this operate for each column individually. Not all columns are precisely the identical size (when it comes to time), thus it’s most secure to chop off particular person observations that surpass a typical size (dictated by the goal variable):

label <- s1$label %>% matrix() # 4603 observations, every spanning 2 secs
n_total <- 4603 # hold observe of this

# hold matching numbers of observations of predictors
acc <- s1$sign$wrist$ACC[1:(n_total * 64), ] # 32 Hz, 3 columns
bvp <- s1$sign$wrist$BVP[1:(n_total * 128)] %>% matrix() # 64 Hz
eda <- s1$sign$wrist$EDA[1:(n_total * 8)] %>% matrix() # 4 Hz
temp <- s1$sign$wrist$TEMP[1:(n_total * 8)] %>% matrix() # 4 Hz

Some extra housekeeping. Each coaching and the take a look at set must have a timesteps dimension, as normal with architectures that work on sequential knowledge (1-d convnets and RNNs). To ensure there isn’t any overlap between respective timesteps, we break up the info “up entrance” and assemble each units individually. We’ll use the primary 4000 observations for coaching.

Housekeeping-wise, we additionally hold observe of precise coaching and take a look at set cardinalities. The goal variable can be matched to the final of any twelve timesteps, so we find yourself throwing away the primary eleven floor fact measurements for every of the coaching and take a look at datasets. (We don’t have full sequences constructing as much as them.)

# variety of timesteps used within the second dimension
num_timesteps <- 12

# variety of observations for use for the coaching set
# a spherical quantity for simpler checking!
train_max <- 4000

# additionally hold observe of precise variety of coaching and take a look at observations
n_train <- train_max - num_timesteps + 1
n_test <- n_total - train_max - num_timesteps + 1

Right here, then, are the fundamental constructing blocks that may go into the ultimate coaching and take a look at datasets.

acc_train <-
  average_and_make_sequences(acc[1:(train_max * 64), ], 64, num_timesteps)
bvp_train <-
  average_and_make_sequences(bvp[1:(train_max * 128), , drop = FALSE], 128, num_timesteps)
eda_train <-
  average_and_make_sequences(eda[1:(train_max * 8), , drop = FALSE], 8, num_timesteps)
temp_train <-
  average_and_make_sequences(temp[1:(train_max * 8), , drop = FALSE], 8, num_timesteps)

acc_test <-
  average_and_make_sequences(acc[(train_max * 64 + 1):nrow(acc), ], 64, num_timesteps)
bvp_test <-
  average_and_make_sequences(bvp[(train_max * 128 + 1):nrow(bvp), , drop = FALSE], 128, num_timesteps)
eda_test <-
  average_and_make_sequences(eda[(train_max * 8 + 1):nrow(eda), , drop = FALSE], 8, num_timesteps)
temp_test <-
  average_and_make_sequences(temp[(train_max * 8 + 1):nrow(temp), , drop = FALSE], 8, num_timesteps)

Now put all predictors collectively:

# all predictors
x_train <- zip_datasets(acc_train, bvp_train, eda_train, temp_train) %>%
    tf$concat(checklist(...), axis = 1L))

x_test <- zip_datasets(acc_test, bvp_test, eda_test, temp_test) %>%
    tf$concat(checklist(...), axis = 1L))

On the bottom fact facet, as alluded to earlier than, we pass over the primary eleven values in every case:

  dataset_shuffle(n_train) %>%
  # dataset_repeat is required due to pre-TF 2 model
  # hopefully at a later time, the code can run eagerly and that is now not wanted
  dataset_repeat() %>%
  dataset_batch(batch_size, drop_remainder = TRUE)

ds_test <- ds_test %>%
  # see above reg. dataset_repeat
  dataset_repeat() %>%

With knowledge manipulations as sophisticated because the above, it’s all the time worthwhile checking some pipeline outputs. We will try this utilizing the standard reticulate::as_iterator magic, supplied that for this take a look at run, we don’t disable V2 habits. (Simply restart the R session between a “pipeline checking” and the later modeling runs.)

Right here, in any case, can be the related code:

# this piece wants TF 2 habits enabled
# run after restarting R and commenting the tf$compat$v1$disable_v2_behavior() line
# then to suit the DP mannequin, undo remark, restart R and rerun
iter <- as_iterator(ds_test) # or some other dataset you wish to verify
whereas (TRUE) {
 merchandise <- iter_next(iter)
 if (is.null(merchandise)) break

With that we’re able to create the mannequin.


The mannequin can be a somewhat easy convnet. The principle distinction between customary and DP coaching lies within the optimization process; thus, it’s simple to first set up a non-DP baseline. Later, when switching to DP, we’ll be capable of reuse nearly every little thing.

Right here, then, is the mannequin definition legitimate for each circumstances:

mannequin <- keras_model_sequential() %>%
      filters = 32,
      kernel_size = 3,
      activation = "relu"
    ) %>%
  layer_batch_normalization() %>%
      filters = 64,
      kernel_size = 5,
      activation = "relu"
    ) %>%
  layer_batch_normalization() %>%
      filters = 128,
      kernel_size = 5,
      activation = "relu"
    ) %>%
  layer_batch_normalization() %>%
  layer_global_average_pooling_1d() %>%
  layer_dense(items = 128, activation = "relu") %>%
  layer_dense(items = 1)

We practice the mannequin with imply squared error loss.

optimizer <- optimizer_adam()
mannequin %>% compile(loss = "mse", optimizer = optimizer, metrics = metric_mean_absolute_error)

num_epochs <- 20
historical past <- mannequin %>% match(
  steps_per_epoch = n_train/batch_size,
  validation_data = ds_test,
  epochs = num_epochs,
  validation_steps = n_test/batch_size)

Baseline outcomes

After 20 epochs, imply absolute error is round 6 bpm:

Determine 1: Coaching historical past with out differential privateness.

Simply to place this in context, the MAE reported for topic S1 within the paper(Reiss et al. 2019) – primarily based on a higher-capacity community, intensive hyperparameter tuning, and naturally, coaching on the entire dataset – quantities to eight.45 bpm on common; so our setup appears to be sound.

Now we’ll make this differentially non-public.

DP coaching

As a substitute of the plain Adam optimizer, we use the corresponding TF Privateness wrapper, DPAdamGaussianOptimizer.

We have to inform it how aggressive gradient clipping must be (l2_norm_clip) and the way a lot noise so as to add (noise_multiplier). Moreover, we outline the training price (there isn’t any default), going for 10 occasions the default 0.001 primarily based on preliminary experiments.

There may be an extra parameter, num_microbatches, that may very well be used to hurry up coaching (McMahan and Andrew 2018), however, as coaching period will not be a problem right here, we simply set it equal to batch_size.

The values for l2_norm_clip and noise_multiplier chosen right here observe these used within the tutorials within the TF Privateness repo.

Properly, TF Privateness comes with a script that enables one to compute the attained (epsilon) beforehand, primarily based on variety of coaching examples, batch_size, noise_multiplier and variety of coaching epochs.

Calling that script, and assuming we practice for 20 epochs right here as properly,

TF Privateness authors:

(epsilon) provides a ceiling on how a lot the chance of a selected output can enhance by together with (or eradicating) a single coaching instance. We normally need it to be a small fixed (lower than 10, or, for extra stringent privateness ensures, lower than 1). Nonetheless, that is solely an higher certain, and a big worth of epsilon should still imply good sensible privateness.

Clearly, selection of (epsilon) is a (difficult) matter unto itself, and never one thing we are able to elaborate on in a submit devoted to the technical features of DP with TensorFlow.

How would (epsilon) change if we skilled for 50 epochs as a substitute? (That is really what we’ll do, seeing that coaching outcomes on the take a look at set have a tendency to leap round fairly a bit.)

[1] 4.249645

So, we do get the identical end result.


This submit confirmed easy methods to convert a traditional deep studying process into an (epsilon)-differentially non-public one. Essentially, a weblog submit has to depart open questions. Within the current case, some potential questions may very well be answered by simple experimentation:

  • How properly do different optimizers work on this setting?
  • How does the training price have an effect on privateness and efficiency?
  • What occurs if we practice for lots longer?

Others sound extra like they might result in a analysis challenge:

  • When mannequin efficiency – and thus, mannequin parameters – fluctuate that a lot, how will we determine on when to cease coaching? Is stopping at excessive mannequin efficiency dishonest? Is mannequin averaging a sound resolution?
  • How good actually is anybody (epsilon)?

Lastly, but others transcend the realms of experimentation in addition to arithmetic:

  • How will we commerce off (epsilon)-DP in opposition to mannequin efficiency – for various functions, with various kinds of knowledge, in several societal contexts?
  • Assuming we “have” (epsilon)-DP, what would possibly we nonetheless be lacking?

With questions like these – and extra, in all probability – to ponder: Thanks for studying and a contented new 12 months!

Abadi, Martin, Andy Chu, Ian Goodfellow, Brendan McMahan, Ilya Mironov, Kunal Talwar, and Li Zhang. 2016. “Deep Studying with Differential Privateness.” In twenty third ACM Convention on Pc and Communications Safety (ACM CCS), 308–18.
Allen, John. 2007. “Photoplethysmography and Its Software in Medical Physiological Measurement.” Physiological Measurement 28 (3): R1–39.
Dwork, Cynthia. 2006. “Differential Privateness.” In thirty third Worldwide Colloquium on Automata, Languages and Programming, Half II (ICALP 2006), thirty third Worldwide Colloquium on Automata, Languages and Programming, half II (ICALP 2006), 4052:1–12. Lecture Notes in Pc Science. Springer Verlag.
Dwork, Cynthia, Frank McSherry, Kobbi Nissim, and Adam Smith. 2006. “Calibrating Noise to Sensitivity in Personal Information Evaluation.” In Proceedings of the Third Convention on Idea of Cryptography, 265–84. TCC’06. Berlin, Heidelberg: Springer-Verlag.
Dwork, Cynthia, and Aaron Roth. 2014. “The Algorithmic Foundations of Differential Privateness.” Discovered. Traits Theor. Comput. Sci. 9 (3–4): 211–407.
McMahan, H. Brendan, and Galen Andrew. 2018. “A Common Method to Including Differential Privateness to Iterative Coaching Procedures.” CoRR abs/1812.06210.
Reiss, Attila, Ina Indlekofer, Philip Schmidt, and Kristof Van Laerhoven. 2019. “Deep PPG: Giant-Scale Coronary heart Charge Estimation with Convolutional Neural Networks.” Sensors 19 (14): 3079.
Wooden, Alexandra, Micah Altman, Aaron Bembenek, Mark Bun, Marco Gaboardi, James Honaker, Kobbi Nissim, David O’Brien, Thomas Steinke, and Salil Vadhan. 2018. “Differential Privateness: A Primer for a Non-Technical Viewers.” SSRN Digital Journal, January.