从二进制观察中恢复概率分布 - 这种实现的缺陷是什么原因?

时间:2015-11-16 21:54:19

标签: python neural-network tensorflow

我试图恢复概率分布(不是概率密度,任何范围在[0,1]中的函数,其中f(x)编码成功概率为x)。我使用一个隐藏层,有10个神经元和softmax。这是我的代码:

import tensorflow as tf
import numpy as np
import random
import math

#Make binary observations encoded as one-hot vectors.
def makeObservations(probabilities):
    observations = np.zeros((len(probabilities),2), dtype='float32')
    for i in range(0, len(probabilities)):        
        if random.random() <= probabilities[i]:
            observations[i,0] = 1
            observations[i,1] = 0
        else:
            observations[i,0] = 0
            observations[i,1] = 1
    return observations

xTrain = np.linspace(0, 4*math.pi, 2001).reshape(1,-1)
distribution = map(lambda x: math.sin(x)**2, xTrain[0])
yTrain = makeObservations(distribution)

def weight_variable(shape):
  initial = tf.truncated_normal(shape, stddev=0.1)
  return tf.Variable(initial)

def bias_variable(shape):
  initial = tf.constant(0.1, shape=shape)
  return tf.Variable(initial)

x = tf.placeholder("float", [1,None])
hiddenDim = 10

b = bias_variable([hiddenDim,1])
W = weight_variable([hiddenDim, 1])

b2 = bias_variable([2,1])
W2 = weight_variable([2, hiddenDim])
hidden = tf.nn.sigmoid(tf.matmul(W, x) + b)
y = tf.transpose(tf.matmul(W2, hidden) + b2)

loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(y, yTrain))
step = tf.Variable(0, trainable=False)
rate = tf.train.exponential_decay(0.2, step, 1, 0.9999)
optimizer = tf.train.AdamOptimizer(rate)
train = optimizer.minimize(loss, global_step=step)

predict_op = tf.argmax(y, 1)

sess = tf.Session()
init = tf.initialize_all_variables()
sess.run(init)

for i in range(50001):
    sess.run(train, feed_dict={x: xTrain})
    if i%200 == 0:
        #proportion of correct predictions
        print i, np.mean(np.argmax(yTrain, axis=1) ==
                     sess.run(predict_op, feed_dict={x: xTrain}))

import matplotlib.pyplot as plt
ys = tf.nn.softmax(y).eval({x:xTrain}, sess)
plt.plot(xTrain[0],ys[:,0])
plt.plot(xTrain[0],distribution)
plt.plot(xTrain[0], yTrain[:,0], 'ro')
plt.show()

以下是两个典型结果: enter image description here enter image description here

问题:

执行tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(y, yTrain))和手动应用softmax与最小化交叉熵有什么区别?

模型通常不会捕捉到分发的最后一段时间。我已经成功了一次。也许它会通过做更多的训练来修复,但它看起来并不像它,因为结果经常稳定在最后的~20k跑。是否最有可能通过更好地选择优化算法,更多隐藏层或隐藏层的更多维度来改进? (由编辑部分回答)

接近x = 0的像差是典型的。是什么导致他们?

编辑:通过执行

,适应性得到了很大改善
hiddenDim = 15
(...)
optimizer = tf.train.AdagradOptimizer(0.5)

并将sigmoids的激活更改为tanh。

enter image description here

进一步的问题:

更高的隐藏尺寸是否通常更容易制动出局部最小值?

隐藏层的最佳维度与输入维度dim(hidden) = f(dim(input))之间的近似典型关系是什么?线性,弱于线性或强于线性?

1 个答案:

答案 0 :(得分:1)

左侧过度贴合,右侧过度贴合。

由于小的随机偏差,隐藏单位在x=0附近都接近零激活,并且由于不对称和大范围的x值,大多数隐藏单位在{{1}附近饱和。 }。

渐变不能通过饱和单位,因此它们都会被用来过度拟合他们能感觉到的值,接近于零。

我认为将数据集中在x = 10上会有所帮助。 尝试减少权重初始化方差,和/或增加偏差初始化方差(或等效地,将数据范围缩小到较小的区域,如x=0)。

如果你使用RBF并且将它们初始化为接近零,你会得到同样的问题。使用线性-Sigmoid单位,第二层使用线性sigmoids对来制作RBF。