Нейронная сеть разбирает данные строки?

28

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

Тем не менее, я пытаюсь обернуть голову вокруг, если это возможно сделать с помощью строковых входов? У меня есть сценарий использования «рекомендательного механизма» для фильмов, которые просмотрел пользователь. Фильмы содержат много строковых данных (заголовок, сюжет, теги), и я мог бы представить, что текст будет сокращен до нескольких ключевых слов, которые описывают этот фильм, но даже если я проанализирую пять лучших слов, которые описывают этот фильм, я думаете, мне нужны входные нейроны для каждого английского слова, чтобы сравнить набор фильмов? Я мог бы ограничить входные нейроны только словами, используемыми в наборе, но мог ли он расти / учиться, добавляя новые фильмы (пользователь смотрит новый фильм с новыми словами)? Большинство библиотек, которые я видел, не позволяют добавлять новые нейроны после обучения системы?

Существует ли стандартный способ сопоставления данных строки / слова / символа со входами в нейронную сеть? Или нейронная сеть на самом деле не является подходящим инструментом для разбора строковых данных, подобных этому (что является лучшим инструментом для сопоставления с образцом в строковых данных)?

MidnightLightning
источник

Ответы:

19

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

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

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

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

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

Мэдисон Мэй
источник
1
Дайте мне знать, если у вас есть дополнительные вопросы, и я сделаю все возможное, чтобы предоставить более подробную информацию.
Мэдисон, май,
Спасибо, это дает мне отличные условия для продолжения изучения!
MidnightLightning
Между прочим, я могу относиться к «хэшированию функций», так как это кажется очень похожим на фильтр Блума , с которым я знаком по работе с кодом криптовалюты. Интересно, эффективнее ли иметь функцию хеширования, связывающую входную функцию с несколькими позициями индекса (в стиле bloom-filter), вместо того, чтобы нуждаться во второй хэш-функции для установки знака индекса ...
MidnightLightning
6

Оба ответа от @Emre и @Madison могут дать хорошее представление об этой проблеме. Проблема в том, что вы представляете вашу строку в виде векторного элемента для ввода в NN.

Во-первых, проблема зависит от размера строки, которую вы хотите обработать. В этой настройке длинные строки, содержащие маркеры май (обычно слова), часто называют документами. Существуют отдельные методы для работы с отдельными токенами / словами.

Существует несколько способов представления документов. Многие из них делают предположение о сумме слов . Простейшие типы представляют документ в виде вектора количества слов или частоты слова (tf). Чтобы устранить влияние длины документа, обычно люди предпочитают нормализовать количество документов, в которых отображается термин, частоту документов ( tf-idf ).

Другой подход - тематическое моделирование, которое изучает скрытое низкоразмерное представление данных. LDA и LSI / LSA являются типичными вариантами, но важно помнить, что это без присмотра. Изученное представление не обязательно будет идеальным для обучения под присмотром, которое вы проводите со своим NN. Если вы хотите заниматься тематическим моделированием, вы также можете попробовать контролируемые тематические модели .

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

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

При использовании NN в NLP люди часто используют разные архитектуры, такие как рекуррентные нейронные сети (например, сети с кратковременной памятью ). В некоторых случаях люди даже использовали сверточные нейронные сети в тексте.

jamesmf
источник
Я думаю, что word2Vec действительно самый точный ответ на вопрос. Существует очень хороший учебник по Kaggle о том, как его тренировать и использовать: kaggle.com/c/word2vec-nlp-tutorial/details/part-2-word-vectors
jagartner
Спасибо, я забыл ссылку на word2vec, я добавлю одну (в дополнение к той, что вы перечислите здесь!)
jamesmf
3

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

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

Эмре
источник
Стоит отметить, что это явно не проблема во всем машинном обучении, а только проблема, когда речь идет о генерации векторов признаков, которые не являются повсеместными в машинном обучении.
Слейтер Викторофф
Какой вид машинного обучения не использует функции?
Эмре
Случайный лес - хороший пример того, для чего не получается получить вектор признаков, который вы видите в нейронных сетях. Многие неконтролируемые методы также работают с необработанными словами, а не с векторными признаками. Примечание: я не говорил, что есть методы, которые не используют функции, но есть методы, которые не опираются на строго структурированные векторы.
Слейтер Викторофф
Я не знаю, что вы подразумеваете под "строго структурированным".
Эмре
строго структурирован 1d-вектор unint8, а не список, содержащий словарь, матрицу весов и серию строк
Слейтер Викторофф
0

Я попробовал следующие 2 способа для пробной n-test реализации нейронных сетей с текстом. Последний работает довольно хорошо, но с ограничениями.

  1. Создайте словарь с помощью токенов word2vect или NLTK / custom word и назначьте индекс каждому слову. Именно этот индекс представляет слово как число.

    проблемы:

    • Индексы должны быть "нормализованы" с использованием масштабирования объектов.
    • Если выходные данные нейронной сети имеют даже небольшое отклонение, то выходные данные могут быть индексом неожиданного слова (например, если ожидаемый выходной сигнал равен 250; но NN выдает 249 или 251, то это может быть близкий выходной сигнал из числового контекста; но они являются указателями на разные слова). Рекуррентный NN для генерации выходного индекса может быть использован здесь.
    • Если новые слова добавляются в словарь, то индексы токенов должны быть пересчитаны. Модель, обученная с предварительно масштабированными значениями, может стать недействительной и должна быть переподготовлена.
  2. Использовать единичную матрицу, например, для «n» слов. Использовать «nx n» или (n-1 x n-1) матрицу, где каждая строка и столбец представляет слово. Поместите «1» в ячейку пересечения и «0» в местах отдыха. ( ссылка )

    проблемы:

    • Каждое входное и выходное значение является вектором «nx 1». Для словаря большого размера его громоздкие вычисления и медленнее.
    • Если новые слова добавляются в словарь, то единичная матрица (то есть вектор слов) должна быть пересчитана. Модель, обученная с предварительно рассчитанными векторами, может стать недействительной и должна быть переподготовлена.
ak2205
источник