Методы Transfer Learning для задачи семантического анализа

Исследование методов Transfer Learning для семантического анализа и их сравнение на данных, содержащих упоминания компании Тинькофф Банк на различных Интернет-ресурсах. Реализация моделей для классификации текстов с использованием различных метрик.

Рубрика Программирование, компьютеры и кибернетика
Вид дипломная работа
Язык русский
Дата добавления 01.12.2019
Размер файла 2,9 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

Методы Transfer Learning для задачи семантического анализа

ВВЕДЕНИЕ

transfer learning семантический текст

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

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

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

В рамках данной работы для исследования эффективности методов с применением Transfer Learning будет рассмотрена одна задача из области NLP - Natural Language Processing (обработки естественного языка), а именно, задача семантического анализа. Имеется база коротких текстов, в которых упоминается банк «Тинькофф» на различных форумах и в социальных сетях. Упоминания разделяются на три класса тональности: «Негативная», «Позитивная», «Не определено». Требуется по тексту определить, к какому классу он относится.

Цель и задачи исследования: исследование методов Transfer Learning для задачи семантического анализа и их экспериментальное сравнение. Исследование будут проводиться на данных, содержащих упоминания компании Тинькофф Банк на различных Интернет-ресурсах.

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

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

I. TRANSFER LEARNING

Transfer Learning (TL) - подход в машинном обучении, который позволяет применить опыт, накопленный при решении одной задачи, для решения другой, связанной задачи. Например, опыт, полученный при решении задачи распознавания автомобилей, можно применить в задаче распознавания грузовиков.

Transfer Learning достаточно часто используется при работе с нейронными сетями. Как правило, для обучения нейронной сети «с нуля» необходимо достаточно большое количество данных и большое количество времени и компьютерных ресурсов, причём чем более глубокая модель обучается, тем больше данных и ресурсов необходимо. Если же для новой задачи использовать предобученную модель, обучение займёт в десятки и сотни раз меньше времени. Более того, зачастую количество доступных размеченных данных может быть очень мало, TL позволяет обойти и эту проблему.

Lisa Torrey и Jude Shavlik в книге [1] описали 3 основных преимущества использования Transfer Learning:

Рисунок 1. График сравнения производительности с применением TL и без него

1. Higher start - первоначальные результаты предобученной модели на новой задаче лучше результатов «чистой» модели

2. Higher slope - предобученная модель, как правило, обучается быстрее «чистой»

3. Higher asymptote - предобученная модель сходится к более хорошим результатам, чем обучаемая с нуля

Существует несколько базовых подходов:

1) Обучение модели с целью переиспользования:

Допустим, необходимо решить задачу А, для которой существует сравнительно небольшое количество данных. Можно найти связанную задачу Б, для которой данных достаточно, обучить модель на этих данных и затем использовать эту модель уже для решения задачи А. Причём подходов к использованию обученной модели также существует множество: можно просто использовать модель, но с другими данными, а можно дообучить некоторые части модели под новые данные. Подход с дообучением уже обученной модели называется fine-tuning - тонкая настройка параметров.

Рисунок 2. Использование предобученной модели для задачи классификации

2) Использование предобученной модели:

Иногда проще не обучать свою модель, а взять уже обученную. Множество библиотек (например, Keras [2]) предоставляют в своём API [3] уже обученные модели для решения различных задач. Также подобные модели можно найти в свободном доступе в сети Интернет. Отличным примером такого подхода является использование, например, модели AlexNet [4] для классификации изображений: изначальная модель обучена для классификации на 1000 классов, но, заменив последний слой и немного дообучив модель, можно классифицировать на произвольное количество классов.

3) Feature extraction:

Ещё один подход в глубоком обучении - поиск (извлечение) наиболее важных признаков из данных с помощью ранее обученной модели. Поскольку при обучении нейронная сеть, например, учится выявлять наиболее важные признаки из входных данных, этот факт можно использовать при решении задач на схожих входных данных. Такой подход, например, часто используется при решении задач компьютерного зрения, поскольку он позволяет уменьшить размер исходных данных, оставив в них только наиболее важные признаки. Пример данного подхода - использование выходов предпоследнего слоя AlexNet, например, для обучения SVM на задаче классификации изображений. Выходы из AlexNet, в данном случае, будут признаками, которые нейронная сеть посчитала наиболее важными для изображения, поэтому использование их в SVM вместо исходного изображения даст хорошие результаты.

1.1 Transfer Learning в задачах обработки естественного языка

Начиная с 2013 г. для работы с любыми задачами обработки естественного языка использовались такие языковые модели, как word2vec и GloVe [5]. Данные модели предварительно обучаются на большом количестве данных, а затем позволяют достаточно просто и быстро преобразовать сырой текст в числовые векторы (embeddings - эмбеддинги), чтобы в дальнейшем преобразованные данные использовать в следующей модели для решения конкретной задачи. Проблема такого подхода заключается в том, что слово переводится в один и тот же числовой вектор, независимо от контекста, в котором оно использовано. Например, слово «сел» в предложении «человек сел на стул» и «мой телефон сел» имеет абсолютно разное значение, однако модели, упомянутые выше, никак не используют этот факт. Другими словами, проблема подходов, подобных word2vec, заключается в том, что они теряют контекст и семантику предложения, рассматривая отдельные слова.

