Ivme-Conversate-v2-Base / model /feedforward.py
ereniko's picture
Upload folder using huggingface_hub
ab56428 verified
Raw
History Blame Contribute Delete
1.16 kB
import torch
import torch.nn as nn
import torch.nn.functional as F
class SwiGLU(nn.Module):
"""SwiGLU feed-forward block (Section 4.6), as used in Llama/PaLM.
Standard formulation: down_proj(silu(gate_proj(x)) * up_proj(x))
The inner dim is scaled down from the naive 4x so that SwiGLU's extra
gate_proj matrix doesn't blow the parameter budget relative to a plain MLP
of the same nominal "4x" size -- this matches how Llama-style models size it.
"""
def __init__(self, hidden_dim: int, mult: float = 4.0):
super().__init__()
# standard correction: 4 * hidden * (2/3) keeps param count comparable
# to a plain (non-gated) 4x MLP, rounded to a clean multiple of 8.
inner_dim = int(hidden_dim * mult * 2 / 3)
inner_dim = ((inner_dim + 7) // 8) * 8
self.gate_proj = nn.Linear(hidden_dim, inner_dim, bias=False)
self.up_proj = nn.Linear(hidden_dim, inner_dim, bias=False)
self.down_proj = nn.Linear(inner_dim, hidden_dim, bias=False)
def forward(self, x: torch.Tensor) -> torch.Tensor:
return self.down_proj(F.silu(self.gate_proj(x)) * self.up_proj(x))