51

从标准方程,梯度下降窥探机器学习训练原理

 5 years ago
source link: https://www.tuicool.com/articles/VZjy63n
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

这个定义其实很好理解: 下面我们以线性回归进行进一步的论证:

1.线性回归的预测模型

2.那幺线性回归的成本函数就是MSE:

3.接着我们对MSE求导,并令其等于0,这样得到一个权重theta为因变量的闭式解:

4.得到标准方程,模型便可以开始预测了:

2.梯度下降

梯度下降:可以成为是从初始theta开始,一步步求的成本函数最低点的过程;

其实通过上面的参数我们可以进一步理解梯度下降:

梯度下降:通过上面的公式不断更新权重,不断的训练模型,当成本函数达到理想值的时候,停止更新权重,即停止训练模型

U3QB7bI.png!web

2.1:梯度向量的计算:

上面就是梯度下降的图例,以线性回归为例,成本函数的梯度向量也可以通过一个闭式方程进行计算:

2.2:学习率

学习率在梯度下降的过程中很关键,如果学习率很低,算法需要大量时间才可以收敛; 反之,学习率太高,则会让函数迅速发散最终找不到最优解 所以,学习率做为一个重要的超参数,我们应该通过类似网格搜索等途径获取最佳的学习率,或者可以这样,随着训练次数的提升,有规律的降低学习率: 下面看图例:(第一个是学习率太低,第二个是学习率太高)

EbMvmuz.png!web

梯度下降可以分为3种,主要式通过训练所用到的X的shape级别进行区分:

    1. 批量梯度下降:每次使用全部的数据进行梯度计算
    1. 随机梯度下降:每次使用随机的一条数据进行梯度计算
    1. 小批量梯度下降:每次从数据中随机取出一部分数据进行计算

到这里,我们可以直观的看出机器学习中,梯度下降可以用来优化模型

3.机器学习模型训练过程

下面粘贴一部分tensorflow的代码,(不了解tensorflow可以直接跳过这块代码):

m, n = housing.data.shape
n_epochs = 1000
learning_rate = 0.01
pipeline = Pipeline([
    ('std_scaler', StandardScaler())
])
scaled_housing_data_plus_bias = pipeline.fit_transform(housing_data_plus_bias)
serialize_data(scaled_housing_data_plus_bias,'scaled_housing_data_plus_bias')
X = tf.constant(scaled_housing_data_plus_bias, dtype=tf.float32, name='X')
y = tf.constant(housing.target.reshape(-1, 1), dtype=tf.float32, name='y')
# 获取初始的theta
theta = tf.Variable(tf.random_uniform([n + 1, 1], -1.0, 1.0), name='theta')
y_pred = tf.matmul(X, theta, name='predictions')
error = y_pred - y
mse = tf.reduce_mean(tf.square(error), name='mse')
gradients = 2 / m * tf.matmul(tf.transpose(X), error)
training_op = tf.assign(theta, theta - learning_rate * gradients)
# 开启会话
init = tf.global_variables_initializer()
with tf.Session() as sess:
    sess.run(init)
    for epoch in range(n_epochs):
        if epoch % 100 == 0:
            print('Epoch', epoch, 'MSE = ', mse.eval())
        sess.run(training_op)
        # training_op.eval()
    best_theta = theta.eval()

具体阐述原理:

1.初始化权重向量 ,这里的 初始化需要注意, 的shape须为(features,)

2.接着利用 求得当前的预测值,进而求的 ,然后利用下面公式:

更新 ,循环往复的重复1,2步骤,直到MSE的值调节倒最优,停止更新 ,并停止训练

如此这般,基于数据不断训练模型直至模型输出最优: 但是需要注意一点: 由于这个训练过程是基于X来进行训练的,所以我们为了提高效率,需要使用小批量的梯度下降: eg:每次从数据中取出50条数据进行训练,这样效率大大提高


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK