Реферат Бакалаврская работа, 34 с., 17 рис., 6 табл., 15 ист., 1 прил




Сторінка3/3
Дата конвертації18.04.2016
Розмір0.62 Mb.
1   2   3

4 Результаты экспериментов

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

Для тестирования же использовались средства Windows Azure, что позволило использовать значительные вычислительные ресурсы для проведения измерений. В качестве конфигурации виртуальной машины была выбрана конфигурация А7 (8 ЦП по 1,6 ГГц, 56 ГБ ОЗУ).

Размер входных данных - 480.189 пользователей, 17.770 фильмов, 100.480.507 оценок. Затем эти данные были обработаны и были использованы для снятия метрик, необходимых для анализа работы системы. Значения метрик и сопутствующие графики вы можете увидеть ниже.



Результаты для различных сетей с популяциями разного размера представлены ниже. Таблицы показывают зависимость среднего количества связей в сетях от количества прошедших поколений. В первых четырёх таблицах приведены результаты полученные при использовании одноточечного кроссинговера.




Число поколений

Размер популяции

20

40

60

80

100

10

12

16

15

23

26

40

13

18

19

25

29

70

16

25

30

26

36

100

17

22

33

31

41

120

19

25

37

39

46

Таблица 1 - Одноточечный кроссинговер с элитным отбором




Число поколений

Размер популяции

20

40

60

80

100

10

13

16

15

23

27

40

14

18

19

24

25

70

16

25

30

26

36

100

17

27

34

31

33

120

19

23

37

39

46

Таблица 2 - Одноточечный кроссинговер с турнирным отбором




Число поколений

Размер популяции

20

40

60

80

100

10

15

17

15

23

36

40

13

19

18

22

33

70

18

25

29

31

35

100

17

21

28

30

39

120

21

25

37

38

44

Таблица 3 - Одноточечный кроссинговер с рулетным отбором

Можно отметить следующие закономерности:

1) Увеличение размера популяции способствует более интенсивному «росту» сети.

2) Для малых популяций (N=10) характерна некоторая хаотичность изменения числа связей.



Таблицы, отражающие зависимость числа связей при фиксированном значении мутации и переменном размере популяции, приведены в таблицах ниже.




Число поколений

Размер популяции

20

40

60

80

100

10

17

23

28

27

29

40

13

18

19

25

34

70

18

28

27

26

39

100

17

22

30

31

40

120

19

24

36

37

47

Таблица 4 - Двухточечный кроссинговер с элитным отбором




Число поколений

Размер популяции

20

40

60

80

100

10

14

17

15

23

28

40

13

19

22

24

32

70

16

23

31

28

37

100

18

26

33

32

43

120

21

27

37

39

47

Таблица 5 - Двухточечный кроссинговер с турнирным отбором




Число поколений

Размер популяции

20

40

60

80

100

10

13

16

18

21

26

40

14

18

21

23

29

70

17

24

29

28

31

100

16

27

31

33

39

120

2

26

33

37

45

Таблица 6 - Двухточечный кроссинговер с рулетным отбором

Из приведенных данных видно, что для малых популяций (N=10) характерна хаотичность изменения количества связей. Данный факт наиболее сильно выражен для одноточечного кроссинговера. Перепады, но уже не настолько сильные, также присутствуют в случаях с использованием двухточечного кроссинговера. Также можно более явно наблюдать стабилизацию числа связей для двухточечного кроссинговера. Начиная с некоторого значения, при увеличении размера популяции скорость роста среднего числа связей растет незначительно. Данное свойство можно наблюдать при сравнении среднего количества связей в популяциях из 100 и 1000 особей.

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



Рис. 4.1 Результат работы алгоритма

Как видно из графика, полученного в результате запуска программы, изначально нейронные сети не очень хорошо справляются с поставленной задачей. Однако, в ходе моделирования эволюционного процесса среднеквадратичное отклонение уменьшается.

Таким образом видно, что полученная искусственная нейронная сеть превосходит по точности предсказания тривиальный алгоритм, ставящий каждому фильму его среднюю оценку, даёт среднеквадратичное отклонение 1,0540 и вполне сопоставима с алгоритмом Cinematch среднеквадратичная ошибка которого составляет 0,9525.

