Добавил:
Да поможет вам Котельников Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

M852_Antonova_1

.pdf
Скачиваний:
8
Добавлен:
23.06.2024
Размер:
8.51 Mб
Скачать

Нейронные сети LSTM лишены данного недостатка. Они разработаны специально, чтобы избежать проблемы долговременной зависимости.

Любая рекуррентная нейронная сеть имеет форму цепочки повторяющихся модулей нейронной сети. В обычной нейронной сети RNN структура одного такого модуля очень проста, например, он может представлять собой один слой (рис. 4.3) с функцией активации «tanh» (гиперболический тангенс).

Рис. 4.3. Устройство ячейки нейронной сети RNN

Структура сети LSTM также напоминает цепочку, но модули вместо одного слоя нейронной сети содержат четыре и эти слои взаимодействуют особым образом (рис. 4.4).

Рис. 4.4. Устройство ячейки сети LSTM

Ключевой компонент сети LSTM — состояние ячейки (cell state) — горизонтальная линия, проходящая по верхней части схемы (рис. 4.5).

Состояние ячейки напоминает конвейерную ленту. Она проходит напрямую через всю цепочку, участвуя лишь в нескольких линейных преобразованиях. Информация при этом не подвергается изменениям. Тем не менее сеть LSTM может удалять информацию из состояния ячейки. Этот процесс регулируется структурами, называемыми фильтрами (gates) (рис. 4.6).

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

31

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Рис. 4.5. Состояние ячейки сети LSTM (в круж-

 

 

 

 

 

 

 

 

 

 

 

 

ках представлены операции над потоками дан-

 

Рис. 4.6. Фильтр

 

 

 

ных Ct–1, поступающих в нейрон)

 

 

 

 

ячейки сети LSTM

Сигмоидальный слой возвращает числа от нуля до единицы, которые обозначают, какую долю каждого блока информации следует пропустить дальше по сети. Ноль в данном случае означает «не пропускать ничего», единица — «пропустить все». В сети LSTM три таких фильтра, позволяющих защищать и контролировать состояние ячейки.

Цель лабораторной работы — получение навыков использования сетей LSTM для обработки и генерации текста.

Постановка задачи — в среде разработки MATLAB создать сеть STM, которая сможет давать некие прогнозы.

Практическая часть

В качестве среды разработки использовать программный комплекс MATLAB R2018b. В качестве моделей сетей LSTM будут созданы нейронные сети:

••LSTM, обрабатывающая сводки о погоде и генерирующая предсказания прогноза погоды в зависимости от описания погодных условий;

••LSTM, обрабатывающая текст художественного произведения и генерирующая после обучения связанные предложения.

Генерация прогнозов погоды

В качестве начальных данных использованы данные интернет-источника: https://www.kaggle.com/grikomsn/amazon-cell-phones-reviews

Импортируем базу данных в среде MATLAB аналогично лабораторной работе № 1.

Поскольку в таблице из интернет-источника присутствует только два необходимых столбца, использовать алгоритм удаления необязательно (см. прил. 2). Изобразим распределение по классам в виде гистограммы (рис. 4.7):

•f = figure;

•f.Position(3) = 1.5*f.Position(3);

•h = histogram(SMSSpamCollection.type);

•xlabel(‘Класс’);

32

Рис. 4.7. Распределение по классам

•ylabel(‘Частота появления’);

•title(‘Распределение по классам’);

Данные классы необходимо разделить на наборы обучения, проверки и тестирования. Проценты удержания (0,3 и 0,5) позволяют получить из исходных данных 70 % для обучения, 1 % для проверочных наблюдений и 15 % для контрольных тестов:

•cvp = cvpartition(SMSSpamCollection.type,’Holdout’,0.3);

•dataTrain = SMSSpamCollection(training(cvp),:);

•dataHeldOut = SMSSpamCollection(test(cvp),:);

•cvp = cvpartition(dataHeldOut.type,’Holdout’,0.5);

