01. 什么是人工智能


 

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): 網絡如何衡量在訓練數據上的性能,具有多個輸出的神經網絡可能具有多個損失函數。

定義損失函數有一些指導原則:

對於二分類問題,使用二元交叉熵損失函數

對於多分類問題,可以用分類交叉熵損失函數

對於回歸問題,可以用均方誤差損失函數

對於序列學習問題,可以用聯結主義 時序分類(CTCconnectionist 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 層次

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM