Pull to refresh
6
0
Send message
Огромное спасибо за ссылки,
Полезно будет знакомиться не со всем подряд, а с тем, что нужно. Отдельное спасибо за упоминание сопряжённых градиентов. А то я тут уже переоткрыл подобный метод и как раз начинал его писать.

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

И центрирование выборки тоже всего лишь слабое подобие. Я для иллюстрации взял задачу, которая строго отцентрована. Значения сдвинуты на 0.5 так чтобы точка (0,0) оказывалась строго в центре экрана, кроме того значение функции в центре экрана, в точке (0,0) равно 0, а площадь над кривой и под кривой одинаковы. Таким образом вероятность появления обучающих примеров на +1 и -1 одинаковы. В общем отцентровал всё идеально. Получилась вот такая задачка и её решение сетью с дополнительным входом:

Вот так выглядит решение задачи сетью с дополнительным входом, когда площади над и под кривой равны, но координаты не сдвинуты, область входных значений (0,1):

А теперь отключим дополнительный вход, и посмотрим как себя поведёт обычная сеть. На нецентрованных данных предсказуемо картинка заваливается в направлении особой точки, тоесть влево:

А вот если данные отцентровать получается самое интересное:

Сеть попадает в тупик и не может решить задачу. Специально 5 раз прогнал.

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

Я стал на много лучше понимать, что и почему творится внутри сетей благодаря этому примеру. Возможно и вы сможете вынести что-то для себя, в том числе и для более сложных сетей и алгоритмов, если рассмотрите эту идею чуть более обстоятельно.

Если вдруг у вас под рукой есть сеть с более качественным алгоритмом обучения вы сможете сравнить его успехи с моими. Результат может быть парадоксальным образом не такой уж хороший. Если сделаете это — поделитесь со мной картинкой, буду благодарен.
Область входных значений для графика (0,1)
График: = |c-|k*(x-b)||+d
func = (point, envirement) => Math.Abs(envirement[2]-Math.Abs(envirement[0]*(point[0]-envirement[1])))+envirement[3]
Константы, при которых задаяча отцентрирована:
envirement[1] = 0.5
envirement[2] = SQRT(1/8) = 0.35355339
envirement[3] = 1/(4+2*SQRT(2)) = 0.1464466
envirement[0] = SQRT(1/8)/envirement[3] = 2.41421371744

Значения сдвигаются на 0,5 чтобы входные данные тоже были центрированы:
                    Convertion = (double[] input, double value) => {
                        NeuralTask result = new NeuralTask() {
                            input = new double[]{input[0]-0.5, input[1]-0.5},
                            output = new double[1] { Math.Sign(input[1] - value) }
                        };
                        result.preview = new double[3] { input[0], input[1], result.output[0]};
                        return result;
                    }

Сеть, как и в прошлый раз, три слоя по 15 нейронов.

То что в работе есть хорошо узнаваемые вами проблемы, к счастью, не значит, что в ней нетчего-то, что было бы новым даже для вас.
12 ...
77

Information

Rating
Does not participate
Registered
Activity