Возможно ли обучить один вход->нейрон->relu->нейрон->relu для входа > 0.5?

Вопрос или проблема

Нейронная сеть выглядит следующим образом:

y=max(max(x*w+b,0)*v+d,0)

w,b – это вес и смещение первого нейрона. v,d – это вес и смещение второго нейрона.

Если данные, например:

x = tensor([[1.0], [0.9], [0.8], [0.75], [0.7], [0.6], [0.51], [0.49], [0.3], [0.25], [0.2], [0.1], [0.0]])
y = tensor([[1.0], [1.0], [1.0], [1.0 ], [1.0], [1.0], [1.0 ], [0.0 ], [0.0], [0.0 ], [0.0], [0.0], [0.0]])

Тогда следующие значения подходят для данных:

w=-12
b=6
v=-12
d=1

Можно ли обучить сеть, чтобы она нашла вышеуказанные значения (или другие возможные значения)?

Я пробовал следующий код (который на самом деле работает иногда, но чаще всего не срабатывает):

l1 = nn.Linear(1, 1)
l2 = nn.Linear(1, 1)
relu1 = nn.ReLU()
relu2 = nn.ReLU()

x = tensor([[1.0], [0.9], [0.8], [0.75], [0.7], [0.6], [0.51], [0.49], [0.3], [0.25], [0.2], [0.1], [0.0]])
y = tensor([[1.0], [1.0], [1.0], [1.0 ], [1.0], [1.0], [1.0 ], [0.0 ], [0.0], [0.0 ], [0.0], [0.0], [0.0]])

lr = 0.5

for i in range(0, 100):
    out = relu2(l2(relu1(l1(x))))
    lss = F.mse_loss(out, y)
    lss.backward()

    with torch.no_grad():
        l1.weight -= l1.weight.grad * lr
        l1.bias -= l1.bias.grad * lr
        l2.weight -= l2.weight.grad * lr
        l2.bias -= l2.bias.grad * lr
        l1.zero_grad()
        relu1.zero_grad()
        l2.zero_grad()
        relu2.zero_grad()

relu2(l2(relu1(l1(x))))

Если я правильно понимаю, вы можете сделать это с помощью строки

target = torch.abs(torch.ceil((torch.zeros_like(x) - 0.5) - x))

без необходимости обучать нейронную сеть. Если это не то, что вы ищете, пожалуйста, уточните, каков желаемый результат. Спасибо.

Ответ или решение

Вопрос, который вы подняли, касается возможности тренировки нейронной сети, состоящей из единственного входного нейрона с двумя слоями ReLU, с целью получения определённых значений параметров весов и смещений. Давайте подробнее разберем этот вопрос.

Структура Нейронной Сети

Ваша нейронная сеть представлена следующим образом:

y = max(max(x * w + b, 0) * v + d, 0)

Где:

  • x — входные данные,
  • w и b — веса и смещения первого нейрона,
  • v и d — веса и смещения второго нейрона.

Вы предоставили набор входных (x) и целевых (y) данных, который указывает, что при входных данных более 0.5 выходное значение должно быть 1, в противном случае — 0.

Анализ Данных

Ваши данные:

x = tensor([[1.0], [0.9], [0.8], [0.75], [0.7], [0.6], [0.51], [0.49], [0.3], [0.25], [0.2], [0.1], [0.0]])
y = tensor([[1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [0.0], [0.0], [0.0], [0.0], [0.0], [0.0]])

Для задаваемого вами целевого значения y по порядку можно заметить, что весы и смещения, которые вы указали (w=-12, b=6, v=-12, d=1), позволяют скомпоновать необходимую функцию, которая корректно разделяет данные.

Возможность Обучения

Исходя из вашей реализации, использование обратного распространения ошибки для тренировки данной сети — это правильный подход. Однако важно учитывать некоторые аспекты:

  1. Инициализация Параметров: Неправильная инициализация весов и смещений может привести к отсутствию сходимости. Рассмотрите возможность использования более продвинутых методов инициализации, например, инициализацию по Хавкингу или Инициализацию по Глору.

  2. Выбор Скорости Обучения: Скорость обучения (lr = 0.5) может быть слишком высокой, из-за чего могут происходить резкие колебания, что иногда приводит к потере сходимости. Попробуйте использовать меньшую скорость — 0.01 или 0.001 — и посмотрите, как это повлияет на результаты.

  3. Линии Кода для Обучения: В вашем коде есть некоторые настройки, которые стоит предварительно изучить. Например, использование методов оптимизации, таких как Adam или SGD, может значительно помочь.

  4. Ограничение Значений: Если мы хотим получить конкретные выходные данные, вы можете обратить внимание на функцию потерь. Возможно, вам нужно будет проанализировать, как точно ее приземлить для двух классов, чтобы помочь модели легче усвоить.

Применение Альтернативных Методов

Вы также упомянули альтернативный метод вычисления целевой переменной, что также может быть важным этапом.

target = torch.abs(torch.ceil((torch.zeros_like(x) - 0.5) - x))

Это может представлять более прямой способ достижения цели, минимизируя потребность в сложе нейронной сети. Если цель просто выразима через известную математическую операцию, имеет смысл использовать уже имеющийся метод.

Заключение

В целом, ваша нейронная сеть потенциально способна обучиться на предоставленных данных при надлежащей настройке гиперпараметров и инициализации. Остальные этапы, такие как выбор алгоритма оптимизации и корректировка функции потерь, также играют важную роль в достижении желаемого результата. Учтите предложенные рекомендации и проведите необходимые тесты, чтобы убедиться, что сеть обучается корректно. Удачи в ваших исследованиях!

Оцените материал
Добавить комментарий

Капча загружается...