텐서 보드 (가중치) 히스토그램 이해


120

TensorBoard에서 스칼라 값을보고 이해하는 것은 정말 간단합니다. 그러나 히스토그램 그래프를 이해하는 방법은 명확하지 않습니다.

예를 들어, 네트워크 가중치의 히스토그램입니다.

여기에 이미지 설명 입력

(Sunside 덕분에 버그를 수정 한 후) 여기에 이미지 설명 입력 이것을 해석하는 가장 좋은 방법은 무엇입니까? 레이어 1 가중치는 대부분 평평 해 보입니다. 이것은 무엇을 의미합니까?

여기에 네트워크 구성 코드를 추가했습니다.

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
마지막 레이어에서 활성화를 전혀 사용하지 않는 것으로 나타났습니다. 당신은 아마 tf.nn.softmax(tf.matmul(layer3_act, W4)).
sunside

@sunside 감사합니다. 히스토그램은 디버깅에도 매우 유용합니다. 사진을 업데이트했습니다.
성 김

1
@SungKim 나는 당신의 구현을 참조로 사용하고 있지만 어떻게 편향을 추가합니까? 이렇게? 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)
거트 Kommer

1
@SungKim 아직 로그 디렉토리가 있으면 Aughie Boards에 업로드 할 수 있습니까? 대화 형 대시 보드에서 히스토그램을 보는 것이 좋을 것입니다
Agost Biro 2018

@SungKim은 코드를 input_size실행하여 결과를 볼 수 있도록 정의 하여 수정 해 주시겠습니까tensorboard
Mario

답변:


131

네트워크는 1 ~ 3 개의 계층에서 아무것도 학습하지 않은 것으로 보입니다. 마지막 레이어가 변경되므로 그래디언트에 문제가있을 수 있습니다 (수동으로 변경하는 경우), 가중치 만 최적화하거나 마지막 레이어를 실제로 최적화하여 학습을 마지막 레이어로 제한합니다. 모든 오류를 먹는다. 편견 만 배우는 것일 수도 있습니다. 네트워크는 무언가를 배우는 것처럼 보이지만 잠재력을 최대한 활용하지 못할 수도 있습니다. 여기에 더 많은 컨텍스트가 필요하지만 학습률 (예 : 더 작은 것을 사용)을 가지고 노는 것이 가치가있을 수 있습니다.

일반적으로 히스토그램은 서로 값을 기준으로 한 값의 발생 횟수를 표시합니다. 간단히 말해서, 가능한 값이 범위 에 있고 값 0..9에 양이 급증하는 것을 보면 10 개의 입력이 값을 가정한다는 의미입니다 . 반대로 히스토그램 이의 모든 값에 대해 안정기를 표시하면 10 개의 입력에 대해 가능한 각 값 이 정확히 한 번 발생 함을 의미합니다 . 모든 히스토그램 값을 총합으로 정규화 할 때 히스토그램을 사용하여 확률 분포를 시각화 할 수도 있습니다. 이렇게하면 특정 값 (x 축)이 다른 입력과 비교하여 나타날 가능성을 직관적으로 얻을 수 있습니다.100010..90..9

이제 layer1/weights고원은 다음을 의미합니다.

  • 대부분의 가중치는 -0.15에서 0.15 범위에 있습니다.
  • 가중치가 이러한 값을 가질 가능성이 (대부분) 동일합니다. 즉, (거의) 균일하게 분포됩니다.

다른 말했다, 무게의 거의 같은 수의 값이 -0.15, 0.0, 0.15그 사이의 모든 것을. 약간 더 작거나 더 높은 값을 가진 일부 가중치가 있습니다. 요컨대, 이것은 단순히 평균이 0이고 값 범위가 0 인 균일 분포를 사용하여 가중치가 초기화 된 것처럼 보입니다 -0.15..0.15. 실제로 균일 한 초기화를 사용하는 경우 네트워크가 아직 훈련되지 않은 경우 일반적입니다.

이에 비해 layer1/activations종형 곡선 (가우스)과 같은 모양을 형성합니다.이 경우 값은 특정 값 (이 경우)을 중심으로 중앙에 배치 0되지만 그보다 크거나 작을 수도 있습니다 (대칭이므로 동일). 대부분의 값은의 평균 주위에 가깝게 0나타나지만 값의 범위는에서 -0.8까지 0.8입니다. 나는 layer1/activations배치의 모든 레이어 출력에 대한 분포로 간주됩니다. 시간이 지남에 따라 값이 변함을 알 수 있습니다.

레이어 4 히스토그램은 구체적인 내용을 알려주지 않습니다. 형태에서, 단지 약간의 중량은 약 값 것을 나타내는 것 -0.1, 0.050.25높은 확률로 발생하는 경향이있다; 이유 는 각 뉴런의 다른 부분이 실제로 동일한 정보를 선택하고 기본적으로 중복되기 때문일 있습니다. 이는 실제로 더 작은 네트워크를 사용할 수 있거나 네트워크가 과적 합을 방지하기 위해 더 많은 구별 기능을 학습 할 가능성이 있음을 의미 할 수 있습니다. 이것은 단지 가정 일뿐입니다.

또한 아래 주석에서 이미 언급했듯이 바이어스 단위를 추가하십시오. 이를 제외하면 네트워크를 유효하지 않은 솔루션으로 강제로 제한하게됩니다.


5
편향을 전혀 가지지 않는 것은 매우 나쁜 생각 일 수 있습니다. 마치 (고차원적인) 점 구름을 통해 선을 그리려고하지만 값 0을 통과하도록 강요받는 것과 같습니다. 작동 할 수도 있고 몇 가지 해결책 을 제공 할 수도 있지만, 그것이 나쁘거나 잘못된 것일 가능성이 있습니다.
sunside

1
슬프게도 히스토그램에서 많은 것을 말할 수 없습니다. (내 대답을 업데이트했습니다.)
sunside

1
이제 조금 더 훈련해야합니다. 특히 첫 번째 결과를 고려할 때 layer4/Qpred훨씬 나아질 수 있습니다. 같은 무게를 유지하는 것에 관해서는 ... 나는 그것이 비린내를 발견하지만 지금 당장은 그것을 이해할 수 없습니다. 정말 정확한 분포 일 수 있지만 전혀 변화가 없다는 점을 감안할 때 믿기 어렵습니다.
sunside

1
@sunside 편견보다 네트워크 가중치 업데이트의 우선 순위를 정하는 방법이 있습니까? 편견과 마지막 레이어가 모든 오류를 빨아들이는 것처럼 보입니다. 편향 만 업데이트되고 가중치 히스토그램이 상대적으로 변경되지 않은 유사한 문제가 있습니다.
mamafoku

2
활성화하기 전에 배치 표준을 사용하는 경우 아니 편견을 갖는 것은 괜찮습니다
Tosha
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.