官术网_书友最值得收藏!

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章例子的流程完全一致,因此在學習過程中只要聚焦于模型構建本身就可以了。

主站蜘蛛池模板: 白城市| 灵川县| 广西| 岐山县| 微博| 江门市| 东乌珠穆沁旗| 浑源县| 阿克| 合作市| 措美县| 罗甸县| 绍兴县| 三明市| 雷山县| 忻州市| 息烽县| 常州市| 陆河县| 长顺县| 右玉县| 赣榆县| 建始县| 公安县| 岢岚县| 游戏| 沙雅县| 高陵县| 伊春市| 司法| 衢州市| 八宿县| 化州市| 隆尧县| 辉县市| 滨海县| 福清市| 元阳县| 深泽县| 开鲁县| 隆化县|