第15章.RNNとCNNを使用してシーケンスを処理


1.RNN概念


1-1. じゅんかんニューロン


  • 左側のネットワークを右側と同じにして、時間通りにネットワークを展開します.
  • 時間ステップ(t)毎に、循環ニューロンx(t)およびそれ以前の時間ステップの出力y(t-1)을 입력으로が受け入れられる.
  • サイクルニューロンには2つの重み付けベクトルがあります.(w x=x(t)重み付け、w y=y(t-1)重み付け)
  • サイクル層全体が重み付け行列を有する.(W_x, W_y)
  • 1-2. メモリセル

  • サイクルニューロンの出力は、메모리の形状を有する以前の時間ステップのすべての入力関数を記憶する.
  • h(t):時間ステップと前の時間ステップの状態を入力する関数
  • h(t) = f(x(t), h(t-1))
  • 2.RNNトレーニング


    2-1. BPTT

  • 時間ステップ展開と逆伝搬を用いた方法
  • 3.表列予測

  • 表の列:時間ステップごとに少なくとも1つの値を有するシーケンス
  • 🖥 実装クロック列
    import numpy as np
    
    def generate_time_series(batch_size, n_steps):
        """
        Description:
            타임 스텝 시계열 데이터 
        """
        freq1, freq2, offsets1, offsets2 = np.random.rand(4, batch_size, 1)
        time = np.linspace(0,1,n_steps)
        # 사인 곡선 1 
        series = 0.5 * np.sin((time-offsets1) * (freq1*10+10))
        # 사인 곡선 2
        series += 0.2 * np.sin((time-offsets2) * (freq2*20+20))
        # 잡음
        series += 0.1 * (np.random.rand(batch_size, n_steps) - 0.5)
        return series[..., np.newaxis].astype(np.float32)
        
    # train, valid, test 세트 생성
    n_steps = 50
    series = generate_time_series(10000, n_steps+1)
    X_train, y_train = series[:7000, :n_steps], series[:7000, -1]
    X_valid, y_valid = series[7000:9000, n_steps], series[7000:9000 , -1]
    X_test, y_test = series[9000:, n_steps], series[9000:, -1]

    3-1. データム性能の決定

  • RNN起動前タスク
  • 実際の基本機種よりも性能が優れているか否かが判断できないため、いくつかの基準性能が用意する.
  • メソッド1)純粋な予測:各テーブル列の最後の値は
  • を直接予測する.
    🖥 純真な予測を実現する
    y_pred = X_valid[:, -1]
    np.mean(keras.losses.mean_squared_error(x_valid, y_pred))
  • 方法2)完全接続ネットワーク:
  • 線形回帰モデルを用いてテーブル列値の線形組合せを予測する
    🖥 線形回帰モデル予測の実装
    model = keras.models.Sequential([
        # 입력마다 1차원 특성 배열 기대하므로 Flatten
        keras.layers.Flatten(input_shape=[50,1]),
        keras.layers.Dense(1)
    ])

    3-2. 複数の時間ステップの事前予測


    深層RNNを使用して
  • の複数の時間ステップを予測
  • 単純RNNレイヤのデフォルトではtanhアクティブ化関数(-1~1の値)が使用されます.

    🖥 深さRNN実施
  • # 10 스텝 앞을 예측하기 위해 n_step 수 변경
    series = generate_time_series(10000, n_steps+10)
    X_new, Y_new = series[:, :n_steps], series[:, n_steps:]
    
    X_train, Y_train = series[:7000, :n_steps], series[:7000, -10:, 0]
    X_valid, Y_valid = series[7000:9000, :n_steps], series[7000:9000, -10:, 0]
    X_test, Y_test = series[9000:, :n_steps], series[9000:, -10:, 0] 
    
    # 시퀀스 모델 생성
    model= keras.models.Sequential([
        keras.layers.SimpleRNN(20, return_sequences=True, input_shape=[None,1])
        keras.layers.SimpleRNN(20),
        keras.layers.Dense(0)
    ])
    
    Y_pred = mode.predict(X_new)
    🖥 シーケンスをベクトルに変更して、シーケンスをシーケンスモデルに変更します.
    model= keras.models.Sequential([
        keras.layers.SimpleRNN(20, return_sequences=True, input_shape=[None,1])
        keras.layers.SimpleRNN(20, return_sequences=True),
        keras.layers.TimeDistributed(keras.layers.Dense(0))
    ])
  • すべてのループレイヤに対してreturn sequence=Trueパラメータを指定
    (return sequence=True:各ステップの出力を保存)
  • は、全ての時間ステップで応答層
  • に出力を適用する.

    4.長いシーケンス


    4-1. 不安定なグラデーションの解決

  • スーパーボウル接線を使用して関数をアクティブ化
  • Reluなどの非収束活性化関数を用いた活性化関数
  • 層を使用して標準化
  • 特性階層の標準化
  • 、すなわちメモリセルに階層標準化
  • を用いる.

    4-2. 長期メモリを持つユニット

  • ユニット
  • は、短期記憶の問題を解決するために使用される
    LSTMユニット(長-短メモリ)
  • long short-term memory
  • h(t):短期状態、c(t):長期状態
  • 入力ゲートウェイ:重要な入力を識別し、
    ≪ゲートウェイの削除|Delete Gateway|oem_src≫:長期間保存され、必要に応じて保持されます.
    学習
  • 、必要に応じて抽出
    🖥 LSTM実装
    model= keras.models.Sequential([
        keras.layers.LSTM(20, return_sequences=True, input_shape=[None,1])
        keras.layers.LSTM(20, return_sequences=True),
        keras.layers.TimeDistributed(keras.layers.Dense(0))
    ])
    GRUユニット
  • LSTMユニットの簡略化されたバージョンで、
  • と類似しています.
  • の実装方法はkerasである.layers.LSTMをGRU
  • に変更
  • RNNよりも長い配列を扱うことができるが,問題は限られた短期記憶にある
    WAVENET
  • 100ステップ以上のシーケンスから長期モードを学習する困難を解決する方法
  • .
  • による入力シーケンスの削減
  • の最初のConv 1 Dから2つの時間ステップを一度に表示します.
    2番目のConv 1 Dでは、次の4つのタイプのステップがあります.
  • 3番目のConv 1 Dで8つの時間ステップを表示
  • すなわち,下層が短期モード学習の上層が長期モード学習の
  • である.
    🖥 WANET実施
    model = keras,models.Sequential()
    model.add(keras.layers.InputLayer(input_shape=[None,1]))
    for rate in (1,2,4,8)*2: 
        model.add(keras.layers.Conv1D(filters=20, kernel_size=2, padding=‘casual’, 
                                      activation=‘relu’, dilation_rate=rate))
    
    model.add(keras.layers.Conv1D(filters=10,kernel_size=1))
    model.compile(loss=‘mse’, optimizer=‘adam’, metrics=[last_time_step_mse])
    history = model.fit(X_train, Y_train, epochs=20, 
                        validation_data=(X_valid, Y_valid))
    Quiz 1 . 次のシーケンス-デュアルベクトルをシーケンス-デュアルシーケンスに変更してください
    model= keras.models.Sequential([
        keras.layers.SimpleRNN(20, return_sequences=True, input_shape=[None,1])
        keras.layers.SimpleRNN(20),
        keras.layers.Dense(0)
    ])
    A. 1. すべてのループレイヤに対してreturn sequences=Trueパラメータを指定
    2.すべての時間ステップで出力をDense層に適用する
    model= keras.models.Sequential([
        keras.layers.SimpleRNN(20, return_sequences=True, input_shape=[None,1])
        keras.layers.SimpleRNN(20, return_sequences=True),
        keras.layers.TimeDistributed(keras.layers.Dense(0))
    ])
    
    Quiz 2. 以下の説明に従ってモデルを実施してください.
    1.Embeddingを使用すると、単語セット(Vocabulary)のサイズは5000、埋め込みベクトルの次元は100になります.
    2.非表示層は単純RNNを使用し、非表示状態の大きさは128である.
    3.トレーニングに使用される全てのサンプルの長さを30とする.
    4.信号関数を使用する出力層内の1つのニューロンのバイナリ分類モデルを実行する.
    5.隠匿層は一つしかない.
    A.RNN実施
    from keras.models.layers import Sequential
    from keras.layers import SimpoleRNN, Embedding, Dense
    
    vocab_size = 5000
    embedding_dim = 100
    hidden_size = 128
    
    model = Sequential()
    embed = Embedding(input_dim=vocab_size, 
                      ontput_dim=embedding_dim)
    model.add(embed)
    model.add(SimpleRNN(hidden_size))
    model.add(Dense(1, activation=‘sigmoid’))
    model.summary()