Получившаяся рекомендательная система уступает существующим алгоритмам и нуждается в значительной доработке для того, чтобы использоваться в “реальных” рекомендательных системах. Для реализованной системы оптимальное значение размера списка рекомендаций - не более 10ти позиций, лучшие результаты - для 5ти позиций. При увеличении количества позиций наблюдается значительное уменьшение точности рекомендаций, а так же их “полезности” пользователю.

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

Заключение

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

Сделан обзор существующих нейроэволюционных алгоритмов. Их анализ позволил создать программную систему, способную одновременно настраивать веса связей и топологию искусственной нейронной сети. Ключевыми особенностями полученной системы являются:


  • Адаптивность мутационных изменений топологии ИНС, что позволяет получить сбалансированные структуры искусственных нейронных сетей;

  • Удаление малоинформативных входных параметров задачи.

Проведен ряд экспериментов, показавших удовлетворительные и хорошие результаты работы созданного программного обеспечения для задачи предсказания оценки фильма пользователем. В качестве данных для оценки работы полученной искусственной нейронной сети использовалась выборка реальных данных собранных компанией Netflix.

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



  • Увеличение скорости нахождения решений;

  • Возможности удаления неинформативных и малоинформативных признаков во время обучения искусственных нейронных сетей;

  • Улучшение адаптивных свойств алгоритма, таких как изменяемый размер популяции;

  • Избежание одинаковых конкурирующих решений.

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

Список использованной литературы


  1. Darrel Whitley. A Genetic Algorithm Tutorial, 1993.

  2. Mitchell M. An introduction to Genetic Algorithm. MIT Press, 1996.

  3. Koza J. R. Genetic programming: On the Programming of Computers by Means of Natural Selection (Complex Adaptive Systems). The MIT Press. MA: Cambridge, 1992

  4. Хомич А.В., Жуков Л.А Оптимизация топологии рекуррентных и многослойных нейронных сетей с применением генетических алгоритмов // Нейроинформатика-2004. Сборник научных трудов. Ч.2. М.: МИФИ, 2004. С.68-74.

  5. Стюарт Рассел Питер Норвиг Искусственный интеллект. Современный подход. 2е изд. // Издательский дом "Вильямс", 2006. 1408 с.

  6. Горбань А.Н., Россиев Д.А. Нейронные сети на персональных компьютерах. Н.: Наука, 1996. 276 с.

  7. Горбань А.Н., Обучение нейронных сетей, Спб.: "Параграф", 1990, 78 с.

  8. Жданов А.А. Автономный искусственный интеллект. М.: БИНОМ. Лаборатория знаний, 2008.

  9. Holland J. Adaptation in Natural and Artificial Systems. The University of Michigan Press, Ann Arbor, 1975.

  10. Balakrishan K., Honavar V. Properties of Genetic Representation of Neural Architectures. Iowa State University, 1995

  11. Whitley D. Genetic Algorithms and Neural Networks. // Genetic Algorithms in Engineering and Computer Science. –John Wiley, 1995. – Р. 203-216.

  12. Whitley D. A Genetic Algorithm Tutorial. // Statistics and Computing. – 1994. – №4. – Р. 65-85.

  13. Божич В.И., Лебедев О.Б., Шницер Ю.Л. Разработка генетического алгоритма обучения нейронных сетей // Перспективные информационные технологии и интеллектуальные системы. – 2001. – №1. – С. 21-24.

  14. Гладков Л. А., Курейчик В. В., Курейчик В. М. Генетические алгоритмы: Учебное пособие. — 2-е изд. — М: Физматлит, 2006. — С. 320.

  15. Цой Ю.Р., Спицын В.Г. Эволюционный подход к настройке и обучению искусственных нейронных сетей // Нейроинформатика – 2006, том 1, № 1 С.34-61.

Приложение 1 Руководство программиста

Программная реализация вышеописанной системы, написана на языка C++ с использованием методов объектно-ориентированного программирования. Работа над программным кодом была проведена в IDE Visual Studio Ultimate, что позволило не только укорить разработку, но и повысить производительность программного продукта.

Класс Neurons

Данный класс служит для моделирования работы нейрона.

Данные-члены класса нейрон:


  • double inputSignal: входной сигнал

  • double afterActivationSignal: итоговый сигнал нейрона

  • Functions function: тип функции

  • vector params: параметры нейрона

