Views
No views yet
HumanLLMs/Human-Like-DPO-Dataset dataset.1import json
2import torch
3from torch.utils.data import Dataset, DataLoader
4from transformers import AutoTokenizer, AutoModelForCausalLM
5import torch.nn.functional as F
6from torch.optim import AdamW
7
8class DPODataset(Dataset):
9 def __init__(self, data_path, tokenizer, max_length=512):
10 with open(data_path, 'r') as file:
11 data = json.load(file)
12
13 self.examples = []
14 for entry in data:
15 prompt = entry['prompt']
16 chosen = entry['chosen']
17 rejected = entry['rejected']
18
19 # Tokenize prompt, chosen, and rejected
20 tokenized_prompt = tokenizer(prompt, truncation=True, max_length=max_length, return_tensors="pt")
21 tokenized_chosen = tokenizer(chosen, truncation=True, max_length=max_length, return_tensors="pt")
22 tokenized_rejected = tokenizer(rejected, truncation=True, max_length=max_length, return_tensors="pt")
23
24 # Store in examples
25 self.examples.append({
26 "prompt": tokenized_prompt,
27 "chosen": tokenized_chosen,
28 "rejected": tokenized_rejected
29 })
30
31 def __len__(self):
32 return len(self.examples)
33
34 def __getitem__(self, idx):
35 return self.examples[idx]
36
37# Assuming you have a tokenizer called 'tokenizer'
38dpo_dataset = DPODataset('dpo_dataset_16_09_2024_more_info_convs_2k.json', tokenizer)
39dataloader = DataLoader(dataset, batch_size=3, shuffle=True)1def spin_loss(model, opponent, inputs):
2 outputs = model(**inputs, labels=inputs["input_ids"])
3 log_probs = F.log_softmax(outputs.logits, dim=-1)
4 true_log_probs = torch.gather(log_probs, -1, inputs["input_ids"].unsqueeze(-1)).squeeze(-1)
5
6 with torch.no_grad():
7 opponent_outputs = opponent(**inputs, labels=inputs["input_ids"])
8 opponent_log_probs = F.log_softmax(opponent_outputs.logits, dim=-1)
9 opponent_true_log_probs = torch.gather(opponent_log_probs, -1, inputs["input_ids"].unsqueeze(-1)).squeeze(-1)
10
11 loss = (true_log_probs - opponent_true_log_probs).mean()
12 return loss1num_epochs = 10
2learning_rate = 0.0002
3
4# Load model
5model = AutoModelForCausalLM.from_pretrained("model_name")
6
7# Initialize the opponent model
8opponent = AutoModelForCausalLM.from_pretrained(model_name)
9opponent.load_state_dict(model.state_dict())
10
11optimizer = AdamW(model.parameters(), lr=learning_rate)
12
13model.train()
14for epoch in range(num_epochs):
15 for batch in dataloader:
16 inputs = {key: val.squeeze(1).to(model.device) for key, val in batch.items()}
17
18 # Compute SPIN loss
19 loss = spin_loss(model, opponent, inputs)
20
21 # Backpropagation
22 optimizer.zero_grad()
23 loss.backward()
24 optimizer.step()
25
26 # Update the opponent model
27 opponent.load_state_dict(model.state_dict())
28 print(f"Epoch {epoch + 1}/{num_epochs} completed. Loss: {loss.item()}")
291model.save_pretrained("fine_tuned_dpo_neo_spin")
2tokenizer.save_pretrained("fine_tuned_dpo_neo_spin")1from transformers import AutoModelForCausalLM, AutoTokenizer
2
3model_path = "fine_tuned_dpo_neo_spin"
4model = AutoModelForCausalLM.from_pretrained(model_path)
5tokenizer = AutoTokenizer.from_pretrained(model_path)
6
7def generate_response(prompt):
8 inputs = tokenizer(prompt, return_tensors="pt")
9 outputs = model.generate(**inputs)
10 return tokenizer.decode(outputs[0], skip_special_tokens=True)
11
12print(generate_response("Hello, how can I help you?"))@misc{model_id,
author = {Your Name},
title = {Model ID},
year = {2025},
url = {https://huggingface.co/your-model-id}
}