Вы находитесь на странице: 1из 69

1

МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ


ДОНЕЦКОЙ НАРОДНОЙ РЕСПУБЛИКИ
Государственное образовательное учреждение
высшего профессионального образования
«ДОНЕЦКИЙ НАЦИОНАЛЬНЫЙ УНИВЕРСИТЕТ»
Физико-технический факультет
Кафедра радиофизики и инфокоммуникационных технологий
Направление подготовки 10.03.01 Информационная безопасность

К защите допустить:
Зав. кафедрой радиофизики и
инфокоммуникационных технологий
_____________ д.т.н., проф. В.В. Данилов
«_____» ________________________
2020г.

ДИПЛОМНАЯ РАБОТА

на тему: «Обработка и распознавание текста с помощью нейронных


сетей»

Студента: Михайлова Павла Сергеевича

Научный руководитель: к.т.н, доцент Шелехова О. Г.__________

Работа представлена на кафедру «___» _______2020г. рег. № ______ _______________

Донецк 2020г.
2

СОДЕРЖАНИЕ 2
ВВЕДЕНИЕ 3
1. Архитектуры нейронных сетей для обработки текстов 6
1.1 Рекуррентные нейронные сети 6
1.2 Одномерные сверточные нейронные сети 13
1.3 Сети с вниманием 18
2. Конфигурация нейронной сети для обработки текстов 20
2.1 Функции активации 20
2.2 Функции потерь 27
2.3 Методы представление текста для обработки нейронной сетью
29
2.4 Обучение нейронной сети 31
3. Реализация нейронной сети 36
3.1 Нейронная сеть, обученная на датасете IMDb 44
3.2 Нейронная сеть, обученная на датасете Yelp 53
4. Охрана труда 55
4.1 Регулировочные операции 55
4.2 Электромонтажные работы 56
4.3 Работа с компьютером 57
ЗАКЛЮЧЕНИЕ 59
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ 60
Приложение 1 63
Приложение 1 64
3

ВВЕДЕНИЕ
Широкое развитие компьютерных технологий и коммуникаций
привело к появлению мощных информационных массивов и потоков,
аналогов которым в прошлом не существовало. Например, ежедневный
объем публикаций электронных средств массовых информаций не позволяет
даже бегло с ними ознакомиться одному человеку. Распределение этой
задачи среди нескольких исполнителей приведет к проблеме коммуникации
и координирования работ между ними. В то же время анализ публикаций
может быть очень ценным средством получения актуальной информации,
ценной для получения компанией конкурентного преимущества. Многие
фирмы имеют специальные отделы информационной безопасности, которые
отслеживают и анализируют публикации, посвященные компании и
конкурентам. Те же методы могут использоваться, например, для проверки
новых сотрудников. Изучая след человека, оставленный в интернет-форумах,
блогах и социальных сетях, можно сделать определенные выводы о его
личности. [1]
Постоянное изучение всего потока информации по конкретной
тематике, более того, даже формирование такого потока без применения
автоматизированных средств – практически безнадежная задача. И – конечно
же – эти средства появляются. Они могут принимать разнообразные формы,
но нас интересуют методы, лежащие в основе этих средств. В течение
последних 20 лет активно развиваются методы интеллектуального анализа и
получения информации из массивов данных. Примером слабо
структурированных данных может служить простой текст. Другим примером
(так называемых полуструктурированных данных) служат XML-документы.
Текст является универсальным средством представления, накопления и
передачи знаний в человеческом обществе. Кроме того, преобразовать
текстовый документ в реляционное представление практически невозможно
4

без потери семантики текста и отношений между сущностями, не говоря уж о


накладных расходах на подобное преобразование.
Главными задачами анализа текста являются:
- классификация. Цель классификации состоит в определении
некоторого набора категорий из заранее заданного множества, к которым
относится документ. Классификация может использоваться для определения
тематики документов, установки тегов и тому подобное.
- кластеризация документов. Целью этого процесса является
автоматическое выделение групп семантически похожих документов среди
заданного фиксированного множества. Группы формируются исключительно
на основе попарной схожести описаний документов. Никакие
характеристики групп не задаются заранее.
- автоматическое аннотирование. Позволяет сократить текст, сохраняя
его смысл. При этом, объем аннотации, как правило, регулируется
пользователем, что позволяет выбрать желаемый уровень детализации.
- извлечение ключевых понятий. Позволяет идентифицировать факты и
отношения в тексте. Часто такими понятиями оказываются собственные
имена существительные: имена людей, названия организаций и другие.
- навигация по тексту. Предоставляет в распоряжение пользователя
компактное интерактивное изображение массива документов с выделенными
темами и значимыми терминами. Пользователь может выбрать
интересующее его подмножество документов и перемещаться между
связанными текстами, например, с помощью автоматически
сгенерированных гиперссылок.
- анализ трендов. Позволяет идентифицировать определенные
тенденции в наборах документов. Это может быть использовано, например,
для обнаружения перемещения интересов компании от одного сегмента
рынка к другому.
5

- поиск ассоциаций. Заключается в выявлении ассоциативных


отношений между ключевыми понятиями текста.
Для решения вышеприведенных задач разработан ряд методов. Как
правило, это обычные алгоритмические методы. С другой стороны,
существует класс мощных методов, которые хороши для решения, как
минимум, некоторых из указанных задач. Это нейросетевые методы. Теория
нейронных сетей возникла и развилась, как попытка объяснить принципы
функционирования мозга. Нейронные сети оказались весьма гибким и
эффективным методом решения некоторых задач, которые плохо решаются
другими методами.[1]
Цель исследования - разработка и реализация программы для
обработки и распознавания текста с помощью нейронных сетей.
Объект исследования – текстовые данные.
Предмет исследования - нейросетевые методы распознавания и
обработки текстовых данных.
Поставленные задачи:
1. Разработка и реализация программы для обработки текста
2. Сравнение эффективности различных архитектур нейронных сетей
для обработки текста
3. Анализ результатов
6

1. АРХИТЕКТУРЫ НЕЙРОННЫХ СЕТЕЙ ДЛЯ ОБРАБОТКИ


ТЕКСТОВ

1.1 Рекуррентные нейронные сети


На рисунке 1.1 представлена архитектура рекуррентной нейронной сети.

Рисунок 1.1. Архитектура рекуррентной нейронной сети.


В каждый момент времени каждый узел берет входные данные
предыдущих узлов, и таким образом образуется обратная петля. Эту петлю
можно развернуть, и мы получим такую цепочку ячеек, как на картинке
внизу. Каждый раз на вход мы запускаем xt и at−1 (выход с прошлого узла) и
получаем ht (выход этого узла). ht передается на следующий узел. И так до
тех пор, пока все шаги не будут пройдены (рисунок 1.2).

Рисунок 1.2. Принцип работы рекуррентной нейронной сети.


7

Как вычисляется каждое выходное значение на математическом языке,


можно увидеть ниже:
at=f(ht−1, xt)
g(x)=tanhx
at=g(Whh⋅ ht−1+Wxh⋅ xt)
at=tanhWhh⋅ ht−1Wxh⋅ xt
ht=Why⋅ at
Обратное распространение ошибки происходит в направлении,
обратном стрелкам на рисунке. Как и во всех подобных операциях, мы
находим значение функции потерь и получаем градиенты, чтобы уточнить
значения весов. Интересно то, что в RNN обратное распространение
проходит справа налево. Такое обновление всех параметров, начиная с
последнего шага и заканчивая первым, называется обратным
распространением во времени.[2][3]
LSTM-сети — сети долгой краткосрочной памяти
Минус классических RNN в том, что чем больше шагов, тем хуже
сохраняется контекст. Чтобы понимать контекст в шаге t+1, нам нужно знать
представления из шагов 0 и 1 (см. рисунок 1.3). Но они находятся очень
далеко от шага t+1, поэтому не могут повлиять на вычисления в нем.
Например: “Я вырос во Франции… Свободно говорю по-французски”. Чтобы
на слове “по-французски” понять, что это именно говорящий, нужно
вернуться далеко назад в предложении, но сделать это невозможно. Из-за
этой особенности на больших последовательностях происходит исчезновение
градиента, а это значит, что модель не всегда может хорошо учиться. В
общем, RNN обладают только краткосрочной памятью.
8

Рисунок 1.3. Шаги в RNN-сети


Шмидхубер и Хохрайтер придумали решение: они создали модель,
которую и назвали долгой краткосрочной памятью (рисунок 1.4).

Рисунок 1.4. Сеть долгой краткосрочной памяти


Принцип LSTM-сетей похож на принцип классических RNN, но каждая
ячейка выполняет больше операций, что позволяет им запоминать
долговременные зависимости. Давайте посмотрим на каждую операцию:
1. Фильтр забывания (forget gate)
Мы получаем входные данные для этого шага и значения,
представленные в предыдущем шаге, которые сцепляются и передаются в
сигмоидную функцию. На выходе она выводит значение ft от 0 до 1.
Затем ft и ct−1 поэлементно умножаются: если получается значение 0,
то ft исключается из ct−1, если 1, то включается (рисунок 1.5).
9

Рисунок 1.5. Фильтр забывания


2. Фильтр обновления (update gate)
На рисунке ниже показана операция фильтра обновления. Мы сцепляем
входные значения и представление из предыдущего шага. Прогоняя их через
функцию тангенса, мы получаем несколько значений, из которых с помощью
сигмоидной функции выбираем то, которое нужно включить в ct−1 (рисунок
1.6).

Рисунок 1.6. Фильтр обновления


3. Фильтр выхода (output gate)
Мы сцепляем входные данные шага с представлением из прошлого
шага и передаем их в сигмоидную функцию, чтобы решить, какие значения
могут быть использованы как выходные. Состояние ячейки передаем в
функцию тангенса и с помощью поэлементного умножения отбираем
значение, которое включаем в c1−t (рисунок 1.7).
10

