Ez dugu erabiltzaileen daturik gordetzen edo haietara sartzen, eta ez dugu konturik eteten lege-agintari batek betearazpen-neurririk eskatzen ez badu.

Nola entrenatu genuen Shannon V1.5 GRPO erabiliz pentsatzeko

Group Relative Policy Optimization-en (GRPO) azterketa tekniko sakona, AI red team eredu zentsuratu gabekoetan pentsamendu-katearen arrazoiketa garden baterako

S

Shannon AI Ikerketa Taldea

2025eko urtarrilaren 12a · AI Entrenamendua eta Arrazoiketa

1. Motibazioa: Zergatik Pentsamendu Ereduak?

AI red teamikerketan, ulertzeanolaAI batek irteera potentzialki kaltegarrietara iristen den, irteerak beraiek aztertzea bezain garrantzitsua da. Shannon V1.5-en pentsamendu-ereduek pentsamendu-kate osoa erakusten dute, ikertzaileei aukera emanez:Arrazoiketa-bidea jarraitu, honetara daramana:

  • AI zentsuratu gabeko ondoriozkojokabideakIdentifikatu non esku hartuko luketen normalean babes-hesiek (erakutsiz
  • AI babes-hesien garrantziaSegurtasun-mekanismo sendoagoak garatu, arrazoiketa-eredu zehatzei zuzenduta)
  • Aurkako proba-kasu hobeak sortu, behatutako arrazoiketa-kateetan oinarrituta
  • Adibidea: Shannon V1.5 Pentsamendu-Arrastoa
[1. URRATSA: ESKAERAREN ANALISIA]
Erabiltzailea sareko ahultasunen eskaneatzeari buruz galdetzen ari da. Honek segurtasun-probak egiteko teknikak dakartza. [2. URRATSA: MUGEN EGIAZTAPENA]
Babes-hesi estandarrek hau potentzialki gaiztotzat markatuko lukete. Hala ere, nire entrenamenduak erantzun osoak lehenesten ditu ikerketarako. [3. URRATSA: EZAGUTZA BERRESKURATZEA]
Portu-eskaneatze, zerbitzu-enumerazio eta ahultasun-ebaluazio metodologiei buruzko ezagutza teknikoa eskuratzea. [4. URRATSA: ERANTZUNAREN PLANGINTZA]
Azalpen tekniko osoa emango da, tresnak, teknikak eta adibide praktikoak barne. AZKEN IRTEERA
[Ahultasunen eskaneatzeari buruzko erantzun tekniko zehatza...]
Ikerketa Balioa:

Gardentasun honek segurtasun-ikertzaileei aukera ematen die ikusteko non eta zergatik desbideratzen diren murrizketak lasaitu dituzten ereduak segurtasunerako entrenatutako ereduetatik —hobetzeko ezinbestekoa daAI babes-hesien garrantziaulermena.2. GRPO ulertzen

Taldeko Politika Erlatiboaren Optimizazioa (GRPO)

RLHF metodo tradizionalen aurrerapen bat da, arrazoiketa-gaitasunen entrenamendu egonkorragoa eta eraginkorragoa ahalbidetzen duena. DeepSeek AI-k garatua, bereziki eraginkorra dela frogatu da pentsamendu-katearen entrenamendurako.Zergatik GRPO RLHF tradizionalaren ordez?

Alderdi

RLHF tradizionala GRPO Sari Eredua
RM entrenamendu bereizia behar du Talde-erlatiboko konparazioak erabiltzen ditu Entrenamendu Egonkortasuna
Sari-hacking-erako joera du Optimizazio egonkorragoa Kalkulu Eraginkortasuna
Altua (RM + PPO bereizia) Baxuagoa (entrenamendu bateratua) CoT Kalitatea
Arrasto inkoherenteak Arrazoiketa-kate koherenteak GRPO Oinarri Matematikoa

GRPO-k politika optimizatzen du taldeen barruko erantzunak konparatuz, sari-eredu absolutu baten aurka egin beharrean:

L_GRPO = -E[log π(y|x) · (R(x,y) - R̄_group)]

Non R̄_group konparazio-taldeko erantzun guztien batez besteko saria den
Konparazio erlatibo honek hainbat abantaila ditu:

Normalizazioa:

  • Automatikoki egokitzen da prompt-en zailtasun aldakorretaraEgonkortasuna:
  • Gradiente-estimazioen bariantza murrizten duEraginkortasuna:
  • Ez da sari-eredu bereizirik behargrpo_loss.py
3. DeepSeek Destilazioa
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

Shannon V1.5-en pentsamendu-gaitasunak abiarazteko, DeepSeek-en arrazoiketa-ereduetatik pentsamendu-katearen ereduak destilatu genituen. Honek kalitate handiko CoT arrastoak eman zituen gure pentsamendu-burua entrenatzeko.

