Вопрос или проблема
Как инженер по обработке сигналов, только начинающий осваивать обработку естественного языка, я сбит с толку в вопросе подачи входных данных в сеть CNN.
С моими знаниями о CNN я пытаюсь создать классификатор для определения этнической принадлежности, используя в качестве входных данных текст (фамилию (LN), отчество (MN), имя (FN)). У меня есть список из 8 000 000 образцов с фамилиями, отчествами, именами и информацией о классе.
array = [['person1_LN','person1_MN','person1_FN','Person1_class'],
['person1_LN','person1_MN','person1_FN','Person2_class'],
....]
Я хочу применить сверточный слой (CL), после которого следует слой подвыборки (PL) для LN, MN и FN соответственно.
Пример обработки текста демонстрирует, как преобразовать предложения в векторные представления слов. Я пытаюсь понять этот фрагмент кода:
W = tf.Variable(tf.random_uniform([vocab_size, embedding_size], -1.0, 1.0), name="W")
self.embedded_chars = tf.nn.embedding_lookup(W, self.input_x)
self.embedded_chars_expanded = tf.expand_dims(self.embedded_chars, -1)
Этот учебник говорит, что обучение должно проводиться с использованием word2vec. Читая эти два блога, я ничего не смог понять. В обоих случаях мои данные не являются предложениями, тем более, на чем я должен обучаться во втором случае?
Будет ли CL работать, если я просто подам на вход слова без векторных представлений?
Если нет, есть ли какой-то пример, как в моем случае представить слова для подачи на вход CNN?
Итак, здесь вопрос в том, как использовать текст в архитектуре CNN.
Так же, как когда мы обрабатываем изображения с помощью CNN, текстовые данные также будут 2D-матрицей, где строки будут представлять текстовые признаки, а столбцы — последовательность символов (например, составляющих имя).
Конечно, если мы просто используем one-hot кодирование, мы получаем разреженность данных, что не особо эффективно с точки зрения вычислений, особенно при использовании CNN. Поэтому предпочтительно использовать векторные представления слов, которые вы описали в своем посте. Здесь векторные представления слов направлены на уменьшение высокой размерности входных данных, чтобы уменьшить вероятность разреженности данных.
Однако есть потенциальная проблема с использованием векторных представлений слов в вашей задаче. Принцип векторных представлений заключается в том, чтобы назначать схожие векторы словам, которые могут легко заменяться в похожих контекстах (например, “Сэм добрый” и “Саймон добрый”), и которые не влияют на связность предложения. Как вы можете заметить, когда дело касается имен собственных, мы можем получить похожие векторы для всех имен, так как они очень взаимозаменяемы в любом контексте и не влияют на общую связность предложения.
Таким образом, хотя это и противоречиво, я бы посоветовал начать с использования one-hot кодированных последовательностей символов для этой задачи, а затем, когда вы это реализуете, вы можете найти более эффективный способ представления имен.
Ответ или решение
Для решения задачи обработки текстов с использованием свёрточной нейронной сети (CNN) в задаче классификации имени по этнической принадлежности, необходимо тщательно подготовить входные данные. В данном случае, вы обладаете массивом данных, состоящим из фамилии (LN), отчества (MN), имени (FN) и класса (этнической принадлежности) для каждого человека. Для подготовки данных к обработке CNN можно использовать несколько подходов, каждый из которых имеет свои преимущества и недостатки.
Теоретические основы
Теоретическая база работы CNN с текстами заключается в преобразовании текстовых данных в числовую форму, удобную для обработки матричными операциями, характерными для CNN. Для изображений текстовым аналогом является представление последовательности символов в числовом формате. Это может быть как один горячий код (one-hot encoding), так и более сложные методы, такие как эмбеддинги (например, word2vec, GloVe и др.).
-
Один горячий код: каждый символ или слово представляется как вектор, где одна позиция равна единице, а все остальные — ноли. Несмотря на простоту, такой подход ведёт к значительной разреженности данных.
-
Эмбеддинги слов: более продвинутый метод, в котором каждый элемент текста преобразуется в вектор меньшего размера, хранящий информацию о семантическом сходстве элементов. Основное преимущество — снижение разреженности и улучшение генерализации моделей.
Пример на практике
Пример на TensorFlow, описанный в вашем вопросе, демонстрирует подход с использованием слова эмбеддингов. Рассмотрим коротко, как это работает:
W = tf.Variable(tf.random_uniform([vocab_size, embedding_size], -1.0, 1.0), name="W")
self.embedded_chars = tf.nn.embedding_lookup(W, self.input_x)
self.embedded_chars_expanded = tf.expand_dims(self.embedded_chars, -1)
-
tf.Variable
используется для создания матрицы случайных весов, представляющей эмбеддинги слов.vocab_size
— размер вашего словаря,embedding_size
— размерность эмбеддингового пространства. -
tf.nn.embedding_lookup
осуществляет поиск необходимых векторов для вашего входного текста (self.input_x
) через использованную матрицу эмбеддингов W. -
tf.expand_dims
увеличивает размерность для взаимодействия с CNN слоями, где операции свёртки требуют соответствующего количества измерений в данных.
Применение на практике
Теперь, обращаясь к проблеме этнической классификации имен, мы сталкиваемся с следующими вызовами и решениями:
-
Разработка входного формата: решите, как представить ваши текстовые данные. В случае имен может быть и целесообразно использовать один горячий код для последовательностей символов, так как имена часто специфичны и использование более сложных эмбеддингов может не раскрыть семантической структуры столь явно.
-
Обучение и применение CNN: после применения одного из выбранных подходов текстовые последовательности могут быть переданы в слои свёртки. Не забудьте разделить ваши данные на обучающие и тестовые выборки; это важно для оценки качества модели.
-
Оптимизация: опытным путем удостоверьтесь, что настройки гиперпараметров, такие как размер шага свёртки, размер ядра и количество слоёв, продвигают вашу модель к лучшему обобщению.
-
Оценка и эксперимент: используя метрики, такие как точность, полнота и F-мера, оцените результативность вашей модели и экспериментируйте с различными архитектурными решениями и подходами к предварительной обработке данных.
Подводя итог, использование CNN для классификации текстовых данных — это эффективный метод, при условии правильного подхода к подготовке данных. Начав с одного горячего кода, можно постепенно усложнять систему, добавляя разные техники токенизации и семантического анализа, что поможет вам достичь результатов самого высокого уровня.