Этот пост призван предоставить пошаговую процедуру для выполнения вывода моделей глубокого обучения на мобильных устройствах с помощью Visual Studio для Mac. Мы исследуем различные стратегии для достижения этой цели и обсуждаем технический долг при их следовании.

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

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

Шаг А. Тренируйте свою модель глубокого обучения на Python

Первым шагом является обучение модели глубокого обучения для обнаружения языка вражды в тексте.

1. Набор данных

Сначала мы ищем помеченный набор данных для этой задачи. Для этого мы используем недавно выпущенный на NAACL-2019 набор данных из твиттера Zampieri et al. (2019). Набор данных содержит 13 240 твитов, помеченных как ВЫКЛЮЧЕНО (оскорбительные) или НЕ (не оскорбительные) на основе краудсорсинговых человеческих аннотаций. Некоторые примеры твитов и меток в этом наборе данных приведены ниже:

@USER You are bringing up honor and decency? With that yoyo in the picture? That's rich.	NOT
@USER Get the hell out of my country.  OFF

2. Предварительная обработка

Мы следуем следующей процедуре для предварительной обработки нашей модели:

2.1 Токенизация и строчные буквы

Токенизация (Webster and Kit, 1992) - это процесс разделения очищенного текстового экземпляра на наиболее близкие допустимые слова. Мы разбиваем слова на отдельные токены с помощью библиотеки NLTK (Loper et. Al., 2002). Затем мы убеждаемся, что каждый жетон имеет нижний регистр, чтобы сохранить единообразие.

2.2 Очистка данных и удаление стоп-слова

Мы удаляем бесполезный текстовый контент, специфичный для этого набора данных. Например, мы удаляем все упоминания "URL". Кроме того, мы удаляем буквенно-цифровой контент, такой как смайлы и хэштеги, сохраняя только буквы и цифры. Мы также удаляем список слов, которые не имеют большого значения (Silva et. Al., 2003) в большинстве задач классификации, связанных с классификацией на основе семантики. Для этой задачи мы используем стандартный список NLTK (Loper et. Al., 2002).

2.3 Лемматизация

Выделение основы - это процедура, при которой мы сводим слова одной основы к общему корню (Lovins and Beth, 1968). Это помогает уменьшить слово до его базовой формы, удаляя каждое слово его словообразовательных и словоизменительных суффиксов. Лемматизация - это форма образования корней, при которой слова сводятся к их действительным корням. Лемматизация оказалась полезной для улучшения характеристик за счет объединения вхождений одинаковых значащих слов вместе (Perkins, 2010). Преимущество перед выделением корней состоит в том, что корневые слова фактически отображаются в словарном слове и не создаются слепыми правилами удаления префиксов / суффиксов, в отличие от выделения корней, как в Porter Stemmer (Porter, 1997). Мы используем лемматизацию на основе WordNet (Miller, 1995), предоставленную NLTK (Loper et. Al., 2002). Это используется как альтернатива стеммингу.

3. Векторизация и сохранение сопоставления токенов и индексов

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

Сопоставление между токенами и их индексом горячего кодирования выглядит так:

Точно так же мы можем кодировать метки в горячие векторы.

4. Модели

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

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

CNN - это класс глубоких искусственных нейронных сетей с прямой связью, в которых соединения между узлами не образуют цикла. Они оказались полезными для задач, подобных обнаружению языка ненависти, например для анализа настроений (Kim, 2014). Во многом это связано с тем, что они способны обнаруживать пространственные особенности, которые в случае текста означают определенные n-граммы слов. Следовательно, если основные функции, полезные для задачи, представлены в форме последовательных слов, операция свертки может сработать при обнаружении шаблона, подобного этим словам. Используя фильтры нескольких размеров, мы можем обнаруживать шаблоны разной длины. Еще одним преимуществом является то, что CNN инвариантны к трансляции. Это означает, что особенность может быть обнаружена независимо от того, где именно она встречается в предложении. В контексте обнаружения языка ненависти мы могли бы обнаружить n-граммы, такие как f # * & off, вернуться в вашу страну и т. Д., Которые если он присутствует в любом месте текста, с большой вероятностью он будет содержать ненавистнические высказывания. Другие задачи, в которых может быть полезна классификация на основе CNN, - это анализ тональности, обнаружение спама и категоризация тем. На следующем рисунке показаны детали простой модели CNN для обнаружения языка вражды.

