Я построил свою собственную нейронную сеть, и у меня есть странная проблема с этим.
Сеть представляет собой простую прямую сеть 1-N-1 с обучением обратному распространению. Сигмоид используется в качестве функции активации.
Мой тренировочный набор генерируется со случайными значениями между [-PI, PI] и их [0,1] -масштабными значениями синуса (Это потому, что «Sigmoid-net» производит только значения между [0,1] и немасштабируемой функцией синуса) производит значения между [-1,1]).
С этим обучающим набором и сетью, установленной на 1-10-1, со скоростью обучения 0,5, все работает отлично, и сеть изучает функции греха, как и должно быть. НО .. если я сделаю все то же самое для COSINE-функции, сеть не научится этому. Не с какой-либо настройкой скрытого размера слоя или скорости обучения.
Есть идеи? Я что-то пропустил?
РЕДАКТИРОВАТЬ: Моя проблема, кажется, похожа, чем можно увидеть с этот апплет. Кажется, он не научится синусоидальной функции, если сначала не будет учиться чему-то «более простому» для весов (например, 1400 циклов квадратичной функции). Все остальные настройки в апплете можно оставить как есть. Таким образом, в случае синуса или косинуса кажется, что веса нужно немного повысить, чтобы хотя бы частично повернуть правильное направление, прежде чем можно будет найти решение. Почему это?
Я изо всех сил пытаюсь понять, как это может работать.
Насколько я вижу, у вас есть 1 вход, N узлов в 1 слое, а затем 1 выход. Таким образом, нет никакой разницы между любыми узлами в скрытом слое сети. Предположим, у вас есть вход х и набор весовя. Тогда выходной узел у будет иметь значение:
y =
Σя w_i x
= x .
Σя w_i
Так что это всегда линейно.
Чтобы узлы могли учиться по-разному, они должны быть подключены по-разному и / или иметь доступ к различным входам. Таким образом, вы можете указать входные данные значения, квадратный корень значения (что дает некоторый эффект масштаба) и т. Д. И подключить разные узлы скрытого слоя к разным входам, и я подозреваю, что вам все равно понадобится как минимум еще один скрытый слой.
Нейронная сеть не магия. Он производит набор конкретных весов для взвешенной суммы. Поскольку вы можете получить набор весов для аппроксимации функции синуса или косинуса, это должно дать вам представление о том, какие входные данные понадобятся нейронной сети, чтобы иметь шанс на успех.
Явный пример: Серия Тейлор экспоненциальной функции:
exp(x) = 1 + x/1! + x^2/2! + x^3/3! + x^4/4! ...
Так что если вы поставили 6 входных заметок с 1, х1, Икс2 и т. д., тогда нейронная сеть, которая только что получала каждый вход в один соответствующий узел и умножала его на свой вес, а затем передавала все эти выходы в выходной узел, была бы способна к 6-членному расширению экспоненты по Тейлору:
in hid out
1 ---- h0 -\
x -- h1 --\
x^2 -- h2 ---\
x^3 -- h3 ----- y
x^4 -- h4 ---/
x^5 -- h5 --/
Не большая часть нейронной сети, но вы понимаете.
Далее на странице википедии о серии Тейлора есть расширения для sin и cos, которые даны в терминах нечетных степеней x и четных степеней x соответственно (подумайте об этом, грех нечетен, cos четен, и да, это так. это просто), поэтому, если вы предоставите все полномочия x, я бы предположил, что версии sin и cos будут выглядеть примерно одинаково с чередующимися нулевыми весами. (грех: 0, 1, 0, -1/6 …, cos: 1, 0, -1/2 …)
Я думаю, что вы всегда можете вычислить синус, а затем вычислить косинус внешне. Я думаю, что вы обеспокоены тем, почему нейронная сеть не изучает функцию косинуса, когда она может изучить функцию синуса. Предполагая, что это артефакт, если не из-за вашего кода; Я бы предложил следующее: