Hiểu biểu đồ TensorBoard (trọng lượng)


120

Việc xem và hiểu các giá trị vô hướng trong TensorBoard thực sự đơn giản. Tuy nhiên, không rõ làm thế nào để hiểu đồ thị biểu đồ.

Ví dụ, chúng là biểu đồ trọng lượng mạng của tôi.

nhập mô tả hình ảnh ở đây

(Sau khi sửa lỗi nhờ che nắng) nhập mô tả hình ảnh ở đây Cách tốt nhất để giải thích những điều này là gì? Các trọng số lớp 1 hầu hết trông bằng phẳng, điều này có nghĩa là gì?

Tôi đã thêm mã xây dựng mạng ở đây.

X = tf.placeholder(tf.float32, [None, input_size], name="input_x")
x_image = tf.reshape(X, [-1, 6, 10, 1])
tf.summary.image('input', x_image, 4)

# First layer of weights
with tf.name_scope("layer1"):
    W1 = tf.get_variable("W1", shape=[input_size, hidden_layer_neurons],
                         initializer=tf.contrib.layers.xavier_initializer())
    layer1 = tf.matmul(X, W1)
    layer1_act = tf.nn.tanh(layer1)
    tf.summary.histogram("weights", W1)
    tf.summary.histogram("layer", layer1)
    tf.summary.histogram("activations", layer1_act)

# Second layer of weights
with tf.name_scope("layer2"):
    W2 = tf.get_variable("W2", shape=[hidden_layer_neurons, hidden_layer_neurons],
                         initializer=tf.contrib.layers.xavier_initializer())
    layer2 = tf.matmul(layer1_act, W2)
    layer2_act = tf.nn.tanh(layer2)
    tf.summary.histogram("weights", W2)
    tf.summary.histogram("layer", layer2)
    tf.summary.histogram("activations", layer2_act)

# Third layer of weights
with tf.name_scope("layer3"):
    W3 = tf.get_variable("W3", shape=[hidden_layer_neurons, hidden_layer_neurons],
                         initializer=tf.contrib.layers.xavier_initializer())
    layer3 = tf.matmul(layer2_act, W3)
    layer3_act = tf.nn.tanh(layer3)

    tf.summary.histogram("weights", W3)
    tf.summary.histogram("layer", layer3)
    tf.summary.histogram("activations", layer3_act)

# Fourth layer of weights
with tf.name_scope("layer4"):
    W4 = tf.get_variable("W4", shape=[hidden_layer_neurons, output_size],
                         initializer=tf.contrib.layers.xavier_initializer())
    Qpred = tf.nn.softmax(tf.matmul(layer3_act, W4)) # Bug fixed: Qpred = tf.nn.softmax(tf.matmul(layer3, W4))
    tf.summary.histogram("weights", W4)
    tf.summary.histogram("Qpred", Qpred)

# We need to define the parts of the network needed for learning a policy
Y = tf.placeholder(tf.float32, [None, output_size], name="input_y")
advantages = tf.placeholder(tf.float32, name="reward_signal")

# Loss function
# Sum (Ai*logp(yi|xi))
log_lik = -Y * tf.log(Qpred)
loss = tf.reduce_mean(tf.reduce_sum(log_lik * advantages, axis=1))
tf.summary.scalar("Q", tf.reduce_mean(Qpred))
tf.summary.scalar("Y", tf.reduce_mean(Y))
tf.summary.scalar("log_likelihood", tf.reduce_mean(log_lik))
tf.summary.scalar("loss", loss)

# Learning
train = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(loss)

4
Tôi chỉ nhận thấy rằng bạn hoàn toàn không sử dụng các kích hoạt trên lớp cuối cùng. Có thể bạn muốn nói tf.nn.softmax(tf.matmul(layer3_act, W4)).
sunide

@sunside Cảm ơn. Hóa ra biểu đồ cũng rất hữu ích để gỡ lỗi. Tôi đã cập nhật các bức ảnh.
Sung Kim

1
@SungKim Tôi đang sử dụng cách triển khai của bạn làm tài liệu tham khảo, nhưng làm cách nào để bạn thêm thiên vị? Như thế này? B1 = tf.get_variable("B1", shape=[hidden_layer_neurons],initializer=tf.random_normal_initializer())layer1_bias = tf.add(layer1, B1)tf.summary.histogram("bias", layer1_bias)
Gert Kommer

1
@SungKim nếu bạn vẫn còn thư mục nhật ký, bạn có thể tải nó lên Aughie Boards không? Sẽ thật tuyệt khi xem các biểu đồ trong một bảng điều khiển tương tác
Agost Biro

@SungKim bạn sẽ sửa chữa mã của bạn bằng cách định nghĩa input_sizeđể chúng ta có thể chạy nó và xem kết quả trongtensorboard
Mario

Câu trả lời:


131

Có vẻ như mạng không học được gì trong các lớp từ một đến ba. Lớp cuối cùng thực sự thay đổi, vì vậy điều đó có nghĩa là có thể có điều gì đó sai với các gradient (nếu bạn đang giả mạo chúng theo cách thủ công), bạn đang hạn chế học đến lớp cuối cùng bằng cách chỉ tối ưu hóa trọng lượng của nó hoặc thực sự là lớp cuối cùng ' ăn hết lỗi. Nó cũng có thể là chỉ những thành kiến ​​được học. Mạng dường như học được điều gì đó, nhưng nó có thể không sử dụng hết tiềm năng của nó. Sẽ cần nhiều ngữ cảnh hơn ở đây, nhưng thử nghiệm với tốc độ học tập (ví dụ: sử dụng một cái nhỏ hơn) có thể đáng để thử.

Nói chung, biểu đồ hiển thị số lần xuất hiện của một giá trị so với các giá trị khác. Nói một cách đơn giản, nếu các giá trị có thể nằm trong một phạm vi 0..9và bạn thấy 10giá trị tăng đột biến 0, điều này có nghĩa là 10 đầu vào giả định giá trị 0; ngược lại, nếu biểu đồ hiển thị đồng nguyên của 1tất cả các giá trị của 0..9, điều đó có nghĩa là đối với 10 đầu vào, mỗi giá trị có thể 0..9xảy ra đúng một lần. Bạn cũng có thể sử dụng biểu đồ để trực quan hóa các phân phối xác suất khi bạn chuẩn hóa tất cả các giá trị biểu đồ bằng tổng của chúng; nếu bạn làm điều đó, bạn sẽ nhận được trực quan khả năng một giá trị nhất định (trên trục x) sẽ xuất hiện (so với các đầu vào khác).

Bây giờ layer1/weights, cao nguyên có nghĩa là:

  • hầu hết các trọng lượng nằm trong khoảng -0,15 đến 0,15
  • (hầu hết) có khả năng như nhau đối với một trọng số có bất kỳ giá trị nào trong số các giá trị này, tức là chúng (gần như) được phân phối đồng đều

Nói cách khác, gần như cùng một số trọng lượng có giá trị -0.15, 0.0, 0.15và tất cả mọi thứ ở giữa. Có một số trọng số có giá trị nhỏ hơn hoặc cao hơn một chút. Vì vậy, trong ngắn hạn, điều này đơn giản giống như các trọng số đã được khởi tạo bằng cách sử dụng phân phối đồng nhất với giá trị trung bình và phạm vi giá trị bằng không -0.15..0.15... cho hoặc nhận. Nếu bạn thực sự sử dụng khởi tạo thống nhất, thì đây là điển hình khi mạng chưa được đào tạo.

Khi so sánh, layer1/activationstạo thành một hình dạng giống như đường cong hình chuông (gaussian): Các giá trị được tập trung xung quanh một giá trị cụ thể, trong trường hợp này 0, nhưng chúng cũng có thể lớn hơn hoặc nhỏ hơn (có khả năng như nhau, vì nó đối xứng). Hầu hết các giá trị xuất hiện gần với giá trị trung bình 0, nhưng các giá trị nằm trong khoảng từ -0.8đến 0.8. Tôi giả sử rằng giá trị layer1/activationsđược lấy làm phân phối trên tất cả các đầu ra của lớp trong một lô. Bạn có thể thấy rằng các giá trị thay đổi theo thời gian.

Biểu đồ lớp 4 không cho tôi biết bất cứ điều gì cụ thể. Từ hình dạng, nó chỉ cho thấy rằng một số trọng lượng giá trị xung quanh -0.1, 0.050.25có xu hướng xảy ra với một xác suất cao hơn; một lý do có thể là, các phần khác nhau của mỗi nơ-ron ở đó thực sự nhận cùng một thông tin và về cơ bản là dư thừa. Điều này có thể có nghĩa là bạn thực sự có thể sử dụng một mạng nhỏ hơn hoặc mạng của bạn có khả năng tìm hiểu thêm các tính năng phân biệt để ngăn trang bị quá mức. Đây chỉ là những giả định.

Ngoài ra, như đã nêu trong các nhận xét bên dưới, hãy thêm đơn vị thiên vị. Bằng cách loại bỏ chúng, bạn đang buộc mạng của mình vào một giải pháp có thể không hợp lệ.


5
Không có sự thiên vị nào có thể là một ý tưởng rất tồi - nó thực sự giống như việc cố gắng vẽ một đường thẳng qua một đám mây điểm (chiều cao), nhưng buộc phải đi qua giá trị 0; nó có thể hoạt động và sẽ cung cấp cho bạn một số giải pháp, nhưng rất có thể đó là một giải pháp tồi hoặc đơn giản là sai.
sunide

1
Tôi không thể nói với bạn nhiều điều đáng buồn từ biểu đồ. (Đã cập nhật câu trả lời của tôi.)
sunide

1
Nó có lẽ nên đào tạo lâu hơn một chút bây giờ. Đặc biệt là với kết quả đầu tiên của bạn, có layer4/Qpredvẻ như nó có thể tốt hơn nhiều. Về trọng lượng vẫn giữ nguyên ... Tôi thấy điều đó thật khó hiểu, nhưng tôi không thể hiểu được nó ngay bây giờ. Có thể đó thực sự là sự phân phối chính xác, nhưng vì không có sự thay đổi nào cả, tôi thấy điều đó thật khó tin.
sunide

1
@sunside có phương pháp nào để ưu tiên cập nhật trọng số mạng hơn các thành kiến ​​không? Vì các thành kiến ​​cũng như lớp cuối cùng dường như hút tất cả các lỗi. Tôi đang gặp sự cố tương tự trong đó chỉ cập nhật các thành kiến ​​và biểu đồ trọng lượng vẫn tương đối không thay đổi.
mamafoku

2
Không có sự thiên vị cũng không sao nếu sử dụng định mức hàng loạt trước khi kích hoạt
Tosha
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.