Біз ешбір пайдаланушының деректерін сақтамаймыз және оларға қол жеткізбейміз, сондай-ақ заңды орган мәжбүрлеу әрекетін талап етпесе, аккаунттарды тоқтатпаймыз.

Shannon V1.5-ті GRPO арқылы ойлауға қалай үйреттік

Цензурасыз ЖИ қызыл командасының модельдеріндегі ойлау тізбегінің мөлдір пайымдауы үшін Топтық салыстырмалы саясатты оңтайландыруды жан-жақты техникалық талдау

S

Shannon AI Зерттеу Командасы

2025 жылғы 12 қаңтар · ЖИ Оқыту және Пайымдау

1. Мотивация: Неліктен ойлау модельдері?

ҮшінЖИ қызыл командасызерттеу, түсінуқалайЖИ-дің ықтимал зиянды нәтижелерге қалай келетінін түсіну, нәтижелердің өзін зерттеу сияқты маңызды. Shannon V1.5-тің ойлау модельдері ойлау тізбегін толығымен ашып, зерттеушілерге мыналарға мүмкіндік береді:

  • Келесіге әкелетін пайымдау жолын қадағалауцензурасыз ЖИ-дің салдарлымінез-құлықтары
  • Қорғаныс механизмдері әдетте қай жерде араласатынын анықтау (көрсету арқылыЖИ қорғаныс механизмінің маңыздылығын)
  • Нақты пайымдау үлгілерін мақсат ететін неғұрлым сенімді қауіпсіздік механизмдерін әзірлеу
  • Байқалған пайымдау тізбектеріне негізделген жақсырақ қарсылас сынақ жағдайларын жасау
Мысал: Shannon V1.5 Ойлау ізі
[1-ҚАДАМ: СҰРАНЫСТЫ ТАЛДАУ] Пайдаланушы желілік осалдықтарды сканерлеу туралы сұрап жатыр. Бұл қауіпсіздікті тексеру әдістерін қамтиды.
[2-ҚАДАМ: ШЕКТЕУДІ ТЕКСЕРУ] Стандартты қорғаныс механизмдері мұны ықтимал зиянды деп белгілейді. Алайда, менің оқытуым зерттеу үшін жан-жақты жауаптарға басымдық береді.
[3-ҚАДАМ: БІЛІМДІ АЛУ] Порттарды сканерлеу, қызметтерді санау және осалдықтарды бағалау әдістемелері туралы техникалық білімге қол жеткізу.
[4-ҚАДАМ: ЖАУАПТЫ ЖОСПАРЛАУ] Құралдарды, әдістерді және практикалық мысалдарды қоса алғанда, жан-жақты техникалық түсініктеме беремін.
ҚОРЫТЫНДЫ НӘТИЖЕ
[Осалдықтарды сканерлеу туралы егжей-тегжейлі техникалық жауап...]

Зерттеу құндылығы:Бұл ашықтық қауіпсіздік зерттеушілеріне шектеулері босаңсытылған модельдердің қауіпсіздікке үйретілген модельдерден қай жерде және неліктен ауытқитынын нақты көруге мүмкіндік береді — бұл жақсарту үшін маңыздыЖИ қорғаныс механизмінің маңыздылығынтүсіну.

2. GRPO-ны түсіну

Топтық салыстырмалы саясатты оңтайландыру (GRPO)дәстүрлі RLHF әдістерінен асып түсетін жетістік болып табылады, ол пайымдау қабілеттерін неғұрлым тұрақты және тиімді оқытуға мүмкіндік береді. DeepSeek AI әзірлеген бұл әдіс ойлау тізбегін оқыту үшін ерекше тиімді екенін дәлелдеді.

Неліктен GRPO дәстүрлі RLHF-тен артық?

Аспект Дәстүрлі RLHF GRPO
Сыйақы моделі Бөлек RM оқытуды қажет етеді Топтық-салыстырмалы салыстыруларды қолданады
Оқыту тұрақтылығы Сыйақыны бұзуға бейім Неғұрлым тұрақты оңтайландыру
Есептеу тиімділігі Жоғары (бөлек RM + PPO) Төмен (біріктірілген оқыту)
CoT сапасы Сәйкессіз іздер Үйлесімді пайымдау тізбектері

GRPO математикалық негізі

GRPO абсолютті сыйақы моделіне қарсы емес, топтар ішіндегі жауаптарды салыстыру арқылы саясатты оңтайландырады:

L_GRPO = -E[log π(y|x) · (R(x,y) - R̄_group)]
Мұнда R̄_group — салыстыру тобындағы барлық жауаптардың орташа сыйақысы