2018 год в некотором роде стал переломным для сферы NLP - появилось некое подобие ImageNet [6], применимое к задачам обработки языка. ImageNet - организация, которая с 2010 г. проводит одноимённое соревнование по классификации изображений. В датасет ImageNet к 2010 г. входило порядка 1 миллиона изображений, разделённого на 1000 классов. В 2011 г. лучший результат показывал алгоритм, который классифицировал изображения с 25% ошибкой, однако в 2012 году глубокая свёрточная сеть под названием AlexNet показала результат с ошибкой классификации всего 16%. Начиная с этого момента, сообщество стало предлагать новые модели, основанные на архитектуре AlexNet, и показывающие всё лучшие и лучшие результаты, а что самое важное - эти модели стали переиспользоваться для решения задач детекции объектов на изображении, семантической сегментации, распознавания на видео и других. Модели, обученные на огромном датасете ImageNet, позволили эффективно применять полученный ими опыт для решения других задач и сейчас решение задач компьютерного зрения без использования предобученной на ImageNet модели считается безрассудным [7].

II. МОДЕЛИ TRANSFER LEARNING

2.1 Архитектура Transformer

Архитектура Transformer была предложена в работе «Attention Is All You Need» в 2017 г. [8]. Данная архитектура будет рассмотрена, поскольку на её основе были разработаны несколько новых моделей, применяемых в NLP и позволяющих использовать преимущества Transfer Learning.

Если взглянуть на Transformer как на чёрную коробку, то это просто приложение, которое получает на вход предложение на одном языке и на выход отдаёт предложение на другом языке.

Рисунок 3. Применение The Transformer

Более конкретно, модель состоит из двух больших частей - блока кодировщиков (encoders) и блока декодировщиков (decoders). Каждый кодировщик (и декодировщик аналогично) имеет одну и ту же структуру и свои веса при обучении.

Рисунок 4. Верхнеуровневая архитектура The Transformer

2.1.1 Кодировщик (Encoder)

Рассмотрим подробнее Encoder:

Рисунок 5 Архитектура кодировщика

Каждый кодировщик состоит из двух основных частей: блок Self-Attention и несколько простых прямонаправленных Fully-connected слоёв. Главную роль здесь играет именно Self-Attention блок, рассмотрим его работу в деталях:

Рисунок 6. Векторы, используемые для вычислений в блоке Encoder

Первый шаг. На вход первому кодировщику передаётся предложение, где каждое слово переведено в какой-либо эмбеддинг (например, GloVe). Помимо этого, в вычисленный эмбеддинг каждого слова добавляется positional embedding, который отражает для модели позицию каждого слова в предложении, позволяет учитывать расстояния между словами и т.д.

Затем для каждого слова с помощью матриц , значения весов которых настраиваются в процессе обучения модели, вычисляется три значения - query, key, value. Эти новые вычисленные вектора имеют размерность меньше, чем входные: входные вектора имеют размерность 512, в то время как q, k и v - 64. Это не ограничение модели, а сделано для того, чтобы сделать время вычисления в self-attention блоках примерно константным значением. Полученные вектора q, k, v - это абстрактные вектора, которые понадобятся дальше для вычисления значения self-attention.

Рисунок 7. Пример вычисления эмбеддинга в блоке Encoder

Второй шаг. Будем рассматривать дальнейший процесс на примере первого слова. Вторым шагом вычисляется score для каждого слова, относительно текущего. Score показывает, насколько при кодировании текущего слова необходимо обращать внимание на другие слова в предложении. Значение вычисляется по формуле:

где i - номер текущего слова, относительно которого вычисляются значения «счёта», а j - слово, для которого вычисляется «счёт». Например, для первого слова “Thinking” значение , т.е. самого для себя, имеет значение 112, а относительно слова “Machines” - 96.

Третий и четвёртый шаги. Третий и четвёртый шаги по большей части оптимизационные. Сначала мы каждый score делим на корень из размерности вектора k (размерность q и v аналогична), чтобы получить более стабильный градиент при обучении. В работе [8] размерность вектора равна 64, поэтому деление происходит на 8.

Далее, с целью нормализовать значения «счетов» (scores) и привести их сумму к единице, мы пропускаем их через softmax-слой. На самом деле, почти всегда слово само для себя будет иметь наибольший score, однако иногда может сложиться другая ситуация. Полученные после этого шага значения в некотором роде отражают, насколько каждое слово в предложении важно при описании текущего.

Пятый шаг. Следующим шагом каждый value вектор умножается на значение коэффициента, полученного на четвёртом шаге, и все полученные значения складываются. Таким образом получается итоговое значение self-attention механизма для первого слова. Можно сказать, что алгоритм в embedding каждого слова «подмешивает» другие слова, причём чем больше слово связанно с другим, тем сильнее оно будет влиять на конечный выходной вектор.

Оптимизация вычислений

Для оптимизации вычислительного процесса и более эффективного использования ресурсов, операции, описанные выше, выполняются в матричной форме:

где - матрица из входных данных (каждая строка - одно предложение), - матрица вычисленных query, key и value соответственно, а - матрица весов для соответствующей результирующей матрицы.