Рисунок 1.7. Фильтр выхода


В LSTM очень много операций проходит в каждой ячейке, из-за чего
сильно возрастает время обучения по сравнению с RNN. Есть альтернатива
— GRU, сеть, которая также может оперировать долговременными
зависимостями, но при этом быстрее обучается.[2][3]
GRU — управляемый рекуррентный блок
В отличии от LSTM у GRU нет состояния ячейки и есть только два
фильтра. (рисунок 1.8)

Рисунок 1.8. GRU


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

какую информацию из предыдущих шагов нужно отбросить. На рисунке zt —


это фильтр обновления, он находит значения, которые должны пойти на
следующие шаги с помощью сигмоидной функции. ht — это фильтр сброса,
который перемножает сцепленные входные данные этого шага и
представления предыдущего с rt и выдает значения из предыдущего шага,
которые мы бы хотели бы убрать.
Несмотря на то, что GRU эффективнее в вычислительном плане из-за
меньшего количества фильтров, он все равно стоит на втором месте после
LSTM в плане исполнения. Поэтому GRU можно использовать тогда, когда
нам нужно быстро обучить модель, а вычислительных мощностей не хватает.
[2][3]
Двунаправленная RNN
На рисунке 1.9 представлена архитектура двунаправленной
рекуррентной нейронной сети.

Рисунок 1.9. Двунаправленная RNN


Главное качество всех предыдущих моделей — обучение не только на
своих входных данных, но и на представлении с предыдущих шагов. Но
иногда нужно учитывать следующие шаги, чтобы лучше понимать контекст.
Например, у нас есть два предложения “Он сказал, что Тэдди продаются со
скидкой” и “Он сказал, что Тэдди Рузвельт был великим президентом”. В
этих предложениях, зная только “Тэдди” и предыдущие слова, трудно
понять, идет ли речь о президенте или игрушках. Для того, чтобы
12

определиться, нам нужно посмотреть на следующие шаги. С


двунаправленной RNN это возможно.
На рисунке выше представлена архитектура этой нейросети. Видно, что
двунаправленная RNN также состоит из ячеек, как и однонаправленная RNN.
Разве что теперь есть два типа связей: одна направлена вперед во времени,
что дает возможность учитывать представления с предыдущих шагов, а
другая направлена обратно, что позволяет учитывает еще и представления
шагов, стоящих впереди.
И вычисление происходит уже в 2 шага:
Мы движемся слева направо, вычисляя значения с первого до
последнего шага.
Мы движемся справа налево, вычисляя значения с последнего шага до
первого.[3][4]
13

1.2 Сверточные нейронные сети


Сверточные нейронные сети первоначально не предназначались для
работы с текстом, они использовались в «компьютерном зрении» и
распознавании образов. Сверточная нейронная сеть — это особый вид
нейронных сетей прямого распространения. Под прямым распространением
понимается то, что распространение сигналов по нейронам идет по порядку,
от первого слоя до последнего. Скрытых слоев в сети может быть достаточно
много, всё зависит от количества данных и сложности задачи. На рисунке
1.10 представлена архитектура сверточной нейронной сети.

Рисунок 1.10. Сверточная нейронная сеть

Основной особенностью таких сетей является наличие чередующихся


слоев типа «свертка — субдискретизация», которых может быть множество.
Операция свертки подразумевает, что каждый фрагмент входа поэлементно
умножается на небольшую матрицу весов (ядро), а результат суммируется
(рисунок 1.11). Эта сумма является элементом выхода, который называется
картой признаков. Взвешенная сумма входов пропускается через функцию
активации.[5][6]
14

Рисунок 1.11. Операция свертки


Сверточный слой является базовым для сверточных нейронных сетей.
Есть еще один базовый слой для CNN — это так называемый pooling-слой.
Pooling-слой представляет собой нелинейное уплотнение карты
признаков, проходя нелинейное преобразование. Пулинг интерпретируется
как разбиение карты признаков на более мелкие матрицы, нахождение их
максимальных элементов, т. е. происходит увеличение «глубины» значений.
Иначе говоря, вместо суммирования всех результатов умножения (входных
данных по нашему условию), мы выбираем просто максимальный элемент.
Это называется max-pooling. Вместо функций максимум может быть другая
арифметическая (или даже более сложная) функция.[5][7]
Стандартные CNN работают с матрицами. Принцип работы CNN при
обработке текста показан на рисунке 1.12.

Рисунок 1.12. CNN для обработки текста


15

Для того, чтобы понять, как CNN работают с текстом, необходимо


знать, что такое embedding.
Embedding — это сопоставление точки в каком-то многомерном
пространстве объекту, в нашем случае — слову. Примером, возможно, самым
известным такого embedding является Word2Vec. У него, кстати, есть
семантические свойства, вроде word2vec(“king”) - word2vec(“man”) +
word2vec(“woman”) ~= word2vec(“queen”). Так вот, мы берем embedding для
каждого слова в нашем тексте и просто ставим все вектора в ряд, получая
искомую матрицу (рис 1.13).

Рисунок 1.13. Embedding


В матрице картинки у нас три измерения — ширина, высота и каналы.
Здесь у нас есть только ширина — это последовательность токенов в
предложении, и каналы, потому что embedding слова имеет смысл только
полностью, каждое отдельное его измерение нам ни о чем не скажет.
16

Свертка у нас может ходить только по одной оси — по ширине.


Поэтому для того, чтобы отличить от стандартной свертки, ее называют
одномерной (1D convolution).
Max Over Time Pooling - это уже обсуждавшийся выше max-pooling,
только примененный ко всей последовательности сразу (то есть ширина его
окна равна всей ширине матрицы).
Примеры использования сверточных нейронных сетей для текстов.
Cверточные нейронные сети хороши там, где нужно увидеть кусочек
или всю последовательность целиком и сделать какой-то вывод из этого. То
есть это задачи, например, детекции спама, анализа тональности или
извлечения именованных сущностей. Разбор статей может быть сложен для
вас, если вы только что познакомились с нейронными сетями, этот раздел
можно пропустить.
В работе [8] Юн Ким (Yoon Kim) показывает, что CNN хороши для
классификации предложений на разных датасетах. Картинка, использованная
для иллюстрации раздела выше — как раз из его работы. Он работает с
Word2Vec, но можно и работать непосредственно с символами.
В работе [9] авторы классифицируют тексты исходя прямо из букв,
выучивая embedding для них в процессе обучения. На больших датасетах они
показали даже лучшие результаты, чем сети, работавшие со словами.
У сверточных нейронных сетей есть существенный недостаток, по
сравнению с RNN — они могут работать только со входом фиксированного
размера (т.к. размеры матриц в сети не могут меняться в процессе работы).
Но авторы работы [10] смогли решить эту проблему. Так что теперь и это
ограничение снято.
В работе [11] авторы классифицируют тексты исходя прямо из
символов. Они использовали набор из 70 символов для того чтобы
представить каждый символ как one-hot вектор и установили фиксированную
длину текста в 1014 символа. Таким образом, текст представлен бинарной
17

матрицей размером 70x1014. Сеть не имеет представления о словах и видит


их как комбинации символов, и информация о семантической близости слов
не предоставлена сети, как в случаях заранее натренированных Word2Vec
векторов. Сеть состоит из 1d conv, max-pooling слоев и двух fully-connected
слоев с дропаутом. На больших датасетах они показали даже лучшие
результаты, чем сети, работавшие со словами. К тому же этот подход заметно
упрощает preprocessing шаг что может поспособствовать его использованию
на мобильных устройствах.
В работе [12] авторы пытаются улучшить применение CNN в NLP
использованием наработок из компьютерного зрения. Главные тренды в
компьютерном зрении в последнее время - это увеличение глубины сети и
добавление так называемых skip-связей, которые связывают слои, которые не
соседствуют друг с другом. Авторы показали, что те же принципы
применимы и в NLP, они построили CNN на основе символов с 16-
размерными embedding, которое учились вместе с сетью. Они натренировали
сети разной глубины (9, 17, 29 и 49 conv слоёв) и поэкспериментировали со
skip-связями, чтобы выяснить, как они влияют на результат. Они пришли к
выводу, что увеличение глубины сети улучшает результаты на выбранных
датасетах, но производительность слишком глубоких сетей (49 слоев) ниже
чем умеренно глубоких (29 слоев). Применение skip-связей привел к
улучшению результатов сети из 49 слоев, но все равно не превзошел
показатель сети с 29 слоями.
Другая важная особенность CNN в компьютерном зрении — это
возможность использования весов сети, натренированной на одном большом
датасете (типичный пример — ImageNet), в других задачах компьютерного
зрения. В работе [6] авторы исследуют применимость этих принципов в
задаче классификации текстов с помощью CNN с word embedding. Они
изучают, как перенос тех или иных частей сети (Embedding, conv слои и fully-
connected слои) влияет на результаты классификации на выбранных
18

датасетах. Они приходят к выводу что в NLP задачах семантическая близость


источника, на котором заранее тренировалась сеть, играет важную роль, то
есть сеть, натренированная на рецензиях к фильмам, будет хорошо работать
на другом датасете с кинорецензиями. К тому же они отмечают, что
использование тех же embedding для слов увеличивает успех трансфера и
рекомендуют не замораживать слои, а дотренировывать их на целевом
датасете.[6]
19

