【发布时间】:2019-12-12 08:34:32
【问题描述】:
为了进一步探索 keras-tf RNN 的能力和不同的参数,我决定解决一个所描述的玩具问题 -
- 构建由一系列随机数组成的源数据集
- 构建由在源数据集上执行的EWMA formula 组成的“标签”数据集。
其背后的想法是,EWMA 对它如何使用序列的“历史”有一个非常清晰和简单的定义 -
EWMAt = (1-alpha)*averaget-1 + alpha*xt
我的假设是,当查看一个简单的 RNN 单元时,其中一个神经元用于当前输入,一个神经元用于前一个状态,等式的 (1-alpha) 部分可以直接是前一个隐藏状态的权重,alpha 部分可以是当前输入的权重,一旦网络完全训练。
例如,对于 alpha = 0.2,我希望网络的权重在训练后为:
Waa = [0.8](先前状态的权重参数)
Wxa = [0.2](当前输入的权重参数)
我使用 numpy 以非常直接的方式模拟了数据集和标签。
目前我已经用反向传播实现了我自己的简单 rnn。 我将 MSE 用于损失和 SGD,它很快收敛到上述参数。它一次只处理一个输入。
我使用 keras 和 tensorflow 尝试了不同的网络配置,但似乎没有一个能成功。我想知道复制玩具 RNN 行为的最佳建议方法是什么。
这是我的玩具神经网络 -
import numpy as np
np.random.seed(1337) # for reproducibility
def run_avg(signal, alpha=0.2):
avg_signal = []
avg = np.mean(signal)
for i, sample in enumerate(signal):
if np.isnan(sample) or sample == 0:
sample = avg
avg = (1 - alpha) * avg + alpha * sample
avg_signal.append(avg)
return np.array(avg_signal)
X = np.random.rand(10000)
Y = run_avg(X)
def train(X,Y):
W_a = np.random.rand()
W_x = np.random.rand()
b = np.random.rand()
a = np.random.rand()
lr = 0.001
for i in range(100):
for x,y in zip(X,Y):
y_hat = W_x * x + W_a * a + b
L = (y-y_hat)**2
dL_dW_a = (y - y_hat) * a
dL_dW_x = (y - y_hat) * x
dL_db = (y - y_hat) * 1
W_a = W_a + dL_dW_a*lr
W_x = W_x + dL_dW_x*lr
b = b + dL_db*lr
a = y_hat
print("epoch " ,str(i), " LOSS = ", L, " W_a = ", W_a, " W_x = ", W_x , " b = " ,b)
train(X,Y)
关于实现的几点说明,与 keras-tf simpleRNN 相比 -
- 此网络的“时间步长”为 1,“批量大小”也为 1。
- 这个网络可能类似于 tensorflow 建议的“有状态”参数。由于在当前步骤中使用了最后一个状态预测(循环中的“a = y_hat”)。
- 我认为可以肯定地说这是一种“一对一”的训练,就每个标签使用的输入而言。
当然,EWMA 算法的性质还有很多要补充的地方,因为它包含有关序列整个历史的信息,而不仅仅是窗口,而是为了让事情更短并得出结论,您将如何使用简单的 RNN 或任何神经网络来预测 EWMA?
如何在 keras 中复制玩具神经网络的行为?
更新: 似乎阻止我解决此问题的主要问题是由于使用“本机” keras(import keras)而不是 tensorflow 实现(来自 tensorflow import keras)。 发布了一个更具体的问题here。
【问题讨论】:
标签: tensorflow keras deep-learning recurrent-neural-network