Обработка строк текста для ввода нейронной сети
Я понимаю, что входные данные ANN должны быть нормализованы, стандартизированы и т. Д. Оставляя в стороне особенности и модели различных ANN, как я могу предварительно обработать кодированный в UTF-8 текст в диапазоне {0,1} или, альтернативно, в диапазоне {-1,1}, прежде чем он будет предоставлен в качестве входных данных для нейронных сетей? Я искал это в Google, но не могу найти какую-либо информацию (возможно, я использую неправильный термин).
- Имеет ли это смысл?
- Разве это не то, как текст предварительно обрабатывается для нейронных сетей?
- Есть ли альтернативы?
РЕДАКТИРОВАТЬ 20 ноября 2013 года:
Я давно принял за правильный ответ Пита. Однако у меня есть серьезные сомнения, в основном из-за недавних исследований, которые я проводил по символическим знаниям и ANN.
Дарио Флореано и Клаудио Маттиусси в своей книге объясняют, что такая обработка действительно возможна с помощью распределенного кодирования.
В самом деле, если вы попробуете поиск в Google google, существует множество статей и статей по нейробиологии о том, как гипотетическое кодирование предположительно будет использоваться мозгами для кодирования символических знаний.
Теуво Кохонен в своей статье "Самоорганизующиеся карты" объясняет:
Можно подумать, что применение законов нейронной адаптации к набору символов (рассматриваемых как набор векторных переменных) может создать топографическую карту, которая отображает "логические расстояния" между символами. Однако возникает проблема, которая заключается в различном характере символов по сравнению с непрерывными данными. Для последнего сходство всегда проявляется естественным образом, как метрические различия между их непрерывными кодировками. Это больше не относится к дискретным символическим элементам, таким как слова, для которых метрика не была определена. В самой природе символа его значение отделено от его кодирования.
Однако Кохонену удалось справиться с символической информацией в СДЛ!
Кроме того, профессор д-р Альфред Ультш в своей статье "Интеграция нейронных сетей с обработкой символьных знаний" посвящен именно тому, как обрабатывать символические знания (например, текст) в ANN. Ultsch предлагает следующие методологии для обработки символических знаний: нейронное аппроксимативное рассуждение, нейронная унификация, самоанализ и интегрированное приобретение знаний. Хотя по этому вопросу можно найти мало информации о тех, кто в Google ученый или где-либо еще.
Пит в своем ответе прав насчет семантики. Семантика в ИНС обычно отключена. Тем не менее, следующая ссылка дает представление о том, как исследователи использовали RBM, обученные распознавать сходство в семантике различных вводимых слов, поэтому не должно быть невозможным иметь семантику, но потребуется многоуровневый подход или вторичный ANN, если семантика требуется,
Обработка естественного языка с помощью субсимволических нейронных сетей, Ристо Мииккулайнен, 1997 Тренировка машин Больцмана с ограничениями на наблюдениях слов, Г. Е. Даль, Райан П. Адамс, Х. Рарохелле, 2012
5 ответов
Я продолжу и подведу итоги нашей дискуссии в качестве ответа здесь.
Ваша цель - иметь возможность включать текст в вашу нейронную сеть. Мы установили, что традиционные ANN не очень подходят для анализа текста. Основное объяснение того, почему это так, основано на идее, что ANN работают с входами, которые обычно представляют собой непрерывный диапазон значений, а близость двух значений для входа означает своего рода близость по своему значению. Слова не имеют этой идеи близости и, следовательно, не существует реального числового кодирования слов, которые могут иметь смысл в качестве входных данных для ANN.
С другой стороны, решение, которое могло бы работать, состоит в том, чтобы использовать более традиционный семантический анализ, который, возможно, мог бы создать диапазоны настроений для списка тем, и тогда эти темы и их значения настроения могли бы использоваться в качестве входных данных для ANN.
В ответ на ваши комментарии, нет, предложенная вами схема не совсем имеет смысла. Выход искусственного нейрона по своей природе представляет непрерывное или, по крайней мере, двоичное значение. Нет смысла отображать огромное дискретное перечисление (например, символы UTF-8) и непрерывный диапазон, представленный значением с плавающей запятой. ИНС обязательно будет действовать так, как будто 0,1243573 является чрезвычайно хорошим приближением к 0,1243577, когда эти числа могут быть легко сопоставлены, например, с символом новой строки и символом "а", что вообще не будет хорошим приближением друг для друга.
Откровенно говоря, не существует разумного представления для "общей строки Unicode" в качестве входных данных для ANN. Разумное представление зависит от специфики того, что вы делаете. Это зависит от ваших ответов на следующие вопросы:
- Ожидаете ли вы, что слова будут отображаться во входных строках, а не в блоках символов? Какие слова вы ожидаете увидеть в строках?
- Каково распределение длин входных строк?
- Какова ожидаемая энтропия входных строк?
- Есть ли у вас какие-то конкретные знания о том, как будут выглядеть строки?
и, самое главное
- Что вы пытаетесь сделать с ANN. Это не то, что вы можете игнорировать.
Возможно, у вас есть настройка, для которой нет перевода, который фактически позволит вам делать то, что вы хотите с нейронной сетью. Пока вы не ответите на эти вопросы (вы обойдете их в комментариях выше), невозможно дать хороший ответ.
Я могу привести пример ответа, который сработал бы, если бы вы дали определенные ответы на вышеуказанные вопросы. Например, если вы читаете строки произвольной длины, но состоящие из небольшого словаря слов, разделенных пробелами, я бы предложил схему перевода, в которой вы делаете N входных данных, по одному на каждое слово в словаре, и используете рекуррентный нейронный код. сеть для подачи слов по одному, устанавливая соответствующий вход в 1, а все остальные в 0.
Я думаю, что было бы интересно подать текст (закодированный на уровне персонажа) в глубокую сеть убеждений, чтобы увидеть, какие свойства языка он может обнаружить.
В последнее время была проделана большая работа по моделированию языка нейронной сети (в основном на уровне слов, но также и на уровне символов).
Смотрите эти ссылки для получения дополнительной информации
http://www.stanford.edu/group/pdplab/pdphandbook/handbookch8.html http://code.google.com/p/word2vec/
Векторы слов закодированы путем обучения на большом корпусе статей в Википедии и т. Д. И способны приобретать семантические и синтаксические особенности, что позволяет определять "расстояние" между ними "
"Недавно было показано, что слова" векторы "охватывают много языковых закономерностей, например, вектор операций над вектором (" король ") - вектор (" мужчина ") + вектор (" женщина ") близок к вектору (" королева ")"
Также посмотрите эту замечательную исследовательскую работу Ильи Суцкевер о генерации случайных символов, которые демонстрируют особенности английского языка после обучения в Википедии. Удивительные вещи!
http://www.cs.toronto.edu/~ilya/pubs/2011/LANG-RNN.pdf http://www.cs.toronto.edu/~ilya/rnn.html (демонстрация текста в режиме онлайн - очень прохладно!)
Не совсем понятно, что вы пытаетесь сделать, но я думаю, что это в некотором смысле связано с тем, что люди называют "естественным языком". Есть много упоминаний об этом... Я не эксперт, но я знаю, например, что есть несколько интересных ссылок от О'Рейли.
С точки зрения NN есть много разных моделей NN. Я думаю, что вы имеете в виду самый популярный, известный как Многослойный персептрон с неким алгоритмом обратного распространения, но есть много моделей ассоциативной памяти, которые могут быть более подходящими для вашего случая. Очень хорошая ссылка об этом - книга Саймона Хайкина.
Однако, если бы я попытался сделать что-то подобное, я бы начал пытаться понять, как часто встречаются буквы, слоги и слова в английском языке (?).
Я надеюсь, что я помог. Как я уже говорил, я не эксперт в этой области.
Решение 1: A = Alt(65) = 65 Bin = 01000001
Решение 2. Добавьте слова в словарную базу данных и добавьте поле id(int). Преобразовать поле идентификатора в двоичный файл.
В NN используйте буквы или слова id (в двоичном виде)