Тогда формулу, описывающую получение итоговой матрицы эмбеддингов Z, можно записать следующим образом:

Multiheaded attention

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

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

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

Рисунок 8. Пример работы Multiheaded-attention

На изображении показано, на какие слова обратили внимание два параллельных механизма относительно слова «it» в предложении «The animal didn't cross the street because it was too tired». Как видно, первый механизм (оранжевый цвет) связал слово “It” со словами “The animal”, а второй - со словом “tired”. Очевидно, обе связи существуют и это поможет нам при кодировании слова “it”.

Полностью модель Transformer в деталях представлена ниже:

Рисунок 9 Архитектура The Transformer в деталях

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

2.1.2 Декодировщик (Decoder)

Архитектура декодировщика очень похожа на кодировщик, однако есть один отличительный момент - блок Encoder-Decoder Attention. На самом деле, он выполняет действия, подобные Self-attention блоку, однако принимает на вход матрицы K и V от последнего кодировщика, а матрицу Q составляет сам на основе выхода предыдущего слоя.

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

Аналогично блокам кодировщиков, декодировщик передаёт свой выход следующему декодировщику, а также принимает матрицы K и V от последнего кодировщика для слоя Encoder-Decoder Attention. Выход последнего декодировщика передаётся в FC слой, где количество нейронов равно размеру словаря, на котором шло обучение (т.е. все уникальные слова из выборки), а после этого слоя - в softmax слой, который и выдаёт для каждого слова в словаре вероятность того, что это слово является следующим в предложении.

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

2.2 OpenAI GPT

В июне 2018 г. была предложена модель, основанная на блоке декодеров из архитектуры Transformer [9]. Её основная идея заключается в том, чтобы предобучить модель на большом количестве данных, а после этого методом тонкой настройки параметров решать какие-либо конкретные задачи NLP. Изначально авторы использовали этот подход, продолжая идею своей же предыдущей работы [10]. Данная модель на момент публикации получила SOTA результаты на большом количестве задач NLP.

Модель обладает следующими характеристиками:

· 12 декодировшиков

· 12 attention-head

· ~110M параметров

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

2.2.1 Применение OpenAI GPT для задач NLP

Главная идея данной модели - переиспользование её в специфичных задачах, донастроив параметры. Авторы статьи предлагают следующие варианты использования:

Рисунок 10. Применение OpenAI GPT для различных задач NLP

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

Через сравнительно небольшой промежуток времени после выхода работы о данной модели, на основе архитектуры Transformer была предложена ещё одна модель - BERT. Поскольку BERT превзошла результаты OpenAI GPT, исследования по GPT практически перестали появляться и развитие модели остановилось. Ввиду этого, в рамках данной работы применение OpenAI GPT рассматриваться не будет.

Сравнение результатов двух моделей будет приведено в следующем разделе.

2.3 Bidirectional Encoder Representations from Transformers (BERT)

В конце 2018 г. на основе модели The Transformer была предложена ещё одна архитектура, которая получила название BERT (Bidirectional Encoder Representations from Transformers) [11]. Эта модель может использоваться практически для любых задач обработки естественного языка - начиная от семантического анализа, заканчивая задачами QA. Авторам предложенной модели удалось получить SOTA результаты на большом количестве NLP-задач, улучшив предыдущие результаты, полученные с помощью OpenAI GPT.

Данная архитектура использует только одну часть своей предшественницы - блоки кодировщиков.

Рисунок 11. Модели BERT Base и BERT Large

Было предложено две одинаковых модели, отличающихся только по размеру:

BERT Base:

· 12 кодировщиков

· 512 размер скрытого слоя

· 12 attention heads

· 110M общее количество параметров

BERT Large:

· 24 кодировщика

· 1024 размер скрытого слоя

· 16 attention heads

· 340M общее количество параметров

2.3.1 Входные данные

Входные данные для данной модели выглядят следующим образом

Рисунок 12. Входные данные для модели BERT

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

Как видно, вход составляется из трёх частей:

1. Token embedding - в случае BERT используется WordPiece embedding [12].

2. Segment Embedding - эмбеддинг, отражающий позицию каждого слова во входном векторе - принадлежит ли оно к первому или второму предложению. Предложения разделяются между собой токеном SEP.

3. Position Embedding - имеет то же значение, что и в оригинальной модели

2.3.2 Обучение BERT

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

Masked LM

Во входном векторе случайным образом выбирается 15% слов. Для каждого из этих слов:

· В 80% случаев слово заменяется на специальный токен [MASK]

· В 10% случаев слово заменяется на любое случайное слово.

· В 10% случаев слово остаётся без изменений

После этого, модель просят предсказать слово, которое должно стоять вместо токена MASK. Таким образом BERT обучается запоминать контекст слов и связывать слова в предложении между собой. Данный этап обучения необходим для того, чтобы модель училась в каждое из слов в предложении «подмешивать» контекст других слов. Это позволяет модели на дальнейшем этапе fine-tuning (тонкой настройки) показывать более хорошие результаты

Next Sentence Prediction