•dataValidation = dataHeldOut(training(cvp),:);

•dataTest = dataHeldOut(test(cvp),:);

Далее извлечем текстовые данные из таблицы:

•textDataTrain = dataTrain.content;

•textDataValidation = dataValidation.content;

•textDataTest = dataTest.content;

•YTrain = dataTrain.type;

•YValidation = dataValidation.type;

•YTest = dataTest.type;

Для корректности вывода воспользуемся визуализацией слов с помощью облака слов, где в качестве веса выступает частота встречаемости слова в описании явления (рис. 4.8):

Рис. 4.8. Визуализация слов

33

•figure

•wordcloud(textDataTrain);

•title(‘Training Data’);

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

•textDataTrain = lower(textDataTrain);

•documentsTrain = tokenizedDocument(textDataTrain);

•documentsTrain = erasePunctuation(documentsTrain);

•textDataValidation = lower(textDataValidation);

•documentsValidation =

=tokenizedDocument(textDataValidation)

•documentsValidation =

=erasePunctuation(documentsValidation)

Для того чтобы убедиться в правильности обработки, выведем несколько строк:

•documentsTrain(1:3)

Должно получиться следующее сообщение:

•ans = 3×1 tokenizedDocument:

6 tokens: ok lar joking wif u oni

32 tokens: free entry in 2 a wkly comp to win fa cup final tkts 21st may 2005 text fa to 87121 to receive entry question std txt rate t cs apply 08452810075over18 s

11 tokens: u dun say so early hor u c already then say

Присваиваем числовые индексы словам для работы сети LSTM:

•enc = wordEncoding(documentsTrain);

Анализируя гистограмму, получаем количество слов в предложениях

(рис. 4.9):

•documentLengths = doclength(documentsTrain);

•figure;

•histogram(documentLengths);

Рис. 4.9. Длина предложений

34

•title(‘Длина предложений’);

•xlabel(‘Длина’);

•ylabel(‘Число описаний’);

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

•XTrain = doc2sequence(enc,documentsTrain,’Length’, 200);

•XValidation=doc2sequence(enc,documentsValidation, ’Length’, 200);

•XTrain(1:5)

Этап подготовки закончен. Теперь необходимо передать данные в сеть. Включим слой ввода и установим его размер, равный единице. Затем активируем слой внедрения слов и установим его размер, равный 100. Таким же размером будет обладать слой для индексов слов. Число вычислительных нейронов установим равным 360. Для задачи классификации режим вывода должен соответствовать последнему выходному нейрону. Наконец, передадим слои классификации:

•inputSize = 1;

•embeddingDimension = 100;

•numWords = enc.NumWords;

•numHiddenUnits = 360;

•numClasses = numel(categories(YTrain));

•layers = [ ...

sequenceInputLayer(inputSize)

wordEmbeddingLayer(embeddingDimension,numWords)

lstmLayer(numHiddenUnits,’OutputMode’,’last’)

fullyConnectedLayer(numClasses) softmaxLayer classificationLayer]

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

Значения параметров:

•options = trainingOptions(‘adam’, ...

‘MaxEpochs’,10, ...

‘GradientThreshold’,1, ...

‘InitialLearnRate’,0.01, ...

‘ValidationData’,{XValidation,YValidation}, ...

‘Plots’,’training-progress’, ...

‘Verbose’,false);

Далее запускаем процесс обучения сети:

•net = trainNetwork(XTrain,YTrain,layers,options);

Длительность процесса обучения составила 203 мин (рис. 4.10).

35

Рис. 4.10. Процесс обучения

Для тестов необходимо подготовить данные, применив ту же обработку, что и для данных, поступивших на обучение:

•textDataTest = lower(textDataTest);

•documentsTest = tokenizedDocument(textDataTest);

•documentsTest = erasePunctuation(documentsTest);

•XTest = doc2sequence(enc,documentsTest,’Length’,200);

•XTest(1:5)

Выполним классификацию тестовых данных с помощью сети и выведем процент совпадений:

