(我从概念上理解RNN的工作原理。在某些用例中,我也使用了RNN / LSTM)
要深入了解RNN和RNN变量模型的工作原理,我想尝试一些实验。
该实验的明显选择是-排序问题。
实验目标: 当我将要用NeuralNet训练一个简单的排序问题时,它的表现应该不佳,但是当我在RNN上进行训练/调谐时,它应该表现得很好(只要我有足够的数据量)
问题模拟: 我已经生成了10,000行序列,每行看起来像这样:
在1-10k之间随机生成一些数字“ num_x”
x1 = sin(num_x)
x2 = sin(x1)
x3 = sin(x1)
x4 = sin(x1)
x5 = sin(x1)
此行的X = = [x1,x2,x3,x4,x5]
该行的y是: y = sin(x6)....因此,通过训练模型,我们需要预测下一个数字是序列。
因此,我们清楚地看到,序列中的每个数字都是非线性的,并且取决于序列中较早的数字。
所以我认为这绝对是一个很好的序列问题,它应该在简单的NN上表现不佳,并且在RNN上表现得很好(调整后)
但是令我惊讶的是,它甚至在没有微调的情况下也能实现非常好的NN。 而且它在RNN模型上的执行效果很差(但我们现在可以忘记这部分)
我想了解一下,为什么它在NN上表现更好?
我使用了RMSE指标,并运行了100 epcoh。 RMSE为2.5,无需调整 (对于RNN,RMSE为37,000)
答案 0 :(得分:0)
好的。因此,我认为此序列对于NN是非常简单的学习任务。所以我使序列变得有点复杂。
num_1 = math.sin(i)
num_2 = math.sin(num_1)
num_3 = math.sin(num_2) + math.cos(num_1)
num_4 = math.sin(num_3) + math.cos(num_2) + math.cos(num_1)
num_5 = math.sin(num_4) + math.cos(num_3) + math.cos(num_2) + math.cos(num_1)
x = [num_1, num_2,num_3, num_4,num_5]
y_num = math.sin(num_5) + math.cos(num_4) + math.cos(num_3) + math.cos(num_2) + math.cos(num_1)
但是NN非常聪明,它也学习这种复杂的序列。 所以我问了我的科学家朋友。我在这里引用他的答案:
“首先,您要构建的序列不是复杂的序列。它们是规则的,有界的,确定性的序列,并且您选择的函数是周期的序列。即使周期性地应用这些周期函数,它们的线性叠加也可能具有短范围的顺序。神经网络可以学习任意阶的非线性函数,您正在要求网络将5维空间映射到1d空间,这是大多数神经网络可以做到的。 “
因此从此练习中学到的教训是:
NN模型能够学习简单到半复杂的低维排序问题。但是,与之相比,它会更慢。 因此,我们将它们用于NLP类型的高维且非常复杂的问题。