Почему моя нейронная сеть Brain.js застряла в середине?

1

Я пытаюсь использовать Brain.js для целей генерации текста.

См. Мой пример WIP по адресу: https://codepen.io/tomsoderlund/pen/WEPqzE (см. Также вывод консоли).

Я в основном:

  1. Создайте массив из всех слов: wordsInOrder
  2. Создайте массив dictionaryWords со отсортированными уникальными словами.
  3. Я создаю свой обучающий набор из wordsInOrder следующим образом: { input: [0.0326], output: [0.9565] }, где input - индекс словаря текущего словаря (нормализованный), а output - следующий индекс словаря слова.

Затем я генерирую новые слова:

  1. Выбор случайного слова из словаря.
  2. Затем запустите brainJsNetwork.run([wordValue]) чтобы сгенерировать следующее слово.
  3. Повторите с шага 1 снова.

Однако, похоже, он застрял в словах в середине словаря, с wordValue около 0,5:

Изображение 174551

Какие-нибудь подсказки, в чем проблема?

Теги:
neural-network
brain.js

1 ответ

2
Лучший ответ

Я подозреваю, что это связано с вашим набором тренировок. Это должно отображать определенный ввод на правильный результат. Как в примере с цветовым контрастом brainjs:

net.train([{input: { r: 0.03, g: 0.7, b: 0.5 }, output: { black: 1 }},
       {input: { r: 0.16, g: 0.09, b: 0.2 }, output: { white: 1 }},
       {input: { r: 0.5, g: 0.5, b: 1.0 }, output: { white: 1 }}]);

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

var output = net.run({ r: 1, g: 0.4, b: 0 });  // { white: 0.99, black: 0.002 }

Вы создаете набор упражнений из словаInOrder. Это означает, что в вашем учебном наборе есть несколько слов, которые встречаются несколько раз. Слово типа "сделано" находится в вашем тренировочном наборе несколько раз с различными выходами:

made -> If (or the respective wordindex values, normalized to be between 0-1)
made -> It's
made -> outside
made -> in

Обученная сеть попытается компенсировать различные возможные результаты и усреднит вероятность, которую он выдает. Если затем вывести этот вывод для поиска слова в массиве dictionaryWords слов, вы, вероятно, получите слова, которые находятся в середине массива (например, "нет" и "обязательно")

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

{input: { (wordindex of 'made' }, output: { if: 1, its: 1, outside:1, in:1 }}

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

Вы смотрели цепочки марков для генерации текста? Это упрощает моделирование того, какие переходы (от одного слова к следующему слову) более вероятны, чем другие.

Вот объяснение и реализация javascript.

  • 0
    Спасибо за исчерпывающий ответ! Да, я думаю, что марковская модель гораздо лучше подходит для такого случая использования. Просто хотел посмотреть, как NN будет жить.
  • 0
    Я обновил свой код с помощью модели Маркова: codepen.io/tomsoderlund/pen/WEPqzE

Ещё вопросы

Сообщество Overcoder
Наверх
Меню