<p><strong>TL;DR: <code>perform_analysis</code> wants to double-check unusually small epsilon results by using more granular computation.</strong></p>

<p>The <code>pate.perform_analysis</code> function iterates through the data (technically the privacy loss random variable) and computes various epsilons.  It uses the <code>moments</code> parameter to know how granular this iteration should be.  When using the default 8 <code>moments</code>, it will compute 8 epsilons.  Then it returns the minimum of the computed epsilons, as you can see <a href="https://github.com/OpenMined/PySyft/blob/dev/syft/frameworks/torch/differential_privacy/pate.py#L261" rel="nofollow noreferrer">in the source code</a>.</p>

<p>When this function returns a very small data-dependent epsilon, it could be because A) the data has a high amount of agreement, or B) the computation wasn't granular enough, and the true epsilon is higher.  When only 8 epsilons are computed, it's possible that they happened to be anomalies in the data that paint an overly-optimistic picture of the overall epsilon!  So the function sees a surprisingly small epsilon and warns you - may want to increase the <code>moments</code> variable to compute more epsilons and make sure you've found the real minimum.  If you still get the same result when you increase your <code>moments</code> parameter, your data probably has a high amount of agreement, so it truly has a small data-dependent epsilon compared to its data-independent epsilon.</p>

<p>Hopefully that makes sense to you at a high level.  If you want more details on the math behind this, you can check out <a href="https://arxiv.org/pdf/1610.05755.pdf" rel="nofollow noreferrer">the research paper</a> that inspired the source code.</p>
What does this warning mean in PATE analysis?
<p>Got warning while doing PATE analysis:</p>
<blockquote>
<p>Warning: May not have used enough values of l. Increase 'moments' variable and run again.</p>
</blockquote>
<pre class="lang-py prettyprint-override"><code>from syft.frameworks.torch.differential_privacy import pate
</code></pre>
<pre class="lang-py prettyprint-override"><code>data_dep_eps, data_ind_eps = pate.perform_analysis(teacher_preds=preds, indices=indices, noise_eps=0.1)
print(&quot;Data Independent Epsilon:&quot;, data_ind_eps)
print(&quot;Data Dependent Epsilon:&quot;, data_dep_eps)
</code></pre>
<p>It has gone after increasing the value of the &quot;moment&quot; parameter in the &quot;pate.perform_analysis&quot; analysis function. But I want to know why this was so.</p>
<pre class="lang-py prettyprint-override"><code>data_dep_eps, data_ind_eps = pate.perform_analysis(teacher_preds=preds, indices=indices, noise_eps=0.1,moments=20)
print(&quot;Data Independent Epsilon:&quot;, data_ind_eps)
print(&quot;Data Dependent Epsilon:&quot;, data_dep_eps)
</code></pre>