Форум программистов, компьютерный форум, киберфорум
Искусственный интеллект
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/18: Рейтинг темы: голосов - 18, средняя оценка - 4.56
244 / 164 / 133
Регистрация: 30.09.2012
Сообщений: 690
1

Нейронные сети: XOR. Ошибка в алгоритме обучения

21.05.2017, 16:04. Показов 3670. Ответов 16
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте!

Никак не могу понять, где я ошибся, при реализации простой нейронной сети. Сеть обучается через раз. Иногда дает абсолютно верные результаты, иногда нет. Такое ощущение, что где-то проваливается в локальный минимум и застревает там. Пытался устранить этот эффект импульсом, но результата не дало.

Используемая функция активации: сигмоида
Инициализация весов: случайная инициализация (lower: -1.0 upper: 1.0)



Алгоритмически вроде бы все верно:
1. Прямой проход
Java
1
2
3
4
5
                SimpleMatrix output = DataSetUtilities.extractRow(X_train, sample);
 
                for(int i = 0; i < layers.size(); ++i) {
                    output = layers.get(i).feedforward(output);
                }
Java
1
2
3
4
5
6
7
8
    public SimpleMatrix feedforward(SimpleMatrix Z) {
        input = Z;
 
        output = activation.activation(input.mult(thetas));
        output = DataSetUtilities.addColumnOfOnes(output);
 
        return output;
    }

2. Расчет ошибки и ее обратное распространение
Java
1
2
3
4
5
6
                SimpleMatrix delta = DataSetUtilities.extractRow(Y, sample);
                error = loss.computeCost(output, delta);
 
                for(int i = layers.size() - 1; i > 0; --i) {
                    delta = layers.get(i).computeError(delta);
                }
Java
1
2
3
4
5
    public SimpleMatrix computeError(SimpleMatrix delta) {
        error = activation.derivative(input.mult(thetas)).scale(delta.elementSum());
 
        return thetas.mult(error.transpose());
    }

3. обновление весов

Java
1
2
3
                for(int i = layers.size() - 1; i > 0; --i) {
                    layers.get(i).updateWeights(learnRate);
                }
Java
1
2
3
4
5
6
7
8
9
10
11
    public void updateWeights(double rate) {
        SimpleMatrix delta = input.transpose().mult(error);
 
        thetas = thetas.plus(delta.scale(rate));
 
        if(momentum != null) {
            thetas = thetas.plus(momentum);
        }
 
        momentum = delta;
    }


Выход сети:
Код
0 0: 0,030  
0 1: 0,692  
1 0: 0,692  
1 1: 0,695
Веса:
Код
Dense{}
Type = dense real , numRows = 3 , numCols = 2
 0,072   0,252  
-6,590  -6,780  
-6,670  -6,859  
Output{}
Type = dense real , numRows = 3 , numCols = 1
 0,821  
-3,528  
-4,393
Случай, когда сеть обучилась верно (после ~10 попытки):
Код
0 0: 0,051  
0 1: 0,956  
1 0: 0,955  
1 1: 0,047
Веса:
Код
Dense{}
Type = dense real , numRows = 3 , numCols = 2
-3,146  -3,199  
 5,653  -5,853  
-5,869   5,693  
Output{}
Type = dense real , numRows = 3 , numCols = 1
-3,486  
 7,086  
 7,100
Почему так происходит? Это ошибка у меня или так и должно быть (что маловероятно)? Если так и должно быть, то почему тогда ни в книгах, ни в статьях не упоминается о том, что такое может быть (именно в задаче xor)?

Спасибо!

Добавлено через 59 секунд
Задачи или, или-не, и, и-не как однослойная, так и многослойная нейронная сеть решает (в моей реализации)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.05.2017, 16:04
Ответы с готовыми решениями:

Нейронные сети
Добрый вечер, всем! Подскажите, пожалуйста, как решить поставленную задачу через нейронные сети....

Нейронные сети (NN)
Продвинутый народ, кто нибудь писал ручками нейронную сеть?

Нейронные сети
Занялся изучением нейросетей на питоне. Нашел пример, написал код под себя. Но почему-то даже для...

Нейронные сети
Расскажите что знаете про нейронные сети, кто что думает об этом? Можно ли реализовать эту сеть на...

16
11 / 20 / 3
Регистрация: 12.10.2015
Сообщений: 126
22.05.2017, 20:57 2
Никто Вам ничего не посоветует без кода Вашей НС, XOR при классической реализации не всегда будет обучаться на простых архитектурах(2,1) на посложнее(2,10,1...) вероятность не сходимости гораздо меньше

