- 從機器學習到無人駕駛
- 宋哲賢
- 1123字
- 2020-11-23 15:03:26
3.5 梯度下降模型實例
實例1:使用Python實現線性回歸梯度下降模型
在3.3節中我們使用最小二乘法完成了一元線性回歸的參數求解過程,本節的第一個例子就使用Python完成梯度下降算法對3.3節數據集合對應的一元線性回歸模型進行求解。代碼如下:
import numpy as np from numpy import dot from numpy import mat #y=2x X = mat([1,2,3]).reshape(3, 1) Y = 2*X theta = 1. alpha = 0.1 for i in range(100): theta = theta + np.sum(alpha * (Y- dot(X, theta))*X.reshape(1,3))/3. print(theta)
數據準備部分與3.3節完全相同,在這里就不贅述了。接下來的代碼是模型參數的初始化,我們人為設定起始參數為1.0,也可以使用隨機算法生成隨機參數。另外,我們還需要指定學習速率,在本例中使用0.1。
theta = 1
alpha = 0.1
然后指定梯度下降的學習速率,學習速率在這里指定為0.1。一般來說,梯度下降學習速率太快(α過大)容易導致算法無法收斂,梯度下降學習速率太慢(α過小)容易造成計算資源的浪費和模型運行時間過長。
for i in range(100): theta = theta + np.sum(alpha * (Y- dot(X, theta))*X.reshape(1,3))/3.
接下來的代碼進行參數更新,即梯度下降的實際運行過程通過NumPy矩陣運算,我們很容易就可以完成更新量的計算,通過循環更新參數集合100次。整個過程比較清晰,但是有一點需要特別注意,如果是多元線性回歸模型,就需要在一次計算中同步更新參數矩陣的所有要素。
例如下面的三元線性回歸模型中,每次循環中需要對參數矩陣的4個要素同時進行更新。
for i in range(10000): temp[0] = theta[0] + alpha*np.sum((Y-dot(X, theta))*X0)/150. temp[1] = theta[1] + alpha*np.sum((Y-dot(X, theta))*X1)/150. temp[2] = theta[2] + alpha*np.sum((Y-dot(X, theta))*X2)/150. temp[3] = theta[3] + alpha*np.sum((Y-dot(X, theta))*X3)/150. theta = temp
實例2:使用TensorFlow框架實現線性回歸梯度下降模型
本例介紹使用TensoFlow進行線性回歸的過程。
import tensorflow as tf x = tf.constant([[1], [2], [3], [4]], dtype=tf.float32) y_true = tf.constant([[0], [-1], [-2], [-3]], dtype=tf.float32) linear_model = tf.layers.Dense(units=1) y_pred = linear_model(x) loss = tf.losses.mean_squared_error(labels=y_true, predictions=y_pred) optimizer = tf.train.GradientDescentOptimizer(0.01) train = optimizer.minimize(loss) init = tf.global_variables_initializer() sess = tf.Session() sess.run(init) for i in range(100): _, loss_value = sess.run((train, loss)) print(loss_value) print(sess.run(y_pred))
雖然使用TensorFlow看起來代碼量比使用Python的NumPy框架進行數學運算時多不少,但是本實例代碼完美地體現了TensorFlow的設計思想,具有平滑的學習曲線這樣一個內在優勢。因此,線性回歸過程完成機器學習代數化向語義的進化,這樣一套代碼完全遵守TensorFlow機器學習的標準流程(模型構建、模型初始化、模型訓練),而且將復雜的數學表達式封裝成了mean_squared_error等方法,也使初級開發者更加容易掌握,而高級開發者可以聚焦模型構建本身。
首先是框架的引入和數據的準備,為了能夠聚焦到線性回歸模型本身,我們依然使用非常簡單的數據集合,使用TensorFlow中的常量來直接存儲。
x = tf.constant([[1], [2], [3], [4]], dtype=tf.float32) y_true = tf.constant([[0], [-1], [-2], [-3]], dtype=tf.float32)
接下來的部分是模型的構建過程,也是我們要重點講解的內容。
linear_model = tf.layers.Dense(units=1)
此處建立一個一元線性模型,units=1表示輸入一個參數。這里我們使用了TensorFlow自己的層模型,也可以用Keras模塊中的層模型進行替換。
y_pred = linear_model(x) loss = tf.losses.mean_squared_error(labels=y_true, predictions=y_pred) optimizer = tf.train.GradientDescentOptimizer(0.01) train = optimizer.minimize(loss)
通過mean_squared_error告知了TensorFlow在框架運行時計算預測值和標簽值的偏差平方和,并以最小化這個值作為訓練目的(optimizer.minimize(loss))。
init = tf.global_variables_initializer() sess = tf.Session() sess.run(init) for i in range(100): _, loss_value = sess.run((train, loss)) print(loss_value) print(sess.run(y_pred))
上面的代碼是訓練過程的詳細實現,我們驚喜地發現,訓練過程(包含參數初始化)和第2章例子的流程完全一致,因此在學習過程中只要聚焦于模型構建本身就可以了。
- ABB工業機器人編程全集
- JavaScript實例自學手冊
- 基于LPC3250的嵌入式Linux系統開發
- Natural Language Processing Fundamentals
- Effective DevOps with AWS
- Matplotlib 3.0 Cookbook
- JMAG電機電磁仿真分析與實例解析
- 城市道路交通主動控制技術
- 水晶石精粹:3ds max & ZBrush三維數字靜幀藝術
- R Data Analysis Projects
- LMMS:A Complete Guide to Dance Music Production Beginner's Guide
- 計算機組成與操作系統
- Machine Learning in Java
- AVR單片機C語言程序設計實例精粹
- 深度學習之模型優化:核心算法與案例實踐