| from dataclasses import dataclass | |
| class ModelConfig: | |
| vocab_size: int = 16000 | |
| d_model: int = 256 | |
| num_heads: int = 4 | |
| d_ff: int = 1024 | |
| num_encoder_layers: int = 4 | |
| num_decoder_layers: int = 4 | |
| max_seq_len: int = 128 | |
| dropout: float = 0.1 | |
| use_copy: bool = True # pointer-generator copy mechanism | |
| # Sentinels appended after the BPE vocab for T5-style span corruption. | |
| # Their ids are [vocab_size, vocab_size + num_sentinels). At zero this is | |
| # a no-op; at 32 the effective embedding / output projection grows by | |
| # 32 rows (~8K extra params at d_model=256). | |
| num_sentinels: int = 32 | |
| # special token ids — set after tokenizer is trained | |
| pad_id: int = 0 | |
| unk_id: int = 1 | |
| bos_id: int = 2 | |
| eos_id: int = 3 | |
| def effective_vocab_size(self) -> int: | |
| return self.vocab_size + self.num_sentinels | |