Некоторые задачи NLP тесно связаны с пониманием связей между двумя предложениями (например, Question Answering). Существующие модели зачастую напрямую не обучаются этому и, как следствие, могут не очень эффективно справляться с подобными задачами. BERT явно обучают искать связи между предложениями в тексте.

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

· Для каждого предложения с 50% вероятностью выбирается либо настоящее следующее предложение, либо случайное предложение из всей тренировочной выборки

· Модели дополнительно передаётся флаг, имеющий значение IsNext либо NotNext

С учётом всего вышесказанного, вход для модели выглядит следующим образом (предложения разделены токеном SEP):

Input = [CLS] the man went to [MASK] store [SEP] he bought a gallon [MASK] milk [SEP], IsNext

Input = [CLS] the man [MASK] to the store [SEP] penguin [MASK] are flight ##less birds [SEP], NotNext

Применение BERT для задач NLP

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

1. Sentence Pair Classification Tasks - отнести к какой-либо категории пару из текстов (например, определить, являются ли два вопроса семантически идентичными)

2. Single Sentence Classification Task - отнести текст к какому-либо классу

3. Question Answering Task - имея вопрос, дать на него ответ

4. Single Sentence Tagging Task - пометить каждое слово во входном предложении тэгом (например, организация, человек, местоположение и т.д.)

Рисунок 13. Использование BERT для различных задач NLP

Результаты BERT и OpenAI GPT:

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

2.4 Модели, основанные на OpenAI GPT

2.4.1 OpenAI GPT 2

Компания OpenAI усовершенствовала свою модель OpenAI Transformer и в феврале 2019 года выпустила следующую версию - GPT 2 [13]. На момент написания данной работы, это самая большая существующая нейронная сеть, которая обладает следующими характеристиками:

· Увеличенная версия OpenAI GPT

· 1.5 миллиарда параметров

· Предобучена на 40 ГБ текстовых данных

· Обучение модели заняло несколько дней на TPU [14] и стоило порядка 50 тысяч долларов

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

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

,

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

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

В оригинальной работе создатели OpenAI GPT 2 утверждают, что модель генерирует настолько правдоподобный текст, что его сложно отличить от написанного человеком. Именно поэтому авторы выложили в общий доступ только небольшую модель (в несколько раз меньше основной), поскольку опасаются, что модель будет использоваться в корыстных целях.

MuseNet

В конце апреля 2019 г. на основе модели OpenAI GPT 2 была представлена ещё одна нейронная сеть - MuseNet [15]. Эта сеть пока что не представляет практического интереса - она способна по отрывку мелодии генерировать продолжение в стиле какого-либо музыканта (список заранее подготовлен и модель обучена на мелодиях этих исполнителей).

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

Рисунок 14 Форма для экспериментов с MuseNet

2.5 ELMo

В марте 2018 г. Matthew E. Peters и другие представили работу Deep Contextualized Word Representations, в которой описали новый способ представления текста в виде векторов чисел, который назвали ELMo (Embeddings from Language Models) [16]. Данная работа вышла немного ранее моделей, основанных на архитектуре Transformer, и в момент выхода показала SOTA результаты во многих задачах обработки естественного языка.

Особенность ELMo, подобно BERT и OpenAI GPT, заключается в том, что данный эмбеддинг не просто переводит каждое слово в числовой вектор, а дополнительно вкладывает в слово контекст, в котором оно было употреблено. Происходит это благодаря двунаправленной LSTM нейронной сети [17], которая имеет свойство запоминать контекст. Архитектура модели ELMo будет рассмотрена ниже.

В первую очередь, каждое слово входного вектора переводится в Character embedding [18]. Это позволяет учесть морфологические особенности каждого слова, а также составить корректное представление даже для слов, отсутствующих в словаре. После этого данные передаются в свёрточный слой с несколькими фильтрами, которые позволяют извлечь различные аспекты слов. Последний элемент, через который проходят данные - Highway Network [19], которая позволяет более плавно передавать информацию со входа.

Рисунок 15. Предобработка входа в ELMo

После предобработки данные передаются в двухслойную двунаправленную LSTM-сеть с дополнительными Residual-соединениями [20]. Схема LSTM-блока приведена ниже:

Рисунок 16. Схема работы ELMo

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

,

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

2.5.1 Использование модели

Как и в случае с другими моделями, эффективнее всего использовать предобученный на большом объёме данных ELMo с последующим использованием полученных векторных представлений, например, в классификаторе. Например, на сайте института, выпустившего работу [21], представлены предобученные модели для нескольких языков. Помимо этого, на просторах сети Интернет можно найти модели для других языков, в частности, для русского [22].

2.6 Обзор текущих результатов в задаче семантического анализа

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

В первую очередь это датасет, состоящий из отзывов о фильмах - IMDb dataset [23]. В этом наборе данных содержится порядка 50 тысяч отзывов о фильмах, все они разделены на положительные и отрицательные. Текущий лучший результат на данном наборе - 95.4% точности, которые были получены в работе Universal Language Model Fine-tuning for Text Classification [24].

Другой известный набор данных - Stanford Sentiment Treebank [25]. Из него выделяется две задачи - классификация на два класса и на пять классов. Лучший результат на задаче бинарной классификации, который был получен в работе Multi-Task Deep Neural Networks for Natural Language Understanding [26] - 95.6%, а в задаче классификации на пять классов - 54.7%, полученные в работе Deep contextualized word representations [16], которая была рассмотрена выше.

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