1.3. Attention-сети
Attention представляет собой способ сообщить сети, на что стоит
обратить больше внимания, то есть сообщить вероятность того или иного
исхода в зависимости от состояния нейронов и поступающих на вход
данных. Выявление важных факторов осуществляется через метод обратного
распространения ошибки, подобно тому как это делается для свёрточных
сетей.[7]
При обучении, Attention демонстрирует свою вероятностную природу.
Сам по себе механизм формирует матрицу весов важности. Если бы мы не
обучали Attention, мы могли бы задать важность, например, эмпирически
(генерал важнее прапорщика). Но когда мы обучаем сеть на данных,
важность становится функцией вероятности того или иного исхода в
зависимости от поступивших на вход сети данных. Например, если бы
проживая в Царской России мы встретили генерала, то вероятность получить
шпицрутенов была бы высока. Удостоверившийся в этом можно было бы
через несколько личных встреч, собрав статистику. После этого наш мозг
выставит соответствующий вес факту встречи данного субъекта и поставит
маркеры на погоны и лампасы. Надо отметить, что выставленный маркер не
является вероятностью: сейчас встреча генерала повлечёт для вас
совершенно иные последствия чем тогда, кроме того вес может быть больше
единицы. Но, вес можно привести к вероятности, нормировав его.[7][13]
Вероятностная природа механизма Attention при обучении проявляется
в задачах машинного перевода. Например, сообщим сети, что при переводе с
русского на английский слово Любовь переводится в 90% случаев как Love, в
9% случаях как Sex, в 1% случаях как иное. Сеть сразу отметёт множество
вариантов, показав лучшее качество обучения. При переводе мы сообщаем
сети: «при переводе слова любовь обрати особое внимание на английское
слово Love, также посмотри может ли это всё же быть Sex”.
20

Подход Attention применяться для работы с текстом, а также звуком и


временными рядами. Для обработки текста широко используются
рекуррентные нейронные сети (RNN, LSTM, GRU). Attention может либо
дополнять их, либо заменять их, переводя сеть к более простым и быстрым
архитектурам.
Одно из самых известных применений Attention это применение его
для того, чтобы отказаться от рекуррентной сети и перейти к полносвязной
модели. Рекуррентные сети обладают серией недостатков: невозможность
осуществлять обучение на GPU, быстро наступающее переобучение. С
помощью механизма Attention мы можем выстроить сеть способную к
изучению последовательностей на базе полносвязной сети, обучить её на
GPU, использовать droput.
Attention широко применяется для улучшения работы рекуррентных
сетей, например, в области перевода с языка на язык. При использовании
подхода кодирование / декодирование, которое достаточно часто
применяется в современном ИИ (например, вариационные
автокодировщики). При добавлении между кодировщиком и
декатировщиком слоя Attention результат работы сети заметно улучшается.
[13]
21

2. КОНФИГУРАЦИЯ НЕЙРОННОЙ СЕТИ ДЛЯ ОБРАБОТКИ


ТЕКСТОВ
2.1 Функции активации
Функция активации определяет выходное значение нейрона в
зависимости от результата взвешенной суммы входов и порогового значения.
[3]
Ступенчатая функция активации
Первый вопрос - что считать границей активации для активационной
функции. Если значение Y больше некоторого порогового значения, считаем
нейрон активированным. В противном случае говорим, что нейрон
неактивен:
 Функция А = активирована, если Y > граница, иначе нет.
 Другой способ: A = 1, если Y > граница, иначе А = 0.
Данная функция называется ступенчатой. Такая функция представлена
на рисунке 2.1.

Рисунок 2.1. Ступенчатая функция


Функция принимает значение 1 (активирована), когда Y > 0 (граница),
и значение 0 (не активирована) в противном случае.
Ступенчатая функция хороша, если нужен бинарный классификатор —
модель, которая должна говорить “да” или “нет” (активирован или нет).
22

Ступенчатая функция сделает это — она в точности выводит 1 или 0. Однако


для классификации многих классов эта функция не подходит.[3][14]
23

Линейная функция активации


Линейная функция представляет собой прямую линию и
пропорциональна входу (рисунок 2.2).
f ( x )=cx

Рисунок 2.2. Линейная фукнция


Такой выбор активационной функции позволяет получать спектр
значений, а не только бинарный ответ. Можно соединить несколько
нейронов вместе и, если более одного нейрона активировано, решение
принимается на основе применения операции max (или softmax). Но и здесь
не без проблем.
Производная от f(x)=cx по x равна с. Это означает, что градиент никак
не связан с Х. Градиент является постоянным вектором, а спуск производится
по постоянному градиенту. Если производится ошибочное предсказание, то
изменения, сделанные обратным распространением ошибки, тоже постоянны
и не зависят от изменения на входе delta(x).
Существует и другая проблема. Рассмотрим связанные слои. Каждый
слой активируется линейной функцией. Значение с этой функции идет в
следующий слой в качестве входа, второй слой считает взвешенную сумму
на своих входах и, в свою очередь, включает нейроны в зависимости от
другой линейной активационной функции.
24

Это означает, что два слоя (или N слоев) могут быть заменены одним
слоем. В результате, вся нейронная сеть все равно будет подобна одному
слою с линейной функцией активации (комбинация линейных функций
линейным образом — другая линейная функция).[3][14]
Сигмоида
График сигмоидной функции представлен на рисунке 2.3.
1
f ( x )=
1+e− x

Рисунок 2.3. Сигмоида


Сигмоида выглядит гладкой и подобна ступенчатой функции.
Во-первых, сигмоида — нелинейна по своей природе, а комбинация
таких функций производит тоже нелинейную функцию. Теперь мы можем
стэкать слои.
Еще одно достоинство такой функции — она небинарна, что делает
активацию аналоговой, в отличии от ступенчатой функции. Для сигмоиды
также характерен гладкий градиент.
В диапазоне значений X от -2 до 2 значения Y меняется очень быстро.
Это означает, что любое малое изменение значения X в этой области влечет
существенное изменение значения Y. Такое поведение функции указывает на
то, что Y имеет тенденцию прижиматься к одному из краев кривой.
Сигмоида хорошо подходит для задач классификации. Она стремится
привести значения к одной из сторон кривой (например, к верхнему
25

при х=2 и нижнему при х=-2). Такое поведение позволяет находить четкие


границы при предсказании.
Другое преимущество сигмоиды над линейной функцией заключается в
следующем. В первом случае имеем фиксированный диапазон значений
функции — [0,1], тогда как линейная функция изменяется в пределах (-inf,
inf). Такое свойство сигмоиды очень полезно, так как не приводит к ошибкам
в случае больших значений активации.
Сегодня сигмоида является одной из самых частых активационных
функций в нейросетях. Но и у неё есть недостатки, на которые стоит
обратить внимание.
При приближении к концам сигмоиды значения Y имеют тенденцию
слабо реагировать на изменения в X. Это означает, что градиент в таких
областях принимает маленькие значения. А это, в свою очередь, приводит к
проблемам с градиентом исчезновения.
При приближении активационной функции к почти горизонтальной
части кривой на обеих сторонах значение градиента мало или исчезает (не
может сделать существенного изменения из-за чрезвычайно малого
значения). Нейросеть отказывается обучаться дальше или делает это крайне
медленно (в зависимости от способа использования или до тех пор, пока
градиент/вычисление не начнет страдать от ограничений на значение с
плавающей точкой). Существуют варианты работы над этими проблемами, а
сигмоида всё ещё очень популярна для задач классификации.[3][14][15]
Гиперболический тангенс
Еще одна часто используемая активационная функция —
гиперболический тангенс (рисунок 2.4)
2
f ( x )=tahn ( x ) =
1+e−2 x
Гиперболический тангенс очень похож на сигмоиду. И
действительно, это скорректированная сигмоидная функция.
26

tahn ( x )=2 sigmoid ( 2 x )−1

Рисунок 2.4. Гиперболический тангенс


Поэтому такая функция имеет те же характеристики, что и у сигмоиды,
рассмотренной ранее. Её природа нелинейна, она хорошо подходит для
комбинации слоёв, а диапазон значений функции -(-1, 1). Поэтому нет
смысла беспокоиться, что активационная функция перегрузится от больших
значений. Однако стоит отметить, что градиент тангенциальной функции
больше, чем у сигмоиды (производная круче). Решение о том, выбрать ли
сигмоиду или тангенс, зависит от ваших требований к амплитуде градиента.
Также, как и сигмоиде, гиперболическому тангенсу свойственная проблема
исчезновения градиента.
Тангенс также является очень популярной и используемой
активационной функцией.[4][15]
ReLu
Следующая в нашем списке — активационная функция ReLu,
f ( x )=max ⁡(0 , x)
27

Пользуясь определением, становится понятно, что ReLu возвращает


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

Рисунок 2.5 ReLu


На первый взгляд кажется, что ReLu имеет все те же проблемы, что и
линейная функция, так как ReLu линейна в первом квадранте. Но на самом
деле, ReLu нелинейна по своей природе, а комбинация ReLu также
нелинейна. (На самом деле, такая функция является
хорошим аппроксиматором, так как любая функция может быть
аппроксимирована комбинацией ReLu). Это означает, что мы можем стэкать
слои.
Следующий пункт — разреженность активации. Использование
сигмоиды или гиперболического тангенса будет влечь за собой активацию
всех нейронов аналоговым способом. Это означает, что почти все активации
должны быть обработаны для описания выхода сети. Другими
словами, активация плотная, а это затратно. В идеале мы хотим, чтобы
некоторые нейроны не были активированы, это сделало бы активации
разреженными и эффективными.
ReLu позволяет это сделать. В сети со случайно инициализированными
весами (или нормализированными) примерно 50% активаций равны 0 из-за
характеристик ReLu (возвращает 0 для отрицательных значений х). В такой
28

сети включается меньшее количество нейронов (разреженная активация), а


