2016-03-05 24 views
7

Dường như không có phân rã trọng lượng trên các lớp co giãn trong ví dụ cifar10 về lưu lượng. Trên thực tế không có phân rã trọng lượng trên bất kỳ lớp nào ngoại trừ hai lớp được kết nối hoàn toàn. Đây có phải là một thực tế phổ biến? Tôi nghĩ rằng trọng lượng phân rã được áp dụng cho tất cả các trọng lượng (trừ thiên vị).Tại sao không phân rã trọng lượng trên các lớp chập trong ví dụ cifar10 của tensorflow?

Để tham khảo, đây là các mã có liên quan (wd là yếu tố phân rã trọng lượng):

# conv1 
    with tf.variable_scope('conv1') as scope: 
    kernel = _variable_with_weight_decay('weights', shape=[5, 5, 3, 64], 
             stddev=1e-4, wd=0.0) 
    conv = tf.nn.conv2d(images, kernel, [1, 1, 1, 1], padding='SAME') 
    biases = _variable_on_cpu('biases', [64], tf.constant_initializer(0.0)) 
    bias = tf.nn.bias_add(conv, biases) 
    conv1 = tf.nn.relu(bias, name=scope.name) 
    _activation_summary(conv1) 

    # pool1 
    pool1 = tf.nn.max_pool(conv1, ksize=[1, 3, 3, 1], strides=[1, 2, 2, 1], 
         padding='SAME', name='pool1') 
    # norm1 
    norm1 = tf.nn.lrn(pool1, 4, bias=1.0, alpha=0.001/9.0, beta=0.75, 
        name='norm1') 

    # conv2 
    with tf.variable_scope('conv2') as scope: 
    kernel = _variable_with_weight_decay('weights', shape=[5, 5, 64, 64], 
             stddev=1e-4, wd=0.0) 
    conv = tf.nn.conv2d(norm1, kernel, [1, 1, 1, 1], padding='SAME') 
    biases = _variable_on_cpu('biases', [64], tf.constant_initializer(0.1)) 
    bias = tf.nn.bias_add(conv, biases) 
    conv2 = tf.nn.relu(bias, name=scope.name) 
    _activation_summary(conv2) 

    # norm2 
    norm2 = tf.nn.lrn(conv2, 4, bias=1.0, alpha=0.001/9.0, beta=0.75, 
        name='norm2') 
    # pool2 
    pool2 = tf.nn.max_pool(norm2, ksize=[1, 3, 3, 1], 
         strides=[1, 2, 2, 1], padding='SAME', name='pool2') 

    # local3 
    with tf.variable_scope('local3') as scope: 
    # Move everything into depth so we can perform a single matrix multiply. 
    dim = 1 
    for d in pool2.get_shape()[1:].as_list(): 
     dim *= d 
    reshape = tf.reshape(pool2, [FLAGS.batch_size, dim]) 

    weights = _variable_with_weight_decay('weights', shape=[dim, 384], 
              stddev=0.04, wd=0.004) 
    biases = _variable_on_cpu('biases', [384], tf.constant_initializer(0.1)) 
    local3 = tf.nn.relu(tf.matmul(reshape, weights) + biases, name=scope.name) 
    _activation_summary(local3) 

    # local4 
    with tf.variable_scope('local4') as scope: 
    weights = _variable_with_weight_decay('weights', shape=[384, 192], 
              stddev=0.04, wd=0.004) 
    biases = _variable_on_cpu('biases', [192], tf.constant_initializer(0.1)) 
    local4 = tf.nn.relu(tf.matmul(local3, weights) + biases, name=scope.name) 
    _activation_summary(local4) 

    # softmax, i.e. softmax(WX + b) 
    with tf.variable_scope('softmax_linear') as scope: 
    weights = _variable_with_weight_decay('weights', [192, NUM_CLASSES], 
              stddev=1/192.0, wd=0.0) 
    biases = _variable_on_cpu('biases', [NUM_CLASSES], 
           tf.constant_initializer(0.0)) 
    softmax_linear = tf.add(tf.matmul(local4, weights), biases, name=scope.name) 
    _activation_summary(softmax_linear) 

    return softmax_linear 
+0

Lạ thật. Bạn có thể thay đổi nó nếu bạn muốn với giá trị 'wd' nhưng dường như không thể cấu hình được ngay cả khi hàm' _variable_with_weight_decay' làm cho nó có thể cấu hình được. – fabrizioM

Trả lời

0

Trọng lượng phân rã không nhất thiết phải cải thiện hiệu suất. Theo kinh nghiệm của riêng tôi, tôi đã tìm thấy một cách hợp lý thường xuyên rằng các mô hình của tôi hoạt động tồi tệ hơn (được đo bằng một số chỉ số trên một tập hợp được tổ chức) với bất kỳ số lượng đáng kể phân rã trọng lượng nào. Nó là một hình thức bình thường hữu ích để nhận thức được, nhưng bạn không cần phải thêm nó vào mọi mô hình mà không xem xét nếu nó có vẻ cần thiết hoặc so sánh hiệu suất có và không có.

Đối với việc phân hủy trọng lượng chỉ trên một phần của mô hình có thể tốt hơn so với phân rã trọng lượng trên toàn bộ mô hình, có vẻ ít phổ biến hơn để chỉ thông thường hóa một số trọng số theo cách này. Tôi không biết rằng có một lý do lý thuyết cho việc này, tuy nhiên. Nói chung, các mạng neural đã có quá nhiều hyperparameters để cấu hình. Việc sử dụng phân rã trọng lượng hay không đã là một câu hỏi, và làm thế nào để mạnh mẽ để thường xuyên hóa các trọng số nếu bạn làm. Nếu bạn cũng tự hỏi, những lớp nào tôi nên thường xuyên hóa theo cách này, bạn sẽ nhanh chóng hết thời gian để kiểm tra hiệu suất của tất cả các cách khác nhau mà bạn có thể bật và tắt cho mỗi lớp.

Tôi tưởng tượng rằng có những mô hình sẽ được hưởng lợi từ việc giảm cân chỉ trên một phần của mô hình; Tôi không nghĩ rằng nó được thực hiện thường xuyên bởi vì rất khó để kiểm tra tất cả các khả năng và tìm ra cái nào hoạt động tốt nhất.

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