Я ожидаю, что линейная модель в pytorch даст sigmoid(WX+b)
. Но я вижу, что он только возвращается Wx+b
. Почему это так?
В Udacity «Введение в глубокое обучение с помощью pytorch» -> Урок 2: Введение в нейронные сети Говорят, что вывод сигмовидный:
𝑦̂ =𝜎(𝑤1𝑥1+𝑤2𝑥2+𝑏)
Из приведенного ниже кода я ожидал, что y cap будет 0,38391371665752183, но это просто значение WX+b
, которое я подтвердил в выводе. Почему такое несоответствие?
import torch
from torch import nn
import numpy as np
torch.manual_seed(0)
model = nn.Linear(2,1)
w1 = model.weight.detach().numpy()
b1 = model.bias.detach().numpy()
print (f'model.weight = {w1}, model.bias = {b1}')
x = torch.tensor([[0.2877, 0.2914]])
print(f'model predicted {model(x)}')
z = x.numpy()[0][0] * w1[0][0] + x.numpy()[0][1] * w1 [0][1] + b1[0]
print(f'manual multiplication yielded {z}')
ycap = 1/(1+ np.exp(-z))
print(f'y cap is {ycap}')
Выход:
model.weight = [[-0.00529398 0.3793229 ]], model.bias=[-0.58198076]
model predicted tensor([[-0.4730]], grad_fn=<AddmmBackward>)
manual multiplication yielded -0.4729691743850708
y cap is 0.38391371665752183
Слой nn.Linear — это линейный полносвязный слой. Это соответствует wX+b
, а не sigmoid(WX+b)
.
Как следует из названия, это линейная функция. Вы можете видеть это как матричное умножение (со смещением или без него). Следовательно, к нему не подключена функция активации (т. е. нелинейности).
Если вы хотите добавить к нему функцию активации, вы можете сделать это, определив последовательную модель:
model = nn.Sequential(
nn.Linear(2, 1)
nn.Sigmoid()
)
Изменить - если вы хотите убедиться:
x = torch.tensor([[0.2877, 0.2914]])
model = nn.Linear(2,1)
m1 = nn.Sequential(model, nn.Sigmoid())
m1(x)[0].item(), torch.sigmoid(model(x))[0].item()
Веса на двух линейных слоях инициализируются случайным образом. Если вы определите m1
как nn.Sequential(model, nn.Sigmoid())
, где model
— ваш автономный линейный слой, то результаты будут такими же. (см. мое редактирование выше)
Неудивительно, что PyTorch реализует Linear
как линейную функцию.
Почему не включена сигмовидная?
Linear
, так как цель сигмоиды — «сломать» линейность: сигмоид — нелинейная функция;Linear
позволяет комбинировать Linear
со многими функциями активации, отличными от сигмоиды, такими как ReLU.Если в курсе сказано, что сигмоид включен в «линейный слой», это ошибка (и я бы посоветовал вам изменить курс). Возможно, вы ошибочно принимаете линейный слой за «полностью связанный слой». На практике полносвязный слой состоит из линейного слоя, за которым следует (нелинейный) активационный слой.
С математической точки зрения линейная функция может иметь смещение.
@Ivan Спасибо, вы заставили меня понять, что это сложнее, чем то, как я это написал. Правильнее было бы сказать, что в линейной алгебре и смежных областях линейная карта не имеет смещения. Я читал, что в английском языке проводится различие между «линейной функцией» и «линейной картой», но, честно говоря, я думаю, что это своего рода «странный обходной путь» для того, что это просто двусмысленная терминология, учитывая, что «карта» является синонимом «функции». ", по крайней мере, на итальянском языке.
Это интересно, во французском языке «карта» является скорее синонимом «биекции», как в «отображении один к одному». Я полагаю, что так программисты обычно называют функцию, которая преобразует список/массив/и т. д. в структуру равного размера... В любом случае, это в основном "аффинная функция" в исчислении и "линейная карта" в линейной алгебре.
Боюсь, ваше резюме неверно, поэтому я попытаюсь резюмировать это математическое предостережение. Функция f(x) = wx + b
называется «линейной функцией» в исчислении и «аффинной функцией/картой» в линейной алгебре. В линейной алгебре линейная функция/карта — это f(x) = wx
. Поскольку «линейная функция» имеет это двойное определение, некоторые люди используют «линейную карту», когда ссылаются на определение линейной алгебры, и «линейную функцию», когда ссылаются на определение исчисления.
Да, здесь есть двойной смысл, и я согласен с фактической разницей в определении между линейной функцией и линейной картой, где в последней нет смещения.
Вывод этой модели, которую вы дали, отличается от torch.sigmoid(z). Код, который я пробовал, таков: m1 = nn.Sequential(nn.Linear(2,1), nn.Sigmoid()) m1(x). Это верно?