сама сеть становится легче.
Однако из-за того, что часть ReLu представляет из себя
горизонтальную линию (для отрицательных значений X), градиент на этой
части равен 0. Из-за равенства нулю градиента, веса не будут
корректироваться во время спуска. Это означает, что пребывающие в таком
состоянии нейроны не будут реагировать на изменения в ошибке/входных
данных (просто потому, что градиент равен нулю, ничего не будет меняться).
Такое явление называется проблемой умирающего ReLu (Dying ReLu
problem). Из-за этой проблемы некоторые нейроны просто выключатся и не
будут отвечать, делая значительную часть нейросети пассивной. Однако
существуют вариации ReLu, которые помогают эту проблему избежать.
Например, имеет смысл заменить горизонтальную часть функции на
линейную. Если выражение для линейной функции задается выражением y =
0.01x для области x < 0, линия слегка отклоняется от горизонтального
положения. Существует и другие способы избежать нулевого градиента.
Основная идея здесь — сделать градиент неравным нулю и постепенно
восстанавливать его во время тренировки.
ReLu менее требовательно к вычислительным ресурсам, чем
гиперболический тангенс или сигмоида, так как производит более простые
математические операции. Поэтому имеет смысл использовать ReLu при
создании глубоких нейронных сетей.[4][15]
29

2.2. Функции потерь


Функция потерь находится в центре нейронной сети. Она используется
для расчета ошибки между реальными и полученными ответами. Глобальная
цель — минимизировать эту ошибку. Таким образом, функция потерь
эффективно приближает обучение нейронной сети к этой цели.[3]
Функция потерь измеряет «насколько хороша» нейронная сеть в
отношении данной обучающей выборки и ожидаемых ответов. Она также
может зависеть от таких переменных, как веса и смещения.
Функция потерь одномерна и не является вектором, поскольку она
оценивает, насколько хорошо нейронная сеть работает в целом.
Функция потерь в нейронной сети должна удовлетворять двум
условиям:
 Функция потерь должна быть записана как среднее;
 Функция потерь не должна зависеть от каких-либо
активационных значений нейронной сети, кроме значений, выдаваемых на
выходе.
В качестве функции потери часто используется среднеквадратическая
ошибка или бинарная перекрестная энтропия.[15][16]
Среднеквадратическая ошибка:
M
1
ε= ∑ ( a − y j )2
2 j=1 j
Бинарная перекрестная энтропия используется при бинарной
классификации с условной вероятностью на выходе. Предположим, что
имеются два целых класса, обозначаемых 0 и 1. Выход классификатора ^y
передается сигмоидной функции σ ( x )=1/ ¿, которая отображает его в диапазон
[0,1], и результат интерпретируется как условная вероятность
^y =σ (~y )=P( y=1∨x). Правило предсказания имеет вид:

