【问题标题】:Why does my Brain.js neural network get stuck in the middle?为什么我的 Brain.js 神经网络卡在中间?
【发布时间】:2018-02-11 12:40:27
【问题描述】:

我正在尝试将 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:

有什么线索吗?

【问题讨论】:

    标签: javascript neural-network brain.js


    【解决方案1】:

    我怀疑这是由于您的训练集造成的。这应该将某个输入映射到正确的输出。就像在 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”这样的词多次出现在你的训练集中,输出不同:

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

    经过训练的网络将尝试补偿不同的可能结果,并对其输出的可能性进行平均。如果您随后将该输出用于在 dictionaryWords 数组中查找单词,则更有可能最终得到位于数组中间的单词(例如“不”和“必然”)

    您需要考虑到神经网络将返回输入属于某个类别的可能性。所以如果你想用它来预测下一个单词,你必须对训练数据进行不同的编码。 'made' 有 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.

    【讨论】:

    • 感谢您提供详尽的回答!是的,我猜马尔可夫模型更适合这种用例。只是想看看神经网络的表现如何。
    猜你喜欢
    • 2018-11-26
    • 1970-01-01
    • 2015-02-10
    • 2019-03-18
    • 2017-01-17
    • 1970-01-01
    • 1970-01-01
    • 2017-05-06
    • 1970-01-01
    相关资源
    最近更新 更多