1. 基本概念
定義
機器學習是一門研究如何通過計算手段, 利用經驗提升自身性能的學科。
人工智能、機器學習與深度學習三者間的關系如圖1-1所示
|
圖 1-1 概念間關系 |
1.1 人工智能定義
努力將通常由人類完成的智力任務自動化。
1.2 機器學習定義
是一種新的編程范式, 傳統編程范式如圖 1-2 所示
圖1-2 傳統的編程范式 |
機器學習的編程范式
圖1-3 機器學習編程范式 |
機器學習的定義:在預先定義好的可能性空間中,利用反饋信號的指引來尋找輸入數據的有用表示。
這個簡單的想法可以解決相當多的智能任務,從語音識別到自動駕駛。
一個程序可以從經驗E中學習,解決任務T, 達到性能度量值P, 當且僅當有了經驗E過后,經過P評判,程序在處理T時性能有所提升。(Tom Mitchell, 1998)
圖1-4 機器學習編程范式 |
機器學習可以分成兩部分:根據是否有標簽
* 監督式學習: 知道使用法則可以在輸入與輸出之間輸出數據。
* 非監督式學習: 當不知道結果的時候
監督式學習算法可以分成
* 回歸問題
* 分類問題
非監督式學習算法
聚類
1.3 深度學習
對深度的定義
從數據中學習表示的一種數學框架,強調從連續的層中進行學習,這些層對應於越來越有意義的表示。
“深度學習”中的“深度”指一系列連續的表示層,數據模型中包含多少層,這被稱為模型的深度(depth)。
圖1-4, 一個數字分類的深度學習網絡框架
圖 1-4 用於數字分類的深度神經網絡 |
深度學習: 學習數據表示的多級方法。
深度學習從數據中進行學習時有兩個基本特征:
第一, 通過漸進的、逐層的方式進行越來越復雜的表示;
第二,對中間這些漸進的表示共同進行學習,每一層的變化都需要同時考慮上下兩層的需要。
強化學習:
通過不斷的試錯進行學習
1.4 發展歷程
20世紀五十年代中后期,“連接主義”
20世紀五十年代至七十年代,人工智能研究處於推理期,典型代表,邏輯理論家,通用問題求解
20世紀七十年代中期,人工智能進入知識期
與此同時,基於邏輯的“符號主義”
機器學習研究划分為
* 從樣例中學習
* 在問題求解和規划中學習
* 通過觀察和發現學習
* 從指令中學習
20世紀80年代以來,被研究最廣的為從樣例中學習,涵蓋了監督學習與無監督學習等。
20世紀90年代中期,統計學習,代表技術是支持向量機,與枋方法
21世紀初, 連接主義卷土重來,以深度學習為名的熱潮,即有很多層的網絡。
2. Hello World Deep Learning
觀察如下一組數據
| x = | -1 | 0 | 1 | 2 | 3 | 4 |
| y = | -3 | -1 | 1 | 3 | 5 | 7 |
發現規律: y = 2x - 1
如果使用傳統方案編程, 很容易得出想要的結果y的值。
cal(int x) { return 2 * x -1; }
現在使用深度學習模型來計算出 y = 2x - 1 這個算法,即通過機器去觀察這組數據,
得出這個算法。
cal (int x) { 深度學習模型 return y; }
為了能讓該模型正常工作,在使用深度學習模型之前 , 必須要使用樣本數據來訓練該模型。
2.1 環境搭建
mkdir src python3 -m venv venv pip install tensorflow pip install numpy pip install matplotlib
2.2 代碼coading
第一步,導入需要的包
import tensorflow as tf import numpy as np import matplotlib.pyplot as plt
第二步,設置訓練模型數據
# set up training data x = np.array([-1, 0, 1, 2, 3, 4], dtype=int) y = np.array([-3, -1, 1, 3, 5, 7], dtype=int) for i,c in enumerate(x): print("x = {} , y = {}".format(c, y[i])
運行結果:
x = -1 , y = -3
x = 0 , y = -1
x = 1 , y = 1
x = 2 , y = 3
x = 3 , y = 5
x = 4 , y = 7
第三步, 創建層
# step 1 build the layer first_layer = tf.keras.layers.Dense(units=1, input_shape=[1])
# step 2 assemble layers into model model = tf.keras.Sequential([first_layer])
神經網絡的核心組件是層, 所以創建模型中第一步就是構建層,層是一種數據過濾器。
每層過后就是更有用的信息。
不同的張量格式與不同的數據處理類型需要用到不同的層。
例如
簡單的向量數據保存在形狀為(samples, features)的 2D 張量中, 通常用密集連接層來處理
序列數據保存在形狀為(samples, timesteps, features)的 3D 張量中, 通常用循環層(LSTM, recurrent Layer)來處理。
圖像數據保存在4D張量中,通常用二維卷積層(Keras 的 Conv2D)來處理。
第四步: 編譯模型
# complie the model model.compile(loss='mean_squared_error', optimizer=tf.keras.optimizers.Adam(1))
編譯模型需要三個參數:
* 損失函數(loss function): 網絡如何衡量在訓練數據上的性能,具有多個輸出的神經網絡可能具有多個損失函數。
定義損失函數有一些指導原則:
對於二分類問題,使用二元交叉熵損失函數
對於多分類問題,可以用分類交叉熵損失函數
對於回歸問題,可以用均方誤差損失函數
對於序列學習問題,可以用聯結主義 時序分類(CTC,connectionist temporal classification)損失函數,等等。
* 優化器(optimizer): 基於訓練數據和損失函數來更新網絡的機器
* 在訓練和測試過程中需要監控的指標(metric)
模型是由層構成的網絡,深度學習模型是層構成的有向無環圖。
常見的網絡拓撲結構如下:
* 雙分支(two-branch) 網絡
* 多頭(multihead)網絡
* Inception 模塊
第四步:訓練模型
# train the model print("start training the model") history = model.fit(x, y, epochs=500, verbose=False) print("Finished training the model")
第五步:查看模型統計數據
# show training statistics plt.xlabel('Epoch Number') plt.ylabel("Loss Magnitude") plt.plot(history.history['loss'])
plt.show()
運行結果
圖2-1 運行結果 |
解釋一下過擬合(overfit)的概念:
機器學習模型在新數據上的性能往往比在訓練數據上要差。
第六步:使用測試數據測試結果
# use the model predict values print(model.predict([100]))
運行結果
[[199.]]
第七步:查看模型權重信息
# show layer weights print("These are the layer variables: {}".format(first_layer.get_weights()))
運行結果
These are the layer variables: [array([[2.]], dtype=float32), array([-1.], dtype=float32)]
典型的Keras工作流程:
(1) 定義訓練數據: 輸入張量和目標張量, 有兩種方法(Sequential , API function)
(2) 定義層組成的網絡(或模型), 將輸入映射到目標
(3) 配置學習過程: 選擇損失函數、優化器和需要監控的指標。
(4) 調用模型的fit方法在訓練數據上進行迭代。
3. 深度學習工作原理
機器學習是將輸入映射到目標,這一過程是通過觀察許多輸入與目標示例完成的。比如 x 與 y 值。
神經網絡中每層對輸入數據所做的具體操作保存在該層的權重中,其本質是一串數字,由其來進行參數化。
所以權重也被稱為該層的參數。在這種情況下, 學習的意思就是找出該層的權重值,使得網絡能夠將每個示例
輸入與其目標正確地一一對應。 流程如圖3-1所示
圖3-1 深度學習網絡由權重來參數化 |
問題來了, 一個深度神經網絡可能有數千萬個參數,找到正確的取值是一項艱巨的任務。
神經網絡中損失函數的定義
衡量預測值y' 與 預期值 之間的距離, 算出損失值。
圖3-2 損失函數用來衡量網絡輸出的質量 |
例如如下一個線性回歸的問題
|
圖3-3 數據圖表, 蟋蟀叫的聲音次數與溫度之間的關系 |
使用一根直線可以近似的描述這個每分鍾叫聲與溫度之間的關系
|
事實上,雖然該直線並未精確無誤地經過每個點,但針對我們擁有的數據,清楚地顯示了鳴叫聲與溫度之間的關系。
只需運用一點代數知識,就可以將這種關系寫下來,如下所示:
y = mx + b
其中:
y 指的是溫度(以攝氏度表示),即我們試圖預測的值。
m 指的是直線的斜率。
x 指的是每分鍾的鳴叫聲次數,即輸入特征的值。
b 指的是 y 軸截距。
使用機器學習的方程式
y' = b + w1x1
其中:
y′ 指的是預測值(理想輸出值)。 b 指的是偏差(y 軸截距)。在一些機器學習文檔中,它稱為 w0。 w1 指的是特征 1 的權重。權重與上文中用 m 表示的“斜率”的概念相同。 x1 指的是特征(已知輸入項)。
要根據新的每分鍾的鳴叫聲值 x1 判斷(預測)溫度 y′,只需將 x1 值代入此模型即可。
下標 w1x1 是一個抽象概念, 可以用多個特征來表示更加復雜的模型。
例如有三個特征的模型可以采用以下方程來表示
y' = b + w1x1 + w2x2 + w3x3
損失值是一個數值,表示對於單個樣本而言模型預測的准確程度。如果預測模型完全正確, 則損失值為0,
否則值越大,表示偏差越大。
訓練模型的目標是從所有樣本中找到一組平均損失“較小”的權重和偏差。
損失函數
(1) 平方損失 (L2損失)
定義如下:
(真實值 - 預測到的值)2 = (y - y')2
(2) 均方誤差損失(MSE)
![]() |
其中:
(x,y) 指的是樣本,其中
x 指的是模型進行預測時使用的特征集(例如,溫度、年齡和交配成功率)。
y 指的是樣本的標簽(例如,每分鍾的鳴叫次數)。
prediction(x) 指的是權重和偏差與特征集 x 結合的函數。
D 指的是包含多個有標簽樣本(即 (x,y))的數據集。
N 指的是 D 中的樣本數量。
比較兩張圖哪個均方誤差較高 |
左側的圖
線上的 6 個樣本產生的總損失為 0。不在線上的 4 個樣本離線並不遠,因此即使對偏移求平方值,產生的值仍然很小:

右側的圖
線上的 8 個樣本產生的總損失為 0。不過,盡管只有兩個點在線外,但這兩個點的離線距離依然是左圖中離群點的 2 倍。
平方損失進一步加大差異,因此兩個點的偏移量產生的損失是一個點的 4 倍。

優化器的定義
深度學習利用這個操作值,使用優化器函數來進行對權重值進行微調。
優化器中使用了反向傳播算法,是深度學習的核心算法, 一種利用梯度下降優化來訓練一系列參數化運算鏈的方法。
圖3-3 將損失值作為反饋信號來調節權重值 |
通過迭代方法降低損失, 不斷的更新, 最終會得出一個越來越接近y的預期值。
對於回歸問題產生的損失值是一個碗形,所以肯定可以找到一個損失最小的值。
|
但是通過該方法需要大量的計算資源,另一種方法叫做梯度下降法
梯度下降法來降低損失, 可以減少計算的次數
|
可以看到, 降低損失是由學習速率與執行的步驟決定的。
|
梯度下降法的第一個階段是為 w1 選擇一個起始值(起點)。起點並不重要;因此很多算法就直接將 w1 設為 0 或隨機選擇一個值。
然后,梯度下降法算法會計算損失曲線在起點處的梯度。簡而言之,梯度是偏導數的矢量;
它可以了解哪個方向距離目標“更近”或“更遠”。請注意,損失相對於單個權重的梯度就等於導數。
學習速率降低可能會導致學習時間過長。
|
隨機梯度下降法(SGD)
|
包含隨機抽樣樣本的大型數據集可能包含冗余數據。實際上,批量大小越大,出現冗余的可能性就越高。
一些冗余可能有助於消除雜亂的梯度,但超大批量所具備的預測價值往往並不比大型批量高。
如果我們可以通過更少的計算量得出正確的平均梯度,會怎么樣?通過從我們的數據集中隨機選擇樣本,我們可以通過小得多的數據集估算(盡管過程非常雜亂)出較大的平均值。
隨機梯度下降法(SGD) 將這種想法運用到極致,它每次迭代只使用一個樣本(批量大小為 1)。如果進行足夠的迭代,SGD 也可以發揮作用,但過程會非常雜亂。“隨機”這一術語表示構成各個批量的一個樣本都是隨機選擇的。
小批量隨機梯度下降法(小批量 SGD)是介於全批量迭代與 SGD 之間的折衷方案。小批量通常包含 10-1000 個隨機選擇的樣本。小批量 SGD 可以減少 SGD 中的雜亂樣本數量,但仍然比全批量更高效。
4. Keras, TensorFlow, Theano, CNTK
圖4-1 深度學習軟件棧與硬件棧 |
TensorFlow API 層次
|



