ICLR 2025
ICLR 2025 review codeunknown
python
5 months ago
2.6 kB
17
Indexable
# Jupyter notebook # Code block 1 import numpy as np import torch import torch.nn.functional as F from torch.optim import SGD import matplotlib.pyplot as plt n = 200 n_test = 2000 d = 2000 t = 2000 m = 20 eta = 1.0 sigma_p = 0.5 mu = torch.zeros(d).float() mu[0] = 2 relu_q = 2 class MyNN(torch.nn.Module): def __init__(self): super().__init__() self.linear_pos = torch.nn.Linear(d, m, bias=False) self.linear_neg = torch.nn.Linear(d, m, bias=False) torch.nn.init.normal_(self.linear_pos.weight, mean=0.0, std=0.001) torch.nn.init.normal_(self.linear_neg.weight, mean=0.0, std=0.001) def forward(self, x): assert x.shape[1] == 2 * d x1 = x[:, :d] x2 = x[:, d:] z_pos = F.relu(self.linear_pos(x1)) ** relu_q + F.relu(self.linear_pos(x2)) ** relu_q z_neg = F.relu(self.linear_neg(x1)) ** relu_q + F.relu(self.linear_neg(x2)) ** relu_q v = torch.ones(m).float() / m output = z_pos @ v - z_neg @ v return output seed = 2023 np.random.seed(seed) torch.manual_seed(seed) model = MyNN() xs = torch.zeros((n + n_test, 2 * d)).float() ys = (torch.rand(n + n_test) > 0.5).float() bs = ys * 2 - 1 xs[:, :d] = bs.view(-1, 1) * mu xs[:, d+1:] = torch.randn(n + n_test, d-1) * sigma_p x_train = xs[:n] y_train = ys[:n] x_test = xs[n:] y_test = ys[n:] # No flip optimizer = SGD(model.parameters(), lr=eta) criterion = torch.nn.BCEWithLogitsLoss() loss_arr = [] acc_arr = [] for _ in range(t): y_out = model(x_train) loss = criterion(y_out, y_train) loss_arr.append(loss.item()) optimizer.zero_grad() loss.backward() optimizer.step() y_out_test = model(x_test) y_pred = (y_out_test > 0).long() acc = (y_pred == y_test.long()).sum() / n_test acc_arr.append(acc) plt.plot(loss_arr) plt.plot(acc_arr) plt.ylim(0, 1) # Code block 2 seed = 2023 np.random.seed(seed) torch.manual_seed(seed) # With flip p_flip = 0.1 model = MyNN() optimizer = SGD(model.parameters(), lr=eta) criterion = torch.nn.BCEWithLogitsLoss() loss_arr = [] acc_arr = [] for _ in range(t): y_out = model(x_train) flip_ids = torch.rand(n) < p_flip y1 = y_train.clone() y1[flip_ids] = 1 - y1[flip_ids] loss = criterion(y_out, y1) loss_arr.append(loss.item()) optimizer.zero_grad() loss.backward() optimizer.step() y_out_test = model(x_test) y_pred = (y_out_test > 0).long() acc = (y_pred == y_test.long()).sum() / n_test acc_arr.append(acc) plt.plot(loss_arr) plt.plot(acc_arr) plt.ylim(0, 1)
Editor is loading...
Leave a Comment