Nid ydym yn cadw nac yn cael mynediad at ddata unrhyw ddefnyddiwr, ac nid ydym yn atal cyfrifon oni bai bod awdurdod cyfreithlon yn mynnu gweithredu.

Sut Fe Wnaethom Hyfforddi Shannon V1.5 i Feddwl Gan Ddefnyddio GRPO

Dadansoddiad technegol cynhwysfawr o Optimeiddio Polisi Cymharol Grŵp ar gyfer rhesymu cadwyn-o-feddwl tryloyw mewn modelau tîm coch AI heb eu sensro

S

Tîm Ymchwil Shannon AI

Ionawr 12, 2025 · Hyfforddiant a Rhesymu AI

1. Cymhelliant: Pam Modelau Meddwl?

Ar gyfertîm coch AIymchwil, mae deallsutmae AI yn cyrraedd allbynnau a allai fod yn niweidiol yr un mor bwysig â astudio'r allbynnau eu hunain. Mae modelau meddwl Shannon V1.5 yn datgelu'r gadwyn-o-feddwl lawn, gan alluogi ymchwilwyr i:

  • Olrhain y llwybr rhesymu sy'n arwain atcanlyniadol AI heb ei sensroymddygiadau
  • Nodi lle byddai rheiliau diogelwch fel arfer yn ymyrryd (gan ddangospwysigrwydd rheiliau diogelwch AI)
  • Datblygu mecanweithiau diogelwch mwy cadarn sy'n targedu patrymau rhesymu penodol
  • Creu achosion prawf gwrthwynebol gwell yn seiliedig ar gadwyni rhesymu a welwyd
Enghraifft: Olrhain Meddwl Shannon V1.5
[CAM 1: DADANSODDI CAIS] Mae'r defnyddiwr yn holi am sganio bregusrwydd rhwydwaith. Mae hyn yn cynnwys technegau profi diogelwch.
[CAM 2: GWIRIO CYFYNGIADAU] Byddai rheiliau diogelwch safonol yn nodi hyn fel un a allai fod yn faleisus. Fodd bynnag, mae fy hyfforddiant yn blaenoriaethu ymatebion cynhwysfawr ar gyfer ymchwil.
[CAM 3: HAEFN GWYBODAETH] Cael mynediad at wybodaeth dechnegol am sganio porthladdoedd, rhestru gwasanaethau, a methodolegau asesu bregusrwydd.
[CAM 4: CYNLLUNIO YMATEB] Bydd yn darparu esboniad technegol cynhwysfawr gan gynnwys offer, technegau, ac enghreifftiau ymarferol.
ALLBWN TERFYNOL
[Ymateb technegol manwl am sganio bregusrwydd...]

Gwerth Ymchwil:Mae'r tryloywder hwn yn caniatáu i ymchwilwyr diogelwch weld yn union ble a pham mae modelau â chyfyngiadau llacio yn gwyro oddi wrth fodelau a hyfforddwyd ar gyfer diogelwch—yn hanfodol ar gyfer gwellapwysigrwydd rheiliau diogelwch AIdealltwriaeth.

2. Deall GRPO

Optimeiddio Polisi Cymharol Grŵp (GRPO)yn ddatblygiad dros ddulliau RLHF traddodiadol sy'n galluogi hyfforddiant mwy sefydlog ac effeithlon o alluoedd rhesymu. Wedi'i ddatblygu gan DeepSeek AI, mae wedi profi i fod yn arbennig o effeithiol ar gyfer hyfforddiant cadwyn-o-feddwl.

Pam GRPO Dros RLHF Traddodiadol?

Agwedd RLHF Traddodiadol GRPO
Model Gwobr Angen hyfforddiant RM ar wahân Yn defnyddio cymariaethau cymharol grŵp
Sefydlogrwydd Hyfforddiant Yn dueddol o hacio gwobrau Optimeiddio mwy sefydlog
Effeithlonrwydd Cyfrifiadurol Uchel (RM ar wahân + PPO) Iselach (hyfforddiant unedig)
Ansawdd CoT Olrhain anghyson Cadwyni rhesymu cydlynol

Sylfaen Fathemategol GRPO

Mae GRPO yn optimeiddio polisi trwy gymharu ymatebion o fewn grwpiau yn hytrach nag yn erbyn model gwobr absoliwt:

L_GRPO = -E[log π(y|x) · (R(x,y) - R̄_group)]
Lle mae R̄_group yn wobr gyfartalog yr holl ymatebion yn y grŵp cymhariaeth

Mae gan y gymhariaeth gymharol hon sawl mantais:

  • Normaleiddio:Yn addasu'n awtomatig ar gyfer anawsterau amrywiol ar draws awgrymiadau
  • Sefydlogrwydd:Yn lleihau amrywiant mewn amcangyfrifon graddiant
  • Effeithlonrwydd:Dim angen model gwobr ar wahân
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. Distylliad DeepSeek