•YPred = classify(net,XTest);

•accuracy = sum(YPred == YTest)/numel(YPred)

Теперь на основании сообщения получить его тип:

•reportsNew = [«Best telephone what i see»

«don’t buy it, never»

«I’ve had this phone for over a year and I really like it. Having never been partial to flip phones, I can appreciate this Nokia’s features. The color screen is very nice and all of the features are easy to use. The keylock is a simple two-button sequence though I do wish it had a timer for the keylock like my old phone. It has a lot of useful features, like a calculator, organizer, stopwatch and alarm, but the three games it has are too lame to play. The customizable features are nice, but lacking in variety. This isn’t the ideal phone for a guy. You’re few options are pretty girly. The ringtones also lack something to be desired, but there are a few decent ones. The battery life is pretty good,

36

nothing special, but definitely not bad. It gets me through

the average day without problems and sometimes lasts for

several days. My parents, sisters, and husband all got fancy

Samsung flip phones with cameras and all the toys, and I

must say mine works better. The battery lasts MUCH longer

and the recpetion is MUCH better. The downside to this cute

phone is the case. It’s made of very weak plastic that

cracked in a few months. Also, if you’re thinking about

getting a different case for it, DON’T! Once you take it

off, it will keep slipping off. It never attaches firmly

again, and neither does the new case you bought. I’ve read

this in other reviews too. Because of this, the last time

I dropped it the back piece popped off and the battery flew

out. Now my phone has issues. Drat. Overall, it’s a great

phone, if you’re content with the simpler things in life.

Who really uses the camera on thier phone anyway? I just

reccommend buying

a protective case for it and leaving it

on and don’t drop

the delicate thing.»];

•reportsNew =

lower(reportsNew);

•documentsNew = tokenizedDocument(reportsNew);

•documentsNew = erasePunctuation(documentsNew);

•XNew = doc2sequence(enc,documentsNew,’Length’,75);

•[labelsNew,score] = classify(net,XNew);

•[reportsNew string(labelsNew)]

Вывод

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

Задание

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

Контрольные вопросы

1.Что такое искусственная нейронная сеть?

2.Из каких основных компонентов состоит искусственная нейронная сеть?

3.Что такое рекуррентные нейронные сети?

4.Какие типы рекуррентных сетей существуют?

5.Что такое токенизация?

ЛАБОРАТОРНАЯ РАБОТА № 5 КЛАСТЕРИЗАЦИЯ МАТЕМАТИЧЕСКИХ МНОЖЕСТВ МЕТОДОМ

K-СРЕДНИХ

Цель — проверка работы алгоритмов с кластеризацией и методом k-средних.

Постановка задачи — кластеризация математического множества чисел методом k-средних.

Теоретическая часть

В машинном обучении, кроме задач обучения с учителем, когда объекты m, представленные как x1, …, xm, заданы вместе с метками в виде y(x1), …, y(xm), имеются также задачи обучения без учителя, в которых заданы только объекты типа x1, …, xm без меток. Ниже приведены примеры задач обучения без учителя.

1.Кластеризация (разбиение объектов на группы похожих).

2.Обнаружение новизны (нахождение объектов, не похожих на остальные).

3.Поиск логических закономерностей.

4.Восстановление плотности.

5.Вложение объектов в пространство малой размерности (с сохранением каких-то свойств).

6.Выделение структуры на множестве объектов (например, по изображению описать на формальном языке, что изображено).

Центральной задачей является кластеризация: разбиение объектов x1,

…, xm на группы похожих объектов — кластеры K1, …, Kl или Km (кластеры l могут быть заранее не заданы). Формулировку задачи нельзя считать достаточно четкой, поскольку непонятно, какое разбиение на кластеры правильное, а какое нет. Следует отметить, что это общее свойство задач обучения без учителя, их ставят, когда необходимо из данных получить какую-то информацию (при этом априори не конкретизируя, что именно необходимо получить). Кластеризацию применяют в следующих случаях:

