2016-06-01 38 views
6

Tensorflow cung cấp trình bao bọc LSTM đẹp.Chuẩn hóa cho LSTM trong tensorflow

rnn_cell.BasicLSTM(num_units, forget_bias=1.0, input_size=None, 
      state_is_tuple=False, activation=tanh) 

Tôi muốn sử dụng quy trình chuẩn hóa, thông báo L2. Tuy nhiên, tôi không có quyền truy cập trực tiếp đến các ma trận trọng lượng khác nhau được sử dụng trong các tế bào LSTM, vì vậy tôi không thể làm được một cách rõ ràng cái gì đó như

loss = something + beta * tf.reduce_sum(tf.nn.l2_loss(weights)) 

Có cách nào để truy cập vào các ma trận hoặc sử dụng quy tắc bằng cách nào đó với LSTM?

+0

Tôi đặt toàn bộ quá trình làm câu trả lời cho câu hỏi của bạn. Chk ra https://stackoverflow.com/questions/37869744/tensorflow-lstm-regularization/46761296#46761296 – sdr2002

Trả lời

9

tf.trainable_variables cung cấp cho bạn danh sách các đối tượng Variable mà bạn có thể sử dụng để thêm cụm từ thông thường L2. Lưu ý rằng việc thêm quy tắc này cho tất cả các biến trong mô hình của bạn. Nếu bạn muốn giới hạn thuật ngữ L2 chỉ với một tập hợp con của trọng số, bạn có thể sử dụng name_scope để đặt tên biến của mình với các tiền tố cụ thể và sau đó sử dụng để lọc các biến từ danh sách được trả về bởi tf.trainable_variables.

0

Tensorflow có một số chức năng built-in và helper cho phép bạn áp dụng định mức L2 để mô hình của bạn như tf.clip_by_global_norm:

# ^^^ define your LSTM above here ^^^ 

    params = tf.trainable_variables() 

    gradients = tf.gradients(self.losses, params) 

    clipped_gradients, norm = tf.clip_by_global_norm(gradients,max_gradient_norm) 
    self.gradient_norms = norm 

    opt = tf.train.GradientDescentOptimizer(self.learning_rate) 
    self.updates = opt.apply_gradients(
        zip(clipped_gradients, params), global_step=self.global_step) 

trong đào tạo của bạn bước chạy:

outputs = session.run([self.updates, self.gradient_norms, self.losses], input_feed) 
6

Tôi muốn làm sau đây, nhưng điều duy nhất tôi biết là một số tham số không muốn được thường xuyên hóa với L2, chẳng hạn như các tham số định mức lô và các thành kiến. LSTM chứa một Bias tensor (mặc dù khái niệm nó có nhiều thành kiến, chúng dường như được ghép nối hoặc một cái gì đó, để thực hiện), và cho việc chuẩn hóa hàng loạt, tôi thêm "noreg" vào tên của biến để bỏ qua nó.

loss = your regular output loss 
l2 = lambda_l2_reg * sum(
    tf.nn.l2_loss(tf_var) 
     for tf_var in tf.trainable_variables() 
     if not ("noreg" in tf_var.name or "Bias" in tf_var.name) 
) 
loss += l2 

đâu lambda_l2_reg là nhân nhỏ, ví dụ như: float(0.005)

Làm lựa chọn này (đó là toàn bộ if trong vòng lặp loại bỏ một số biến trong quy tắc) một lần khiến tôi nhảy từ 0,879 điểm F1 để 0.890 trong một shot kiểm tra mã mà không điều chỉnh lại giá trị của cấu hình lambda, điều này đã bao gồm cả những thay đổi đối với chuẩn hóa lô và các Xu hướng và tôi có các thành kiến ​​khác trong mạng thần kinh.

Theo this paper, việc thường xuyên hóa các trọng lượng tái phát có thể giúp với độ dốc phát nổ.

Ngoài ra, theo số this other paper, bỏ học sẽ được sử dụng tốt hơn giữa các ô được xếp chồng và không bên trong ô nếu bạn sử dụng một số ô.

Giới thiệu về vấn đề bùng nổ gradient, nếu bạn sử dụng gradient cắt với sự mất mát có quy tắc L2 đã được thêm vào nó, việc chuẩn hóa sẽ được tính đến trong quá trình cắt.


P.S. Đây là mạng lưới thần kinh mà tôi đang làm việc: https://github.com/guillaume-chevalier/HAR-stacked-residual-bidir-LSTMs

Các vấn đề liên quan