为什么我的 Brain.js 神经网络卡在中间?
Why does my Brain.js neural network get stuck in the middle?
我正在尝试使用 Brain.js 来生成文本。
请参阅我的 WIP 示例:https://codepen.io/tomsoderlund/pen/WEPqzE(另请参阅控制台输出)。
我基本上是:
- 生成所有单词的数组:
wordsInOrder
- 创建一个
dictionaryWords
数组,其中包含已排序的唯一单词。
- 我从
wordsInOrder
创建我的训练集,如下所示:{ input: [0.0326], output: [0.9565] }
,其中 input
是 当前 单词的字典索引(规范化) , output
是以下 词的字典索引。
然后我通过以下方式生成新词:
- 从字典中随机选择一个单词。
- 然后运行
brainJsNetwork.run([wordValue])
函数生成下面的单词。
- 再次从步骤 1 开始重复。
不过好像卡在了字典中间的词上,wordValue
在0.5左右:
有什么问题的线索吗?
我怀疑这是因为你的训练集。这应该将某个输入映射到正确的输出。就像在 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
数组中的单词,您更有可能以数组中间的单词结束(如 'not' 和 'necessarily')
您需要考虑到神经网络 return 输入属于某个类别的可能性。所以如果你想用它来预测下一个单词,你必须对训练数据进行不同的编码。
'made' 有 4 个有效的下一个词,因此您必须将它们编码为 ...
{input: { (wordindex of 'made' }, output: { if: 1, its: 1, outside:1, in:1 }}
当然,这意味着您的输出将具有 dictionaryWords
数组中所有 92 个唯一单词的似然得分。我不确定这个简单的神经网络是否可以与 92 维的输出一起使用。
你看过用于生成文本的马尔可夫链吗?它使得建模哪些转换(从一个词到下一个词)比其他转换更有可能变得更容易。
我正在尝试使用 Brain.js 来生成文本。
请参阅我的 WIP 示例:https://codepen.io/tomsoderlund/pen/WEPqzE(另请参阅控制台输出)。
我基本上是:
- 生成所有单词的数组:
wordsInOrder
- 创建一个
dictionaryWords
数组,其中包含已排序的唯一单词。 - 我从
wordsInOrder
创建我的训练集,如下所示:{ input: [0.0326], output: [0.9565] }
,其中input
是 当前 单词的字典索引(规范化) ,output
是以下 词的字典索引。
然后我通过以下方式生成新词:
- 从字典中随机选择一个单词。
- 然后运行
brainJsNetwork.run([wordValue])
函数生成下面的单词。 - 再次从步骤 1 开始重复。
不过好像卡在了字典中间的词上,wordValue
在0.5左右:
有什么问题的线索吗?
我怀疑这是因为你的训练集。这应该将某个输入映射到正确的输出。就像在 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
数组中的单词,您更有可能以数组中间的单词结束(如 'not' 和 'necessarily')
您需要考虑到神经网络 return 输入属于某个类别的可能性。所以如果你想用它来预测下一个单词,你必须对训练数据进行不同的编码。 'made' 有 4 个有效的下一个词,因此您必须将它们编码为 ...
{input: { (wordindex of 'made' }, output: { if: 1, its: 1, outside:1, in:1 }}
当然,这意味着您的输出将具有 dictionaryWords
数组中所有 92 个唯一单词的似然得分。我不确定这个简单的神经网络是否可以与 92 维的输出一起使用。
你看过用于生成文本的马尔可夫链吗?它使得建模哪些转换(从一个词到下一个词)比其他转换更有可能变得更容易。