1) для сокращения объема информации (кластер можно заменить одним его представителем, поскольку остальные объекты «на него очень похожи»); 2) выяснения структуры данных (например, описанные ниже иерархические методы позволяют разложить данные по «виртуальной системе

каталогов»); 3) обнаружения новизны (хотя это и отдельная задача, но «особенные»

объекты, как правило, являются представителями небольших кластеров).

38

Использование кластеризация повышает эффективность обучения с учителем: объекты контрольной выборки разбивают на кластеры и на каждом кластере обучают свой алгоритм классификации или регрессии (часто это дает существенное улучшение качества классификации/регрессии на всей выборке), при классификации/регрессии сначала определяют, в какой кластер попадает объект, потом запускают соответствующий алгоритм.

Будем считать, что объекты заданы в метрическом пространстве X с метрикой ρ. В некоторых случаях вычисляют среднее арифметическое объектов, если объекты задаются признаковым описанием (как было описано в лабораторной работе № 4). Если известны только попарные расстояния между объектами, то можно среднее арифметическое

1 r

r i=1 zr

заменить объектом

zj = arg min (max p (zj, zi))

(«центр» в метрическом пространстве).

Рассмотрим наиболее известный алгоритм k-средних. Инициализация:

случайно генерируем центры кластеров z1, …, z j в пространстве X.

Приписывание:

относим объект к тому кластеру, к центру которого он ближе, т. е.

 

{

 

i

}

K j =

 

xt

ρ(xt ,z j ) = minρ(xt ,z j )

(если минимум достигается на нескольких центрах, то относим объект к одному из подходящих кластеров).

Адаптация:

пересчитываем центры (чтобы они действительно стали «центрами»)

z j = K1j xt K j xt , j {1, 2,..., l}

(если какой-то кластер пустой, то либо кластер удаляется, либо центр остается). Если кластеризация не изменяется две итерации подряд (не изменяют положения центры кластеров), тогда алгоритм завершает работу, иначе —

переход в начальное состояние.

Термин «k-средних» является устоявшимся. В данном случае алгоритм правильнее назвать «l-средних» (хотя число центров кластеров может уменьшиться в результате работы алгоритма).

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

39

Есть так называемая «мягкая» форма алгоритма, в которой на первом этапе идет не приписывание объектов кластерам, а вычисление степени принадлежности

p

(xt ) =

e−βρ(xt, z j )

,

l

j

 

 

 

 

e−βρ(xt, z j )

 

 

 

i=1

 

на втором — центры вычисляются по формуле

 

m

 

 

pj (xt )xt

 

z j =

t =1

.

m

 

pj (xt )

 

 

t =1

 

Ответ может быть не только «четкое разбиение на кластеры», а число кластеров и степень принадлежности к каждому из них. Подобная задача называется нечеткой кластеризацией. Ее можно решать также с помощью EM-алгоритма, если известно, что каждый кластер представляет собой реализацию случайной величины с распределением известного вида.

Следует отметить недостатки алгоритма k-средних, которые присущи многим другим алгоритмам кластеризации:

1)результат не определен однозначно (многое зависит от начальной позиции центров);

2)необходимо выбирать параметр l3.

Практическая часть

Программное задание метода k-средних:

выборка

•X =

[randn([5 2]); randn([5 2]) + 1];

•m

=

size(X,1); % число точек в выборке

•k

=

3; % число кластеров

сгенерировать центры (k случайных точек выборки)

•r = randperm(m);

•centers = X(r(1:k),:);

•olderror = 0;

•newerror = Inf;

пока ошибка не стабилизируется

•while (olderror~=newerror)

•olderror = newerror;

матрица попарных расстояний

•D = sqrt(sum(abs(repmat(permute(X, [1 3 2]), ...

[1 size(centers,1) 1]) – ...

repmat(permute(centers, [3 1 2]), [m 1 1]) ).^2, 3));

40

Соседние файлы в предмете Системы искусственного интеллекта