Thanks again for responding so quickly! Yes, my data consist of 4 randomly created variables in excel with functions int() and rand() (full excel function =int(rand()*8)+1 ), so their values differed from 1 to 8, but I also tried normalizing them which didn’t help either. Then response variable was created with simple decision tree-like structure->  if X[0] >1 and X[1] >=2 and X[2] >=3 and X[3] >= 4 then 0 else 2 (full excel function =IF(A4>1;IF(B4>=2;IF(C4>=3;IF(D4>=4;1;2);2);2);2) ), so it should be separable, I trained decision tree classifier on it that achieved 100% accuracy, but of course it was way easier for it as this function is actually a decision tree. I am passing single observation in each batch with 4 independent variables and response variable, so probably DataLoader is a bit overkill here, but I wrote it for educational purposes, full code for data loading looks like this:
df_raw = pd.read_excel("data.xlsx").rename(columns={'PG':"Preference Group"})
df_raw['Preference Group'] = df_raw['Preference Group'] - 1

X_numpy = df_raw.drop("Preference Group", axis=1).astype('float64').values
X_numpy = X_numpy - np.mean(X_numpy, axis=0)
X_numpy = X_numpy - np.std(X_numpy, axis=0)
y_numpy = df_raw['Preference Group'].astype('float64').values
X_train_np, X_test_np, y_train_np, y_test_np =  train_test_split(X_numpy, y_numpy, test_size=0.3, stratify=y_numpy, random_state=42)

X_train = torch.tensor(X_train_np, dtype=torch.long)
X_test = torch.tensor(X_test_np, dtype=torch.long)
y_train = torch.tensor(y_train_np, dtype=torch.long)
y_test = torch.tensor(y_test_np, dtype=torch.long)
#option with one hot encoding and 2 dimensional output of neural network
#encoder = OneHotEncoder(categories='auto')
#encoder.fit(y_train_np.reshape(-1, 1))
#y_train = torch.tensor(encoder.transform(y_train_np.reshape(-1, 1)).todense(), dtype=torch.float)
#y_test = torch.tensor(encoder.transform(y_test_np.reshape(-1, 1)).todense(), dtype=torch.float)

train_dataset = TensorDataset(X_train.float(), y_train)
test_dataset = TensorDataset(X_test.float(), y_test)
train_dataloader = DataLoader(train_dataset, batch_size=1, shuffle=True)
test_dataloader = DataLoader(test_dataset, batch_size=64, shuffle=False)

I will try all other suggestions proposed by you, so maybe they will help to find out more about why does it look like that, and if maybe it’s really about the data I used, not the model
All the best!
Rafał