>

tf.contrib.rnn.MultiRNNCell 를 사용하는 메신저  다중 계층 RNN을 만드는 모듈. 다음 줄을 사용하여 3 계층 RNN-LSTM 네트워크를 정의합니다.

n_hidden = 2
num_layers = 3        
lstm_cell = tf.contrib.rnn.BasicLSTMCell(n_hidden)
stacked_lstm_cell = tf.contrib.rnn.MultiRNNCell([lstm_cell] * num_layers)

그러나 실제로 tensorflow에서 일어나는 일과 관련하여 내 마음에는 약간의 불확실성이 있습니다. 내가 이해할 수있는 한이 코드는 3 개의 LSTM 셀 레이어가 있으며 각 레이어에는 2 개의 LSTM 셀이있는 계산 그래프를 제공합니다. 다음과 같은 의심이 있습니다.

<올>
  • 이 3 개의 LSTM 층 사이의 가중치가 변수로 취급됩니까?
  • 이 가중치가 변수로 취급되는 경우 트레이닝 세션 중에 수정됩니까?
  • LSTM 셀에는 forget 등과 같은 연산자가 있습니다.이 ops도 변수로 취급되므로 훈련 중에 조정됩니까?

    • 답변 # 1

      구문에 대한 한 가지 참고 사항 : TF ~ 1.0부터 [cell] * num_layers 를 사용하는 대신 루프에서 여러 계층을 정의해야합니다.  문법과 같이 :

      lstm_cells = []
      for _ in range(num_layers):
          cell = tf.contrib.rnn.BasicLSTMCell(n_hidden)
          lstm_cells.append(cell)
      stacked_lstm_cell = tf.contrib.rnn.MultiRNNCell(lstm_cells)
      
      

      주요한 질문에 :

      코드가 3 계층 네트워크 ( num_layers )를 제공합니다 ), 각 레이어에는 숨겨진 상태 길이가 2 인 LSTM이 포함됩니다 ( n_hidden ). 이것에 대해 조금 더 알아보십시오.

      3 개의 LSTM 레이어 사이에는 가중치가 없습니다. 각 LSTM은 출력을 다음 LSTM의 입력으로 공급합니다.

      네트워크에있는 모든 가중치와 편향은 TF에게 특정 사물을 훈련시키지 말라고 지시하지 않는 한 훈련 가능한 변수로 취급되며 역 전파를 통해 훈련됩니다.

      LSTM의 잊어 버린 업데이트와 같은 작업은 네트워크에 대한 입력과 네트워크의 이전 숨겨진 상태에 대한 선형 조합에서 일부 기능을 실행합니다. 이것의 "선형 조합"부분은 네트워크에 의해 훈련 된 가중치와 바이어스를 포함합니다.

      LSTM 살펴보기 <시간>

      LSTM 네트워크 아키텍처를 살펴 보겠습니다. 이것은 내가 읽는 것이 좋습니다 꽤 좋은 개요입니다. 기본적으로 단일 LSTM 셀은 지금까지 본 것의 "메모리"를 나타내는 숨겨진 상태를 유지하며 각 업데이트 단계에서 " 게이트 ". 또한 게이트를 사용하여 출력 할 내용을 결정합니다. 단일 셀의 업데이트 프로세스 살펴보기 :

      <올>

      먼저 잊어 버릴 오래된 정보의 양을 결정합니다 (우리의 게이트를 잊어 버림) : f_k = sigmoid(W_f * [h_k-1, x_k] + b_f)

      여기서 우리는 네트워크의 이전 기록 h_k-1 에서 운영하고 있습니다  현재 관측치와 연결됨 . 역사 벡터 크기 x_k   h 에 의해 정의됩니다 . 무게 n_hidden  Wyzwyz 편견  교육 절차를 통해 학습합니다.

      우리는 얼마나 많은 새로운 정보를 통합 할 것인지 결정합니다 (우리의 입력 게이트, W_f ) 및 일부 새로운 후보 셀 상태 ( b_f )를 작성하십시오. ) :

      i_k
      
      

      다시, 우리는 우리의 오래된 내부 상태 c'_k 에서 운영하고 있습니다 , 그리고 우리의 새로운 관찰 i_k = sigmoid(W_i * [h_k-1, x_k] + b_i) c`_k = tanh(W_c * [h_k-1, x_k] + b_c)  다음에 무엇을해야할지 파악하기 위해 셀 상태 h_k-1 의 크기  및 후보 세포 상태 x_k   c 에 의해 결정된또한 . 와이즈 비즈  그리고 c'  더 많은 매개 변수를 배우게됩니다.

      이전 정보를 새로운 후보 상태와 결합하여 새로운 셀 상태를 제공합니다 : n_hidden

      여기서 우리는 내적 또는 다른 것 대신에 요소 별 곱셈을하고 있습니다. 기본적으로 우리는 우리의 오래된 정보 중 얼마를 유지할 것인지 선택합니다 ( W_* ) 및 통합 할 새 정보의 양 ( b_* ) ).

      마지막으로 출력 게이트로 출력 할 셀 상태를 결정합니다 :

      c_k = f_k * c_k-1 + i_k * c'_k
      
      

      기본적으로 우리는 오래된 정보와 새로운 정보를 내부 "셀 상태" f_k * c_k-1 로 혼합하고 있습니다. 그런 다음 i_k * c'_k 에서 해당 양의 정보를 출력합니다. . LSTM과 유사하지만 약간 이해하기 쉬운 구조를 갖는 게이트 형 반복 단위 (GRU) 네트워크를 살펴 보는 것도 좋습니다.

      이제 멀티 레이어 네트워크가 쌓이는 방법에 대해 알아 보겠습니다. 기본적으로 다음과 같은 것이 있습니다 :

      o_k = sigmoid(W_o * [h_k-1, x_k] + b_o)
      h_k = o_k * tanh(c_k)
      
      

      여러분의 관찰이 첫 번째 네트워크로 들어 오면 해당 네트워크의 출력이 다음 네트워크에 입력으로 공급되어 자체의 내부 상태와 혼합되어 출력을 생성 한 다음 세 번째 네트워크에 대한 입력이됩니다. 그리고 끝까지. 이는 데이터에서 시간적 구조를 학습하는 데 도움이됩니다. 나는 그것에 대한 좋은 인용이 없습니다.

      분류를 수행하는 경우 (예를 들어), 마지막 네트워크의 출력에 마지막으로 완전히 연결된 레이어를 던져서 관찰 한 프로세스가 분류중인 각 범주 내에 있다는 확신을 얻을 수 있습니다.

      p> 훈련 가능한 변수 <시간>

      네트워크에서 배울 학습 가능한 변수를 모두 다음과 같이 인쇄 할 수 있습니다 :

      c_k
      
      

      Tensorflow는 서로 다른 연산을 결합하여 멋진 작업을 수행하므로 이상한 모양과 무게 행렬 및 바이어스가 누락 된 것처럼 보일 수 있지만 모두 있습니다. 기본적으로 각 게이트에 사용되는 가중치와 바이어스를 배우고 있습니다. 위의 내용은 다음과 같습니다.

      와이즈 : h_k , x_k ---> (network 0) --h0_k--> (network_1) --h1_k--> (network_2) --h2_k--> , for var in tf.trainable_variables(): print('{}\nShape: {}'.format(var.name, var.get_shape()))W_f  각 레이어마다

      편견 : W_i , W_c , W_ob_f  각 레이어마다

      마지막 LSTM 레이어 위에 추가 한 추가 출력 레이어 가중치/바이어스

      TF가 기본적으로 모든 게이트를 단일 빅 매트릭스 연산으로 결합하는 TF가 GRU 아키텍처를 처리하는 방법에 대해 더 잘 알고 있으므로 모든 게이트에 대해 하나의 결합 된 가중치 매트릭스와 하나의 결합 된 바이어스 벡터가 있습니다. 그런 다음 결과를 각 개별 게이트로 분할하여 올바른 위치에 적용합니다. 참고로, 각 셀의 각 단계마다 가중치와 바이어스가없는 것 같습니다.

      b_i

  • 이전 javascript - NPM 콧수염 렌더링은 단일 템플릿과 여러 JSON으로 여러 HTML을 생성합니다
  • 다음 actionscript 3 - Flash AS3 여러 객체 드래그