prediction= 0 , ^y <0.5
{
1 , ^y > 0.5
30

Сеть обучается максимизировать логарифмическую условную


вероятность logP ( y=1∨x ) для каждого обучающего примера ( x , y ).

Логистическая потеря определяется следующим образом:


Llogistic =( ^y , y )=− ylog ^y −( 1− y ) log ⁡( 1−^y )

Логистическая потеря полезна, когда нужно, чтобы сеть порождала


условную вероятность класса для проблемы бинарной классификации. При
этом предполагается, что выходной слой преобразуется сигмоидной
функцией.[15][16]
31

2.3. Представление текста в цифровом виде для нейронной сети


Входными данными для нейронной сети является числа. Поэтому, для
того, чтобы нейронная сеть работала с текстом, необходимо этот текст
перевести в набор чисел. Преобразование текстовых данных в набор чисел,
которые потом будет анализировать нейронная сеть, называется
векторизация.
На первом этапе необходимо разбить текст на отдельные части, каждая
из которых будет представляться в цифровом виде отдельно. Текст можно
разбить на отдельные символы (буквы, цифры, знаки препинания), слова или
предложения.
После разбития текста на отдельные токены, каждый токен необходимо
преобразовать в число. Этот процесс и называется векторизация.
При числовом кодировании каждому токену назначается отдельный
числовой код. Это может быть частота, с которой токен встречается в тексте,
или некая кодировка (ASCII, UTF-8). [3][7]
One hot encoding
Другой подход – когда каждому токену ставится в соответствие не
одно число, а целый вектор, который содержит несколько чисел. Самый
простой вариант – использовать формат one hot encoding. В этом случае
вектор содержит столько чисел, сколько возможно использовать токенов, при
этом значения всех элементов вектора равны 0, кроме одного, который
соответствует нужному нам токену (его значение – 1).[3][17]
На первом этапе мы ограничиваем максимальное количество слов,
которые будем использовать для анализа текста, и создаем вектор
соответствующей длины. С одной стороны, это может показаться
ограничением – при использовании ограниченного количества слов
возможна потеря части смысла. Однако практика показывает, что для
большинства задач достаточно даже словаря на 3000 слов – например, Oxford
3000 или Merriam Webster 3000 Core Vocabulary Words.
32

Недостаток подхода векторизации one hot encoding состоит в том, что у


нас получаются очень большие векторы. Например, при использовании
словаря на 3000 слов вектор тоже будет иметь 3000 элементов, причем
большая часть значений в нем – 0, и только одно значение равно 1. Это
называется разряженный вектор, и с такими векторами современные
вычислительные устройства – как процессоры, так и графические ускорители
– работают недостаточно эффективно. Кроме того, такие векторы занимают
много места в памяти.
Плотное векторное представление
Третий вариант – плотные векторные представления (embedding). В
этом случае каждому токену тоже ставится в соответствие не одно число, а
вектор, однако размерность такого вектора гораздо ниже, чем у one hot
encoding. В таком векторе могут использоваться не только 0 и 1, но и другие
числа.
В нейронных сетях плотное векторное представление определяется в
процессе обучения (точно так же, как и другие веса в нейронной сети).
Обучение проходит так же, как и обычное обучение нейронной сети: на
первом этапе элементы векторов инициализируются случайными числами.
Значения вектора изменяются итерационно с помощью метода обратного
распространения ошибки, пока не станут такими, которые подходят для
решения конкретных задач. [3][4]
Для того, чтобы обучить векторное представление слов, нужен
большой объем данных, и, как правило, большие вычислительные мощности
и много времени. Поэтому популярно использование предварительно
обученных векторных представлений слов, которые позволяют решать
задачи анализа текста значительно быстрее. На сегодняшний день популярны
следующие предварительно обученные векторные представления слов:
GloVe (Стэндфордский университет), Word2Vec (Google), FastText
(Facebook), для русского языка – RusVectores, RUSSE.
33
34

2.4. Обучение нейронной сети


В данной работе в качестве алгоритма обучения используется алгоритм
обратного распространения ошибки.
Обучение алгоритмом обратного распространения ошибки
предполагает два прохода по всем слоям сети: прямого и обратного. При
прямом проходе входной вектор подается на входной слой нейронной сети,
после чего распространяется по сети от слоя к слою. В результате
генерируется набор выходных сигналов, который и является фактической
реакцией сети на данный входной образ. Во время прямого прохода все
синаптические веса сети фиксированы. Во время обратного прохода все
синаптические веса настраиваются в соответствии с правилом коррекции
ошибок, а именно: фактический выход сети вычитается из желаемого, в
результате чего формируется сигнал ошибки. Этот сигнал впоследствии
распространяется по сети в направлении, обратном направлению
синаптических связей. Синаптические веса настраиваются с целью
максимального приближения выходного сигнала сети к желаемому.[4]
Целью обучения сети алгоритмом обратного распространения ошибки
является такая подстройка ее весов, чтобы приложение некоторого
множества входов приводило к требуемому множеству выходов. Для
краткости эти множества входов и выходов будут называться векторами. При
обучении предполагается, что для каждого входного вектора существует
парный ему целевой вектор, задающий требуемый выход. Вместе они
называются обучающей парой. Сеть обучается на многих парах.
Алгоритм обратного распространения ошибки следующий:
1. Инициализировать синаптические веса маленькими случайными
значениями.
2. Выбрать очередную обучающую пару из обучающего множества;
подать входной вектор на вход сети.
3. Вычислить выход сети.
35

4. Вычислить разность между выходом сети и требуемым выходом


(целевым вектором обучающей пары).
5. Подкорректировать веса сети для минимизации ошибки
Повторять шаги с 2 по 5 для каждого вектора обучающего множества
до тех пор, пока ошибка на всем множестве не достигнет приемлемого
уровня.
Операции, выполняемые шагами 2 и 3, сходны с теми, которые
выполняются при функционировании уже обученной сети, т.е. подается
входной вектор и вычисляется получающийся выход. Вычисления
выполняются послойно. Шаги 4 и 5 составляют «обратный проход», здесь
вычисляемый сигнал ошибки распространяется обратно по сети и
используется для подстройки весов.[18]
Обучение с учителем
Обучение с учителем (supervised learning) предполагает наличие
полного набора размеченных данных для тренировки модели на всех этапах
ее построения.
Наличие полностью размеченного датасета означает, что каждому
примеру в обучающем наборе соответствует ответ, который алгоритм и
должен получить. Таким образом, размеченный датасет из фотографий
цветов обучит нейронную сеть, где изображены розы, ромашки или
нарциссы. Когда сеть получит новое фото, она сравнит его с примерами из
обучающего датасета, чтобы предсказать ответ.
В основном обучение с учителем применяется для решения двух типов
задач: классификации и регрессии.
В задачах классификации алгоритм предсказывает дискретные
значения, соответствующие номерам классов, к которым принадлежат
объекты. В обучающем датасете с фотографиями животных каждое
изображение будет иметь соответствующую метку — «кошка», «коала» или
36

«черепаха». Качество алгоритма оценивается тем, насколько точно он может


правильно классифицировать новые фото с коалами и черепахами.[4][19]
А вот задачи регрессии связаны с непрерывными данными. Один из
примеров, линейная регрессия, вычисляет ожидаемое значение
переменной y, учитывая конкретные значения x.
Более утилитарные задачи машинного обучения задействуют большое
число переменных. Как пример, нейронная сеть, предсказывающая цену
квартиры в Сан-Франциско на основе ее площади, местоположения и
доступности общественного транспорта. Алгоритм выполняет работу
эксперта, который рассчитывает цену квартиры исходя из тех же данных.
Таким образом, обучение с учителем больше всего подходит для задач,
когда имеется внушительный набор достоверных данных для обучения
алгоритма. Но так бывает далеко не всегда. Недостаток данных — наиболее
часто встречающаяся проблема в машинном обучении на 2020 год.
Обучение без учителя
Идеально размеченные и чистые данные достать нелегко. Поэтому
иногда перед алгоритмом стоит задача найти заранее не известные ответы.
Вот где нужно обучение без учителя.
В обучении без учителя (unsupervised learning) у модели есть набор
данных, и нет явных указаний, что с ним делать. Нейронная сеть пытается
самостоятельно найти корелляции в данных, извлекая полезные признаки и
анализируя их.
В зависимости от задачи модель систематизирует данные по-разному.
 Кластеризация. Даже без специальных знаний эксперта-
орнитолога можно посмотреть на коллекцию фотографий и разделить их на
группы по видам птиц, опираясь на цвет пера, размер или форму клюва.
Именно в этом заключается кластеризация — наиболее распространенная
задача для обучения без учителя. Алгоритм подбирает похожие данные,
находя общие признаки, и группируют их вместе.
37

 Обнаружение аномалий. Банки могут обнаружить


мошеннические операции, выявляя необычные действия в покупательском
поведении клиентов. Например, подозрительно, если одна кредитная карта
используется в Калифорнии и Дании в один и тот же день. Похожим образом,
обучение без учителя используют для нахождения выбросов в данных.
 Ассоциации. Выберете в онлайн-магазине подгузники, яблочное
пюре и детскую кружку-непроливайку и сайт порекомендует вам добавить
нагрудник и радионяню к заказу. Это пример ассоциаций: некоторые
характеристики объекта коррелируют с другими признаками. Рассматривая
пару ключевых признаков объекта, модель может предсказать другие, с
которыми существует связь.
 Автоэнкодеры. Автоэнкодеры принимают входные данные,
кодируют их, а затем пытаются воссоздать начальные данные из полученного
кода. Не так много реальных ситуаций, когда используют простой
автоэнкодер. Но стоит добавить слои и возможности расширятся: используя
зашумленные и исходные версии изображений для обучения, автоэнкодеры
могут удалять шум из видеоданных, изображений или медицинских сканов,
чтобы повысить качество данных.
В обучении без учителя сложно вычислить точность алгоритма, так как
в данных отсутствуют «правильные ответы» или метки. Но размеченные
данные часто ненадежные или их слишком дорого получить. В таких
случаях, предоставляя модели свободу действий для поиска зависимостей,
можно получить хорошие результаты.[4][19]
Обучение с частичным привлечением учителя
Обучение с частичным привлечением учителя (semi-supervised learning)
характеризуется своим названием: обучающий датасет содержит как
размеченные, так и неразмеченные данные. Этот метод особенно полезен,
когда трудно извлечь из данных важные признаки или разметить все объекты
– трудоемкая задача.
38

Этот метод машинного обучения распространен для анализа


медицинских изображений, таких как сканы компьютерной томографии или
МРТ. Опытный рентгенолог может разметить небольшое подмножество
сканов, на которых выявлены опухоли и заболевания. Но вручную размечать
все сканы — слишком трудоемкая и дорогостоящая задача. Тем не менее
нейронная сеть может извлечь информацию из небольшой доли размеченных
данных и улучшить точность предсказаний по сравнению с моделью,
обучающейся исключительно на неразмеченных данных.[4][19]
39

3. РЕАЛИЗАЦИЯ НЕЙРОННОЙ СЕТИ


3.1. Нейронная сеть, обученная на датасете IMDb
Нейронная сеть была реализована на языке программирования Python с
помощью библиотек TensorFlow и Keras.
TensorFlow — открытая программная библиотека для машинного
обучения, разработанная компанией Google для решения задач построения и
тренировки нейронной сети с целью автоматического нахождения и
классификации образов, достигая качества человеческого восприятия.
Keras — открытая нейросетевая библиотека, написанная на
языке Python. Она представляет собой надстройку над
фреймворками Deeplearning4j, TensorFlow и Theano. Нацелена на
оперативную работу с сетями глубинного обучения, при этом
спроектирована так, чтобы быть компактной, модульной и расширяемой. Эта
библиотека содержит многочисленные реализации широко применяемых
строительных блоков нейронных сетей, таких как слои, целевые и
передаточные функции, оптимизаторы, и множество инструментов для
упрощения работы с изображениями и текстом.
Для проверки работы нейронной сети были отобраны 5 отзывов.
Отзыв первый:
I saw this film at a free preview about a week before it was released and two
years later I can still remember how angry I was wasting an evening on this drivel.
The whole premise that these guys can't feel any emotion unless they're beating the
hell out of each other is ridiculous and boring. I can't remember one thing I liked
about this movie. Not the script, none of the performances, the editing or
cinematography, nothing. Maybe this film taps into the current anarchist views and
aspirations of whatever generation we're up to, but who cares? If there was a score
lower than one, I wouldn't hesitate to mark it on my ballot.
Перевод первого отзыва:
40

Я посмотрел этот фильм на бесплатном предварительном просмотре


примерно за неделю до его выхода, и через два года я все еще помню, как я
злился, тратя вечер на эту чушь. Весь посыл о том, что эти парни не могут
испытывать никаких эмоций, если они чертовски не бьют друг друга, смешна
и скучна. Я не могу вспомнить ни единой вещи, которая мне понравилась в
этом фильме. Ни сценарий, ни актерская игра, ни монтаж, ни
кинематография, ничего. Может быть, этот фильм отражает нынешние
анархистские взгляды и чаяния любого поколения, к которому мы
стремимся, но кого это волнует? Если бы была возможность поставить балл
ниже единицы, я бы без колебаний это сделал.
Второй отзыв:
When I knew the film was being made, I thought how could they make a
film that would be up to the standard of such a perfect book. But they did! Sure
they missed bits out but they captured the essence of the book brilliantly. One
member of the cast was miscast for me but my children disagreed. I even found
myself believing they were flying and not wondering "how are they doing that?"
So 10 out 10 Warner Brothers. Bring on the next one!
Перевод второго отзыва:
Когда я узнал о съемках фильма, я подумал: как можно сделать фильм,
который будет соответствовать стандартам такой идеальной книги? Но
фильм действительно вышел отличным! Конечно, были опущены некоторые
детали, но суть книги передана блестяще. Мне не понравился выбор одного
актера, но мои дети не согласились. Я даже обнаружил, что верю, что они
летят, и не задавался вопросом "как они это делают?" Так что 10 из 10 Warner
Brothers. Давайте еще один!
Третий отзыв:
It is my firm belief that the standard versions of The Lord of the Rings
should be jettisoned in favour of the extended editions universally. Sure, the near 4
41

hour runtime is a tad steep, but for an absolute masterpiece like this, it's work
every second and the first act of undoubtedly the best trilogy in cinematic history!
Перевод третьего отзыва:
Я твердо убежден, что стандартные версии «Властелина колец»
должны быть отвергнуты в пользу расширенных выпусков повсеместно.
Конечно, 4 часа – это многовато, но в этом абсолютном шедевре прекрасна
каждая секунда и первый акт, несомненно, лучшей трилогии в истории
кинематографа!
Отзыв четвертый:
Banal, puerile, putrid rubbish entirely bereft of art or merit filled to vomit
point with the sickening ugly machinations of a diseased mind. How the
participants who found themselves involved in this gross festering blight will face
their folly in their old age hell only knows. The script and the acting is an
excruciating embarrassment to behold.
It is a disgrace to the film industry if that is where it claims its origins.
It deserves to do more than just flop it should sink without trace in the deepest
darkest cesspool imaginable never to see the light of day again, but no cesspool
owner with a trace of self-respect would admit such a vile despicable creation. A
monkey with a lobotomy could have come up with a better screenplay. My
colleagues consider my comments to be a tad mild.
Перевод четвертого отзыва:
Банальный, ребяческий, гнилостный мусор, полностью лишенный
искусства или заслуг, наполненных до рвоты острыми отвратительными
махинациями больного ума. Как участники, вовлеченные в этот мерзкий
гной, отреагируют на свою глупость, когда будут постарше, только черт
знает. Сценарий и действие - мучительное смущение, чтобы созерцать.
Это позор для киноиндустрии, если именно там она заявляет о своем
происхождении.
42

Сериал заслуживает того, чтобы сделать больше, чем просто провал:


его нужно погрузить без следа в самую глубокую и самую темную
выгребную яму, какую только можно себе представить, чтобы никогда не
увидеть свет дня, но ни один владелец выгребной ямы со следом
самоуважения не допустил бы такое мерзкое, презренное создание. Обезьяна
с лоботомией могла бы придумать лучший сценарий. Мои коллеги считают
мои комментарии немного мягкими.
Пятый отзыв:
Amazing! Awesome! Unbelievable! This is truly a brilliant film, worthy to
stand on a par with such masterpieces as The Hunger Games, Divergent and 50
Shades of Grеy.
The film really broke expectations and was able to truly surprise: I was
expecting a snotty unworked face-down sub-drama for twelve-year-old girls, and I
got a snotty unworked face-down sub-drama for twelve-year-old girls.
This "expectation-reality" coincidence impressed me greatly.
The script, definitely written by a gifted person, amazed me with its
originality: our main character is a lonely girl who has problems with her father,
moves to another city, meets a mysterious guy who then turns out to be a vampire,
and their love begins, which in general is not so bad as a hint at the target
audience. If the further development of the plot is not obvious to you, then (spoiler
alert) it is snot, drooling, tears, and, finally, a moronic ending.
The drama here turned out to be excellent, however, in terms of its
wretchedness. The filmmakers did not consider it necessary to reveal the characters
and put pressure on the empathy by elaboration, but decided to simply take on a
handsome guy on one of the leading roles and wait for a response from
unassuming viewers, and judging by the popularity and status of “cult”, this was
enough.
43

Acting just broke the pattern. Earlier, I was sure that it’s impossible for a
person not to change their facial expression for a long time. However, the leading
actress proved the opposite. Bravo.
As we can see, it is enough to be a snotty clichéd pseudo-drama in order to
become a bestseller, which gives us a rather unpleasant picture of the demand of a
modern average spectator.
Перевод пятого отзыва:
Поразительно! Восхитительно! Невероятно! Это воистину гениальный
фильм, достойный стоять в одном ряду с такими шедеврами, как "Голодные
игры", "Дивергент" и "50 оттенков серого".
Фильм действительно сломал ожидания и смог по-настоящему
удивить: я ожидал сопливой непроработанной фейспалмовой недодрамы для
двенадцатилетних девочек, а получил сопливую непроработанную
фейспалмовую недодраму для двенадцатилетних девочек.
Такое совпадение "ожидание-реальность" меня крайне впечатлило.
Сценарий же, определенно написанный одаренным человеком, поразил
меня своей оригинальностью: наша главная героиня – девушка-одиночка, у
которой проблемы с отцом, переезжает в другой город, встречает
загадочного парня, который потом оказывается вампиром, и у них
начинается любовь, что в целом неплохо так намекает на целевую
аудиторию. Если дальнейшее развитие сюжета для вас не очевидно, то
(осторожно, спойлер) это: сопли, слюни, слезы, и, наконец, дебильный
финал.
Драма же тут получилась отменная, правда, в плане своей убогости.
Создатели фильма не сочли нужным раскрывать персонажей и давить на
эмпатию их проработкой, а решили просто взять на одну из главных ролей
красавчика и ждать отклика со стороны непритязательных зрителей, и, судя
по популярности и статуса «культовости», этого было достаточно.
44

Актерская игра же просто разорвала шаблон. Ранее я был уверен, что


человек не может на протяжении длительного времени не менять своего
выражения лица. Однако исполнительница главной роли доказала обратное.
Браво.
Как мы видим, достаточно быть сопливой клишированной
псевдодрамой для того, чтобы стать бестселлером, что дает нам довольно
нелицеприятную картину спроса современного среднестатистического
зрителя.
Первые четыре отзыва довольно просты для анализа – в них
используется довольно большое количество слов, четко указывающих на
тональность. Гораздо интересней последний, пятый отзыв. Он имеет явно
выраженную негативную тональность, однако при этом в нем очень много
слов, указывающих на то, что тон текста – положительный.
Тональность этих отзывов была проверена на различных ресурсах. Все
они смогли правильно определить тональность первых четырех, однако
ситуация с последним отзывом отличается. Результаты работы сторонних
ресурсов отображены на рис. 3.1-3.5.

Рисунок 3.1. Анализ на сайте danielsoper.com


45

Рисунок 3.2. Анализ на сайте monkeylearn.com

Рисунок 3.3. Анализ на сайте paralleldots.com

Рисунок 3.4. Анализ на сайте text-processing.com


46

Рисунок 3.5. Анализ с помощью Microsoft Azure


47

3.1 Простейшая нейронная сеть, обученная на датасете IMDb

Датасет IMDb movie review создан для задач определения тональности


текста. Набор включает отзывы на фильмы с сайта IMDb. Все отзывы на
английском языке. Отзывы только явно положительные (оценка >= 7) или
отрицательные (оценка <= 4), нейтральные отзывы в набор данных не
включались.

Размер набора данных – 50 тыс. отзывов:

 Набор данных для обучения – 25 тыс. отзывов


 Набор данных для тестирования – 25 тыс. отзывов

Количество положительных и отрицательных отзывов одинаковое.

Разметка набора данных:

 0 – отзыв отрицательный
 1 – отзыв положительный

С точки зрения машинного обучения это задача бинарной


классификации.

Текст был приведен к нижнему регистру, были удалены все знаки


препинания.
Для анализа использовались 10000 наиболее часто встречающихся в
отзывах слов.
Для представления текста в цифровом виде использовалось числовое
кодирование, где наиболее часто встречающемуся слову соответствовало
наименьшее число.
При представлении текста также использовались служебные коды:
0 – символ-заполнитель
1 – начало последовательности
2 – неизвестное слово
48

Числовые коды 3 и далее использовались для наиболее часто


встречающихся слов.
Для работы нейронной сети необходимо, чтобы длина всех отзывов
была одинакова. Была установлена длина всех отзывов – 300 слов. В случае,
если длина превышала 300 слов, отзыв обрезался, если длина была меньше
необходимой – дополнялся символами-заполнителями.
В нейронной сети использовались 3 полносвязных слоя. На первом
(входном) слое было 128 нейронов, на втором (скрытом) слое – 64 нейрона,
на выходном – 1 нейрон. В качестве функции активации на первом и втором
слоях использовалось функция ReLU.
Количество эпох – 25. В качестве оптимизатора нейронной сети взят
Adam, функция потери – бинарная перекрестная энтропия. В качестве
алгоритма обучения использовался метод обратного распространения
ошибки.
Обучение нейронной сети происходило с учителем. Результаты
обучения нейронной сети отображены на рисунке 3.6.

Рисунок 3.6. Доля верных ответов


49

Как видно на графике, доля верных ответов на обучающем наборе


данных растет, однако на проверочном – не изменяется, и даже под конец
обучения нейронная сеть правильно определяет тональность только в 50%
случаев. Изменение количества нейронов на первом и втором слоях не дали
значительных положительных изменений. На наборе тестовых данных доля
верных ответов составила 50,6%. Для нейронной сети, задача которой –
бинарная классификация, такой показатель является крайне
неудовлетворительным. Делаем вывод, что не все варианты представления
текста в виде чисел подходят для задачи анализа текста.
Для улучшения работы нейронной сети было принято решение
попробовать представить текст в виде one hot encoding и в виде плотного
векторного представления (embedding).
Нейронная сеть с представлением текста в виде one hot encoding
Как и ранее, используются 10000 наиболее часто используемых слов.
Теперь отзыв будет представляться не массивом кодов, а вектором в
формате one hot encoding. В результате этого преобразования мы получаем
вектор, состоящий из 0 и 1, где 0 означает, что слово, соответствующее
данной позиции в тексте, не встречается в тексте, а 1 – встречается. Однако
при таком представлении данных мы теряем информацию о позиции, на
которой находится это слово, а также о частоте его появления в тексте.
Все гиперпараметры нейронной сети (количество и тип слоев,
количество нейронов, количество эпох, функции активации, оптимизатор и
функции потери) остались неизменными. Результаты обучения нейронной
сети представлены на рисунке 3.7.
50

Рисунок 3.7. Доля верных ответов


Как видно из графика, доля верных ответов на обучающем наборе
достигает 100% уже на четвертой эпохе обучения, в то время как доля
верных ответов на проверочном наборе практически не меняется и
составляет 86%. Нейронная сеть правильно определила тональность первых
четырех отзывов, однако ошиблась с пятым, посчитав его положительным.
Нейронная сеть с представлением текста плотным вектором
Для представления текста плотным вектором был добавлен embedding-
слой. Для снижения переобучения был добавлен dropout-слой. Главная идея
Dropout — вместо обучения одной глубокой нейронной сети обучить
ансамбль нескольких нейронных сетей, а затем усреднить полученные
результаты.
Сети для обучения получаются с помощью исключения из сети
(dropping out) нейронов с вероятностью p, таким образом, вероятность того,
что нейрон останется в сети, составляет q=1−p. “Исключение” нейрона
означает, что при любых входных данных или параметрах он возвращает 0.
Исключенные нейроны не вносят свой вклад в процесс обучения ни на
одном из этапов алгоритма обратного распространения ошибки; поэтому
исключение хотя бы одного из нейронов равносильно обучению новой
51

нейронной сети. Принцип работы dropout представлен на рисунке 3.8.

Рисунок 3.8. Принцип работы dropout


Embedding-слой выдает нам массив, который мы преобразуем в
плоский вектор с помощью слоя flatten. На выходе использовался
полносвязный слой с сигмоидальной функцией активации. В качестве
оптимизатора нейронной сети взят Adam, функция потери – бинарная
перекрестная энтропия. Количество эпох – 25. Результаты обучения
нейронной сети представлены на рисунке 3.9.
52

Рисунок 3.9. Доля верных ответов


Как видно из графика, наступает переобучение, которое является
одним из главных проблем глубоких нейронных сетей. Суть переобучения
состоит в том, что модель хорошо объясняет только примеры из обучающей
выборки, адаптируясь к обучающим примерам, вместо того чтобы учиться
классифицировать примеры, не участвовавшие в обучении (теряя
способность к обобщению).
Для анализа работы сети были выбраны слова, явно указывающие на
тональность текста: amazing, brilliant, fantastic, good, average, bad, terrible,
awful, trash, crap. (рисунок 3.10)
53

Рисунок 3.10. Тональность различных слов


Из графика видно, что слова, отвечающие за положительную
тональность, находятся в верхнем правом углу, а за отрицательную – в
противоположном. Так, слова fantastic, brilliant и amazing говорят о
положительной окраске отзыва, а terrible и awful – об отрицательной. Слова
bad, crap и trash находятся ближе к центру координат, так как имеют менее
негативный оттенок, чем terrible и awful. Интересная ситуация со словами
average и good – они находятся практически в одном месте. Объясняется это
тем, что слово good, означающее «хороший», нередко употребляется вместе с
частицей «not», в результате чего получается «нехороший». Отсюда можно
сделать вывод, что, анализируя текст по словам, теряется информация,
заложенная в последовательности слов. Для того, чтобы анализировать
последовательности слов, требуется использование других архитектур
нейронных сетей, поэтому было решено реализовать рекуррентную
нейронную сеть.
Рекуррентная нейронная сеть
В рекуррентной нейронной сети после слоя embedding был добавлен
рекуррентный слой, содержащий 8 нейронов. Оптимизатор – adam, функция
потери – бинарная перекрестная энтропия. Результаты обучения нейронной
сети представлены на рисунке 3.11.
54

Рисунок 3.11. Доля верных ответов


Налицо явное переобучение сети. Точность работы сети на тестовом
наборе данных – 83%. Нейронная сеть правильно определила тональность
первых четырех отзывов, однако ошиблась с пятым, посчитав его
положительным.
Полученный результат недостаточно высокий. Объясняется это тем,
что архитектура простой нейронной сети непригодна для каких-либо
прикладных задач. Вместо простой нейронной сети используются более
сложные архитектуры, такие как LSTM и GRU.
LSTM и GRU
В нейронной сети LSTM 3 слоя – embedding, затем слой LSTM с 32
ячейками, и выходной полносвязный слой. Оптимизатор – adam, функция
потери – бинарная перекрестная энтропия. Результаты обучения нейронной
сети представлены на рисунке 3.12.
55

Рисунок 3.12. Доля верных ответов


Снова видно переобучение. Точность работы сети на тестовом наборе
данных составила 84%. Нейронная сеть правильно определила тональность
первых четырех отзывов, однако ошиблась с пятым, посчитав его
положительным.
Для уменьшения переобучения была предпринята попытка добавить
dropout-слой, однако результаты практически не изменились (рисунок 3.13)

Рисунок 3.13. Доля верных ответов


Вместо слоя LSTM – GRU, 32 модуля (рисунок 3.14).
56

Рисунок 3.14. Доля верных ответов


Изменение слоя с LSTM на GRU сократило время обучения, однако
практически никак не повлияло на долю верных ответов – она составляет те
же 84%. Нейронная сеть правильно определила тональность первых четырех
отзывов, однако ошиблась с пятым, посчитав его положительным.
Максимальная точность нейронных сетей, обученных на датасете IMDb
– 84%. Причиной этого является как узкая направленность, так и небольшой
объем данных. Для повышения доли правильных ответов следует
использовать другой датасет.
3.2 Нейронная сеть, обученная на датасете Yelp
Yelp — веб-сайт для поиска на местном рынке услуг, например
ресторанов или парикмахерских, с возможностью добавлять и просматривать
рейтинги и обзоры этих услуг. Для популярных бизнесов имеются сотни
обзоров. Отзывы на сайте Yelp менее узконаправленны по сравнению с
IMDb, поэтому использование датасета yelp должно повысить точность
результатов сети.
На данный момент в базе данных Yelp более 8000000 отзывов. Для
обучения нейронной сети использовался датасет 2015 года, который
насчитывает 560 000 тренировочных и 38 000 тестовых данных.
57

Модель нейронной сети была взята та же, что и в предыдущей LSTM-


сеть. Результаты представлены на рисунке 3.15.

Рисунок 3.15. Доля верных ответов


Точность нейронной сети на тестовом наборе составила 96%, что
является довольно высоким показателем. Нейронная сеть правильно
определила тональность первых четырех отзывов, однако ошиблась с пятым,
посчитав его положительным.
58

Сверточная нейронная сеть


Первый слой – embedding, который создает векторы, длина вектора –
64 числа. Сверточная часть – один сверточный слой, 250 различных ядер
сверток, длина ядра – 5, функция активация – relu. Потом идет слой
подвыборки, который выбирает максимальное значение из набора данных,
которые поступили ему на вход. Затем идет полносвязный слой, состоящий
из 128 нейронов, функция активации – relu. После – слой dropout для
регуляризации, и, наконец, выходной полносвязный слой. Оптимизатор –
adam, функция потери – бинарная перекрестная энтропия. Длительность
обучения – 4 эпохи. Результаты обучения представлены на рис. 3.16.

Рисунок 3.16. Доля верных ответов


Доля верных ответов на тестовом наборе составила 96%. Нейронная
сеть правильно определила тональность первых четырех отзывов, однако
ошиблась с пятым, посчитав его положительным.
59

4. ОХРАНА ТРУДА

4.1Регулировочные операции

При выполнении регулировочных работ различной радиоэлектронной


аппаратуры наиболее опасным видом травматизма является поражение
электрическим током. Рабочий, выполняющий регулировочные работы
должен соблюдать правило техники безопасности, в частности
электробезопасности:
а) все доступные для прикосновения токоведущие части
электрооборудования должны быть ограждены;
б) рубильники и выключатели должны быть мгновенного действия;
в) щетки и рубильники должны быть установлены в глухих
металлических кожухах, запираться на замок и иметь надпись о
применяемом напряжении;
г) ручки, рукояти должны быть сделаны из изолирующих
материалов;
д) металлические детали должны быть изолированы от
токоведущих частей и заземлены;
е) все электрооборудование, а также оборудование и механизмы,
которые могут оказаться под напряжением должны быть надежно заземлены;
ж) работы по ремонту оборудования и механизмов должны
производиться только после полного отключения от сети электропитания, на
месте работ обязательно вывешивают предупредительные плакаты;
з) ручной инструмент, применяемый при регулировочных работах
(отвертки, плоскогубцы, кусачки) должен быть снабжен изолированными
ручками;
и) измерительные приборы должны быть заземлены, соединительные
провода и щупы не должны иметь повреждений. [23]
60

