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

Recovering probability distribution from binary observations - what are the reasons for the defects of this implementation?

我正在尝试恢复概率分布(不是概率密度,范围在 [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()

这里有两个典型的结果:

问题:

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

模型通常不会捕捉到分布的最后一个周期。我只让它成功过一次。也许它会通过进行更多的训练运行来修复,但它看起来并不像最后 ~20k 运行的结果通常稳定。最有可能通过更好地选择优化算法、更多隐藏层或更多维度的隐藏层来改进它吗? (编辑部分回答)

x=0 附近的像差是典型的。是什么原因造成的?

编辑:通过

,贴合度提高了很多
hiddenDim = 15
(...)
optimizer = tf.train.AdagradOptimizer(0.5)

并将激活从 sigmoid 更改为 tanh。

更多问题:

隐藏维度越高越容易突破局部极小值,这是典型的吗?

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

左边过拟合,右边欠拟合

由于小的随机偏差,你的隐藏单元在 x=0 附近都接近零激活,并且由于 x 值的不对称性和大范围,大多数隐藏单元在 [= 附近饱和11=].

梯度无法流过饱和单元,因此它们都被用尽以过度拟合它们可以感觉到的值,接近于零。

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

如果您使用 RBF 并将它们全部初始化为接近零,您会遇到同样的问题。使用线性 S 形单元,第二层使用成对的线性 S 形单元来制作 RBF。