機器學習的學習不該該僅僅停留在對scikit-learn or tensorflow(deep learning)框架的調用,而應該着眼於內部的世界,學習機器學習有一段時間了,有必要回頭整理一下,下面咱們基於線性模型來看算法
- 標準方程
- 梯度降低 進而來看基於以上二者如何實現模型的訓練,基本思想一致,不一樣的模型你們能夠舉一反三
1.標準方程bash
2.梯度降低框架
3.機器學習模型訓練過程dom
這個定義其實很好理解: 下面咱們以線性迴歸進行進一步的論證:機器學習
梯度降低:能夠成爲是從初始theta開始,一步步求的成本函數最低點的過程;函數
其實經過上面的參數咱們能夠進一步理解梯度降低:學習
上面就是梯度降低的圖例,以線性迴歸爲例,成本函數的梯度向量也能夠經過一個閉式方程進行計算:優化
學習率在梯度降低的過程當中很關鍵,若是學習率很低,算法須要大量時間才能夠收斂; 反之,學習率過高,則會讓函數迅速發散最終找不到最優解 因此,學習率作爲一個重要的超參數,咱們應該經過相似網格搜索等途徑獲取最佳的學習率,或者能夠這樣,隨着訓練次數的提高,有規律的下降學習率: 下面看圖例:(第一個是學習率過低,第二個是學習率過高) ui
梯度降低能夠分爲3種,主要式經過訓練所用到的X的shape級別進行區分:spa
到這裏,咱們能夠直觀的看出機器學習中,梯度降低能夠用來優化模型
下面粘貼一部分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條數據進行訓練,這樣效率大大提升