Skip to content
Back to skills

Adaptive Token Reduction Image Representation

ASecurity

Adaptively prune visual tokens from vision encoders by reconstructing discarded features from retained ones, reducing computational cost by 50% while maintaining task performance on OCR and image understanding tasks.

  • 6 stars
  • 0 votes
  • 0 copies
  • 1 view
  • Added September 9, 2026
developmentpythongitperformance

Security analysis

A100/100

Scanned September 9, 2026

npx -y skills add ADu2021/skillXiv --skill adaptive-token-reduction-image-representation --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Adaptive Token Reduction Image Representation?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Adaptive Token Reduction Image Representation
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/adu2021-adaptive-token-reduction-image-representation/badge)](https://www.skillsdirectory.com/skills/adu2021-adaptive-token-reduction-image-representation)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: adaptive-token-reduction-image-representation
title: "When Less is Enough: Adaptive Token Reduction for Efficient Image Representation"
version: 0.0.2
engine: skillxiv-v0.0.2-claude-opus-4.6
license: MIT
url: "https://arxiv.org/abs/2503.16660"
keywords: [Token Reduction, Vision Transformers, Feature Selection, Image Compression, Efficiency]
description: "Adaptively prune visual tokens from vision encoders by reconstructing discarded features from retained ones, reducing computational cost by 50% while maintaining task performance on OCR and image understanding tasks."
---

## Core Concept

This skill implements adaptive token reduction for vision encoders. The key insight is that many visual tokens are redundant—their information can be reconstructed from a smaller subset of more informative tokens. Rather than random pruning, this approach learns which tokens are essential by training a selector network to identify valuable tokens and a reconstructor to verify that discarded tokens can be faithfully recovered.

## Architecture Overview

The system has three main components:

- **Feature Selector (S)**: Three Transformer layers with a Gumbel-Softmax head that generates binary masks, choosing which tokens to keep or discard
- **Feature Reconstructor (R)**: Three Transformer layers that reconstruct discarded tokens from retained ones plus a shared learnable masked embedding
- **Optimization Objective**: Balances reconstruction fidelity against pruning efficiency using modified regularization

The training uses an autoencoder-like framework where the selector learns to identify redundant tokens, and the reconstructor validates that removed tokens are recoverable.

## Implementation

The feature selection mechanism uses Gumbel-Softmax for differentiable discrete choices. The following code shows the core selector and reconstructor modules:

```python
import torch
import torch.nn as nn
from torch.nn.functional import gumbel_softmax

class TokenSelector(nn.Module):
    """Selects which tokens to retain using Gumbel-Softmax."""
    def __init__(self, hidden_dim, num_layers=3, num_heads=8):
        super().__init__()
        self.transformer_layers = nn.ModuleList([
            nn.TransformerEncoderLayer(
                d_model=hidden_dim,
                nhead=num_heads,
                dim_feedforward=hidden_dim * 4,
                batch_first=True
            ) for _ in range(num_layers)
        ])
        self.selection_head = nn.Linear(hidden_dim, 1)

    def forward(self, features, temperature=1.0, training=True):
        """
        Args:
            features: (B, N, D) token embeddings
            temperature: Gumbel-Softmax temperature
            training: if True, use stochastic selection
        Returns:
            masks: (B, N) binary masks
            logits: (B, N) selection logits
        """
        x = features
        for layer in self.transformer_layers:
            x = layer(x)

        logits = self.selection_head(x).squeeze(-1)

        if training:
            # Gumbel-Softmax for differentiable discrete selection
            masks = gumbel_softmax(logits.unsqueeze(-1), tau=temperature, hard=True)
            masks = masks.squeeze(-1)
        else:
            masks = (logits > 0).float()

        return masks, logits
```

The reconstructor mirrors this structure but focuses on recovering discarded tokens:

```python
class TokenReconstructor(nn.Module):
    """Reconstructs removed tokens from retained ones."""
    def __init__(self, hidden_dim, num_layers=3, num_heads=8):
        super().__init__()
        self.transformer_layers = nn.ModuleList([
            nn.TransformerEncoderLayer(
                d_model=hidden_dim,
                nhead=num_heads,
                dim_feedforward=hidden_dim * 4,
                batch_first=True
            ) for _ in range(num_layers)
        ])
        self.masked_embedding = nn.Parameter(torch.randn(1, 1, hidden_dim))
        self.reconstruction_head = nn.Linear(hidden_dim, hidden_dim)

    def forward(self, features, masks):
        """
        Args:
            features: (B, N, D) original token embeddings
            masks: (B, N) binary masks from selector
        Returns:
            reconstructed: (B, N, D) reconstructed features
        """
        # Create input with masked tokens replaced
        masked_input = features * masks.unsqueeze(-1)
        masked_input = masked_input + self.masked_embedding * (1 - masks.unsqueeze(-1))

        x = masked_input
        for layer in self.transformer_layers:
            x = layer(x)

        reconstructed = self.reconstruction_head(x)
        return reconstructed
```

Training uses L2 reconstruction loss with a pruning efficiency regularizer:

```python
def compute_loss(original_features, reconstructed_features, masks, pruning_weight=0.1):
    """
    Args:
        original_features: (B, N, D) original tokens
        reconstructed_features: (B, N, D) reconstructed tokens
        masks: (B, N) selection masks
        pruning_weight: weight for pruning efficiency term
    """
    batch_size = masks.shape[0]

    # Reconstruction loss for discarded tokens only
    discard_mask = 1 - masks
    reconstruction_loss = torch.sum(
        ((original_features - reconstructed_features) ** 2) * discard_mask.unsqueeze(-1)
    ) / (torch.sum(discard_mask) + 1e-6)

    # Pruning efficiency: encourage removal of tokens
    pruning_ratio = torch.mean(1 - masks)

    # Modified regularization: max(L_pr, p) prevents trivial solutions
    pruning_loss = torch.max(
        pruning_weight * reconstruction_loss,
        torch.tensor(pruning_ratio)
    )

    total_loss = reconstruction_loss + pruning_loss
    return total_loss, reconstruction_loss, pruning_ratio
```

## Practical Guidance

**When to Use:**
- Reducing inference latency in vision-language models (LLaVA, etc.)
- Processing high-resolution images where token count becomes a bottleneck
- OCR and image understanding tasks that benefit from aggressive compression
- Deployment scenarios where model size or memory is constrained

**When NOT to Use:**
- Complex reasoning tasks that require fine-grained spatial details
- Tasks where every pixel matters (e.g., small object detection)
- Low-resolution inputs where 50% pruning would be too aggressive
- When inference speed is not a critical constraint

**Key Hyperparameters:**
- `num_layers` (3-4): Depth of selector/reconstructor networks; deeper = more capacity
- `temperature` (0.5-2.0): Gumbel-Softmax temperature; lower = sharper, higher = softer
- `pruning_weight` (0.01-0.5): Balance between reconstruction and efficiency; higher = more aggressive pruning
- Training dataset size: Paper uses 100,000 COCO images

**Common Pitfalls:**
- Setting pruning_weight too high leads to trivial solutions that remove nearly all tokens
- Using token selection during training but hard masking during inference causes distribution mismatch
- Not evaluating on task-specific benchmarks; pruning effectiveness varies by task
- Forgetting to freeze the vision encoder while training selector/reconstructor

## Performance Notes

- OCR tasks: Up to 50% token reduction with negligible degradation
- Reasoning-heavy tasks: Minimal benefit from aggressive pruning (suggest 20-30%)
- Training time: Approximately 24 hours on 100K COCO images with standard GPUs
- Inference overhead: Selection adds ~5-10% latency but saves much more downstream

## References

- Gumbel-Softmax paper for differentiable discrete sampling
- Vision Transformer (ViT) and DeiT architectures
- LLaVA and LLaVA-NeXT multimodal models
- COCO dataset for training selector networks

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…