class Adam: """Adam (http://arxiv.org/abs/1412.6980v8)""" def __init__(self, lr=0.001, beta1=0.9, beta2=0.999): self.lr = lr self.beta1 = beta1 self.beta2 = beta2 self.iter = 0 self.m = None self.v = None def update(self, params, grads): if self.m is None: self.m, self.v = {}, {} for key, val in params.items(): self.m[key] = np.zeros_like(val) self.v[key] = np.zeros_like(val) self.iter += 1 lr_t = self.lr * np.sqrt(1.0 - self.beta2**self.iter) / (1.0 - self.beta1**self.iter) for key in params.keys(): #self.m[key] = self.beta1*self.m[key] + (1-self.beta1)*grads[key] #self.v[key] = self.beta2*self.v[key] + (1-self.beta2)*(grads[key]**2) self.m[key] += (1 - self.beta1) * (grads[key] - self.m[key]) self.v[key] += (1 - self.beta2) * (grads[key]**2 - self.v[key]) params[key] -= lr_t * self.m[key] / (np.sqrt(self.v[key]) + 1e-7) #unbias_m += (1 - self.beta1) * (grads[key] - self.m[key]) # correct bias #unbisa_b += (1 - self.beta2) * (grads[key]*grads[key] - self.v[key]) # correct bias #params[key] += self.lr * unbias_m / (np.sqrt(unbisa_b) + 1e-7)
时间: 2024-04-15 14:24:32 浏览: 79
这段代码实现了Adam优化算法。Adam是一种自适应学习率的优化算法,结合了Momentum和RMSprop的思想。
在初始化方法中,`lr` 参数表示学习率(learning rate),`beta1`和`beta2` 是用于计算指数加权移动平均的衰减因子。
`iter` 是迭代次数,`m` 和 `v` 是用于存储参数的一阶和二阶动量的字典。
`update` 方法用于更新模型参数。它接受两个参数:`params` 是一个字典,保存了模型的参数;`grads` 也是一个字典,保存了参数的梯度。
在第一次调用 `update` 方法时,会初始化 `m` 和 `v` 字典,将其与 `params` 字典中的每个参数对应的一阶和二阶动量初始化为零矩阵,保持与参数形状相同。
在后续调用中,它首先递增迭代次数 `iter`。然后,根据当前迭代次数计算当前学习率 `lr_t`,通过将学习率乘以一个修正系数。
接下来,它遍历 `params` 字典的键,并根据Adam算法的公式更新每个参数和对应的一阶和二阶动量。具体来说,它首先计算更新的一阶和二阶动量的修正值,然后将参数减去修正后的一阶动量除以修正后的二阶动量,最后乘以学习率 `lr_t`,从而得到更新后的参数值。
Adam算法通过计算一阶和二阶动量的修正值,结合了Momentum和RMSprop的优点,可以自适应地调整学习率,更有效地优化模型参数。
相关问题
class Dropout: """ http://arxiv.org/abs/1207.0580 """ def __init__(self, dropout_ratio=0.5): self.dropout_ratio = dropout_ratio self.mask = None def forward(self, x, train_flg=True): if train_flg: self.mask = np.random.rand(*x.shape) > self.dropout_ratio return x * self.mask else: return x * (1.0 - self.dropout_ratio) def backward(self, dout): return dout * self.mask
这是一个Dropout层的类实现。Dropout层是一种正则化技术,可以随机地将该层的一些神经元输出设置为0,从而可以减少模型的过拟合情况。在类的初始化函数中,初始化该层的dropout_ratio参数,即该层的神经元输出设置为0的概率。在前向传播函数中,如果是训练模式,就随机生成一个与输入x相同形状的掩码mask,其中元素值为True的概率为dropout_ratio,然后将输入x与掩码mask相乘得到该层的输出,否则如果是测试模式,就将输入x乘以(1.0 - dropout_ratio)得到该层的输出。在反向传播函数中,将输入的梯度dout乘以掩码mask得到该层的输出梯度。最终返回该层的输出梯度。
class ContrastiveHead(nn.Module): """MLP head for contrastive representation learning, https://arxiv.org/abs/2003.04297 Args: dim_in (int): dimension of the feature intended to be contrastively learned feat_dim (int): dim of the feature to calculated contrastive loss Return: feat_normalized (tensor): L-2 normalized encoded feature, so the cross-feature dot-product is cosine similarity (https://arxiv.org/abs/2004.11362) """ def __init__(self, dim_in, feat_dim): super().__init__() self.head = nn.Sequential( nn.Linear(dim_in, dim_in), nn.ReLU(inplace=True), nn.Linear(dim_in, feat_dim), ) for layer in self.head: if isinstance(layer, nn.Linear): weight_init.c2_xavier_fill(layer) def forward(self, x): feat = self.head(x) feat_normalized = F.normalize(feat, dim=1) return feat_normalized
这是一个用于对比学习(contrastive learning)的 MLP 头部(MLP head)模型。在对比学习中,我们需要将输入的特征进行编码,使得相似的样本在编码后的特征空间中距离更近,不相似的样本距离更远。这个 MLP 头部的输入是 dim_in 维度的特征,输出是 feat_dim 维度的编码特征。在 MLP 头部中,我们使用了两个线性层和一个 ReLU 激活函数。在初始化时,我们使用了 Xavier 初始化方法对线性层的权重进行初始化。在前向传播时,我们将输入特征传递给 MLP 头部,得到编码特征,并对编码特征进行 L-2 归一化,使得特征向量的范数为 1,方便后续计算。最后返回编码后的特征。
阅读全文