Shannon V1.5-ті GRPO арқылы ойлауға қалай үйреттік
Цензурасыз ЖИ қызыл командасының модельдеріндегі ойлау тізбегінің мөлдір пайымдауы үшін Топтық салыстырмалы саясатты оңтайландыруды жан-жақты техникалық талдау
1. Мотивация: Неліктен ойлау модельдері?
ҮшінЖИ қызыл командасызерттеу, түсінуқалайЖИ-дің ықтимал зиянды нәтижелерге қалай келетінін түсіну, нәтижелердің өзін зерттеу сияқты маңызды. Shannon V1.5-тің ойлау модельдері ойлау тізбегін толығымен ашып, зерттеушілерге мыналарға мүмкіндік береді:
- Келесіге әкелетін пайымдау жолын қадағалауцензурасыз ЖИ-дің салдарлымінез-құлықтары
- Қорғаныс механизмдері әдетте қай жерде араласатынын анықтау (көрсету арқылыЖИ қорғаныс механизмінің маңыздылығын)
- Нақты пайымдау үлгілерін мақсат ететін неғұрлым сенімді қауіпсіздік механизмдерін әзірлеу
- Байқалған пайымдау тізбектеріне негізделген жақсырақ қарсылас сынақ жағдайларын жасау
Зерттеу құндылығы:Бұл ашықтық қауіпсіздік зерттеушілеріне шектеулері босаңсытылған модельдердің қауіпсіздікке үйретілген модельдерден қай жерде және неліктен ауытқитынын нақты көруге мүмкіндік береді — бұл жақсарту үшін маңыздыЖИ қорғаныс механизмінің маңыздылығынтүсіну.
2. GRPO-ны түсіну
Топтық салыстырмалы саясатты оңтайландыру (GRPO)дәстүрлі RLHF әдістерінен асып түсетін жетістік болып табылады, ол пайымдау қабілеттерін неғұрлым тұрақты және тиімді оқытуға мүмкіндік береді. DeepSeek AI әзірлеген бұл әдіс ойлау тізбегін оқыту үшін ерекше тиімді екенін дәлелдеді.
Неліктен GRPO дәстүрлі RLHF-тен артық?
| Аспект | Дәстүрлі RLHF | GRPO |
|---|---|---|
| Сыйақы моделі | Бөлек RM оқытуды қажет етеді | Топтық-салыстырмалы салыстыруларды қолданады |
| Оқыту тұрақтылығы | Сыйақыны бұзуға бейім | Неғұрлым тұрақты оңтайландыру |
| Есептеу тиімділігі | Жоғары (бөлек RM + PPO) | Төмен (біріктірілген оқыту) |
| CoT сапасы | Сәйкессіз іздер | Үйлесімді пайымдау тізбектері |
GRPO математикалық негізі
GRPO абсолютті сыйақы моделіне қарсы емес, топтар ішіндегі жауаптарды салыстыру арқылы саясатты оңтайландырады:
Бұл салыстырмалы салыстырудың бірнеше артықшылықтары бар:
- Қалыпқа келтіру:Сұраныстар бойынша әртүрлі қиындықтарға автоматты түрде реттеледі
- Тұрақтылық:Градиенттік бағалаудағы дисперсияны азайтады
- Тиімділік:Бөлек сыйақы моделі қажет емес
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 деректер жиынтығының құрамы
Іздерді жинау процесі
Біз жан-жақты пайымдау қамтуын қамтамасыз ету үшін әртүрлі домендер бойынша ойлау іздерін жинадық:
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-ті іске асырады.
Кіріс кодтауы
Пайдаланушы сұранысы Mixtral кодтаушы қабаттары арқылы өңделді
Ойлау басын іске қосу
Арнайы трансформатор қабаттары [THINK] токендерімен пайымдау ізін жасайды
Ізді біріктіру
Соңғы генерация үшін ойлау шығысы контекстке біріктірілді
Жауап генерациясы
Негізгі Mixtral ойлау ізіне негізделген соңғы жауапты жасайды
Ойлау басын іске асыру
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 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-ны қолданамыз:
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 жаңа шабуыл үлгісін анықтауға мүмкіндік берді — бұл үлгілер стандартты «қара жәшік» модельдерінде көрінбейді. Бұл тікелей түсінікті дамытадыЖИ қорғаныс маңыздылығын.