4.2 Электромонтажные работы

При электромонтажных работах необходимо выполнять следующие


правила и рекомендации:
а) Электрическое напряжение выше 40В опасно для жизни. Степень
поражения зависит от пути прохождения электрического тока через тело
человека и от силы тока, особенно той его части, которая проходит через
сердце. Наиболее опасны пути тока – «рука–нога», «рука-рука». Поэтому при
настройке необходимо стараться работать одной рукой в одежде с длинными
рукавами, чтобы избежать прикосновения к токоведущим частям обеими
руками. Другую руку следует держать за спиной или в кармане и не
прикасаться ей к корпусу устройства или другим заземлённым предметам
или использовать инструменты с изолированными рукоятками;
б) Любые работы электронного направления нужно стараться вести
вдали от водопроводных труб и радиаторов, исключить случайное
прикосновение к ним;
в) Заменять детали следует только после отключения прибора от
сети, обязательно вынимая вилку шнура питания из сетевой розетки. После
отключения источника электропитания необходимо разрядить конденсаторы
фильтра питающего напряжения. Нельзя проверять исправность плавких
предохранителей в аппаратуре путем их замыкания;
г) Подключать измерительный прибор к высоковольтным цепям
можно только при обесточенной аппаратуре, предварительно неоднократно
разрядив конденсаторы фильтра. Во время таких измерений щуп,
подсоединённый к корпусу устройства, нельзя держать рукой;
Необходимо работать у открытого окна, чаще проветривать
помещение. После окончания радиомонтажных работ мыть руки. [23]
61