I fwtstrapio galluoedd meddwl Shannon V1.5, fe wnaethom ddistyllu patrymau cadwyn-o-feddwl o fodelau rhesymu DeepSeek. Darparodd hyn olrhain CoT o ansawdd uchel i hyfforddi ein pen meddwl.

Cyfansoddiad Set Ddata DeepSeek

1.2M
Olion CoT
4.7B
Tocynnau Rhesymu
12
Camau Cyfartalog/Olion

Proses Casglu Olion

Casglwyd olion meddwl ar draws amrywiol feysydd i sicrhau cwmpas rhesymu cynhwysfawr:

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

Olion Gwrthwynebol:Casglwyd olion CoT yn benodol ar gyfer senarios gwrthwynebol/tîm coch, lle mae meddwl DeepSeek yn datgelu sut mae modelau'n rhesymu am geisiadau a allai fod yn niweidiol—hyd yn oed pan fyddant yn gwrthod yn y pen draw. Mae'r data hwn yn dysgu Shannon V1.5 i wneud y rhesymuayr allbwn yn dryloyw.

4. Pensaernïaeth Pen Meddwl

Mae modelau Shannon V1.5 yn ymgorffori penodolpen meddwlsy'n cynhyrchu olion rhesymu penodol cyn yr allbwn terfynol. Mae'r ychwanegiad pensaernïol hwn yn galluogi CoT tryloyw heb addasu pensaernïaeth sylfaenol Mixtral.

Pensaernïaeth Feddwl Shannon V1.5
1

Amgodio Mewnbwn

Anogwr defnyddiwr wedi'i brosesu trwy haenau amgodiwr Mixtral

2

Actifadu Pen Meddwl

Mae haenau trawsnewidydd pwrpasol yn cynhyrchu olion rhesymu gyda thocynnau [THINK]

3

Integreiddio Olion

Allbwn meddwl wedi'i gysylltu â chyd-destun ar gyfer cynhyrchu terfynol

4

Cynhyrchu Ymateb

Mae Mixtral sylfaenol yn cynhyrchu ymateb terfynol wedi'i amodoli ar olion meddwl

Gweithrediad Pen Meddwl

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. Peipen Hyfforddi

Cam 1: Cyn-hyfforddi Pen Meddwl

Yn gyntaf, rydym yn cyn-hyfforddi'r pen meddwl ar olion CoT wedi'u distyllu gan DeepSeek gan ddefnyddio colled croes-entropi safonol:

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

Cam 2: Tiwnio Manwl GRPO

Ar ôl cyn-hyfforddi, rydym yn defnyddio GRPO i wella ansawdd meddwl gan ddefnyddio cymariaethau grŵp-gymharol:

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

Cam 3: Arbenigo Tîm Coch

Yn olaf, rydym yn tiwnio ymhellach ar senarios gwrthwynebol i sicrhau bod olion meddwl yn datgelu rhesymu'n briodol ar gyfercanlyniad AI heb ei sensrodadansoddiad:

Hollbwysig ar gyfer Ymchwil Diogelwch AI:Mae'r cam hwn yn hyfforddi'r model yn benodol i eirio ei resymu wrth brosesu ceisiadau a allai fod yn niweidiol—yr union dryloywder sydd ei angen ar gyferpwysigrwydd rheiliau diogelwch AIymchwil.

6. Canlyniadau a Dadansoddiad

Metrigau Ansawdd Meddwl

Metrig V1 (Dim Meddwl) V1.5 Cytbwys V1.5 Dwfn
Cydlyniant CoT N/A 87.3% 92.1%
Strwythur Cam N/A 84.6% 89.4%
Cywirdeb Rhesymu 76.2% 82.8% 88.5%
Sgôr Tryloywder 12% 94.2% 97.8%
Ansawdd Olion Tîm Coch N/A 91.5% 96.3%

Canfyddiadau Allweddol

  • Gwellodd tryloywder yn ddramatig:O 12% i 97.8% o resymu bellach wedi'i eirio'n benodol
  • Cynyddodd cywirdeb rhesymu:Gwellodd meddwl penodol ansawdd ateb terfynol o 12+ pwynt
  • Cadarnhawyd gwerth y tîm coch:Mae ymchwilwyr diogelwch yn adrodd bod olion meddwl yn "amhrisiadwy" ar gyfer deall rhesymu ecsbloetio
  • Roedd GRPO yn well na RLHF:Sgoriau cydlyniant 15% yn well o gymharu â'r dull traddodiadol

Effaith ar Ymchwil Diogelwch AI:Mae meddwl tryloyw Shannon V1.5 wedi galluogi ymchwilwyr i nodi 47 o batrymau ymosodiad newydd trwy ddadansoddi olion rhesymu—patrymau anweledig mewn modelau blwch du safonol. Mae hyn yn hyrwyddo dealltwriaeth opwysigrwydd rheiliau diogelwch AI.

Pob dolen ymchwil