为什么我的Brain.js神经网络卡在中间?

时间:2017-09-02 19:18:47

标签: javascript neural-network brain.js

我试图将Brain.js用于文本生成目的。

请参阅我的WIP示例:https://codepen.io/tomsoderlund/pen/WEPqzE(另请参阅控制台输出)。

我基本上:

  1. 生成所有单词的数组:wordsInOrder
  2. 创建一个包含已排序的唯一字词的dictionaryWords数组。
  3. 我从wordsInOrder创建我的训练集,如下所示:{ input: [0.0326], output: [0.9565] },其中input当前字词的索引(标准化), output跟随字词的索引。
  4. 然后我通过以下方式生成新单词:

    1. 从字典中挑选一个随机单词。
    2. 然后运行brainJsNetwork.run([wordValue])函数以生成以下单词。
    3. 重复步骤1。
    4. 然而,似乎卡在词典中间的单词上,wordValue的大约是0.5:

      Stuck in the middle

      有什么线索是什么问题?

1 个答案:

答案 0 :(得分:3)

我怀疑这是由于你的训练集。这应该将某个输入映射到正确的输出。就像在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 }

您可以从wordsInOrder创建训练集。这意味着您的训练集中会出现一些多次出现的单词。像'之类的词。在你的训练集中多次,输出不同:

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

受过训练的网络将尝试补偿不同的可能结果,并对其输出的可能性进行平均。如果你然后使用该输出来查找dictionaryWords数组中的单词,那么你更可能最终得到数组中间的单词(例如' not'和'一定&#39)

您需要考虑到神经网络将返回属于某个类别的输入的可能性。所以如果你想用它来预测下一个单词,你必须以不同的方式编码训练数据。 '制作'有4个有效的下一个单词。所以你必须把它们编码为......

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

当然,这意味着您的输出将具有dictionaryWords数组中所有92个唯一字的可能性分数。我不确定这个简单的神经网络是否可以用于92维的输出。

您是否看过马尔可夫链以生成文字?它使得模型转换(从一个单词到下一个单词)的可能性更容易。

Here is an explanation and a javascript implementation.