Helpex - Trao đổi & giúp đỡ Đăng nhập
81

Xem xét mã ví dụ .

Tôi muốn biết Làm thế nào để áp dụng cắt độ dốc trên mạng này trên RNN khi có khả năng nổ độ dốc.

tf.clip_by_value(t, clip_value_min, clip_value_max, name=None)

Đây là một ví dụ có thể được sử dụng nhưng tôi phải giới thiệu nó ở đâu? Trong def của RNN

    lstm_cell = rnn_cell.BasicLSTMCell(n_hidden, forget_bias=1.0)
    # Split data because rnn cell needs a list of inputs for the RNN inner loop
    _X = tf.split(0, n_steps, _X) # n_steps
tf.clip_by_value(_X, -1, 1, name=None)

Nhưng điều này không có ý nghĩa gì vì tenor _X là đầu vào và không phải là grad, cái gì sẽ được cắt?

Tôi có phải xác định Trình tối ưu hóa của riêng mình cho việc này không hoặc có tùy chọn nào đơn giản hơn không?

81 hữu ích 0 bình luận 52k xem chia sẻ
127

Việc cắt gradient cần phải xảy ra sau khi tính toán độ dốc, nhưng trước khi áp dụng chúng để cập nhật các tham số của mô hình. Trong ví dụ của bạn, cả hai điều đó đều được xử lý bằng AdamOptimizer.minimize()phương thức.

Để cắt bớt độ dốc của bạn, bạn cần phải tính toán rõ ràng, cắt clip và áp dụng chúng như được mô tả trong phần này trong tài liệu API của TensorFlow . Cụ thể, bạn sẽ cần thay thế cuộc gọi đến minimize()phương thức bằng một số thứ như sau:

optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate)
gvs = optimizer.compute_gradients(cost)
capped_gvs = [(tf.clip_by_value(grad, -1., 1.), var) for grad, var in gvs]
train_op = optimizer.apply_gradients(capped_gvs)
127 hữu ích 5 bình luận chia sẻ
97

Mặc dù những gì có vẻ là phổ biến, bạn có thể muốn cắt toàn bộ độ dốc theo tiêu chuẩn toàn cầu của nó:

optimizer = tf.train.AdamOptimizer(1e-3)
gradients, variables = zip(*optimizer.compute_gradients(loss))
gradients, _ = tf.clip_by_global_norm(gradients, 5.0)
optimize = optimizer.apply_gradients(zip(gradients, variables))

Việc cắt từng ma trận gradient thay đổi tỷ lệ tương đối của chúng nhưng cũng có thể:

optimizer = tf.train.AdamOptimizer(1e-3)
gradients, variables = zip(*optimizer.compute_gradients(loss))
gradients = [
    None if gradient is None else tf.clip_by_norm(gradient, 5.0)
    for gradient in gradients]
optimize = optimizer.apply_gradients(zip(gradients, variables))
97 hữu ích 5 bình luận chia sẻ
9

Điều này thực sự được giải thích đúng trong tài liệu. :

Gọi tối thiểu hóa () đảm nhiệm cả việc tính toán độ dốc và áp dụng chúng cho các biến. Nếu bạn muốn xử lý gradient trước khi áp dụng chúng, thay vào đó bạn có thể sử dụng trình tối ưu hóa theo ba bước:

  • Tính toán độ dốc với compute_gradrons ().
  • Xử lý gradient như bạn muốn.
  • Áp dụng các gradient được xử lý với application_gradrons ().

Và trong ví dụ họ cung cấp, họ sử dụng 3 bước sau:

# Create an optimizer.
opt = GradientDescentOptimizer(learning_rate=0.1)

# Compute the gradients for a list of variables.
grads_and_vars = opt.compute_gradients(loss, <list of variables>)

# grads_and_vars is a list of tuples (gradient, variable).  Do whatever you
# need to the 'gradient' part, for example cap them, etc.
capped_grads_and_vars = [(MyCapper(gv[0]), gv[1]) for gv in grads_and_vars]

# Ask the optimizer to apply the capped gradients.
opt.apply_gradients(capped_grads_and_vars)

Đây MyCapperlà bất kỳ chức năng nào giới hạn độ dốc của bạn. Danh sách các chức năng hữu ích (khác tf.clip_by_value()) ở đây .

9 hữu ích 2 bình luận chia sẻ
7

Đối với những người muốn hiểu ý tưởng cắt gradient (theo định mức):

Bất cứ khi nào định mức độ dốc lớn hơn một ngưỡng cụ thể, chúng tôi sẽ cắt chỉ tiêu độ dốc để nó nằm trong ngưỡng đó. Ngưỡng này đôi khi được đặt thành 5.

Đặt gradient là g và max_norm_thr Ngưỡng là j .

Bây giờ, nếu | | g | | > j , chúng tôi làm:

g = ( j * g ) / | | g | |

Đây là việc thực hiện được thực hiện trong tf.clip_by_norm

7 hữu ích 2 bình luận chia sẻ
4

IMO giải pháp tốt nhất là gói trình tối ưu hóa của bạn với trình trang trí trình ước tính của TF tf.contrib.estimator.clip_gradients_by_norm:

original_optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate)
optimizer = tf.contrib.estimator.clip_gradients_by_norm(original_optimizer, clip_norm=5.0)
train_op = optimizer.minimize(loss)

Bằng cách này, bạn chỉ phải xác định điều này một lần và không chạy nó sau mỗi phép tính độ dốc.

Tài liệu: https://www.tensorflow.org/api_docs/python/tf/contrib/estimator/clip_gradrons_by_norm

4 hữu ích 0 bình luận chia sẻ
2

Gradient Clipping về cơ bản giúp trong trường hợp nổ tung hoặc biến mất độ dốc. Có thể mất mát của bạn quá cao sẽ dẫn đến độ dốc theo cấp số nhân chảy qua mạng có thể dẫn đến các giá trị Nan. Để khắc phục điều này, chúng tôi cắt độ dốc trong một phạm vi cụ thể (-1 đến 1 hoặc bất kỳ phạm vi nào theo điều kiện).

clipped_value=tf.clip_by_value(grad, -range, +range), var) for grad, var in grads_and_vars

trong đó grads _and_vars là cặp độ dốc (mà bạn tính toán thông qua tf.compute_gradrons) và các biến của chúng sẽ được áp dụng.

Sau khi cắt, chúng ta chỉ cần áp dụng giá trị của nó bằng trình tối ưu hóa. optimizer.apply_gradients(clipped_value)

2 hữu ích 0 bình luận chia sẻ
loading
Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ python machine-learning tensorflow deep-learning lstm , hoặc hỏi câu hỏi của bạn.

Có thể bạn quan tâm

loading