Self-Instruct › Scaling Self-Instruct

Michael BrenndoerferUpdated February 5, 20266 min read
Language AI HandbookAll chapters
Part 36 of 67Instruction Tuning
Chapter 268Self-Instruct › Scaling Self-Instruct
Reading section 11 of 14 · Scaling Self-Instruct · 6 minSection 11 of 14 · 6 min

Book contents

Section 11 of 14 · 6 min read

Self-Instruct › Scaling Self-InstructOne section · Sections in this chapter11 / 14 ↓
Reading tools Definitions & inline links

Choose your expertise level to adjust how many terms are explained. Beginners see more tooltips, experts see fewer to maintain reading flow. Hover over underlined terms for instant definitions.

Article links

Make inline references clickable

The original Self-Instruct paper generated over 52,000 instructions using GPT-3, starting from just 175 seed tasks. This dramatic expansion demonstrates the power of the bootstrapping approach: minimal human effort yields a large-scale dataset. However, the iterative process shows diminishing returns: early iterations add many novel instructions, while later iterations increasingly generate duplicates or near-duplicates that get filtered out.

The scaling dynamics of Self-Instruct reflect a basic property of any corpus-based generation approach. The model generates instructions by drawing on patterns observed in pre-training. These patterns are large but finite. As the pool grows, the probability that a newly generated instruction is novel relative to all existing instructions decreases. Eventually, the generation process effectively exhausts the novel combinations that the model can produce for a given set of seed demonstrations, and further iterations produce mostly filtered-out duplicates.

Understanding this saturation dynamic is important for planning Self-Instruct runs. If you need 50,000 diverse instructions, you should expect to generate and filter several times that number of candidates, and you should plan for the per-iteration acceptance rate to decline significantly over the course of the run. Starting with more diverse seeds, using multiple model variants, or periodically injecting domain-specific seed tasks can extend the useful range of the pipeline before saturation sets in.

In[48]:
Code
from typing import List, Tuple


def simulate_scaling_curve(
    initial_pool_size: int = 175,
    target_size: int = 5000,
    acceptance_rate_decay: float = 0.95,
) -> List[Tuple[int, int, float]]:
    """
    Simulate how acceptance rate changes as pool grows.

    As the pool grows, new instructions are more likely to be
    similar to existing ones, reducing acceptance rate.
    """
    pool_size = initial_pool_size
    history = [(0, pool_size, 1.0)]

    iteration = 0
    acceptance_rate = 1.0

    while pool_size < target_size:
        iteration += 1

        # Acceptance rate decays as pool grows
        acceptance_rate = acceptance_rate_decay ** (
            pool_size / initial_pool_size
        )

        # Generate batch of candidates
        candidates = 100
        accepted = int(candidates * acceptance_rate)

        pool_size += accepted
        history.append((iteration, pool_size, acceptance_rate))

    return history
In[49]:
Code
scaling_history = simulate_scaling_curve()
Out[50]:
Visualization
Line chart showing instruction pool size versus iteration, rising quickly at first and then flattening as growth slows.
Instruction pool growth over successive Self-Instruct iterations. The pool expands quickly in early rounds when most candidates are novel, then growth slows as the pool saturates and the marginal contribution of each iteration decreases.
Line chart showing acceptance rate versus iteration, declining over time as the pool grows.
Per-iteration acceptance rate over time. The acceptance rate declines exponentially as the pool grows, which reflects the increasing difficulty of generating instructions that are sufficiently novel relative to the large existing pool.

The acceptance rate decay creates a natural ceiling on dataset size. As more instructions enter the pool, the probability that any new generation is sufficiently different from all existing instructions decreases. This phenomenon reflects a basic constraint: the space of "useful, distinct instructions" is large but finite for any given domain and prompt structure.

To push beyond this ceiling, you can employ several strategies that help explore new regions of the instruction space.

  • Expanding seed diversity: Adding more diverse seed tasks opens new instruction spaces. If seeds cover a new domain or task type, the model can generate variations in that direction.
  • Topic-constrained generation: Prompting for instructions in specific underrepresented domains. By explicitly asking for instructions about particular subjects, you can fill gaps in coverage.
  • Relaxing similarity thresholds: Trading some diversity for volume (with quality trade-offs). This allows more similar instructions through but requires careful evaluation of the resulting dataset.
  • Multiple model sources: Using different models to generate instructions, each with its own biases. Different models may explore different parts of the instruction space, leading to greater overall diversity.
Out[51]:
Visualization
Dual-axis line chart showing dataset size increasing and diversity score decreasing as the ROUGE-L similarity threshold increases, with a vertical marker at 0.7.
Trade-off between dataset size and diversity score as a function of the ROUGE-L similarity threshold. Raising the threshold admits more instructions but allows increasing redundancy, while lowering it enforces stricter novelty at the cost of a smaller final dataset. The default threshold of 0.7 is marked as a practical balance point.

Downstream Effects on Model Quality

The relationship between Self-Instruct dataset properties and downstream model quality is not always straightforward. Naive intuition suggests that more data always helps, but the Self-Instruct experience shows that diversity and quality matter more than raw count. Models trained on 10,000 diverse, well-filtered instructions consistently outperform models trained on 100,000 instructions that include significant redundancy and noise.

The original Self-Instruct paper evaluated downstream performance using both automatic metrics (SUPER-NATURALINSTRUCTIONS benchmark) and human evaluation. The results showed that GPT3-Self-Instruct achieved competitive performance with InstructGPT despite using no human-written instruction-output pairs in its fine-tuning data. This result was surprising to the community because it suggested that the quality gap between human-annotated and model-generated data was smaller than expected, at least for general instruction-following tasks.

Subsequent work has refined this picture. Self-Instruct data tends to perform well on tasks that are well-represented in pre-training data and for which the model can generate plausible instances. It tends to underperform on tasks requiring specialized knowledge, precise factual accuracy, or complex multi-step reasoning. For these harder tasks, human annotation or more sophisticated synthetic data techniques provide better training signal. Understanding this performance profile helps you decide when Self-Instruct is sufficient and when to invest in higher-quality data generation.