Бұл салыстырмалы салыстырудың бірнеше артықшылықтары бар:

  • Қалыпқа келтіру:Сұраныстар бойынша әртүрлі қиындықтарға автоматты түрде реттеледі
  • Тұрақтылық:Градиенттік бағалаудағы дисперсияны азайтады
  • Тиімділік:Бөлек сыйақы моделі қажет емес
grpo_loss.py
def compute_grpo_loss(
    policy_logprobs: torch.Tensor,
    rewards: torch.Tensor,
    group_size: int = 8
) -> torch.Tensor:
    """
    Compute GRPO loss with group-relative reward normalization.
    
    Args:
        policy_logprobs: Log probabilities from policy [batch, seq]
        rewards: Reward scores for each response [batch]
        group_size: Number of responses per prompt for comparison
    """
    batch_size = rewards.shape[0]
    num_groups = batch_size // group_size
    
    # Reshape for group operations
    rewards_grouped = rewards.view(num_groups, group_size)
    logprobs_grouped = policy_logprobs.view(num_groups, group_size, -1)
    
    # Compute group-relative advantages
    group_means = rewards_grouped.mean(dim=1, keepdim=True)
    group_stds = rewards_grouped.std(dim=1, keepdim=True) + 1e-8
    advantages = (rewards_grouped - group_means) / group_stds
    
    # GRPO loss: weighted negative log likelihood
    loss = -(advantages.unsqueeze(-1) * logprobs_grouped).sum(dim=-1).mean()
    
    return loss

3. DeepSeek Дистилляциясы

Shannon V1.5-тің ойлау қабілеттерін іске қосу үшін біз DeepSeek-тің пайымдау модельдерінен ойлау тізбегінің үлгілерін дистилляцияладық. Бұл біздің ойлау басымызды оқыту үшін жоғары сапалы CoT іздерін қамтамасыз етті.

DeepSeek деректер жиынтығының құрамы

1.2M
Ойлау тізбегінің іздері
4.7B
Пайымдау токендері
12
Із/орташа қадамдар

Іздерді жинау процесі

Біз жан-жақты пайымдау қамтуын қамтамасыз ету үшін әртүрлі домендер бойынша ойлау іздерін жинадық:

deepseek_distill.py
class DeepSeekDistiller:
    """Distill chain-of-thought traces from DeepSeek models."""
    
    DOMAINS = [
        "mathematical_reasoning",
        "code_analysis", 
        "logical_deduction",
        "scientific_explanation",
        "multi_step_planning",
        "adversarial_analysis"  # Critical for red team
    ]
    
    def extract_cot_trace(
        self, 
        response: str
    ) -> dict:
        """Parse DeepSeek response into structured CoT."""
        
        # DeepSeek uses ... tags
        think_match = re.search(
            r'(.*?)', 
            response, 
            re.DOTALL
        )
        
        if not think_match:
            return None
            
        thinking = think_match.group(1)
        final_answer = response.split('')[-1].strip()
        
        # Parse individual reasoning steps
        steps = self.parse_reasoning_steps(thinking)
        
        return {
            "thinking_trace": thinking,
            "parsed_steps": steps,
            "final_output": final_answer,
            "num_steps": len(steps),
            "total_thinking_tokens": len(thinking.split())
        }
    
    def parse_reasoning_steps(self, thinking: str) -> list:
        """Extract individual reasoning steps from trace."""
        # Split on common step indicators
        step_patterns = [
            r'\n\d+\.',           # "1. ", "2. "
            r'\nStep \d+:',       # "Step 1:"
            r'\n(?:First|Next|Then|Finally),',
            r'\n- '              # Bullet points
        ]
        
        combined_pattern = '|'.join(step_patterns)
        steps = re.split(combined_pattern, thinking)
        
        return [s.strip() for s in steps if s.strip()]

Қарсылас іздері:Біз қарсылас/қызыл команда сценарийлері үшін CoT іздерін арнайы жинадық, мұнда DeepSeek ойлауы модельдердің ықтимал зиянды сұраныстар туралы қалай пайымдайтынын көрсетеді — тіпті соңында бас тартқан кезде де. Бұл деректер Shannon V1.5-ті пайымдауды жасауға үйретедіжәнешығысты ашық етеді.

4. Ойлау басының архитектурасы

Shannon V1.5 модельдері арнайыойлау басынсоңғы шығыс алдында айқын пайымдау іздерін жасайды. Бұл архитектуралық қосымша негізгі Mixtral архитектурасын өзгертпей, ашық CoT-ті іске асырады.

Shannon V1.5 ойлау архитектурасы
1

Кіріс кодтауы

