張皓凱、陳睿倬Fed 25,2022
AI
tcirc
社課
臺中一中電研社
講義都會公告在社網上
社網:tcirc.tw
IG:tcirc_39th
online judge:judge.tcirc.tw
AI(artificial intelligence)指的是以「人工」方式撰寫程式,來達成模擬人類「智慧」的目的。
人工:由人設計、製作、創造
智慧:聽音辨讀、視覺辨識、推理決策、理解學習、移動、動作控制
自然語言生成、語音識別、虛擬助理、可能認識的人、youtube廣告、導航路徑…
1956年-達特矛斯學院的約翰·麥卡錫 (J. McCarthy) 發起了一場活動:夏季人工智慧研究計劃。誕生了人工智慧這個名詞,這場活動也被後人視為人工智慧革命的開端。
70年代-由於大家不再看好人工智慧,所以就進入了寒冬期,被稱為第一次人工智慧泡沫。
80年代-出現機器學習
1987年-因為機器學習仰賴大量的訓練資料和龐大的運算能力,迎來了第二次人工智慧泡沫。
2006年-類神經網路的支持者,傑佛瑞·辛頓 (Geoffrey Hinton)提出了新的類神經網路訓練方法,並以深度學習之名重新包裝,Hinton 也因此被譽為深度學習之父。
2017年-AlphaGo戰勝世界第一棋士柯潔
基於規則系統(rule-based system)
大量的if else,e.g.看到紅燈停,綠燈行
缺點:必須完全依賴人類定義各種條件所對應到的結果
圖源:makerpro
最主要差異在於特徵是否需要人工提取
接下來這一節所有的內容都屬於機器學習,若同時為深度學習的內容將在後面標記(DL)
機器學習分為四種:監督式學習、半監督式學習、無監督學習、強化式學習
監督:給予標記
第一類:(2, 3), (1, 5), (3, 2), (6, 3), (4, 4), (4, 7), (8, 7), (3, 9), (10, 2), (11, 13)
第二類:(14, 10), (13, 8), (14, 6), (11, 5), (13, 3), (11, 9), (15, 4)
第三類:(2, 14), (3, 12), (5, 13), (4, 15), (8, 15), (6, 12), (9, 13), (8, 11), (5, 10), (7, 9), (9, 9), (2, 4), (12, 12), (11, 11), (13, 14)
問:(7, 5)屬於?
(k-d Tree) 選擇k
算所有距離
排序
選擇前k個
投票
決定
k大-underfit
k剛好-好棒棒
k小-overfit
黑(0)––>白(255)
輸入層隱藏層
輸出層
計算loss
用優化器反向傳播修正
依epocs次數再來一次
每條線都有一個權重(weight)
每個隱藏層節點都有一個bias
每個隱藏層都有一個activation function
loss-用於評估模型好壞
優化器-決定weight、及bias的調整量
反向傳播-將須調整的量傳回上一節點
GAN是有一個Generator(生成器)與Discriminator(檢查者),可以想像成作假鈔的人與辨認假鈔的警察。訓練時,Generator 為不斷想辦法騙過 Discriminator,而Discriminator 會努力的去判別,雙方會同時不斷的進步成長。
google colab 是一個線上的python直譯器,使用方式和 jupyter notebook相同。google colab 優點在於有網路和google帳號便可使用,且有免費的GPU可以使用,降低硬體的規格需求。
使用python編寫的神經網路API,這學期會藉由tensorflow模組使用,由google維護。我們可以藉由keras裡已完成的機器學習演算法程式,輕鬆寫出一個深度神經網路
當我們要讓一個程式學習時,我們需要將大量的資料輸入,讓此人工智慧學習後能夠正常的運作,正確預測未來或分辨事物。
數據集越多越好,但我們也必須注意資料的完整性,篩選並適時汰除特殊資料,讓機器不會因這些特殊資料而產生變形。
通常我們會將資料分成三個部分: 訓練資料、驗證資料、測試資料
假如我們手中有一資料集,我們有許多方法來將它分成上述三種資料
資料標準化有助於我們修正一些稍微極端的資料。資料標準化能提升梯度的收斂,使模型變得穩定。學習後的模型準確率也會高很多。
數據標準化有許多種作法,這裡介紹兩種
當我們要建立一個深度學習模型時,會有一個輸入層,一個輸出層,和好幾個隱藏層,而我們會將這些層一個一個疊出來。
一開始我們會先建立一個空模型Sequential模型。這個模型從tf.keras.models匯入。Sequential是最基本的深度學習模型,適用許多於數據集。
from tensorflow.keras.models import Sequential model = keras.Sequential()
接著,我們要把隱藏層加上去。要加隱藏層上去,必須從tf.keras.layers匯入Dense。在設定一個隱藏層時,要設定隱藏層的參數: 節點(輸往下一層的資料量)、激活函數
from tensorflow.keras.layers import Dense model.add(Dense(節點數, activation = '激活函數'))
記得,當你在加入第一層時,要寫輸入的資料的形狀(維度、元素量)
model.add(Dense(20, input_shape = (data.shape ), activation = 'relu'))
最後,當我們要確認一個模型的結構,可以使用model.summary()
from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense model = keras.Sequential() model.add(Dense(20, input_shape = (4, ), activation = 'relu')) model.add(Dense(20, ), activation = 'relu') print(model.summary())
output
神經元的運作原理如下:首先,每個數值從上層神經元輸出時,會乘上上個神經元和目標(現在)神經元間的權重。接著,把上一層每個神經元輸出的值總和。再來,減去(或加)偏差值(bias),偏差值是描述一個神經元被激活的容易度。最後,將得出的數值丟進激活函數處理,模擬人類神經元被激發的狀態。
較常用的激活函數是Relu(預設)
但是模型中一開始的節點函數、參數都是隨機的,和答案有很大的差距。這裡就要提到深度學習的核心: 誤差反向傳播
誤差反向傳播的意思是,將輸出答案和資料的標籤(實際數值、正解)的誤差,從輸出層往前推算,調整權重、參數。就像我們寫數學在驗算時,會從後面一個一個看算式,尋找錯誤、可修改的地方。
推薦影片: 反向傳播原理(英文)
https://www.youtube.com/watch?v=Ilg3gGewQ5U
此時,決定誤差的計算方式和如何調整參數,分別由損失函數和優化函數求出。
那所以每個節點運作的原理到底怎麼運作呢?
首先,當數據(學習資料)從輸入端進入時,經過第一層的激活函數(等下會講)做非線性轉換。當第一筆資料要準備從輸入層到隱藏層時,資料的特徵量會乘上節點間的權重,再加總起來。加總後減去偏差值,帶入激活函數。
推薦影片:
https://www.youtube.com/watch?v=aircAruvnKk&list=PLZHQObOWTQDNU6R1_67000Dx_ZCJB-3pi&index=2
上面我們講到,深度學習會利用誤差來調整節點參數。而深度學習最終的目的就是將模型的損失函數降到越小越好。所以,對於模型要學什麼資料時用哪個損失函數很重要,因為它會影響模型的參數,或誤導模型,使模型看起來成功,實際使用卻誤差很大。
這裡我們會介紹一些損失函數:
均方誤差常使用於線性回歸,它的運算方式為將預測和實際的誤差平方去平均。之所以用平方的原因,是因為不同數據間的誤差可以抵銷,為了避免此狀況,所以用平方或加絕對值來處理
橫軸為輸出,縱軸為loss
其他loss func↓
https://keras.io/api/losses/
說完loss 損失函數,我們來說優化函數。如同上面所講的,深度學習的目的就在於把損失函數降到最小,透過反向傳播調整參數。
那重點是如何降低損失函數呢?
由於loss是一個函數算出來的(幹話),所以我們目的就是找它的最低點。
我們可以把尋找最低點的方法,想成尋找斜率為'0'的地方,且是往下尋找(斜率為負)。就像你想從山上下來,一定會根據你的所在地,一步一步往下,直到走到山谷。此方法稱梯度下降法
目前我們暫時無法解決這問題。但是就算我們只找到局部最佳解,對我們模型的實際準確率影響微乎其微。
以下是幾個常用的激活函數
設定損失函數和激活函數的方法:
model.compile(loss = 'loss func', optimizer = 'optimizer func', metrics = 模型準確率指標(None))
最後,我們要把學習資料丟進模型訓練時,使用fit程式來達成。但同時我們還要設定以下參數。
每次計算梯度所抓的樣本量(學習資料量),若數量太小,會導致模型在梯度下降效率低。若太大,則非常吃硬體資源
當一份完整的學習資料進入模型並輸出後,稱為1次epoch。但是模型只看一次是不夠的,必須透過好幾次的訓練來調整。
將數據打亂,由於蒐集資料時我們可能找到已排序好的資料。但是排序好的資料反而會影響模型學習的準確率(例如: 訓練分類模型)
是否顯示訓練過程
有多少個學習資料拿來當成驗證資料
顯示最終模型的準確度所採用的指標
程式碼
model.fit(學習資料, 學習標籤、正解, validation_split = '數值', epochs = num, batch_size = num(預設32), verbose = num(預設0), shuffle = bool(預設false)) model.evaluate(測試資料, 測試標籤)
預測數值,執行模型。
arr = model.predict(輸入資料)
匯出
tf.saved_model.save(model, "保存的目標資料夾名稱") # 記得要import tensorflow
匯入
model = tf.saved_model.load("保存的目標資料夾名稱")