зы ну и сигмоида это не идеал, лучше гипертангенс
1
244 / 164 / 133
Регистрация: 30.09.2012
Сообщений: 690
23.05.2017, 00:31  [ТС] 3
Цитата Сообщение от сахатый Посмотреть сообщение
XOR при классической реализации не всегда будет обучаться на простых архитектурах(2,1)
Спасибо! Как раз-таки именно этот вопрос и интересовал, так как что в литературе, что в статьях везде был рассмотрен идеальный вариант обучения.
Про недообучение\переобучение знаю, но так упорно везде писалось, что задача xor решается прямо-таки железно, что вначале и не сомневался в том, что так оно и есть

Попробовал по вашему совету использовать гипертангенс и немного усложненную архитектуру сети и, действительно, алгоритм сходится в большинстве случаях. Хотя с сигмоидой и несколькими скрытыми слоями результат ненамного лучше, чем в изначальной конфигурации.
0
11 / 20 / 3
Регистрация: 12.10.2015
Сообщений: 126
25.05.2017, 02:39 4
Цитата Сообщение от Gr1f0nn Посмотреть сообщение
гипертангенс и немного усложненную архитектуру сети и, действительно, алгоритм сходится в большинстве случаях
от инициализации ещё существенно зависит качество сходимости, от ускорения и сглаживания градиентного спуска и тп. проще запускать параллельно множество сеток и выбирать наиболее успешную
1
244 / 164 / 133
Регистрация: 30.09.2012
Сообщений: 690
25.05.2017, 03:10  [ТС] 5
сахатый, Тоже предполагал, что в некоторых случаях начальная инициализация весов была успешнее, чем в других, и это сильно влияло на сходимость. Изменение количества слоев и скрытых нейронов в них при этом несильно помогало, в отличие от изменении функции активации. Как-то в большинстве источниках упускается, как мне показалось, значимость активационной функции.
Просто до этого думал, что на таких задачах не будет проблем с этим, однако, как оказалось, сильно ошибался ^_^

Такую же ситуацию наблюдаю и при использовании логистической регрессии на классическом наборе данных о листьях ириса. В некоторых случаях точность классификации достигала 97%, а в некоторых алгоритм вовсе не сходился (около 3-5%).
0
1487 / 1414 / 240
Регистрация: 19.02.2010
Сообщений: 3,915
26.05.2017, 21:24 6
Цитата Сообщение от Gr1f0nn Посмотреть сообщение
Как-то в большинстве источниках упускается, как мне показалось, значимость активационной функции.
Прочитайте, в конце концов, буржуинскую методичку 98 года Efficient backprop
Если и не говорят - то потому, что буквари пересказывать уже надоело. Особенно почти через 20 лет после выхода конкретно этого указанного букваря.
1
244 / 164 / 133
Регистрация: 30.09.2012
Сообщений: 690
27.05.2017, 00:50  [ТС] 7
Цитата Сообщение от VTsaregorodtsev Посмотреть сообщение
Прочитайте, в конце концов, буржуинскую методичку 98 года Efficient backprop
Спасибо! К сожалению, упустил ее из виду.

