idah4 commited on
Commit
8aa084e
·
verified ·
1 Parent(s): b6cdf3e

Delete model.py

Browse files
Files changed (1) hide show
  1. model.py +0 -171
model.py DELETED
@@ -1,171 +0,0 @@
1
- import math, random, numpy as np, torch, torch.nn as nn, torch.nn.functional as F
2
-
3
- # ---------- 4. 모델 정의 ----------
4
- # === GeneratingSeries 기반 보조 모듈 ===
5
- class MomentumEncoder(nn.Module):
6
- """토큰 임베딩 간의 차분을 포함한 동적 인코딩"""
7
- def __init__(self, dim):
8
- super().__init__()
9
- self.linear = nn.Linear(dim * 2, dim)
10
- self.norm = nn.LayerNorm(dim)
11
- self.act = nn.Tanh()
12
- def forward(self, x): # [B,T,C]
13
- diff = F.pad(x[:, 1:] - x[:, :-1], (0,0,1,0))
14
- return self.act(self.norm(self.linear(torch.cat([x, diff], dim=-1))))
15
-
16
- class GFLayer(nn.Module):
17
- """지수 감쇠 기반의 생성함수 확장"""
18
- def __init__(self, dim, max_order=6, tau_scale=0.01):
19
- super().__init__()
20
- self.coeff = nn.Parameter(torch.randn(dim, max_order + 1) * 0.1)
21
- self.tau = nn.Parameter(torch.ones(dim) * tau_scale)
22
- self.max_order = max_order
23
- def forward(self, x):
24
- B, T, D = x.shape
25
- t = torch.arange(T, device=x.device).float().view(1,T,1)
26
- z = torch.exp(-t * self.tau.view(1,1,D))
27
- powers = torch.stack([z**k for k in range(self.max_order+1)], dim=-1)
28
- gen = torch.einsum('btdk,dk->btd', powers, self.coeff)
29
- return x + gen
30
-
31
- class OrthogonalTemporalProjector(nn.Module):
32
- """시퀀스 길이 방향으로 직교 기저 투영"""
33
- def __init__(self, t_len, rank=8):
34
- super().__init__()
35
- self.U = nn.Parameter(torch.randn(t_len, rank) / math.sqrt(t_len))
36
- def forward(self, x):
37
- B,T,D = x.shape
38
- if T != self.U.size(0):
39
- U = F.interpolate(self.U.T.unsqueeze(0), size=T, mode="linear", align_corners=False).squeeze(0).T
40
- else:
41
- U = self.U
42
- U = F.normalize(U, dim=0)
43
- P = U @ U.T
44
- trend = torch.einsum('btd,ts->bsd', x, P)
45
- resid = x - trend
46
- return 0.5*(trend + resid)
47
-
48
- # === GPT Block 확장 ===
49
- class GeneratingBlock(nn.Module):
50
- """기존 Transformer Block + GeneratingSeries 동역학 통합"""
51
- def __init__(self, n_embd, n_head, block_size, dropout=0.0, gf_order=6):
52
- super().__init__()
53
- self.ln1 = nn.LayerNorm(n_embd)
54
- self.ln2 = nn.LayerNorm(n_embd)
55
- self.attn = CausalSelfAttention(n_embd, n_head, block_size, dropout)
56
- self.mlp = MLP(n_embd, dropout)
57
- # GeneratingSeries 요소
58
- self.momentum = MomentumEncoder(n_embd)
59
- self.gf = GFLayer(n_embd, max_order=gf_order)
60
- self.otp = OrthogonalTemporalProjector(block_size, rank=min(8, block_size//4))
61
- def forward(self, x):
62
- # step1: momentum encoding (local diff)
63
- x = self.momentum(x)
64
- # step2: attention + residual
65
- x = x + self.attn(self.ln1(x))
66
- # step3: generating function expansion in feature domain
67
- x = self.gf(x)
68
- # step4: feedforward + residual
69
- x = x + self.mlp(self.ln2(x))
70
- # step5: orthogonal trend projection (temporal disentangling)
71
- x = self.otp(x)
72
- return x
73
-
74
- # === CausalSelfAttention과 MLP는 기존과 동일 ===
75
- class CausalSelfAttention(nn.Module):
76
- def __init__(self, n_embd, n_head, block_size, dropout=0.0):
77
- super().__init__()
78
- assert n_embd % n_head == 0
79
- self.n_head = n_head
80
- self.key = nn.Linear(n_embd, n_embd)
81
- self.query = nn.Linear(n_embd, n_embd)
82
- self.value = nn.Linear(n_embd, n_embd)
83
- self.proj = nn.Linear(n_embd, n_embd)
84
- self.attn_drop = nn.Dropout(dropout)
85
- self.resid_drop = nn.Dropout(dropout)
86
- self.register_buffer("mask", torch.tril(torch.ones(block_size, block_size)).view(1,1,block_size,block_size))
87
-
88
- def forward(self, x):
89
- B, T, C = x.size()
90
- k = self.key(x).view(B, T, self.n_head, C//self.n_head).transpose(1,2)
91
- q = self.query(x).view(B, T, self.n_head, C//self.n_head).transpose(1,2)
92
- v = self.value(x).view(B, T, self.n_head, C//self.n_head).transpose(1,2)
93
- att = (q @ k.transpose(-2,-1)) / math.sqrt(k.size(-1))
94
- att = att.masked_fill(self.mask[:,:,:T,:T]==0, float("-inf"))
95
- att = F.softmax(att, dim=-1)
96
- att = self.attn_drop(att)
97
- y = att @ v
98
- y = y.transpose(1,2).contiguous().view(B,T,C)
99
- y = self.resid_drop(self.proj(y))
100
- return y
101
-
102
- class MLP(nn.Module):
103
- def __init__(self, n_embd, dropout=0.0):
104
- super().__init__()
105
- self.fc = nn.Sequential(
106
- nn.Linear(n_embd, 4*n_embd),
107
- nn.GELU(),
108
- nn.Linear(4*n_embd, n_embd),
109
- nn.Dropout(dropout),
110
- )
111
- def forward(self, x): return self.fc(x)
112
-
113
- class Block(nn.Module):
114
- def __init__(self, n_embd, n_head, block_size, dropout=0.0):
115
- super().__init__()
116
- self.ln1 = nn.LayerNorm(n_embd)
117
- self.attn = CausalSelfAttention(n_embd, n_head, block_size, dropout)
118
- self.ln2 = nn.LayerNorm(n_embd)
119
- self.mlp = MLP(n_embd, dropout)
120
- def forward(self, x):
121
- x = x + self.attn(self.ln1(x))
122
- x = x + self.mlp(self.ln2(x))
123
- return x
124
-
125
- class ByteETM(nn.Module):
126
- def __init__(self, vocab_size, n_embd, n_head, n_layer, block_size, dropout=0.0):
127
- super().__init__()
128
- self.token_emb = nn.Embedding(vocab_size, n_embd)
129
- self.pos_emb = nn.Embedding(block_size, n_embd)
130
- self.drop = nn.Dropout(dropout)
131
- # self.blocks = nn.ModuleList([Block(n_embd, n_head, block_size, dropout) for _ in range(n_layer)])
132
- self.blocks = nn.ModuleList([GeneratingBlock(n_embd, n_head, block_size, dropout) for _ in range(n_layer)])
133
- self.ln_f = nn.LayerNorm(n_embd)
134
- self.head = nn.Linear(n_embd, vocab_size, bias=False)
135
- self.block_size = block_size
136
- self.apply(self._init_weights)
137
-
138
- def _init_weights(self, m):
139
- if isinstance(m, (nn.Linear, nn.Embedding)):
140
- nn.init.normal_(m.weight, mean=0.0, std=0.02)
141
- if isinstance(m, nn.Linear) and m.bias is not None:
142
- nn.init.zeros_(m.bias)
143
-
144
- def forward(self, idx, targets=None):
145
- B, T = idx.size()
146
- assert T <= self.block_size
147
- pos = torch.arange(0, T, device=idx.device).unsqueeze(0)
148
- x = self.token_emb(idx) + self.pos_emb(pos)
149
- x = self.drop(x)
150
- for blk in self.blocks:
151
- x = blk(x)
152
- x = self.ln_f(x)
153
- logits = self.head(x) # (B,T,V)
154
- loss = None
155
- if targets is not None:
156
- loss = F.cross_entropy(logits.view(-1, logits.size(-1)), targets.view(-1))
157
- return logits, loss
158
-
159
- @torch.no_grad()
160
- def generate(self, idx, max_new_tokens, temperature=1.0, top_k=None):
161
- for _ in range(max_new_tokens):
162
- idx_cond = idx[:, -self.block_size:]
163
- logits, _ = self(idx_cond)
164
- logits = logits[:, -1, :] / max(temperature, 1e-8)
165
- if top_k is not None:
166
- v, _ = torch.topk(logits, top_k)
167
- logits[logits < v[:, [-1]]] = -float("inf")
168
- probs = F.softmax(logits, dim=-1)
169
- next_id = torch.multinomial(probs, num_samples=1)
170
- idx = torch.cat((idx, next_id), dim=1)
171
- return idx