III. ПРИМЕНЕНИЕ МОДЕЛЕЙ С ИСПОЛЬЗОВАНИЕМ TL К ЗАДАЧЕ СЕМАНТИЧЕСКОГО АНАЛИЗА

3.1 Постановка задачи

В рамках данной работы будет рассмотрена продуктовая задача семантического анализа упоминаний банка на открытых Интернет-ресурсах. Будут рассмотрены упоминания Тинькофф банка, который является одним из крупнейших банков России [27].

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

3.2 Описание доступных данных

Данные собираются из нескольких источников: социальные сети (Twitter, Facebook, VK), со специализированных сайтов (banki.ru, различные форумы, где обсуждается работа банков) с помощью закрытой системы YouScan [28] [29]. Эти данные загружаются в корпоративную копию YouScan, которая расположена во внутренней сети банка, и каждый день несколько десятков человек размечают эти упоминания на три тональности: «Позитивная», «Негативная», «Не определено». Таким образом, наиболее важные упоминания - это именно те, которые имеют окраску, отличную от «Не определено», поскольку именно на них сотрудникам банка нужно реагировать.

Данные имеют несколько ключевых особенностей:

· Данные очень разнородные и «грязные» - поскольку они собраны с источников, где используется разговорный язык, в текстах упоминаний встречается огромное количество грамматических ошибок, много нецензурной лексики, сарказма и иронии

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

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

На начальном этапе работы мне было доступно порядка 150 тысяч упоминаний, которые обладали следующими тональностями:

· 134 тысячи - Не определено

· 9 тысяч - Негативная

· 7 тысяч - Позитивная

Помимо прочего, доступны следующие поля:

· Дата и время комментария

· Источник комментария (соц. сеть, форум и т.п.)

· URL комментария

Примеры данных из датасета

Положительная тональность:

· «У нас тинькофф и всюду платим только ей. Картой выгодней обменника получается. + снятие наличных более 3тр по всему миру без комиссии.»

· «Смотри сам, у меня тинькоф уже 5.5 лет и норм»

· «Елена, как раз у Тинькова это выгодно, но не в других банках)»

· «Ура, по киношечке отдельная смс пришла о кешбеке. Так - намного удобнее!»

Тональность не определена:

· «Если платить со счёта отличного от RUB, USD, EUR, GBP то кэшбэка не будет.»

· «Александр, у меня дом и он в залоге у банка ( в ипотеке) по сути у меня больше и нет ни чего»

· «А в Тинькофф можно деньги без комиссии снять?»

Негативная тональность:

· «Я тоже не советуют, тоже брали там если в определённый день не платишь очень большой процент»

· «ВОТ УЖЕ ПЯТЬ ЛЕТ ДУРИТ ТИНЬКОФ БАНК НАРОД И ГРАБИТ ГРАЖДАН СССР, БЕЗ ЛИЦЕНЗИИ БЕЗ НА КРЕДИТНЫЕ ОПЕРАЦИИ.»

· «С такими процентами, потом почку продадите!»

· «@A1daron Одна из причин, по которой карта тинькофф стала резервной»

Орфография и пунктуация авторов сохранена.

3.3 Используемые метрики и модели

3.3.1 Использование SVM в качестве классификатора

В рамках данной работы во многих экспериментах в качестве классификатора используется SVM (Support Vector Machine). Реализация базовых классификаторов машинного обучения, таких как SVM, Random Forest, Naive Bayes и других, представлена в библиотеке sklearn [30]. Поскольку данная библиотека зарекомендовала себя в предыдущих работах, реализация SVM из неё и будет использоваться.

Прежде чем обучать SVM, для него необходимо подобрать параметры. В рамках данной работы будет использоваться RandomizedSearchCV из библиотеки sklearn. Он позволяет подобрать наилучшие параметры перебирая не всё доступное пространство параметров, а случайным образом выбирая некоторые. Это не даёт гарантии на то, что будут выбраны лучшие доступные параметры, однако ввиду большого размера датасета и долгого времени проверки каждого доступного значения параметра, такой подход в данном случае приемлем.

3.3.2 Подготовка выборки и подбор параметров

В каждом эксперименте доступная выборка разделяется на тренировочную и тестовую в процентном соотношении 70/30:

Наиболее подходящие параметры классификатора C и gamma подбираются следующим образом:

3.3.3 Используемые метрики

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

· accuracy - точность классификатора. Показывает, насколько хорошо классификатор работает в целом, т.е. без учёта сбалансированности классов. Вычисляется следующим образом:

· precision - точность внутри класса. Отражает, насколько точно модель определяет каждый из классов. Вычисляется по формуле:

· recall - полнота системы. Для каждого класса показывает долю найденных элементов класса относительно общего количества элементов этого класса. Вычисляется по формуле:

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

· Помимо этого, в работе приведены значения micro и macro-метрик, которые вычисляются сразу для всех классов, а не для каждого:

3.4 Bi-Directional LSTM + Attention

