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)
답변
네트워크는 1 ~ 3 개의 계층에서 아무것도 학습하지 않은 것으로 보입니다. 마지막 레이어가 변경되므로 그래디언트에 문제가있을 수 있습니다 (수동으로 변경하는 경우), 가중치 만 최적화하거나 마지막 레이어를 실제로 최적화하여 학습을 마지막 레이어로 제한합니다. 모든 오류를 먹는다. 편견 만 배우는 것일 수도 있습니다. 네트워크는 무언가를 배우는 것처럼 보이지만 잠재력을 최대한 활용하지 못할 수도 있습니다. 여기에 더 많은 컨텍스트가 필요하지만 학습률 (예 : 더 작은 것을 사용)을 가지고 노는 것이 가치가있을 수 있습니다.
일반적으로 히스토그램은 서로 값을 기준으로 한 값의 발생 횟수를 표시합니다. 간단히 말해서, 가능한 값이 범위 에 있고 값 0..9
에 양이 급증하는 것을 보면 10 개의 입력이 값을 가정한다는 의미입니다 . 반대로 히스토그램 이의 모든 값에 대해 안정기를 표시하면 10 개의 입력에 대해 가능한 각 값 이 정확히 한 번 발생 함을 의미합니다 . 모든 히스토그램 값을 총합으로 정규화 할 때 히스토그램을 사용하여 확률 분포를 시각화 할 수도 있습니다. 이렇게하면 특정 값 (x 축)이 다른 입력과 비교하여 나타날 가능성을 직관적으로 얻을 수 있습니다.10
0
0
1
0..9
0..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.05
및 0.25
높은 확률로 발생하는 경향이있다; 이유 는 각 뉴런의 다른 부분이 실제로 동일한 정보를 선택하고 기본적으로 중복되기 때문일 수 있습니다. 이는 실제로 더 작은 네트워크를 사용할 수 있거나 네트워크가 과적 합을 방지하기 위해 더 많은 구별 기능을 학습 할 가능성이 있음을 의미 할 수 있습니다. 이것은 단지 가정 일뿐입니다.
또한 아래 주석에서 이미 언급했듯이 바이어스 단위를 추가하십시오. 이를 제외하면 네트워크를 유효하지 않은 솔루션으로 강제로 제한하게됩니다.