В этой модели мы добавили слой внедрения, который принимает горячую кодировку текста (дополняется до максимальной длины) и преобразует его в вектор длиной 30. Это сделано для того, чтобы избежать использования предварительно обученных внедрений, таких как Word2Vec или GloVe, справочная таблица которых потребляла бы большой объем памяти, когда шаги предварительной обработки воспроизводятся на шаге E. Для получения дополнительной информации о CNN для классификации текста вы можете обратиться к этой статье.

Вот код для воспроизведения этой сети в Керасе.

4.2 Закрытые рекуррентные нейронные сети

RNN - это класс искусственной нейронной сети, в которой связи между узлами образуют ориентированный граф по последовательности. Это позволяет им хорошо работать с временными последовательностями, такими как временные ряды и текстовое содержимое. В отличие от CNN, RNN лучше, когда классификация определяется семантической зависимостью большого диапазона, а не некоторыми локальными ключевыми фразами. Используя закрытые модули, такие как LSTM и GRU, мы гарантируем, что можем кодировать долгосрочные зависимости. На следующем рисунке показаны подробности простой модели LSTM для обнаружения языка вражды.

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

Вот код для воспроизведения этой сети в Керасе.

4.3 Выбор модели

Мы перемешиваем данные и делим 80–20 разделов между данными обучения и тестирования. Мы можем убедиться, что разделение имеет сбалансированное соотношение меток OFF и NOT, используя передискретизацию и стратификацию. Далее мы можем разделить обучающие данные на 80–20, чтобы использовать последние в качестве данных проверки для настройки наших моделей. При тестировании нашей модели CNN и LSTM мы получили лучшую точность первой по сравнению со второй. Следовательно, мы выбираем модель CNN для вывода.

Б / С. Преобразование в ONNX и CoreML

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

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

Теперь мы хотим преобразовать нашу модель Keras в ONNX, а затем преобразовать ее в CoreML. Другой вариант - напрямую преобразовать модель Keras в модель CoreML. Мы показываем оба этих варианта ниже:

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

Из формата onnx мы можем преобразовать нашу модель в coreml, как показано в приведенном выше коде.

Техническая задолженность: по состоянию на 12 июня 2019 года некоторые функции, такие как tf.gather и tf.shape, не были реализованы в библиотеке onnx_coreml, поддерживаемой Apple. Большинство ограничений связано с уровнями, доступными в спецификации CoreML NN, а не с конвертером. Однако, поскольку бета-версия CoreML 3 только что была выпущена во время WWDC, и у нее гораздо больше операций, таких как ONNX, конвертер должен иметь возможность использовать это. В следующие пару месяцев команда Apple может значительно обновить конвертер ONNX, добавив в него новые слои, так что процесс преобразования моделей NLP должен стать намного более плавным.

Если вы столкнулись с такой технической задолженностью, пожалуйста, конвертируйте модель keras напрямую в модель coreml, используя вариант 2, как показано выше.

Д. Добавить модель coreml в Visual Studio для Mac

Visual Studio для Mac - это IDE, выпущенная Microsoft для разработки приложений и игр для iOS, Android и Интернета с использованием среды .NET.

Чтобы добавить нашу модель в VS для Mac, просто добавьте модель CoreML (файл с расширением .mlmodel) в каталог ресурсов вашего приложения (файл .sln). В свойствах файла модели убедитесь, что для его действия Build установлено значение CoreMLModel. Это означает, что он будет скомпилирован в файл .mlmodelc при построении приложения. Убедитесь, что для свойства «Копировать в вывод» вашего файла .mlmodel установлено значение «Всегда копировать».

Э. Воспроизвести шаги предварительной обработки на C #