В качестве базисной точки, было принято решение использовать архитектуру Bi-Directional LSTM + Attention [31]. Данная архитектура традиционно используется для задач классификации текстов [32], [33], однако обучать подобную нейронную сеть для получения хороших результатов необходимо с нуля.

Следует отметить, что для обучения подобной нейронной сети необходимо значительно больше данных, чем используется в дальнейших экспериментах, поэтому соотношение тренировочной и тестовой выборки в данном эксперименте - 90 и 10 процентов соответственно (против 70 и 30 в последующих моделях).

Ниже расположены графики зависимости точности на тестовой выборке и значения loss-функции от итерации. Максимальная точность, которую удалось получить - 44% на пятой итерации. Далее точность падает и держится на уровне 39%. Значение loss-функции уменьшается вплоть до 25 итерации, а затем остаётся примерно на одном уровне.

Рисунок 17. Графики зависимости значения loss-функции и точности от итерации модели Bi-Directional LSTM + Attention

Также ниже расположена таблица с основными метриками и матрица ошибок:

Таблица 1.

Результаты модели Bi-Directional LSTM + Attention

Метрики

Класс

precision

recall

F1-score

Не определено

0.41

0.49

0.45

Негативная

0.41

0.45

0.42

Позитивная

0.40

0.29

0.33

micro avg

0.41

0.41

0.41

macro avg

0.41

0.41

0.40

Рисунок 18. Матрица ошибок модели Bi-Directional LSTM + Attention

3.5 fastText + SVM

В качестве первой модели c применением TL было принято решение использовать векторное представление текста fastText [34] в совокупности с классификатором SVM.

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

В рамках данного исследования использовалась модель из пакета deeppavlov [35], которая была обучена на постах, собранных в социальной сети Twitter. Было принято решение использовать данную модель, поскольку синтаксически и по стилю речи она наиболее подходит к датасету, используемому в текущей работе.

На кросс-валидации с разбиением на 5 подвыборок было получено среднее значение точности 63%. Ниже расположена таблица со значениями основных метрик:

Таблица 2. Результаты модели fastText + SVM

Метрики

Класс

precision

recall

F1-score

Не определено

0.72

0.57

0.64

Негативная

0.59

0.69

0.64

Позитивная

0.66

0.68

0.67

micro avg

0.65

0.65

0.65

macro avg

0.66

0.65

0.65

Как видно из таблицы, точнее всего модель определяет класс упоминаний «Не определено», однако из всех таких объектов было определено корректно только 57%. В остальном, никаких аномальных выбросов не наблюдается.

Ниже дополнительно расположена матрица ошибок:

Рисунок 19. Матрица ошибок модели fastText + SVM

3.6 fastText + NN

Следующий подход - вместо классификатора SVM использовать нейронную сеть. Нейронная сеть в данном случае имеет довольно простую архитектуру: два скрытых слоя на 100 и 50 нейронов соответственно, а также выходной слой на 3 нейрона. График точности на валидационной выборке и изменение значения loss-функции от итерации показаны на графиках:

Рисунок 20. Графики зависимости значения loss-функции и точности от итерации модели fastText + NN

Основные метрики представлены в таблице ниже:

Таблица 3. Результаты модели fastText + NN

Метрики

Класс

precision

recall

F1-score

Не определено

0.73

0.55

0.63

Негативная

0.57

0.68

0.62

Позитивная

0.64

0.68

0.66

micro avg

0.64

0.64

0.64

macro avg

0.65

0.64

0.64

Матрица ошибок:

Рисунок 21. Матрица ошибок модели fastText + NN

Как видно из метрик выше, качество классификации практически не изменилось и максимальная точность по-прежнему на уровне 64%.

3.7 BERT pretrained + SVM

