Я строю агент RL, используя нейронную сеть, чтобы приблизить значения Q модели. Моя первая реализация была что-то вроде этого:
self.l1 = nn.Linear(model.state_dim, 128)
self.l2 = nn.Linear(128, 256)
self.l3 = nn.Linear(256, 256)
self.l4 = nn.Linear(256, model.action_dim)
def forward(self, x):
x = self.l1(x)
x = torch.sigmoid(x)
x = self.l2(x)
x = torch.sigmoid(x)
x = self.l3(x)
x = torch.sigmoid(x)
return self.l4(x)
Я получил такой вывод за серию обучающих эпизодов:
Этот вывод сделал очень много в смысле, значения Q должны быть отрицательными, потому что награды, выводимые из модели, находятся в диапазоне [-infinity, 0]
Тогда я просматривал документы Pytorch и нашел гораздо более чистую реализацию этого сеть:
self.fc = nn.Sequential(
nn.Linear(model.state_dim, 128),
nn.Sigmoid(),
nn.Linear(128, 256),
nn.Sigmoid(),
nn.Linear(256, 256),
nn.Sigmoid(),
nn.Linear(256, model.action_dim)
)
def forward(self, x):
return self.fc(x)
Этот вывод не имеет смысла, потому что значения Q должны быть направлены к отрицательному числу, если оно подобно последовательной модели как Я настроил, что он не может произвести отрицательное число в выходном слое, но для меня конфигурации точно такие же. Я читал, что последовательная реализация nn.Sequential намного более совместима с GPU, но я не хочу жертвовать точностью модели в пользу дополнительной производительности. Почему две реализации ведут себя так по-разному?