從標準方程,梯度降低窺探機器學習訓練原理

機器學習的學習不該該僅僅停留在對scikit-learn or tensorflow(deep learning)框架的調用,而應該着眼於內部的世界,學習機器學習有一段時間了,有必要回頭整理一下,下面咱們基於線性模型來看算法

  • 標準方程
  • 梯度降低 進而來看基於以上二者如何實現模型的訓練,基本思想一致,不一樣的模型你們能夠舉一反三
下面咱們分佈闡述

1.標準方程bash

2.梯度降低框架

3.機器學習模型訓練過程dom

1.標準方程

標準方程:其實就是求算法模型成本函數最小,即爲0的時候的\theta的閉式解

這個定義其實很好理解: 下面咱們以線性迴歸進行進一步的論證:機器學習

  • 1.線性迴歸的預測模型
y = \theta  * X
  • 2.那麼線性迴歸的成本函數就是MSE:
MSE(X,h_\theta) = 1/m  \sum_{i=0}^{m}(\theta^T * Xi  - yi)^2
  • 3.接着咱們對MSE求導,並令其等於0,這樣獲得一個權重theta爲因變量的閉式解:
\theta = (X^T * X)^{-1} * X^T  * y
  • 4.獲得標準方程,模型即可以開始預測了:
y(pred) = \theta * X

2.梯度降低

梯度降低:能夠成爲是從初始theta開始,一步步求的成本函數最低點的過程;函數

\theta(next) = \theta - \eta \frac{\partial mse}{\partial \theta}
\theta:權重向量 \quad  \eta:學習率 \quad \frac{\partial mse}{\partial \theta}:梯度

其實經過上面的參數咱們能夠進一步理解梯度降低:學習

  • 梯度降低:經過上面的公式不斷更新權重,不斷的訓練模型,當成本函數達到理想值的時候,中止更新權重,即中止訓練模型
    在這裏插入圖片描述
2.1:梯度向量的計算:

上面就是梯度降低的圖例,以線性迴歸爲例,成本函數的梯度向量也能夠經過一個閉式方程進行計算:優化

\frac{\partial mse}{\partial \theta} = 2/m * \sum_{i=1}^m(\theta * X^{(i)} - y^{(i)})x_j^{(i)}
\frac{\partial mse}{\partial \theta} = 2/m * X^T * (X*\theta - y)
2.2:學習率

學習率在梯度降低的過程當中很關鍵,若是學習率很低,算法須要大量時間才能夠收斂; 反之,學習率過高,則會讓函數迅速發散最終找不到最優解 因此,學習率作爲一個重要的超參數,咱們應該經過相似網格搜索等途徑獲取最佳的學習率,或者能夠這樣,隨着訓練次數的提高,有規律的下降學習率: 下面看圖例:(第一個是學習率過低,第二個是學習率過高) ui

在這裏插入圖片描述
在這裏插入圖片描述

梯度降低能夠分爲3種,主要式經過訓練所用到的X的shape級別進行區分:spa

  1. 批量梯度降低:每次使用所有的數據進行梯度計算
  2. 隨機梯度降低:每次使用隨機的一條數據進行梯度計算
  3. 小批量梯度降低:每次從數據中隨機取出一部分數據進行計算

到這裏,咱們能夠直觀的看出機器學習中,梯度降低能夠用來優化模型

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.初始化權重向量\theta,這裏的\theta初始化須要注意,\theta的shape須爲(features,)

2.接着利用\theta*X求得當前的預測值,進而求的MSE,而後利用下面公式:

\frac{\partial mse}{\partial \theta} = 2/m * X^T * (X*\theta - y)\;\;\;\;\;\;\;\theta(next) = \theta - \eta \frac{\partial mse}{\partial \theta}

更新\theta,循環往復的重複1,2步驟,直到MSE的值調節倒最優,中止更新\theta,並中止訓練

如此這般,基於數據不斷訓練模型直至模型輸出最優: 可是須要注意一點: 因爲這個訓練過程是基於X來進行訓練的,因此咱們爲了提升效率,須要使用小批量的梯度降低: eg:每次從數據中取出50條數據進行訓練,這樣效率大大提升

相關文章
相關標籤/搜索