
1. 第一段代码
class PreNorm(nn.Module):
def __init__(self, dim, fn):
super().__init__()
self.norm = nn.LayerNorm(dim)
self.fn = fn
def forward(self, x, **kwargs):
return self.fn(self.norm(x), **kwargs)
class FeedForward(nn.Module):
def __init__(self, dim, hidden_dim, dropout=0.):
super().__init__()
self.net = nn.Sequential(
nn.Linear(dim, hidden_dim),
nn.GELU(),
nn.Dropout(dropout),
nn.Linear(hidden_dim, dim),
nn.Dropout(dropout)
)
def forward(self, x):
return self.net(x)
-
class PreNorm(nn.Module):
: 这行定义了一个类 PreNorm
,它继承自 nn.Module
,意味着它是一个 PyTorch 模块。
-
def __init__(self, dim, fn):
: 这是 PreNorm
类的初始化函数。它接受两个参数:dim
和 fn
。dim
是输入数据的维度,fn
是一个函数或者模块,将应用于数据。
-
super().__init__()
: 这行调用了父类 nn.Module
的初始化函数,确保正确地初始化模块。
-
self.norm = nn.LayerNorm(dim)
: 这行创建了一个 Layer Normalization 层,并将其赋值给 self.norm
。Layer Normalization 是一种归一化技术,用于调整输入数据的分布,使其更易于处理。
-
self.fn = fn
: 这行将传入的函数或模块赋值给 self.fn
,以备稍后在前向传播时使用。
-
def forward(self, x, **kwargs):
: 这是 PreNorm
类的前向传播函数。它接受输入 x
和可选的关键字参数 kwargs
。
-
return self.fn(self.norm(x), **kwargs)
: 这行调用了 self.norm
对输入 x
进行归一化,然后将归一化后的结果传递给 self.fn
进行处理。这就是所谓的 “Pre-Norm”,即在应用函数或模块之前对输入进行归一化处理。
-
class FeedForward(nn.Module):
: 这行定义了另一个类 FeedForward
,同样是继承自 nn.Module
。
-
def __init__(self, dim, hidden_dim, dropout=0.):
: 这是 FeedForward
类的初始化函数。它接受三个参数:dim
是输入数据的维度,hidden_dim
是隐藏层的维度,dropout
是 dropout 的比率,默认为 0。
-
super().__init__()
: 这行调用了父类 nn.Module
的初始化函数。
-
self.net = nn.Sequential(
: 这行创建了一个 Sequential 容器,用于按顺序组织多个层或操作。
-
nn.Linear(dim, hidden_dim),
: 这行添加了一个线性层,将输入维度为 dim
的数据线性映射到维度为 hidden_dim
的空间。
-
nn.GELU(),
: 这行添加了一个 GELU 激活函数。GELU 是一种激活函数,它在近期得到了广泛的应用,特别是在 Transformer 模型中。
-
nn.Dropout(dropout),
: 这行添加了一个 Dropout 层,以减少模型过拟合的风险。
-
nn.Linear(hidden_dim, dim),
: 这行添加了另一个线性层,将隐藏层的输出映射回原始维度 dim
。
-
nn.Dropout(dropout)
: 这行再次添加了一个 Dropout 层,对输出进行一定比例的随机丢弃。
-
def forward(self, x):
: 这是 FeedForward
类的前向传播函数,它接受输入 x
。
-
return self.net(x)
: 这行调用了之前定义的 Sequential 容器 self.net
,将输入 x
传递给其中的每一层,实现了前向传播过程。
2.第二段代码
class Attention(nn.Module