Функции класса нейрон:

  • Конструктор Neurons(): создаёт пустой нейрон

  • Конструктор Neurons(Functions function, vector params): создаёт конструктор с заданными параметрами и типом функций

  • Деструктор ~Neurons(): уничтожает нейрон

  • Функция setFunctionAndParams (Functions function, vector params): получает тип функции и параметры нейрона

  • Функция addSignal(double value): возвращает параметры нейрона

  • Функция activate(): активирует нейрон

  • Функция getAfterActivationSignal(): возвращает итоговый сигнал нейрона

  • Функция getFunction(): возвращает тип функции нейрона

  • Функция getParams(): возвращает параметры нейрона

  • Функция clone(): возвращает точную копию объекта

Класс Links

В данном классе информация о связях нейронной сети:



  • int totalLinksCount: число связей

  • map
    , double> links: список связей

Для взаимодействия с информацией о связях класс содержит следующие функции:

  • Конструктор Links(): создаёт пустой список связей

  • Деструктор ~Links(): удаляет список связей

  • Функция getReceivers (int activatorNeuronNumber): список получателей

  • Функция getWeight (int activatorNeuronNumber, int receiverNeuronNumber): получить вес связи

  • Функция addWeight (int activatorNeuronNumber, int receiverNeuronNumber, double weight): добавить вес связи

  • Функция getAllWeights(): получить веса всех связей

  • Функция setAllWeights (vector weights): задать веса всех связей

  • Функция сlone(): возвращает точную копию объекта

Класс Functions

Содержит информацию о функции нейрона.



  • int type;

  • enum ThresholdFunction {LINEAR, SIGN, SIGMA,};

Для вычисления данной

  • Functions(int);

  • Functions(void);

  • Статическая функция getRandomFunction(): возвращает случайный тип функции

  • Статическая функция getDefaultParams(int): возвращает стандартные параметры для функции

  • Функция функция calculate(double value, vector params): вычисляет значение функции в соответствии с типом и параметрами

  • Функция getType(): возвращает тип функции

  • Функция calculateLINEAR(double value, vector params): вычисляет значение линейной функции

  • Статическая функция getDefaultParamsLINEAR(): возвращает стандартные параметры для линейной функции

  • Функция функция calculateSIGN(double value, vector params); вычисляет значение пороговой функции

  • Статическая функция getDefaultParamsSIGN(): возвращает стандартные параметры для пороговой функции

  • Функция calculateSIGMA(double value, vector params); вычисляет значение сигма-функции

  • Статическая функция getDefaultParamsSIGMA(): возвращает стандартные параметры для сигмоидной функции

Класс NeuralNetwork

Данный класс содержит информацию о нейронной сети.



  • vector neurons: список нейронов

  • Links neuronsLinks: список связей нейронной сети

  • int activationIterations:

Для работы нейронной сети следует использовать следующие функции:

  • Конструктор NeuralNetwork(): создаёт искусственную нейронную сеть с параметрами по умолчанию

  • Конструктор NeuralNetwork(int numberOfNeurons): создаёт искусственную нейронную сеть с заданным числом нейронов

  • Деструктор ~NeuralNetwork(): удаляет нейронную сеть

  • Функция setNeuronFunction (int neuronNumber, Functions function, vector params): задаёт параметры конкретного нейрона

  • Функция push_backLink(int activatorNeuronNumber, int receiverNeuronNumber, double weight): добавляет связь с заданным весом

  • Функция putSignalToNeuron (int neuronIndx, double signalValue): сообщает входной сигнал нейрону

  • Функция getAfterActivationSignal (int neuronIndx): получает выходной сигнал нейрона

  • Функция activate(): активирует функцию

  • Функция getWeightsOfLinks(): возвращает список весов связей

  • Функция setWeightsOfLinks (vector weights): задаёт список весов связей

  • Функция getNeurons(): возвращает список нейронов

  • Функция getNeuronsCount(): возвращает число нейронов в сети

  • Функция setNeurons(vector newNeurons): задаёт список нейронов

  • Функция getNeuronsLinks(): возвращает список связей

Класс OptimizableNeuralNetwork

Кодирует информацию об оптимизируемой нейронной сети:



  • double weightsMutationInterval:

  • double neuronParamsMutationInterval:

