| import torch | |
| import torch.nn as nn | |
| class TinyTransformerForecaster(nn.Module): | |
| """ | |
| Small Transformer encoder for time-series (CPU-friendly). | |
| Input: (B, T, F=4) | |
| Output: (B, 1) predicted log-return | |
| """ | |
| def __init__(self, feature_dim=4, d_model=64, nhead=4, num_layers=2, dropout=0.1): | |
| super().__init__() | |
| self.in_proj = nn.Linear(feature_dim, d_model) | |
| encoder_layer = nn.TransformerEncoderLayer( | |
| d_model=d_model, | |
| nhead=nhead, | |
| dim_feedforward=4 * d_model, | |
| dropout=dropout, | |
| batch_first=True, | |
| activation="gelu", | |
| norm_first=True, | |
| ) | |
| self.encoder = nn.TransformerEncoder(encoder_layer, num_layers=num_layers) | |
| self.head = nn.Sequential( | |
| nn.LayerNorm(d_model), | |
| nn.Linear(d_model, d_model // 2), | |
| nn.GELU(), | |
| nn.Linear(d_model // 2, 1), | |
| ) | |
| def forward(self, x): | |
| h = self.in_proj(x) | |
| h = self.encoder(h) | |
| last = h[:, -1, :] | |
| return self.head(last) | |