4.3 Работа с компьютером

Основные правила организации пространства вокруг рабочего места:


При длительном и интенсивном использовании, на поверхности
модулей ПК (системный блок, монитор, мышка и т.д.) возникают небольшие
разряды тока. Эти частицы активизируются во время прикосновений к ним и
приводят к выходу техники из строя. Нужно регулярно использовать
нейтрализаторы, увлажнители воздуха, антистатики; вокруг стола не должно
быть свисающих проводов, пользователь не должен контактировать с ними;
важна целостность корпуса розетки и штепсельной вилки; отсутствие
заземления пред экранного фильтра проверяется с помощью измерительных
приборов.
Желательно во время строительных работ в офисе использовать
минимальное количество легко воспламеняемых материалов (дерева,
пенопласта), а также горючего пластика в изоляции.
Рекомендуется отдавать предпочтение кирпичу, стеклу, металлу и т.д.;
помещение должно хорошо вентилироваться и охлаждаться в жаркую пору
года. Важен своевременный отвод избыточного тепла от техники.
В случае обнаружения трещины на корпусе или повреждений другого
рода, нужно обратиться за помощью в сервисный центр. Это же относится к
ПК с неисправным индикатором включения/выключения. предметы на столе
не должны мешать обзору, пользованию мышкой и клавиатурой.
Поверхность экрана должна быть абсолютно чистой; на системном
блоке не должно находиться никаких предметов, так как в результате
вибраций может нарушиться работа устройства. Нужно убедиться в том, что
никакие посторонние предметы не мешают работе системе охлаждения.
недопустимо включать персональный компьютер в удлинители и розетки, в
которых отсутствует заземляющая шина.[24]
62

Запрещается начинать работу в помещениях с повышенной


влажностью, а также в случае, если рядом присутствуют открытые источники
влажности (лужи, мокрый пол).
Включить технику можно лишь после полного высыхания
окружающих предметов. недопустимо часто включать и выключать
компьютер в течение рабочего дня без особой нужды. Система просто не
справляется с необходимостью быстро сворачивать все процессы.
При выполнении работы. Поскольку персональный компьютер
обладает всеми свойствами электрического прибора, то на него
распространяются основные правила безопасности при взаимодействии с
проводниками тока: нельзя размещать какие-либо вещи на поводах, а также
самостоятельно менять их расположение без особой нужды; рекомендуется
избегать расположения жидкостей рядом с модулями компьютера.
Поэтому кулер с водой или кофейный автомат необходимо размещать
в стороне от рабочих мест в офисе. Пользователи должны осознавать
опасность потенциального замыкания в случае пролития воды на клавиатуру
или системный блок. Нельзя работать на ПК с мокрыми руками; нельзя
очищать поверхность компьютера от загрязнений, когда он находится во
включенном состоянии; недопустимо снимать корпус любой из составных
частей ПК во время его работы.
Кроме того, разбор и ремонт техники имеют совершают только
специализированные работники; во время работы на компьютере нельзя
одновременно прикасаться к другим металлическим конструкциям, которые
стоят на той же поверхности. Это касается отопительных батарей или
трубопроводов; в помещении с компьютерами непозволительно употреблять
пищу на рабочем месте. [24]
63