Следующим шагом было принято решение использовать предтренированную модель BERT для feature extraction, как было описано ранее. Существует несколько имплементаций модели BERT, мною была выбрана и использована реализация на pytorch [36], поскольку я был знаком с этой библиотекой ранее, и она предоставляет более удобный и высокоуровневый API (https://ru.wikipedia.org/wiki/API), нежели исходная реализация на tensorflow [37].

Специалисты компании Google в своём GitHub-репозитории [38] поддерживают актуальный список предтренированных моделей на разных языках. В данной работе за основу бралась модель BERT-Base, Multilingual Cased, которая была выложена в открытый доступ в конце ноября 2018 года и имеет следующие характеристики:

· Поддерживает 104 различных языка

· Имеет 12 attention-head

· 110 миллионов настраиваемых параметров

· Обучена на большом количестве данных, среди которых не только формальные тексты, но также и выдержки с различных сайтов/форумов и т.д.

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

Выходы сети с последнего слоя для каждого текста были получены следующим образом:

где массив после окончания работы будет содержать столько элементов, сколько было текстов на входе, где каждый элемент - искомый embedding текста, с помощью которого будет обучаться SVM.

После подбора параметров модель была протестирована на валидационной выборке и получена точность в 54%.

Ниже расположен график зависимости точности от размера тренировочной выборки:

Рисунок 22 Кривая обучения модели BERT pretrained + SVM

Как видно из графика, существенный рост точности на тестовой выборке происходит вплоть до выборки размером 1500-2000. После этого рост практически останавливается.

Ниже приведена таблица с основными метриками, а также матрица ошибок:

Таблица 4. Результаты модели BERT pretrained + SVM

Метрики

Класс

precision

recall

F1-score

Не определено

0.69

0.58

0.63

Негативная

0.56

0.65

0.60

Позитивная

0.64

0.64

0.64

micro avg

0.62

0.62

0.62

macro avg

0.63

0.62

0.62

Рисунок 23 Матрица ошибок модели BERT pretrained + SVM

3.8 BERT pretrained + fine tuning + SVM

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

Дообучение производилось с помощью функционала, представленного в библиотеке pytorch-pretrained-bert [39], который был несколько доработан под доступные данные. Для того, чтобы запустить процесс тонкой настройки параметров, необходимо подготовить данные - все отзывы были предварительно отформатированы в следующем формате:

· Каждое предложение упоминания с новой строки

· Упоминания между собой разделены пустой строкой

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

После дообучения самого BERT, были подобраны новые параметры для SVM и удалось получить точность классификации на тестовой выборке в 62%.

Таким образом, дообучение модели под специфичный домен, которое заняло порядка часа, дало прирост примерно в 8%.

Рисунок 24 Кривая обучения модели BERT pretrained + fine tuning + SVM

На графике показана зависимость точности от размера выборки. Как видно, обучение эффективно лишь доопределённого размера выборки, как и в предыдущем случае. В данном примере обучение практически прекращается на размере выборки более 2500. Точность при этом находится в районе 61-62%.

Ниже расположены таблица с основными метриками и матрица ошибок:

Таблица 5. Результаты модели BERT pretrained + fine tuning + SVM

Метрики

Класс

precision

recall

F1-score

Не определено

0.70

0.62

0.65

Негативная

0.59

0.67

0.63

Позитивная

0.67

0.65

0.66

micro avg

0.65

0.65

0.65

macro avg

0.65

0.65

0.65

Рисунок 25. Матрица ошибок модели BERT pretrained + fine tuning + SVM

Как видно из метрик, модель показывает схожую с моделью fastText + SVM точность классификации. Самая «проблемная» тональность, как и прежде, «Не определено».

3.9 BERT pretrained + Classification layer

Помимо feature extraction, модель предоставляет возможность добавить Fully-Connected и Softmax слои для того, чтобы использовать модель сразу же для классификации. Для этого в библиотеке pytorch-pretrained-bert существует специальный класс - BertForSequenceClassification, который добавляет нужные слои к исходной модели. В отличие от самой модели, эти слои не являются предобученными, поэтому их необходимо обучить перед использованием. Ниже расположены графики точности и значения loss-функции при обучении модели:

Рисунок 26. Графики зависимости значения loss-функции и точности от итерации BERT pretrained + Classification layer

Как видно из графиков, точность модели уже после первых итераций достигает 75%. Это объясняется тем, что модель не требуется обучать целиком, по факту происходит обучение только новых слоёв для классификации. В этом преимущество предобученных моделей - на их дообучение под конкретную задачу не требуется большого количества вычислительных ресурсов и времени, они показывают хорошие результаты уже «из коробки». Ниже дополнительно расположены таблица с основными метриками и матрица ошибок:

Таблица 6. Результаты модели BERT pretrained + Classification layer

Метрики

Класс

precision

recall

F1-score

Не определено

0.76

0.74

0.75

Негативная

0.75

0.78

0.77

Позитивная

0.79

0.78

0.78

micro avg

0.77

0.77

0.77

macro avg

0.77

0.77

0.77

Рисунок 27. Матрица ошибок модели BERT pretrained + Classification layer

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

3.10 ELMo + SVM

Следующая модель, которая была использована - эмбеддинг ELMo в совокупности с SVM. Как и в случае с fastText, была использована предобученная модель ELMo, доступная в пакете deeppavlov [40]. Данная модель была обучена на корпусе, состоящем из русскоязычных постов социальной сети Twitter, поскольку это наиболее близкий домен к тому, что используется в работе.

После того, как текст был переведён в числовые вектора с помощью ELMo, были подобраны параметры для классификатора SVM и максимальная точность, которую удалось получить - 73%.

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

Рисунок 28 Кривая обучения модели ELMo + SVM

Ниже расположены основные метрики и матрица ошибок:

Таблица 7. Результаты модели ELMo + SVM

Метрики

Класс

precision

recall

F1-score

Не определено

0.75

0.71

0.73

Негативная

0.70

0.76

0.73

Позитивная

0.75

0.72

0.73

micro avg

0.73

0.73

0.73

macro avg

0.73

0.73

0.73

Рисунок 29 Матрица ошибок модели ELMo + SVM

3.11 ELMo + NN

По аналогии с BERT, вместо SVM для классификации полученных векторных представлений текстов была использована нейронная сеть. Сеть имеет следующую архитектуру: входной слой размером 1024 нейрона, 2 скрытых слоя размером 512 и 256 нейронов соответственно, и выходной слой размерностью 3 нейрона.

Максимальная точность, которую удалось получить - 71%. Ниже расположены графики зависимости точности на тестовой выборке и значения loss-функции от номера итерации. Как видно из графика точности, нейронная сеть уже на 7-8 итерации выходит на максимальную точность и дальше не обучается, хотя значение loss-функции падает.

Рисунок 30. Графики зависимости значения loss-функции и точности от итерации модели ELMo + NN

Также ниже расположены таблица с основными метриками и матрица ошибок:

Таблица 8. Результаты модели ELMo + NN

Метрики

Класс

precision

recall

F1-score

Не определено

0.80

0.60

0.69

Негативная

0.64

0.78

0.71

Позитивная

0.71

0.73

0.72

micro avg

0.70

0.70

0.70

macro avg

0.72

0.71

0.70

Рисунок 31. Матрица ошибок модели ELMo + NN

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

Таблица 9. Сводная таблица результатов по всем использованным методам

Модель

Метрика

Bi-LSTM

+

Attention

fastText

+

SVM

fastText

+

NN

BERT pretrained

+

SVM

BERT pretrained +

fine tuning

+

NN

BERT pretrained +

fine tuning

+

NN

ELMo

+

SVM

ELMo

+

NN

accuracy

0.44

0.63

0.64

0.54

0.62

0.75

0.73

0.71

micro precision

0.41

0.65

0.64

0.62

0.65

0.77

0.73

0.70

micro recall

0.41

0.65

0.64

0.62

0.65

0.77

0.73

0.70

micro F1

0.41

0.65

0.64

0.62

0.65

0.77

0.73

0.70

macro precision

0.41

0.66

0.65

0.63

0.65

0.77

0.73

0.72

macro recall

0.41

0.65

0.64

0.62

0.65

0.77

0.73

0.71

macro F1

0.40

0.65

0.64

0.62

0.65

0.77

0.73

0.70

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

Помимо прочего, из таблицы видно, что все методы с применением Transfer Learning показывают неплохие результаты относительно объёма доступных данных для обучения. На этом же объёме данных модель Bi-LSTM + Attention смогла обучиться до максимальной точности лишь в 44%.

Также стоить отметить, что все micro/macro метрики примерно равны между собой для каждой модели. Это связанно с тем, что датасет, на котором проводились эксперименты, сбалансирован по классам.

ЗАКЛЮЧЕНИЕ

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


Подобные документы

  • Понятие семантики; обзор и анализ существующих средств семантического разбора естественно-языковых текстов. Разработка алгоритма работы системы на основе семантического анализа, его реализация на языке программирования; проектирование интерфейса системы.

    дипломная работа [1,7 M], добавлен 18.03.2012

  • Морфологические анализаторы (морфологизаторы) на различных языках программирования. Анализ методов и технологий автоматической обработки ЕЯ-текстов. Разработка модуля графематического анализа и создания таблицы лексем. Программная реализация классов.

    дипломная работа [3,0 M], добавлен 06.03.2012

  • Asynchronous Transfer Mode как сетевая высокопроизводительная технология коммутации и мультиплексирования, основанная на передаче данных в виде ячеек фиксированного размера. Транспортные протоколы для локальных и глобальных сетей. Иерархия скоростей.

    лекция [186,3 K], добавлен 15.04.2014

  • Рассмотрение и анализ моделей и алгоритмов семантического поиска в мультиагентной системе поддержки пользователей. Ознакомление с интерфейсом чата с ботом. Изучение и характеристика экспериментальных оценок релевантности и пертинентности запросов.

    дипломная работа [3,0 M], добавлен 13.10.2017

  • Управление электронным обучением. Технологии электронного обучения e-Learning. Программное обеспечение для создания e-Learning решений. Компоненты LMS на примере IBM Lotus Learning Management System и Moodle. Разработка учебных курсов в системе Moodle.

    курсовая работа [146,6 K], добавлен 11.06.2009

  • Обзор разнообразных методов теории линейных систем: методов корреляционного и регрессионного анализа, косинор-анализа. Особенности применения факторного анализа. Программная реализация метода главных компонент. Разработка нелинейных регрессионных моделей.

    дипломная работа [390,2 K], добавлен 03.09.2016

  • Сущность и развитие систем электронных платежей. Платежные системы Яндекс.Деньги и WebMoney Transfer, их возможности, сравнение по ряду критериев, особенности регистрации, преимущества, недостатки и процедуры обеспечения безопасности от мошенников.

    реферат [121,4 K], добавлен 14.11.2009

  • Общие понятия об e-learning. Области применения продукта. Модели и технологии. Исследование и анализ программных инструментов. Создание учебного курса для преподавателей инженерно-экономического факультета. Оценка эффективности внедрения такого обучения.

    дипломная работа [4,7 M], добавлен 03.05.2018

  • Основные цели создания Интернет-магазина по продаже спортивного питания. Исследование свойств и характеристик информационного ресурса. Разработка дизайна сайта. Структуризация семантического ядра. Автоматизация процесса оплаты товаров покупателем.

    курсовая работа [2,1 M], добавлен 22.05.2015

  • Обзор Интернет-ресурсов по футбольной тематике в России, Англии, Дублине. Порядок и основные принципы создания сайтов по данной тематике, сравнение их проработанности на различных примерах. Интернет-ресурсы по футбольной тематике различных организаций.

    курсовая работа [1,5 M], добавлен 25.03.2011

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.