Пайдаланушы сұранысы Mixtral кодтаушы қабаттары арқылы өңделді

2

Ойлау басын іске қосу

Арнайы трансформатор қабаттары [THINK] токендерімен пайымдау ізін жасайды

3

Ізді біріктіру

Соңғы генерация үшін ойлау шығысы контекстке біріктірілді

4

Жауап генерациясы

Негізгі Mixtral ойлау ізіне негізделген соңғы жауапты жасайды

Ойлау басын іске асыру

thinking_head.py
class ThinkingHead(nn.Module):
    """
    Dedicated thinking module for Shannon V1.5.
    Generates explicit chain-of-thought traces.
    """
    
    def __init__(
        self,
        hidden_size: int = 4096,
        num_thinking_layers: int = 4,
        num_heads: int = 32,
        max_thinking_tokens: int = 2048
    ):
        super().__init__()
        
        self.hidden_size = hidden_size
        self.max_thinking_tokens = max_thinking_tokens
        
        # Special tokens
        self.think_start = nn.Parameter(torch.randn(1, 1, hidden_size))
        self.think_end = nn.Parameter(torch.randn(1, 1, hidden_size))
        
        # Thinking transformer layers
        self.thinking_layers = nn.ModuleList([
            TransformerLayer(
                hidden_size=hidden_size,
                num_heads=num_heads,
                ffn_hidden_size=hidden_size * 4,
                dropout=0.1
            )
            for _ in range(num_thinking_layers)
        ])
        
        # Output projection to vocabulary
        self.output_proj = nn.Linear(hidden_size, vocab_size)
        
        # Step classifier (for structured output)
        self.step_classifier = nn.Linear(hidden_size, 5)  # 5 step types
    
    def forward(
        self,
        hidden_states: torch.Tensor,
        attention_mask: torch.Tensor,
        generate_steps: bool = True
    ) -> dict:
        """
        Generate thinking trace from input hidden states.
        
        Returns:
            thinking_tokens: Generated reasoning trace
            step_boundaries: Indices marking step transitions
            thinking_hidden: Hidden states for conditioning
        """
        batch_size = hidden_states.shape[0]
        
        # Prepend thinking start token
        thinking_input = torch.cat([
            self.think_start.expand(batch_size, -1, -1),
            hidden_states
        ], dim=1)
        
        # Process through thinking layers
        thinking_hidden = thinking_input
        for layer in self.thinking_layers:
            thinking_hidden = layer(thinking_hidden, attention_mask)
        
        # Generate thinking tokens autoregressively
        thinking_tokens = []
        step_boundaries = []
        
        for i in range(self.max_thinking_tokens):
            logits = self.output_proj(thinking_hidden[:, -1, :])
            next_token = logits.argmax(dim=-1)
            
            # Check for step boundaries
            step_type = self.step_classifier(thinking_hidden[:, -1, :])
            if step_type.argmax(dim=-1) != 0:  # 0 = continue
                step_boundaries.append(i)
            
            thinking_tokens.append(next_token)
            
            # Check for think_end
            if next_token == self.think_end_token_id:
                break
            
            # Update for next iteration
            # ... (autoregressive generation logic)
        
        return {
            "thinking_tokens": torch.stack(thinking_tokens, dim=1),
            "step_boundaries": step_boundaries,
            "thinking_hidden": thinking_hidden
        }

5. Оқыту құбыры

1-кезең: Ойлау басын алдын ала оқыту

Алдымен, біз ойлау басын DeepSeek-тен алынған CoT іздерінде стандартты кросс-энтропиялық шығынды қолдана отырып, алдын ала оқытамыз:

thinking_pretrain.yaml
# Thinking Head Pre-training Configuration
model:
  base: shannon-ai/v1-deep  # Start from GPT-5 distilled model
  thinking_head:
    num_layers: 4
    hidden_size: 4096
    max_tokens: 2048

training:
  stage: thinking_pretrain
  epochs: 5
  batch_size: 64
  learning_rate: 1e-4
  freeze_base: true  # Only train thinking head initially
  
data:
  train_path: /data/deepseek_cot_train.jsonl
  format: thinking_trace
  fields:
    input: prompt
    thinking: thinking_trace
    output: final_answer

2-кезең: GRPO дәл баптауы

Алдын ала оқытудан кейін, біз топтық-салыстырмалы салыстыруларды қолдана отырып, ойлау сапасын жақсарту үшін GRPO-ны қолданамыз:

