Есть слова, длиной от 4 до 7 символов, состоящих из строчных букв английского алфавита. Каждому слову в соответствии ставится 1 или 0. Нужно обучить ИНН так, чтобы она сама могла оценивать новые слова.
Попробовал перегонять каждую букву в 26 мерный вектор и прокидывать эти вектора на вход к персептрону. Сеть ничему не обучилась, пишет почти нулевую ошибку, но на деле даже на обучающей выборке дает огромную ошибку.
В какую сторону копать? Может нужна другая архитектура сети? Или же другой метод маппинга слова в инпут? UPD
Опишу саму задачу, чтобы было понятней. Я хочу научить ИНС определять субъективную оценку "красоты" набора букв. То есть, есть наборы букв, сочетание которых выглядит хорошо, есть наборы букв, сочетание которых выглядит плохо. Например, мне нравится, как выглядит слово "cool", но мне абсолютно не нравится, как выглядит "kkrt". Это субъективно, поэтому вряд ли здесь может помочь что-то кроме ИНС.
Текст обычно кодируют двумя способами:
1) bag-of-words (или chars, или еще чего) - кодируем вектором длины N (размер словаря), для каждого примера i-й элемент вектора равен кол-ву этих слов\символов в тексте. Плюс различные вариации вроде TF-IDF (когда используем не просто количество, а более сложную метрику), n-grams (когда используем не отдельные слова, а последовательности из 2, 3 и более), skipgrams (когда используем не отдельные слова, а сочетания слов, отстоящие друг от друга на каком-то расстоянии - чтобы выкидывать предлоги, артикли и прочее) и так далее. Закодированный таким образом текст можно прогнать через наивный байесовский классификатор, SVM (обычно показывает лучший результат на порядках 10000-100000 примеров), MLP
2) кодируем вектором длины N (максимально допустимая длина текста), где каждый элемент - это индекс слова\символа. Если текст короче N, то дополняем нулями. С таким вариантом кодирования работают сверточные, рекурентные и рекурсивные сети.
Большое спасибо за развернутый ответ!
Касательно моей задачи: перцептрон меня очень обрадовал для слов фиксированной длинны. Всего на 600 примерах он уже генерирует очень и очень хорошие варианты. Теперь хочу расширить для слова произвольный длинны, пока не знаю, какую лучше архитектуру выбрать.
n7olkachev: Вот в этой статье https://arxiv.org/abs/1509.01626 сравнивается несколько штук методов классификации текста на нескольких датасетах различного размера (от 120К примеров до 3.6М).
На входе у меня получается массив размерности 26 * 7, т.е. объединенные массивы для всех букв. Буква в массив перегоняется следующим образом: arr[i] = word[i] - 'a' == i ? 1 : 0. Т.е. я ставлю 1 для текущей буквы, 0 для всех других. Если длина слова меньше 7, тогда входные данные добиваются нулями до нужной длинны.
n7olkachev Нет, не то что у вас получается, а человеческим языком постановку задачи. Например - "на вход набор слов, на выходе - является ли фраза нецензурной".
n7olkachev Фух, у вас не 26-мерный вектор. Обычный двухмерный. По сабжу. Попробуйте передавать просто номер букв - условно позицию в алфавите. Если позиция не важна - то еще и отсортируйте.
Либо, второй вариант - это сделать 26 входов, и уже их инитить 0 и 1. Ну и еще - структуру нейросети опишите - там всякое количество слоев, метод обучения, бла бла бла. Все это - в текст вопроса - может кто чего дельнее скажет.
Роман Мирр Ну а что такого - ИНС вполне подходит для субъективных оценок, когда зависимость входных и выходных параметров плохо подчиняется закономерности
GavriKos: Так "когда зависимость входных и выходных параметров плохо подчиняется закономерности", то как Учитель НС обучит?? Это ведь учитель, сам не имеющий представления о том чему учить.
Учитель НС *обязан* знать формально чему обучать. Должны быть примеры "хорошего" и "плохого" слова. Но заранее предупрежу, что задача в данной формулировке нерешаема.
Роман Мирр Ну дык субъективно. Я подаю слово, и говорю - нравится или нет. Обучение с учителем, классическое, не автоматическое. Все уже придумано. Метод оценки обученности - на контрольной выборке.
GavriKos: двухмерный? Как мне запихнуть 4-7 букв всего лишь в два измерения?
Порядок все таки важен. "Красота" -- слово выглядит хорошо, "крстаоа" -- слово выглядит не очень. Поэтому и в 26 входов тоже не получится.
Касательно варианта с просто номеров букв. На сколько я понимаю, НС тогда будет думать, что, условно, 'a' и 'b' -- близкие по значению входы. Но это тоже неверно, между буквами нет такой близости.
n7olkachev 4-7 букв запихиваются в 1 измерение. А у вас 26 строк и 7 колонок, условно - это два измерения.
Про "ИНС будет думать" - все зависит от чувствительности.
Роман Мирр: интересно, почему она нерешаема. Разве это не идеальный пример, когда нужно использовать нейросеть? Я не могу определить закономерность сам, однако знаю выход для каждого из входа.
n7olkachev: Предположим, что слово "Красота" кодируется как "1,0,1", а слово "крстаоа" как "1,1,0". На основании какого критерия тогда "1,0,1" *лучше* чем "1,1,0"? На основании какой метрики?
Я понимаю, что моя проблема как раз таки кроется в кодировании входных данных, но не могу найти ничего лучше предложенного мной варианта. Куча информации на тему семантического кодирования слова, которое мне совсем не подходит.