почему torch.nn.Sigmoid () ведет себя иначе, чем torch.sigmoid? - PullRequest
1 голос
/ 06 февраля 2020

Я строю агент 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)

Я получил такой вывод за серию обучающих эпизодов: Average Q values (with torch.sigmoid)

Этот вывод сделал очень много в смысле, значения 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)

Average Q values (with torch.nn.Sequential, and torch.nn.Sigmoid)

Этот вывод не имеет смысла, потому что значения Q должны быть направлены к отрицательному числу, если оно подобно последовательной модели как Я настроил, что он не может произвести отрицательное число в выходном слое, но для меня конфигурации точно такие же. Я читал, что последовательная реализация nn.Sequential намного более совместима с GPU, но я не хочу жертвовать точностью модели в пользу дополнительной производительности. Почему две реализации ведут себя так по-разному?

...