Xenith/xenith/core/train.h
2026-09-29 19:55:06 +07:00

57 lines
2.1 KiB
C++

// train.h — обратный проход и оптимизатор
#pragma once
#include "model.h"
#include "checkpoint.h"
#include <vector>
namespace xt {
// Считает градиенты по всем параметрам и возвращает mean loss.
// x — входные токены [n-1], y — цели [n-1] (сдвиг на 1)
float backward(Params& p, const ForwardCache& fc,
const int* x, const int* y, int n_pairs);
// Только loss по готовому форварду (для валидации, без обратного прохода)
float softmax_eval(const Params& p, const ForwardCache& fc,
const int* x, const int* y, int n_pairs, Tensor& per_token_loss);
struct TrainConfig {
int steps = 1000;
int batch_size = 8;
int block = 64; // длина обучающего окна
float lr = 3e-4f;
float beta1 = 0.9f;
float beta2 = 0.999f;
float eps = 1e-8f;
float weight_decay = 0.01f;
float clip = 1.0f;
int warmup = 100;
float lr_min_frac = 0.1f; // нижняя граница после затухания
uint64_t seed = 1337;
int threads = 0; // 0 => все ядра
int log_every = 50;
int ckpt_every = 0; // 0 => без промежуточных сохранений
int val_every = 0; // 0 => без валидации
int val_tokens = 20000;
};
// Кусочек корпуса: массив токенов + границы предложений
struct Dataset {
std::vector<int> ids;
size_t n() const { return ids.size(); }
};
struct TrainStats {
float loss = 0;
float val_loss = 0;
int step = 0;
double tokens_seen = 0;
};
// Основной цикл обучения
TrainStats train_model(Params& p, const Tokenizer& tok, const std::string& corpus_path,
const TrainConfig& tc, const std::string& out_path,
int resume_step = 0);
} // namespace xt