| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Алгоритмы > нейросеть. первые шаги. |
| Автор: neutrino 25.4.2007, 22:18 |
| Приветствую! Мне необходимо изучить САБЖ. Вот первое, что я сделал (у меня ничего н получилось): Я придумал 41 характеристику и для каждой случайно подобрал standart deviation (не знаю как по-русски, может среднее квадратичное отклонение?) и среднее значение. В дальнейшем я в Excel'e для каждой такой характеристики создал около 1000 опытных данных: сгенерировал числа поддающиеся нормальному распределению с соответствующими средним и квадратичным отклонением. Эту операцию я повторил 4 раза. Далее в матлабе я взял нейросеть с 41 входными нейронами, 41 в скрытом слое (hidden layer) и 4 выходными. У меня есть как-будто четыре вида устройств, которые характеризуются по 41-ой характеристике. Нейросеть была создана с помощью команды newff. Обучал я ее функциями trainlm, trainrp и trainbp. При обучении для каждого набора характеристик давал как выход: 0 0 0 1 - для первого устройства, 0 0 1 0 - для второго, 0 1 0 0 - для третьего и 1 0 0 0 - для четвертого. Проблема в том, что когда я симулирую данные, которые нейросеть не видела, то получаю один и тот же бред на выходе для всех цифр: 0 -0 1 1. В чем может быть проблема? Если нужны более подробные объяснения или код на матлабе, могу все предоставить. Спасибо. |
| Автор: VictorTsaregorodtsev 26.4.2007, 09:12 |
| А обучилась ли нейросеть поставленной задаче? Ошибку обучения (среднеквадратичную ошибку на обучающей выборке, процент правильно распознанных после обучения примеров каждого класса (устройства)) - в студию! Скорее всего, произошла ошибка в процессе генерации обучающих или тестовых данных, либо обучение было неуспешным. Вдобавок, при обучении сети никак не вводилось требование запрещения выдачи одновременно двух и более единиц на выходе |
| Автор: VictorTsaregorodtsev 26.4.2007, 12:58 |
| А толку только от 100%? Я же просил и MSE-ошибку тоже указать, да и непонятно само правило отнесения непрерывнозначного значения выходного сигнала сети к нулю или единице. Где порог, значение выше которого считается за 1, а ниже - за 0? Может 0 - это именно физический компьютерный 0, а 1 - все значения, хоть сколько-нибудь от нуля отличные. Тогда действительно любая малая флуктуация выходного сигнала сети вокруг нуля может в итоге радикально менять "отдискретизованный" ответ сети. |
| Автор: neutrino 26.4.2007, 16:03 | ||
| Я думаю мы друг друга не поняли. Вернее будет сказать, что я неправильно выразился. 100% ошибки - это я шуточно указал на то, что сеть просто напросто не работает. А что это? И как мне ее подсчитать?
ОК. Поскольку я совсем зеленый в этом деле, очень прошу отнестись с пониманием. Я не совсем себе представляю как именно все это работает. На занятиях мы когда-то делали такую вот лабораторную: было около 2 тысяч нарисованных по разному цифр 2,3,4 и 8. В матлабе надо было построить сеть, которая бы обучалась по данным рисунка определять какая это цифра. Делалось это так: каждая цифра была нарисована на картинке 16 на 16 пикселей. Это переводилось в вектор длинной 256. У сети не было скрытого слоя, а просто на выходе четыре нейрона. Обучалась она аналогичным моему способом: для 2-ки выход должен был быть 0 0 0 1, для 3-ки - 0 0 1 0, для 4-ки - 0 1 0 0 а для 8-ки - 1 0 0 0. Было что-то вроде такого: net = newff([0, 255; 0, 255 ...], [4], {'tansig'}, 'trainlm'); net = train(net, trainset2, [0 0 0 1; 0 0 0 1; ...]); net = train(net, trainset3, [0 0 1 0; 0 0 1 0; ...]); net = train(net, trainset4, [0 1 0 0; 0 1 0 0; ...]); net = train(net, trainset8, [1 0 0 0; 1 0 0 0; ...]); После чего на вход подавались неизвестные данные, которые сеть оценивала и выдавала на выходе данные. В выходных данных выбиралось максимальное число и приравнивалось к единице, остальные к нулю. Таким образом раскодировался результат. Помоему сеть ошибалась в 10% случаев... |
| Автор: VictorTsaregorodtsev 27.4.2007, 08:33 |
| Нда, а я "понял", что 100% правильно (иначе просто не стоит переходить к тесту сети на новых данных - очевидно, что для них будет совершенно бредовый прогноз). Имеется в виду ошибка на ОБУЧАЮЩИХ данных, а не на тестовых, т.е. показатель, что сеть обучающим данным как-то обучилась. MSE (mean square error) - значение среднеквадратичной ошибки, именно тот показатель, который минимизируется в ходе обучения сети (и поэтому является тем показателем качества, на который надо смотреть в первую очередь - ведь он оптимизируется явно, в отличие от числа правильно классифицированных обучающих примеров, которое оптимизируется опосредованно). Где и как матлаб его выводит - ХЗ, я с матлабом не работал, но очевидно, что выводиться он должен. Указанный пример обучения сети является самым неоптимальным (!!!), т.к. обучение на последующей цифре совершенно не гарантирует сохранения навыка распознавания цифр, которым сеть обучалась ранее. Учить надо по полной обучающей выборке (все цифры/устройства/классы), причем примеры разных классов желательно перемешать (хоть указанные алгоритмы обучения перемешивания и не требуют, но на будущее, для online-методов обучения, стоит об этом не забывать). Поэтому ошибка в 10% - это было из области чуда. Так что еще одна возможная причина некорректного результата (наряду с необученностью сети) - неправильный "способ" обучения (учить надо всему сразу, а не отдельные ситуации по-очереди) |
| Автор: neutrino 27.4.2007, 13:08 | ||||
ОК. Запущу заново и сообщу.
Спасибо за совет! |
| Автор: neutrino 28.4.2007, 12:06 |
| Приветствую! Сеть очень странно обучается. Я сделал так: обучил ее только одному эталонному вектору типа 1 с должным результатом [0 0 0 1], после чего проверил как сеть ему обучилась, и получил ответ [0 0 0 1]. Повторил эту операцию для вектора типа 2 и 3 - результат правильный. Но как только я обучил ее вектору типа 4, то получил [1 1 0 0] вместо [1 0 0 0]. Последующие вызовы с любыми входными значениями дают тот же результат [1 1 0 0]. Что я делаю неправильно? Может поменять какие-то параметры обучения? |
| Автор: VictorTsaregorodtsev 29.4.2007, 10:02 | ||
Ну, значит, сетка не обучилась - требуемый выходной результат так для этого вектора и не достигнут. Почему - а ХЗ, аборт по интернету не делается (прошу же дать СТАНДАРТНЫЕ ЧИСЛОВЫЕ показатели точности типа MSE, чтобы хоть действительно можно было доказать обученность или необученность). То, что она потом встала колом и дает одинаковый выход для любых входов - это проблема дискретизации непрерывнозначных выходных сигналов в 0 или 1. Не максимум надо приравнивать к 1 (тем более, при результате [1 1 0 0] я не верю, что максимальных чисел пара и они равны - для непрерывнозначных значений такое бывает только чудом), а смотреть по близости к кодовым значениям (т.е. если >=0,5 то 1, если <0,5 - то 0). |
| Автор: neutrino 29.4.2007, 13:26 | ||
| Когда я ее обучаю, у меня рисуется график обучения. По оси Х у меня количество epoch, а по Y - performance. Обучение я делаю при помощи функции traingdm - градиентный с моментом способ обучения. Оценка performance начинается с 10 (примерно) и заканчивается в 10е-5 (для большинства эталонных значений). Это помогает? Нужен сам график обучения какому-нибудь эталонному значению? Спасибо! Добавлено через 4 минуты и 54 секунды
Имелось в виду, что она начинается с 10 и по ходу обучения падает. Падает она для разных эталонных значений по-разному: у некоторых она асимптотически приближается к 10е-5 (оценка performance при которой останавливается обучение, эту оценку задаю я), у некоторых она еще вначале стремительно падает вниз и достигает этого предела. Обучение для эталонного значения останавлилвается если достигнуто 2000 epoch, либо достигнута оценка 10е-5. Вот так. |
| Автор: neutrino 29.4.2007, 15:41 |
| Значит так, видимо эталонные значения выбраны некорректно. Я обучал сеть в таком порядке: эталонное значение 1-го типа, 2-го, 3-го, 4-го, 1-го, 2-го, 3-го, 4-го, 1-го ... Заметил, что сеть поддается обучению лишь эталонным данным 1-го типа. Я проверял после каждого обучения эталонным значением, как сеть обучилась этому значению. Может ли быть ошибка еще в чем-нибудь? |
| Автор: VictorTsaregorodtsev 30.4.2007, 10:43 |
| Тогда, при такой финальной performance (эта та самая MSE - средний квадрат ошибки) и выдачи [1 1 0 0] после обучения ЕДИНСТВЕННОМУ вектору четвертого типа - ошибка только в обучении по единственному примеру и, может быть, схеме дискретизации выходных сигналов по максимуму (надо всё-таки мерять близость к эталонным кодам). Учить методом traingdm надо по набору векторов разных типов сразу. Перемешивать при этом вектора разных типов не обязательно - можно их подать последовательно группами друг за другом, или в цикле 1-2-3-4, всё это без разницы будет именно для этого метода обучения. То, что обучается только первому типу (опять же непонятен смысл слова "обучается" - какая там performance для наборов векторов других типов?) может быть связано с тем, что входные сигналы для этих "трудных" типов малоинформативны ("видимо эталонные значения выбраны некорректно" - может быть как раз из этой оперы), и сетке проще установить константное смещение для выходного нейрона (это и может объяснять ситуацию [1 1 0 0] - при раздельном обучении по разным типам сначала выставили смещение у третьего выходного нейрона, потом у четвертого, не затрагивая третий), чем обучиться именно отображению входных сигналов в выходной. |