Чтобы убедиться, что логический вывод работает в нашем приложении, нам нужно воспроизвести те же шаги предварительной обработки на C #, которые мы выполнили в нашей программе Python.

E.1 Токенизация, строчные буквы и очистка данных

Перед выполнением какой-либо предварительной обработки нам необходимо объявить нашу модель coreml, как показано в строке 3. Затем мы используем токенизатор из NatualLanguage framework в Xamarin.iOS. Эта структура не только обеспечивает токенизацию текста, но также удаляет любые знаки препинания и смайлики из нашего текста.

Ошибка в токенизаторе. В настоящее время в NLTokenizer есть ошибка, из-за которой, если текст, который нужно токенизировать, начинается с символа «, происходит сбой. Один из способов избежать этой проблемы - добавить к тексту префикс «? ‘(знак вопроса, за которым следует пробел). Это обеспечит это? удаляется (потому что это знаки препинания), а оставшийся текст будет правильно размечен.

E.2 Удаление стоп-слова

Во-первых, нам нужно добавить в наш проект текстовый файл со всеми стоп-словами, используемыми в NLTK. Чтобы получить набор этих стоп-слов, мы можем использовать следующую команду Python.

После сохранения этого списка в виде файла .txt мы добавляем его в раздел "Ресурсы" нашего проекта. Затем мы можем убедиться, что в нашем тексте нет этих слов.

E.3 Лемматизация

Для лемматизации мы используем библиотеку LemmaSharp от Matjaž Juršič et. al. Мы используем список отображений лемматизации отсюда. Мы также включаем этот список в раздел Ресурсы.

Воспроизведение векторизации на C #

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

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

Ф. Проверка вывода на мобильных устройствах

F1. Подача входных векторов в модель и извлечение выходных данных.

Когда мы добавили hate_coreml.mlmodel в раздел "Ресурсы", VS for Code автоматически сгенерировал файл с именем hate_coreml.cs

F.2 Создание пользовательского интерфейса

Для создания пользовательского интерфейса мы можем выбирать среди множества примеров, приведенных здесь. Мы приводим пример чистого интерфейса с текстовым полем, кнопкой и okAlert, уведомляющим пользователя, выключен ли текст или НЕТ и с какой вероятностью. Сначала мы создаем этот дизайн с помощью панели инструментов перетаскивания в Main.storyboard. Вот снимок экрана с нашим дизайном.

Теперь в файле ViewController.cs мы фиксируем текст, предоставленный пользователем через UserInput.Text, выполняем шаги предварительной обработки, как описано в разделе E, в событии щелчка Обнаружить и вывести предсказанную метку и ее вероятность через переменные hate_speech_var и prob соответственно. Мы выводим эти две переменные пользователю, когда он нажимает кнопку Определить, как показано в приведенном ниже коде.

F.3 Проверка вывода на эмуляторе

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

Для полного проекта вы можете обратиться к этому репозиторию-

Https://github.com/ayushoriginal/HateSpeechDetector