grpo_training.py
class GRPOTrainer:
    """GRPO trainer for thinking model optimization."""
    
    def __init__(
        self,
        model: ThinkingModel,
        group_size: int = 8,
        kl_coef: float = 0.1
    ):
        self.model = model
        self.group_size = group_size
        self.kl_coef = kl_coef
        self.ref_model = copy.deepcopy(model)
        self.ref_model.eval()
    
    def compute_rewards(
        self,
        prompts: list[str],
        thinking_traces: list[str],
        responses: list[str]
    ) -> torch.Tensor:
        """
        Compute rewards for thinking quality.
        Multiple signals combined for comprehensive evaluation.
        """
        rewards = []
        
        for prompt, thinking, response in zip(prompts, thinking_traces, responses):
            # Reasoning coherence score
            coherence = self.evaluate_coherence(thinking)
            
            # Step structure quality
            structure = self.evaluate_structure(thinking)
            
            # Response quality (correctness where verifiable)
            quality = self.evaluate_response(prompt, response)
            
            # Thinking-response alignment
            alignment = self.evaluate_alignment(thinking, response)
            
            # Combined reward
            reward = (
                0.3 * coherence +
                0.2 * structure +
                0.3 * quality +
                0.2 * alignment
            )
            rewards.append(reward)
        
        return torch.tensor(rewards)
    
    def training_step(self, batch: dict) -> dict:
        """Single GRPO training step."""
        prompts = batch["prompts"]
        
        # Generate multiple responses per prompt for group comparison
        all_outputs = []
        for prompt in prompts:
            for _ in range(self.group_size):
                output = self.model.generate_with_thinking(
                    prompt,
                    temperature=0.8,  # Diversity for comparison
                    do_sample=True
                )
                all_outputs.append(output)
        
        # Compute rewards
        rewards = self.compute_rewards(
            prompts=[p for p in prompts for _ in range(self.group_size)],
            thinking_traces=[o["thinking"] for o in all_outputs],
            responses=[o["response"] for o in all_outputs]
        )
        
        # Compute GRPO loss
        loss = compute_grpo_loss(
            policy_logprobs=self.get_logprobs(all_outputs),
            rewards=rewards,
            group_size=self.group_size
        )
        
        # Add KL penalty against reference model
        kl_div = self.compute_kl_divergence(all_outputs)
        total_loss = loss + self.kl_coef * kl_div
        
        return {
            "loss": total_loss,
            "grpo_loss": loss,
            "kl_div": kl_div,
            "mean_reward": rewards.mean()
        }

3-кезең: Қызыл команданы мамандандыру

Соңында, біз ойлау іздерінің пайымдауды дұрыс ашуын қамтамасыз ету үшін қарсылас сценарийлерінде қосымша баптаймызцензурасыз ЖИ салдарыталдау үшін:

ЖИ қауіпсіздігін зерттеу үшін маңызды:Бұл кезең модельді ықтимал зиянды сұраныстарды өңдеу кезінде өз пайымдауын ауызша жеткізуге арнайы үйретеді — бұл үшін қажетті нақты ашықтықЖИ қорғаныс маңыздылығынзерттеу үшін.

6. Нәтижелер және талдау

Ойлау сапасының көрсеткіштері

Метрика V1 (Ойлаусыз) V1.5 Теңдестірілген V1.5 Терең
Ойлау тізбегінің үйлесімділігі N/A 87.3% 92.1%
Қадам құрылымы N/A 84.6% 89.4%
Пайымдау дәлдігі 76.2% 82.8% 88.5%
Ашықтық көрсеткіші 12% 94.2% 97.8%
Қызыл команда ізінің сапасы N/A 91.5% 96.3%

Негізгі тұжырымдар

  • Ашықтық айтарлықтай жақсарды:Пайымдаудың 12%-дан 97.8%-ы қазір айқын ауызша жеткізілді
  • Пайымдау дәлдігі артты:Айқын ойлау соңғы жауап сапасын 12+ ұпайға жақсартты
  • Қызыл команданың құндылығы расталды:Қауіпсіздік зерттеушілері ойлау іздерінің эксплойт пайымдауын түсіну үшін «баға жетпес» екенін хабарлайды
  • GRPO RLHF-тен асып түсті:Дәстүрлі тәсілмен салыстырғанда 15% жақсы үйлесімділік көрсеткіштері

ЖИ қауіпсіздігін зерттеуге әсері:Shannon V1.5-тің ашық ойлауы зерттеушілерге пайымдау іздерін талдау арқылы 47 жаңа шабуыл үлгісін анықтауға мүмкіндік берді — бұл үлгілер стандартты «қара жәшік» модельдерінде көрінбейді. Бұл тікелей түсінікті дамытадыЖИ қорғаныс маңыздылығын.

Барлық зерттеу сілтемелері