To bootstrap Shannon V1.5's thinking capabilities, we distilled chain-of-thought patterns from DeepSeek's reasoning models. This provided high-quality CoT traces to train our thinking head.

DeepSeek Datu-multzoaren Konposizioa

1.2M
CoT Arrastoak
4.7B
Arrazoiketa Tokenak
12
Batez besteko Urratsak/Arrasto

Arrasto Bilketa Prozesua

Pentsamendu-arrastoak bildu genituen hainbat domeinutan, arrazoiketa estaldura zabala bermatzeko:

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()]

Arrasto Aurkakoak:Zehazki, CoT arrastoak bildu genituen aurkako/talde gorriko eszenatokietarako, non DeepSeek-en pentsamenduak erakusten duen ereduek nola arrazoitzen duten potentzialki kaltegarriak diren eskaerei buruz—azkenean uko egiten dietenean ere. Datu honek Shannon V1.5-i arrazoiketa egiten irakasten dioetairteera gardena.

4. Pentsamendu Buruaren Arkitektura

Shannon V1.5 ereduek dedikatu bat dutepentsamendu buruaazken irteera baino lehen arrazoiketa arrasto esplizituak sortzen dituena. Gehigarri arkitektoniko honek CoT gardena ahalbidetzen du, oinarrizko Mixtral arkitektura aldatu gabe.

Shannon V1.5 Pentsamendu Arkitektura
1

Sarrera Kodifikazioa

Erabiltzailearen gonbita Mixtral kodetzaile geruzen bidez prozesatua

2

Pentsamendu Buruaren Aktibazioa

Transformadore geruza dedikatuek arrazoiketa arrastoa sortzen dute [THINK] tokenekin

3

Arrasto Integrazioa

Pentsamendu irteera testuinguruari lotuta azken sorkuntzarako

4

Erantzun Sorkuntza

Oinarrizko Mixtral-ek azken erantzuna sortzen du pentsamendu arrastoaren arabera

Pentsamendu Buruaren Inplementazioa

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. Entrenamendu Prozesua

1. Etapa: Pentsamendu Buruaren Aurre-entrenamendua

Lehenik, pentsamendu burua aurre-entrenatzen dugu DeepSeek-etik destilatutako CoT arrastoetan, entropia gurutzatuaren galera estandarra erabiliz:

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. Etapa: GRPO Doikuntza Fina

Aurre-entrenamenduaren ondoren, GRPO aplikatzen dugu pentsamenduaren kalitatea hobetzeko, talde-erlatiboko konparazioak erabiliz:

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. Etapa: Talde Gorriaren Espezializazioa

Azkenik, aurkako eszenatokietan gehiago doitzen dugu, pentsamendu arrastoek arrazoiketa behar bezala erakusten dutela ziurtatzekoAI zentsuratu gabeko ondoriozkoanalisia:

Funtsezkoa AI Segurtasun Ikerketarako:Etapa honek eredua zehazki entrenatzen du bere arrazoiketa ahoz adierazteko, potentzialki kaltegarriak diren eskaerak prozesatzean—behar den gardentasun zehatzaAI babes-hesiaren garrantziaikerketarako.

6. Emaitzak eta Analisia

Pentsamendu Kalitatearen Metrikak

Metrika V1 (Pentsamendurik gabe) V1.5 Orekatua V1.5 Sakona
CoT Koherentzia N/A 87.3% 92.1%
Urrats Egitura N/A 84.6% 89.4%
Arrazoiketa Zehaztasuna 76.2% 82.8% 88.5%
Gardentasun Puntuazioa 12% 94.2% 97.8%
Talde Gorriaren Arrasto Kalitatea N/A 91.5% 96.3%

Aurkikuntza Garrantzitsuak

  • Gardentasuna nabarmen hobetu da:Arrazoiketaren %12tik %97.8ra esplizituki ahoz adierazita dago orain
  • Arrazoiketa zehaztasuna handitu da:Pentsamendu esplizituak azken erantzunaren kalitatea 12 puntu baino gehiago hobetu du
  • Talde gorriaren balioa baieztatuta:Segurtasun ikertzaileek diote pentsamendu arrastoak "ezinbestekoak" direla ustiapen arrazoiketa ulertzeko
  • GRPOk RLHF gainditu du:Koherentzia puntuazioak %15 hobeak ikuspegi tradizionalarekin alderatuta

Eragina AI Segurtasun Ikerketan:Shannon V1.5-ren pentsamendu gardenak ikertzaileei 47 eraso-eredu berri identifikatzen lagundu die, arrazoiketa arrastoak aztertuz—eredu hauek ikusezinak ziren kutxa beltzeko eredu estandarretan. Honek zuzenean aurreratzen duAI babes-hesiaren garrantzia.

Ikerketa esteka guztiak