在Tensorflow中使用Rmsprop进行线性回归

问题描述

我正在尝试使用Rms Prop优化器从头开始实现线性回归。
代码

EPOCHS = 100

w3 = tf.Variable(w_vector,dtype = tf.float32)
w4 = tf.Variable(0,dtype = tf.float32)
lr = 1e-5
beta = 0.9
epilson = 1e-7
momentum = 0.0
for epoch in range(1,EPOCHS+1):
    mom_w = 0
    mom_b = 0
    mean_square_w = 0
    mean_gradient_w = 0
    mean_square_b = 0
    mean_gradient_b = 0

    y_pred1 = tf.squeeze(tf.matmul(w3,x,transpose_a = True,transpose_b = True) + w4)
    dw3,dw4 = gradients_mse(x,y,y_pred1)

    # My eqautions for RMS prop
    mean_square_w = beta * mean_square_w + (1-beta) * dw3 ** 2
    mean_gradient_w = beta * mean_gradient_w + (1-beta) * dw3
    
    mom_w = momentum * mom_w + lr * (dw3/(tf.sqrt(mean_square_w + epilson - mean_gradient_w ** 2)))
    
    mean_square_b = beta * mean_square_b + (1-beta) * dw4 ** 2
    mean_gradient_b = beta * mean_gradient_b + (1-beta) * dw4
    
    mom_b = momentum * mom_b + lr * (dw4/(tf.sqrt(mean_square_b + epilson - mean_gradient_b ** 2)))

    w3.assign_sub(mom_w)
    w4.assign_sub(mom_b)

print('w3 : {}'.format(w3.numpy()))
print('w4 : {}'.format(w4.numpy()))

输出

w3 : [[-1.2507935]]
w4 : 0.0033333366736769676

现在,我创建一个没有激活功能的单层和单个神经元神经网络。在其神经元中分配相同的权重,并使用RMS prop作为优化器,我得到不同的最终权重。但是,sgd Optimizer并非如此。

代码

# using keras to get same results
def create_model():
    model = tf.keras.Sequential()
    model.add(tf.keras.layers.Dense(units = 1,name = 'd1',input_shape = (x.shape[1],)))
    
    model.compile(optimizer=tf.keras.optimizers.RMSprop(
    learning_rate=1e-5,rho=0.9,momentum=0.0,epsilon=1e-07,centered=False),loss="mse")
    
    return model
model = create_model()

d1 = model.get_layer('d1')
d1_weights = [tf.constant(w_vector,dtype = tf.float32),tf.constant(np.array([0]),dtype = tf.float32)]
d1.set_weights(d1_weights)

model.fit(x,epochs = 100)

d1 = model.get_layer('d1')
print('w3 = {}'.format(d1.weights[0].numpy()))
print('w4 = {}'.format(d1.weights[1].numpy()[0]))

输出

w3 = [[-1.2530397]]
w4 = 0.0010913893347606063

我的梯度可以正确计算出mse损失函数。我已经使用内置的tensorflows交叉检查了内置的梯度计算功能gradient tape。
代码

# Computing gradients
def gradients_mse(X,Y,Y_PREDS):
    DW1 = tf.matmul(X,tf.reshape(Y-Y_PREDS,(X.shape[0],1)),transpose_a = True) * (-2/X.shape[0])
    DW0 = (-2 / X.shape[0]) * tf.reduce_sum(Y - Y_PREDS)
    return DW1,DW0

此实现中唯一会出错的地方是我认为使用错误的公式计算 mom_w mom_b

x.shape = [10,1]
认批次大小为32,因此对重量更新没有影响。当我尝试使用简单的梯度下降而不是RMS prop时,相同的代码给出了完全匹配的输出

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)