Цитата Сообщение от VTsaregorodtsev Посмотреть сообщение
Если и не говорят - то потому, что буквари пересказывать уже надоело.
Но ведь это же основы, а там, где ожидаешь их увидеть, их нет
0
1487 / 1414 / 240
Регистрация: 19.02.2010
Сообщений: 3,915
27.05.2017, 19:19 8
Цитата Сообщение от Gr1f0nn Посмотреть сообщение
Но ведь это же основы
К сожалению, многие люди (среди них - и пишущие ВУЗовские учебники) не понимают даже основ.
Поэтому нужно уметь отделять компетентных от бредогенераторов
Над последними можно только смеяться (как я посмеялся в http://neuropro.ru/memo340.shtml над типичными их представителями), серьёзно их писульки не рассматривая.
Но меня, правда, и буржуинские учебники полностью не удовлетворяют (я про Хайкина это отдельно писал, из указанной методички ЛеКуна я тоже не использую очень многое из обведённых там в рамочку рецептов).
1
244 / 164 / 133
Регистрация: 30.09.2012
Сообщений: 690
27.05.2017, 20:25  [ТС] 9
VTsaregorodtsev, Опять-таки, к сожалению, мой опыт пока не позволяет мне судить о компетентности авторов

Ради интереса почитал http://neuropro.ru/memo322.shtml и возник вопрос, на который, возможно, вы уже отвечали:
Как много времени заняло обучение сверточной нейронной сети на достаточно больших объемах данных? В статье вы писали о "минимальнейшем комфорте".
при росте производительности процессора в 3 раза получаем, что базу изображений (при условии сохранения минимальнейшего комфорта работы с ней) можно увеличить
Спрашиваю, потому что решал задачу распознавания текста с помощью нейронной сети, в которой использовал именно сверточную нейронную сеть, и без использования видеокарты одна эпоха могла занимать какое-то невообразимое время. При этом выборка данных была сравнительно небольшой: ~65 тысяч изображений 128*128 (позже 30*30). Стоит сказать, что тогда использовал Python и фреймворк Keras и, наверное, учитывая эти факты, о высокой скорости нельзя говорить, но все же я предполагал, что это займет намного меньше времени.
0
1487 / 1414 / 240
Регистрация: 19.02.2010
Сообщений: 3,915
28.05.2017, 21:58 10
Дык, есть описание для размера базы, похожего на один из указанных Вами.
Для 60тыс картинок 28*28 (база MNIST) ориентиры времени есть в http://neuropro.ru/memo344.shtml
Поделите тамошние времена на 3 (150 эпох - излишне много, за полсотни всё сходится. В Вашей задаче - думаю, тоже 50 эпох хватит). Далее - может, ещё на какой делитель (если вдруг Ваша нейросетка была размером меньше, чем указанная в хабровском обзоре, на который там дана ссылка).
Это, правда, уже для "сейчас" ориентиры - а тогда, когда писался указанный Вами пост, прога помедленнее была примерно в полтора раза.
И в указанном мной посте - свёрточная сетка "классическая" ЛеКуновская, со слоями сабсэмплинга. А в названном Вами - в варианте П.Симарда, без сабсэмплинга (он делается смещением положений полей свёрточных нейронов на шаг >1), но в 4 раза быстрее (при stride=2 ибо получается в 2 раза меньше свёрточных нейронов по вертикали и горизонтали, и 2*2=4). В общем, большие базы можно прикидочно проверять именно на таком варианте структуры - без сабсэмплинга (хотя тут экономия времени получается малой) и со stride=2 у свёрточных слоёв. Т.е. хоть тогда прога и помедленнее была - но большие базы всё-таки комфортно съедались из-за менее вычислительнозатратной структуры нейросетки.
0
244 / 164 / 133
Регистрация: 30.09.2012
Сообщений: 690
31.05.2017, 00:54  [ТС] 11
VTsaregorodtsev, Спасибо, интересная информация. Мне, правда, не совсем понятно, почему при использовании перспетрона у вас ушло ~17 минут, а при использовании сверточной сети - ~1 час и 17 минут. Не должно ли быть наоборот? Ведь, по сути, в сверточной нейронной сети количество проводимых вычислений меньше, чем у персептрона.

В моем случае использовалась видеокарта gtx 770 и время обучения заняло около 1,5 часа (Python 2.7\Keras версию не скажу уже\Theano 0.8.**).
На более поздних версиях keras и theano время обучения несколько снизилось (как и обещали сами разработчики в пределах n%).
На процессоре (i5 3570), как я уже упомянул, время было каким-то совсем заоблачным.
Сложность нейронной сети при этом не сильно влияла на время, если не брать в расчет гиперпараметры, а только набор слоев.
0
1487 / 1414 / 240
Регистрация: 19.02.2010
Сообщений: 3,915
01.06.2017, 07:13 12
Цитата Сообщение от Gr1f0nn Посмотреть сообщение
не совсем понятно, почему при использовании перспетрона у вас ушло ~17 минут, а при использовании сверточной сети - ~1 час и 17 минут. Не должно ли быть наоборот? Ведь, по сути, в сверточной нейронной сети количество проводимых вычислений меньше, чем у персептрона.
Наоборот, больше вычислений.
Хотя размер бинарного файла с записанной свёрточной сеткой при этом действительно может быть меньше, чем размер файла с персептроном.
0
244 / 164 / 133
Регистрация: 30.09.2012
Сообщений: 690
01.06.2017, 20:41  [ТС] 13
VTsaregorodtsev, Значит я неправильно оценивал количество и сложность вычислений в обоих случаях. Я думал, что при использовании сверточной нейронной сети не только количество нейронов меньше, что ведет к уменьшению затрат на хранение весов и иной информации, но и за счет этого количество проводимых операций существенно меньше. Или это утверждение верно в том случае, если в такой сети будут слои судбискретизации? Они же ведь как раз уменьшают размерность получившихся матриц после операции свертки.
0
1487 / 1414 / 240
Регистрация: 19.02.2010
Сообщений: 3,915
04.06.2017, 22:29 14
Цитата Сообщение от Gr1f0nn Посмотреть сообщение
Я думал, что при использовании сверточной нейронной сети не только количество нейронов меньше
В св.сети в некотором слое стоит меньшее число "плоскостей" свёрточных нейронов, чем (обычно) число нейронов в слое персептрона.
Но в каждой плоскости могут быть сотни и даже тысячи нейронов. Например, при картинке 30*30 и смещении рецептивных полей св.нейронов на единицу в плоскость влазит 26*26=676 нейронов. Просто у всех нейронов в некоторой плоскости - будет одинаковый=общий набор весов синапсов.
И умножив эти сотни-тысячи нейронов в плоскости на число плоскостей в слое - получим уже о-го-го
Далее, у каждого свёрточного нейрона может быть малое рецептивное поле. Например, 5*5. Но если свёрточный слой уже не первый - то в нём нейрон будет кушать сигналы со всех плоскостей (пофиг - свёрточных или порезанных в размере субдескретизацией) предыдущего слоя, т.е. иметь связь 5*5 () с каждой предыдущей плоскостью. Т.е. у нейрона при десятке плоскостей предыд.слоя будет 250синапсов независимо от того, как субдескретизация (если она была) порезала размер предыдущих плоскостей (размер-то она могла порезать, т.е. число нейронов в след.плоскости стало меньшим, но число синапсов-то для связи не уменьшилось).
В общем, в свёрточной нейросетке нейронов много, синапсов у них тоже много. Хоть пулинг и уменьшает размерность "полян" сигналов - но после него обычно ставится большее число свёрточных плоскостей, дабы малое число выделенных пулингом признаков соединить в большее число более высокоуровневых признаков.
1
244 / 164 / 133
Регистрация: 30.09.2012
Сообщений: 690
05.06.2017, 03:29  [ТС] 15
VTsaregorodtsev, теперь стало понятнее, с чем связано такое различие во времени обучения, осталось только самому это сделать

Спасибо за подробное объяснение, буду дальше разбираться теперь
0
defun
603 / 617 / 44
Регистрация: 30.04.2011
Сообщений: 702
12.07.2017, 00:57 16
Цитата Сообщение от VTsaregorodtsev Посмотреть сообщение
Для 60тыс картинок 28*28 (база MNIST) ориентиры времени есть в http://neuropro.ru/memo344.shtml
собственная реализация, обучение на CPU
тест перед внедрением Adam, сеть прямого распространения, 2 слоя
Bash
1
2
# cat /proc/cpuinfo | grep -i i5 | uniq 
model name      : Intel(R) Core(TM) i5-6400 CPU @ 2.70GHz
Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
;; выход         - softmax 10 neurons
;; стоимость     - cross-entropy
;; активация     - relu модифицированный
;; регуляризация - L2
;; инерция       - none
 
;; Mnist (test 10000)
;; 70 neurons
;; 9700          - после 10-ти эпох - [417 sec - learning 60000]
;; 9709          - после 12-ти эпох
 
;; 150 neurons
;; 9702          - после 9-ти эпох - [828 sec - learning 60000]
;; 9699          - после 10-ти эпох
;; 9717          - после 14-ти эпох
;; 9714          - после 20-ти эпох
медленно по сравнению с тобой...

Добавлено через 2 часа 27 минут
Lisp
1
2
3
;; 300 neurons
;; 9705         - после 10-ти эпох - [1568 sec - learning 60000]
;; 9723         - после 17-ти эпох
0
1487 / 1414 / 240
Регистрация: 19.02.2010
Сообщений: 3,915
12.07.2017, 21:27 17
А от Адама вообще ничего не зависит.
Ну и, ИМХО, relu в персептроне - мастдай.
0
12.07.2017, 21:27
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.07.2017, 21:27
Помогаю со студенческими работами здесь

Сверточные нейронные сети
Здравствуйте, Платформа Accord.NET реализует сверточные сети или нет? Есть ли у кого нибудь код...

Нейронные сети в трейдинге
Привет всем! Нужна ваша помощь. Недавно выдали тему диплома. Почему так поздно - это долгая...

Сверточные нейронные сети
Здравствуйте, есть вопросы знатокам нейронных сетей. Прочитал много статьей про нейронных сетей,...

Спектроскопия и нейронные сети
В спектрометр загружают исследуемый образец (на данный момент пищевая продукция). Он выдаёт спектр...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru