Огромное спасибо за ссылки,
Полезно будет знакомиться не со всем подряд, а с тем, что нужно. Отдельное спасибо за упоминание сопряжённых градиентов. А то я тут уже переоткрыл подобный метод и как раз начинал его писать.
Однако в том, что касается идеи опорного входа вы не совсем правы. Добавление входа не идентично добавлению константы в функцию активации. Мало того, что это сильно проще, важнее, что это сильно улучшает качество сети. Если просто добавить константу в функцию активации, то придётся ещё как минимум один слой в сеть добавить, чтобы достичь похожих результатов.
И центрирование выборки тоже всего лишь слабое подобие. Я для иллюстрации взял задачу, которая строго отцентрована. Значения сдвинуты на 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 нейронов.
То что в работе есть хорошо узнаваемые вами проблемы, к счастью, не значит, что в ней нетчего-то, что было бы новым даже для вас.
Полезно будет знакомиться не со всем подряд, а с тем, что нужно. Отдельное спасибо за упоминание сопряжённых градиентов. А то я тут уже переоткрыл подобный метод и как раз начинал его писать.
Однако в том, что касается идеи опорного входа вы не совсем правы. Добавление входа не идентично добавлению константы в функцию активации. Мало того, что это сильно проще, важнее, что это сильно улучшает качество сети. Если просто добавить константу в функцию активации, то придётся ещё как минимум один слой в сеть добавить, чтобы достичь похожих результатов.
И центрирование выборки тоже всего лишь слабое подобие. Я для иллюстрации взял задачу, которая строго отцентрована. Значения сдвинуты на 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 чтобы входные данные тоже были центрированы:
Сеть, как и в прошлый раз, три слоя по 15 нейронов.
То что в работе есть хорошо узнаваемые вами проблемы, к счастью, не значит, что в ней нетчего-то, что было бы новым даже для вас.