Почему линейная модель pytorch не использует сигмовидную функцию

Я ожидаю, что линейная модель в 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
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
3 565
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Слой 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()

Вывод этой модели, которую вы дали, отличается от torch.sigmoid(z). Код, который я пробовал, таков: m1 = nn.Sequential(nn.Linear(2,1), nn.Sigmoid()) m1(x). Это верно?

Ravi 25.12.2020 23:10

Веса на двух линейных слоях инициализируются случайным образом. Если вы определите m1 как nn.Sequential(model, nn.Sigmoid()), где model — ваш автономный линейный слой, то результаты будут такими же. (см. мое редактирование выше)

Ivan 25.12.2020 23:21

Неудивительно, что PyTorch реализует Linear как линейную функцию.

Почему не включена сигмовидная?

  1. ну, в таком случае было бы странно называть результирующий модуль Linear, так как цель сигмоиды — «сломать» линейность: сигмоид — нелинейная функция;
  2. наличие отдельного модуля Linear позволяет комбинировать Linear со многими функциями активации, отличными от сигмоиды, такими как ReLU.

Если в курсе сказано, что сигмоид включен в «линейный слой», это ошибка (и я бы посоветовал вам изменить курс). Возможно, вы ошибочно принимаете линейный слой за «полностью связанный слой». На практике полносвязный слой состоит из линейного слоя, за которым следует (нелинейный) активационный слой.

С математической точки зрения линейная функция может иметь смещение.

Ivan 25.12.2020 22:12

@Ivan Спасибо, вы заставили меня понять, что это сложнее, чем то, как я это написал. Правильнее было бы сказать, что в линейной алгебре и смежных областях линейная карта не имеет смещения. Я читал, что в английском языке проводится различие между «линейной функцией» и «линейной картой», но, честно говоря, я думаю, что это своего рода «странный обходной путь» для того, что это просто двусмысленная терминология, учитывая, что «карта» является синонимом «функции». ", по крайней мере, на итальянском языке.

janluke 25.12.2020 23:17

Это интересно, во французском языке «карта» является скорее синонимом «биекции», как в «отображении один к одному». Я полагаю, что так программисты обычно называют функцию, которая преобразует список/массив/и т. д. в структуру равного размера... В любом случае, это в основном "аффинная функция" в исчислении и "линейная карта" в линейной алгебре.

Ivan 25.12.2020 23:33

Боюсь, ваше резюме неверно, поэтому я попытаюсь резюмировать это математическое предостережение. Функция f(x) = wx + b называется «линейной функцией» в исчислении и «аффинной функцией/картой» в линейной алгебре. В линейной алгебре линейная функция/карта — это f(x) = wx. Поскольку «линейная функция» имеет это двойное определение, некоторые люди используют «линейную карту», ​​когда ссылаются на определение линейной алгебры, и «линейную функцию», когда ссылаются на определение исчисления.

janluke 25.12.2020 23:58

Да, здесь есть двойной смысл, и я согласен с фактической разницей в определении между линейной функцией и линейной картой, где в последней нет смещения.

Ivan 26.12.2020 00:27

Другие вопросы по теме