【问题标题】:predict exponential weighted average using a simple rnn使用简单的 rnn 预测指数加权平均值
【发布时间】:2019-12-12 08:34:32
【问题描述】:

为了进一步探索 keras-tf RNN 的能力和不同的参数,我决定解决一个所描述的玩具问题 -

  1. 构建由一系列随机数组成的源数据集
  2. 构建由在源数据集上执行的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,“批量大小”也为 1。
  2. 这个网络可能类似于 tensorflow 建议的“有状态”参数。由于在当前步骤中使用了最后一个状态预测(循环中的“a = y_hat”)。
  3. 我认为可以肯定地说这是一种“一对一”的训练,就每个标签使用的输入而言。

当然,EWMA 算法的性质还有很多要补充的地方,因为它包含有关序列整个历史的信息,而不仅仅是窗口,而是为了让事情更短并得出结论,您将如何使用简单的 RNN 或任何神经网络来预测 EWMA?

如何在 keras 中复制玩具神经网络的行为?

更新: 似乎阻止我解决此问题的主要问题是由于使用“本机” keras(import keras)而不是 tensorflow 实现(来自 tensorflow import keras)。 发布了一个更具体的问题here

【问题讨论】:

    标签: tensorflow keras deep-learning recurrent-neural-network


    【解决方案1】:

    在keras中复制玩具神经网络行为的代码如下所示:

    from tensorflow import keras
    import numpy as np
    from tensorflow.keras.models import Sequential as Sequential
    
    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)
    
    def train():
        x = np.random.rand(3000)
        y = run_avg(x)
        x = np.reshape(x, (-1, 1, 1))
        y = np.reshape(y, (-1, 1))
    
        # SimpleRNN model
        model = Sequential()
        model.add(Dense(32, batch_input_shape=(1,1,1), dtype='float32'))
        model.add(keras.layers.SimpleRNN(1, stateful=True, activation=None, name='rnn_layer_1'))
        model.compile(optimizer=keras.optimizers.SGD(lr=0.1), loss='mse')
        model.summary()
    
        print(model.get_layer('rnn_layer_1').get_weights())
        model.fit(x=x, y=y, batch_size=1, epochs=10, shuffle=False)
        print(model.get_layer('rnn_layer_1').get_weights())
    
    train()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-24
      相关资源
      最近更新 更多