Ссылки:

  1. Вебстер, Джонатан Дж. И Чунью Кит. «Токенизация как начальный этап в НЛП». COLING 1992 Volume 4: 15-я Международная конференция по компьютерной лингвистике. Vol. 4. 1992.
  2. Сильва, Катарина и Бернардете Рибейро. «Важность удаления стоп-слова для значений отзыва при категоризации текста». Труды международной совместной конференции по нейронным сетям, 2003 г.. Vol. 3. IEEE, 2003.
  3. Лопер, Эдвард и Стивен Берд. «NLTK: инструментарий естественного языка». препринт arXiv cs / 0205028 (2002 г.).
  4. Джейкоб Перкинс. 2010. Обработка текста Python с помощью NLTK 2.0 Cookbook. Packt Publishing.
  5. М. Ф. Портер. 1997. Чтения по информационному поиску. глава Алгоритм удаления суффиксов, страницы 313–316. Морган Кауфманн Паблишерс Инк., Сан-Франциско, Калифорния, США.
  6. Ловинс, Джули Бет. «Разработка алгоритма стемминга». мех. Translat. И комп. Языкознание 11.1–2 (1968): 22–31.
  7. Педрегоса, Фабиан и др. «Scikit-learn: машинное обучение на Python». Журнал исследований в области машинного обучения 12 октября (2011 г.): 2825–2830.
  8. Дюмэ, Сьюзен и др. «Алгоритмы индуктивного обучения и представления для категоризации текста». (1998).
  9. Форман, Джордж. «Обширное эмпирическое исследование показателей выбора функций для
    классификации текста». Журнал исследований в области машинного обучения 3 марта (2003 г.): 1289–1305.
  10. Рамос, Хуан. «Использование tf-idf для определения релевантности слова в запросах документа». Материалы первой учебной конференции по машинному обучению. Vol. 242. 2003.
  11. Пеннингтон, Джеффри, Ричард Сочер и Кристофер Мэннинг. «Перчатка: глобальные векторы для представления слов». Материалы конференции 2014 г. по эмпирическим методам обработки естественного языка (EMNLP). 2014 г.
  12. Ронг, Синь. «Объяснение обучения параметрам word2vec». Препринт arXiv arXiv: 1411.2738 (2014).
  13. Кокс, Дэвид Р. «Регрессионный анализ двоичных последовательностей». Журнал Королевского статистического общества: серия B (методологическая) 20.2 (1958): 215-232.
  14. Limsopatham, Nut, et al. «Использование терминологической зависимости при работе с отрицанием в медицинском поиске». Материалы 35-й международной конференции ACM SIGIR по исследованиям и разработкам в области информационного поиска. ACM, 2012.
  15. Миттал, Намита и др. «Анализ настроений в обзорах на хинди, основанный на отрицании и соотношении дискурсов». Материалы 11-го семинара по ресурсам азиатского языка. 2013.
  16. Ким, Юн. «Сверточные нейронные сети для классификации предложений». Препринт arXiv arXiv: 1408.5882 (2014).
  17. Пак, Джи Хо и Паскаль Фунг. «Одноэтапная и двухэтапная классификация для обнаружения ненормативной лексики в твиттере». Препринт arXiv arXiv: 1706.01206 (2017).
  18. Джоулен, Арман и др. «Набор хитростей для эффективной классификации текста». Препринт arXiv
    arXiv: 1607.01759
    (2016).
  19. Инь, Венпэн и др. «Сравнительное исследование cnn и rnn для обработки естественного языка». Препринт arXiv arXiv: 1702.01923 (2017).
  20. Бурнап, Пит и Мэтью Л. Уильямс. «Кибернетические высказывания в твиттере: приложение машинной классификации и статистического моделирования для выработки политики и принятия решений». Политика и Интернет 7.2 (2015): 223-242.
  21. Чавла, Нитеш В. и др. «SMOTE: метод передискретизации синтетического меньшинства». Журнал исследований искусственного интеллекта 16 (2002): 321-357.
  22. Бернс, Уолтер. Первая поправка и будущее американской демократии. Нью-Йорк: Основные книги, 1976.
  23. Серадж, Мина. «Мы создаем, соединяем, уважаем, поэтому мы являемся интеллектуальной, социальной и культурной ценностью в онлайн-сообществах». Журнал интерактивного маркетинга 26.4 (2012): 209-222.
  24. Босиджи, Пол и Лерой Макфарлейны. «Домогательства в Интернете: к определению киберпреследования». Журнал тюремной службы (2002): 31–38.
  25. Сильва, Леандро и др. «Анализ целей ненависти в социальных сетях». Десятая Международная конференция AAAI по Интернету и социальным сетям. 2016 г.
  26. Солтон, Джерард и Дж. Майкл. «Макгилл. 1983. » Введение в современный поиск информации (1983).
  27. Зампиери, Маркос и др. «SemEval-2019 Task 6: Выявление и категоризация ненормативной лексики в социальных сетях (OffensEval)». Препринт arXiv arXiv: 1903.08983 (2019).