Работа с оптимизируемой нейронной сетью обеспечивается следующим набором функций членов-класса:

  • Функция Crossover(): выбор конкретного оператора скрещивания искусственной нейронной сети

  • Функция TwoPointsWeightsCrossover (vector thisWeights, vector anotherWeights): двухточечный оператор скрещивания искусственной нейронной сети работающий со связями

  • Функция UniformelyDistributedWeightsCrossover (vector thisWeights, vector anotherWeights): распределённый оператор скрещивания искусственной нейронной сети работающий со связями

  • Функция TwoPointsNeuronsCrossover (vector thisNeurons, vector anotherNeurons): двухточечный оператор скрещивания искусственной нейронной сети работающий с нейронами

  • Функция UniformelyDistributedNeuronsCrossover (vector thisNeurons, vector anotherNeurons): распределённый оператор скрещивания искусственной нейронной сети работающий с нейронами

  • Функция Mutate(): выбор конкретного оператора мутации искусственной нейронной сети

  • Функция MutateWeights (vector weights): мутация изменяющая вес связи

  • Функция MutateNeuronsFunctionsParams (vector neurons): мутация изменяющая параметр нейрона

  • Функция MutateChangeNeuronsFunctions (vector neurons): мутация изменяющая тип нейрона

  • Функция ShuffleWeightsOnSubinterval (vector weights): мутация изменяющая связи путём перестановки весов

  • Функция Clone(): возвращает точную копию оптимизируемой искуственной нейронной сети

  • Статическая функция getRandomWeight(): возвращает случайное значение из подходящего для веса диапазона

Классы ответственные за работу нейронной сети

Класс GeneticAlgorithm

Класс реализующий работу генетического алгоритма.


  • Population population: популяция решений

  • vector stat: статистика поколений

  • int parentChromosomesSurviveCount: число «выживших» решений

  • int generationCount: максимальное число поколений

  • double mutationRatio: вероятность мутации

  • int mutationNumber: область мутации популяции

  • int populationNumber: размер популяции

  • int counter: счётчик прошедших популяций

Работа этого класс обеспечивается следующим классами-функциями:

  • Конструктор GeneticAlgorithm(int mutationNumber, int mutationRatio, int generationCount, int populationNumber): создаёт экземпляр реализующий работу алгоритма

  • Деструктор ~GeneticAlgorithm(void): удаляет экземпляр реализующий работу алгоритма

  • Функция GetResult(): возвращает

  • Функция CreateFirstpopulation(): создаёт начальную популяцию решений для генетического алгоритма

  • Функция ComputeFitness(): вычисляет значение функции приспособленности для текущих решений

  • Функция IsNotEnded(): проверяет достижение критерия остановки работы алгоритма

  • Функция Evolve(): выполняет конкретную итерацию работы генетического алгоритма

  • Функция Evolve(int count): выполняет заданное чисто итераций работы генетического алгоритма

  • Функция GetPopulation(): возвращает текущую популяцию

  • Функция GetBest(): возвращает лучшее решение в текущей популяции

  • Функция GetWorst():возвращает худшее решение в текущей популяции

  • Функция SetParentChromosomesSurviveCount(int parentChromosomesCount);

  • Функция GetParentChromosomesSurviveCount();

Класс Population

В данном классе содержится информация о текущей популяции.



    • int currentLength;

    • vector individuals;

Взаимодействие с этим классом производится с помощью следующих функций-членов:

    • Population(void)

    • Population(int populationLength)

    • ~Population()

    • Функция Sort(): упорядочивает по убыванию значения приспособленности оптимизируемых решений в текущей популяции

    • Функция GetLength(): возвращает размер текущей популяции

    • Функция Mutate(int ratio, int number): реализует мутацию решений популяции с заданными параметрами

    • Функция ComputeFitness(): вычисляет значение приспособленности решений в популяции

    • Функция AddChilds(Chromosome firstChild, Chromosome secondChild): добавить пару решений в популяцию

    • Функция AddChromosome(Chromosome in): добавить новое решение в текущую популяцию

    • Функция GetRandomChromosome(): возвращает случайную популяцию из текущей популяции

    • Функция GetBestFittnes(): возвращает лучшее значение приспособленности из текущей популяции

    • Функция trim(int length): уменьшает размер текущей популяции решений до заданного размера

Класс Chromosome

Этот класс содерижт информацию о решениях, хранящихся в популяции

double fittnes;

Работа этого класс обеспечивается следующими функциями-членами.



  • Chromosome()

  • Chromosome(OptimizableNeuralNetwork)

  • ~Chromosome()

  • Функция ComputeFittnes()

  • Функция GetFittnes()

  • Функция GetNeuralNetwork()
1   2   3


База даних захищена авторським правом ©mediku.com.ua 2016
звернутися до адміністрації

    Головна сторінка