ЗАКЛЮЧЕНИЕ
Предложенные в работе модели нейронных сетей имеют
удовлетворительную точность – доля верных ответов достигает 96%.
Наилучшие результаты достигаются при использовании сверточных и LSTM-
сетей. Обучение сетей с помощью датасета Yelp привело к лучшим
результатам, чем обучение с помощью датасета IMDb, что объясняется
гораздо большим количеством данных.
Нейронные сети без проблем распознают тональность отзыва в том
случае, если она совпадает с тональностью используемых в отзыве слов.
Однако, если в тексте используется большое количество слов с
положительной окраской, хотя сам отзыв при этом – отрицательный, сеть не
сможет правильно определить тональность. Объясняется это тем, что
нейронные сети не в состоянии определить иронию и сарказм, а также не
всегда правильно интерпретируют контекст слов и фраз.
64

1. Хайкин С. Нейронные сети: полный курс, 2-е издание.: Пер. с анг. – М.:
Издательский дом «Вильямс», 2006. – 1104 с.
2. colah’s blog [Электронный ресурс] - Understanding LSTM networks. Режим
доступа: http://colah.github.io/posts/2015-08-Understanding-LSTMs/ (дата
обращения: )
3. David Kriesel – A Brief Introduction to Neural Networks, 2007 – 226 с
4. University of Montreal – Deep Learning Tutorial Release 0.1 LISA lab -–167 с
5. Haohan Wang, Bhiksha Raj – On the Origin of Deep Learning, 2017 – 72с
6. Каллан Р. Основные концепции нейронных сетей. Пер. с анг. – М.:
Издательский дом «Вильямс», 2001. – 288 с
7. colah’s blog [Электронный ресурс] – Deep Learning, NLP, and Representations
Режим доступа: http://colah.github.io/posts/2014-07-NLP-RNNs-Representations/
(дата обращения: )
8. Kim, Y. [Электронный ресурс] Convolutional Neural Networks for Sentence
Classification. Proceedings of the 2014 Conference on Empirical Methods in
Natural Language Processing (EMNLP 2014), 2014. 1746–1751 с. Режим
доступа: https://www.aclweb.org/anthology/D14-1181/ (дата обращения: )
9. Heigold, G., Neumann, G., & van Genabith, J. [Электронный ресурс] Neural
morphological tagging from characters for morphologically rich languages, 2016.
Режим доступа: arxiv.org/abs/1606.06640 (дата обращения: )
10. Xiang Zhang, Junbo Zhao, Yann LeCun [Электронный ресурс] Character-
level Convolutional Networks for Text Classification, 2016. Режим доступа:
arxiv.org/abs/1509.01626 (дата обращения: )
11. A Conneau, H Schwenk, L Barrault, Y Lecun [Электронный ресурс] Very
Deep Convolutional Networks for Text Classification, 2017. Режим доступа:
arxiv.org/abs/1606.01781 (дата обращения: )
12. T Semwal, G Mathur, P Yenigalla, SB Nair [Электронный ресурс] A
Practitioners’ Guide to Transfer Learning for Text Classification using
Convolutional Neural Networks, 2018. Режим доступа: arxiv.org/abs/1801.06480
65

13. Towards Data Science [Электронный ресурс] Mahendran Venkatachalam –


Attention in Neural Networks. Режим доступа:
https://towardsdatascience.com/attention-in-neural-networks-e66920838742 (дата
обращения: )
14. Medium [Электронный ресурс] Avinash Sharma V – Understanding
Activation Functions in Neural Networks. Режим доступа:
https://medium.com/the-theory-of-everything/understanding-activation-functions-
in-neural-networks-9491262884e0 (дата обращения: )
15. Neurohive [Электронный ресурс] Stanislav Isakov – Как работает
нейронная сеть: алгоритмы, обучение, функции активации и потери Режим
доступа: https://neurohive.io/ru/osnovy-data-science/osnovy-nejronnyh-setej-
algoritmy-obuchenie-funkcii-aktivacii-i-poteri/ (дата обращения: )
16. Йоав Гольдберг – Нейросетевые методы в обработке естественного языка,
ДМК-Пресс, 2019 – 282c
17. Hackernoon [Электронный ресурс] What is One Hot Encoding? Why And
When do you have to use it? – 2019. Режим доступа:
https://hackernoon.com/what-is-one-hot-encoding-why-and-when-do-you-have-to-
use-it-e3c6186d008f (дата обращения: )
18. Портал искусственного интеллекта [Электронный ресурс] Алгоритм
обратного распространения ошибки. Режим доступа:
http://www.aiportal.ru/articles/neural-networks/back-propagation.html (дата
обращения: )
19. nVidia [Электронный ресурс] SuperVize Me: What’s the Difference Between
Supervised, Unsupervised, Semi-Supervised and Reinforcement Learning? – 2018.
Режим доступа: https://blogs.nvidia.com/blog/2018/08/02/supervised-
unsupervised-learning/ (дата обращения: )
20. Подготовка и защита курсовых работ, дипломных работ и магистерских
диссертаций: для студентов направлений подготовки «Радиофизика» и
«Информационная безопасность» всех форм обучения: учебно-методическое
66

пособие / В.В. Данилов, И.А. Третьяков, К. Г. Джанджгава. – Донецк :


ДонНУ, 2019. – 88 с.
21. Кожухар, В. М. Основы научных исследований: учеб. пособие / В. М.
Кожухар. - Москва: Дашков К, 2010. - 216 с.
22. Ломакин, П. А. Электронные презентации своими руками / П. А.
Ломакин, А. В. Севостьянов. - М.: Майор, 2004. - 349 с.
23. Корнилов О.П., Техника безопасности при электромонтажных и наладочных
работах: Справочник электромонтажника/Под. Ред. А.Д. Смирнова и др.-2-е
изд., перераб. И доп. – М.: Энергоатомиздат, 1987. -240с
24. ПроРемонтПК [Электронный ресурс] Техника безопасности при работе с
компьютером. Режим доступа: http://proremontpk.ru/ustanovka/tehnika-
bezopasnosti-pri-rabote-s-personalnym-kompjuterom.htm (дата обращения: )
67

Приложение 1
Код нейронной сети LSTM на датасете IMDB

from tensorflow.keras.datasets import imdb
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Embedding, LSTM 
from tensorflow.keras import utils
from tensorflow.keras.preprocessing.sequence import pad_sequences
import numpy as np
import matplotlib.pyplot as plt
max_words=10000
(x_train, y_train), (x_test, y_test) = imdb.load_data(num_words=max_words)

maxlen = 300
x_train = pad_sequences(x_train, maxlen=maxlen)
x_test = pad_sequences(x_test, maxlen=maxlen)

model = Sequential()
model.add(Embedding(max_words, 8, input_length=maxlen))
model.add(LSTM(32, recurrent_dropout = 0.2))
model.add(Dense(1, activation='sigmoid'))
model.compile(optimizer='adam', 
              loss='binary_crossentropy', 
              metrics=['accuracy'])

history = model.fit(x_train, 
                    y_train, 
                    epochs=15,
                    batch_size=128,
                    validation_split=0.1)
scores = model.evaluate(x_test, y_test, verbose=1)

a=[1]
message = ''
arr=message.split(' ')
for word in arr:
 code = (word_index.get(word, -1)+3)
 if code>10000:
      code=2
 a.append(code)
data = np.array([a], dtype=int)
result = model.predict(data)
if result[[0]] < 0.5:
    print('Отзыв отрицательный')
else:
    print('Отзыв положительный')
68

Приложение 2
Код одномерной сверочной нейронной сети LSTM на датасете Yelp

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Embedding, GRU, LSTM
from tensorflow.keras import utils
from tensorflow.keras.preprocessing.sequence import pad_sequences
from tensorflow.keras.preprocessing.text import Tokenizer
from tensorflow.keras.callbacks import ModelCheckpoint
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

num_words = 10000
max_review_len = 300

train = pd.read_csv('yelp_review_polarity_csv/train.csv', 
                    header=None, 
                    names=['Class', 'Review'])
reviews = train['Review']
y_train = train['Class'] - 1
tokenizer = Tokenizer(num_words=num_words)
tokenizer.fit_on_texts(reviews)
sequences = tokenizer.texts_to_sequences(reviews)
x_train = pad_sequences(sequences, maxlen=max_review_len)

model = Sequential()
model.add(Embedding(num_words, 64, input_length=max_review_len))
model.add(LSTM(128))
model.add(Dense(1, activation='sigmoid'))

model.compile(optimizer='adam', 
              loss='binary_crossentropy', 
              metrics=['accuracy'])

model_save_path = 'best_model.h5'
checkpoint_callback = ModelCheckpoint(model_save_path, 
                                      monitor='val_accuracy',
                                      save_best_only=True,
                                      verbose=1)

history = model.fit(x_train, 
                    y_train, 
                    epochs=5,
                    batch_size=128,
                    validation_split=0.1,
69

                    callbacks=[checkpoint_callback])

model.load_weights(model_save_path)
test = pd.read_csv('yelp_review_polarity_csv/test.csv', 
                    header=None, 
                    names=['Class', 'Review'])
test_sequences = tokenizer.texts_to_sequences(test['Review'])
x_test = pad_sequences(test_sequences, maxlen=max_review_len)
y_test = test['Class'] - 1
model.evaluate(x_test, y_test, verbose=1)
text = ‘‘‘ ’’’
sequence = tokenizer.texts_to_sequences([text])
data = pad_sequences(sequence, maxlen=max_review_len)

result = model.predict(data)
if result[[0]] < 0.5:
    print('Отзыв отрицательный')
else:
    print('Отзыв положительный')