iT邦幫忙

2024 iThome 鐵人賽

DAY 30
0
Python

從概念到應用:Python實戰開發學習之旅系列 第 30

[Day29] Python專案 - 人工智能的開端與Python的共舞(2) 深度學習(excel學神經網路、預測妹子的喜好)

  • 分享至 

  • xImage
  •  

目標

https://ithelp.ithome.com.tw/upload/images/20241014/201210525abjKYsCdN.png

今天是我們的名面上最後一天,我們要探討的是深度學習
**深度學習(Deep Learning)**無疑是其中一個最重要的領域。
從自動駕駛汽車、語音識別、推薦系統到圖像分類,深度學習正在塑造未來的數位世界。
它模仿人類大腦神經網路的結構和運作方式,使電腦能夠從大量數據中學習、推理並做出決策。
學習深度學習不僅是一扇通向未來技術的門,也是探索人工智能潛力的第一步。

這個領域不僅充滿了創新,更能解決許多現實生活中的複雜問題,讓我們的生活更智能、便捷。
/images/emoticon/emoticon08.gif

今天的目標是:

  1. 為什麼要學深度學習?
  2. 深度學習的核心知識
  3. 用Excel來模擬Model Training
  4. 實戰來做神經網路輸出

1. 為什麼要學深度學習

神經網路的誕生是多種因素共同推動的結果,既有理論上的需求,也有技術和應用層面的發展。以下是促成神經網路誕生和發展的關鍵原因:

1.1 線性不可分問題(非常重要)

  • 背景:早期的感知機(Perceptron)是線性分類器,無法解決非線性問題,如XOR問題。這些問題暴露了線性模型的局限性。
  • 影響:為了克服這些局限,提出了多層神經網路,其中的隱藏層能夠捕捉到非線性的關係,從而解決線性不可分問題。

這邊Roni想要特別補充為什麼線性不可分特別重要
馬文·明斯基(Marvin Minsky)和西摩·帕帕特(Seymour Papert)這兩位大老當初提出詳細分析了感知機的能力和局限性。他們指出了單層感知機無法解決線性不可分問題,特別是像XOR問題這樣的非線性問題。由於單層感知機的這些局限性,他們對神經網路的潛力持懷疑態度。

首先先幫大家介紹什麼是線性可分跟線性不可分
https://ithelp.ithome.com.tw/upload/images/20241014/20121052rIZzpvyiww.png

類別 定義 示例 總結
線性可分 一組數據可以用一條直線或超平面完全分開。 存在一條直線能夠將所有 A 類點與所有 B 類點分開。 可以用直線或超平面完全區分不同類別的數據。
線性不可分 一組數據無法用一條直線或超平面完全分開。 XOR 問題:無法用一條直線分開 (0,0)、(1,1) 與 (0,1)、(1,0)。 無法用直線或超平面完全區分不同類別的數據,通常需要更複雜的模型來處理。

線性跟非線性的應用

類別 實際應用 說明
線性可分 信用卡欺詐檢測 使用交易特徵來判斷交易是否為欺詐行為,適合線性模型。
情感分析 判斷文本的情感傾向,某些情感特徵可能是線性可分的。
醫療診斷 使用年齡、血壓等特徵來區分健康與生病的患者,適合線性模型。
線性不可分 圖像識別 像素值特徵通常是線性不可分的,需要使用 CNN 等複雜模型。
語音識別 語音信號特徵通常是非線性的,需使用 RNN 或 LSTM 模型。
自然語言處理 文本分類或翻譯任務中,語言的複雜性使得數據通常是線性不可分的。

1.2 生物學啟發

  • 背景:神經網路的基本概念源自於對人類大腦神經元結構和運作的模仿。科學家希望通過模仿神經元之間的互動來創造智能系統。
  • 影響:這種對大腦結構的模仿是神經網路誕生的基礎,促使了神經元模型(如McCulloch-Pitts神經元)的出現,這些模型為神經網路的發展奠定了理論基礎。

https://ithelp.ithome.com.tw/upload/images/20241014/20121052tFImnKhirN.png

來源:https://zh.wikipedia.org/zh-tw/%E7%A5%9E%E7%B6%93%E5%85%83

人們透過神經突觸來想像神經網路的誕生。

1.3 反向傳播算法的發現

  • 背景:多層神經網路雖然能夠解決更複雜的問題,但如何有效訓練這些網路是個難題。1986年,**反向傳播算法(Backpropagation)**的引入,解決了神經網路訓練中的梯度計算問題。
  • 影響:反向傳播算法使得多層神經網路的訓練變得切實可行,大大推動了神經網路的應用和發展。

微積分上的鏈鎖率(Chain rule)可以從神經網路的末端開始計算誤差與各權重的關係,藉此減少運算量。

1.4 計算能力的提升

  • 背景:訓練深層的神經網路需要大量的計算資源。在20世紀後期,隨著硬體技術的發展,尤其是**GPU(圖形處理單元)**的進步,大規模的並行計算能力得到了顯著提升。
  • 影響:GPU的出現使得神經網路,特別是深度學習網路的訓練速度大大提高,推動了深度神經網路在圖像識別、語音識別等領域的應用。

尤其是近期Nivida、Meta、Google各大運算的硬體興起這個就不用說明了吧XDD
硬體提升把算法提升起來了!!/images/emoticon/emoticon08.gif

1.5 大數據的崛起

  • 背景:神經網路需要大量數據進行訓練,而隨著互聯網、社交媒體、傳感器技術的發展,數據量呈爆炸性增長。
  • 影響大數據的出現為訓練更深、更複雜的神經網路提供了足夠的樣本量,神經網路模型能夠從數據中學習更多有價值的特徵,從而在各個應用領域表現出色。

1.6 理論研究的推動

  • 背景:除了實踐中的發展,學術界對於神經網路理論的深入研究也促成了其發展。例如,Hinton 等人提出的 限制玻爾茲曼機(Restricted Boltzmann Machines, RBM)深度置信網路(Deep Belief Networks, DBN) 幫助解決了網路訓練中的瓶頸。
  • 影響:這些理論研究提供了訓練深層神經網路的新方法,促成了深度學習的興起。

1.7 成功應用的激勵

  • 背景:隨著神經網路技術的不斷成熟,許多實際應用中的突破推動了其進一步發展。從早期的手寫字體識別(如MNIST數據集的應用)到後來的語音識別、推薦系統和自動駕駛技術,神經網路在這些領域的優異表現讓更多的企業和研究人員對其產生了濃厚的興趣。
  • 影響:成功的應用為神經網路技術帶來了更多資源和關注,促進了技術和理論的雙重進步。

1.8 深度學習框架的推出

  • 背景:隨著神經網路和深度學習技術的流行,許多開源工具和框架(如TensorFlow、PyTorch、Keras等)相繼出現,降低了研究者和開發者使用神經網路的門檻。
  • 影響:這些框架使得神經網路的開發和部署變得更加簡單和高效,進一步推動了其普及和應用。

這些框架也跟python脫離不了關係
這也是為啥我們會來學python XDD

2. 深度學習的核心知識

1. 神經網路的基本結構

  • 感知機(Perceptron):最基本的神經網路單元,模仿生物神經元,通過加權輸入、偏置和激活函數來輸出結果。
  • 多層感知機(MLP, Multilayer Perceptron):包含輸入層、隱藏層和輸出層,能處理非線性問題。
  • 前向傳播(Forward Propagation):輸入數據通過神經網路層逐層傳遞,得到預測值。
  • 反向傳播(Backpropagation):通過計算誤差的梯度來更新網路權重,是神經網路訓練的核心。

https://ithelp.ithome.com.tw/upload/images/20241014/20121052tBvNewpLKv.png

來源: https://zh.wikipedia.org/zh-tw/%E6%84%9F%E7%9F%A5%E5%99%A8

2. 激活函數(Activation Functions)

激活函數(Activation Function)在神經網路中扮演著至關重要的角色,主要用於引入非線性,這樣神經網路就能學習並處理複雜的數據特徵。如果**沒有激活函數,神經網路僅僅是簡單的線性回歸模型,無法處理非線性問題
**

簡單來說就是在數值輸出前,會先經過這個函數模型運算把值分類

激活函數類型 輸出範圍 優點 缺點 適用場景
Sigmoid 0 ~ 1 - 將輸出壓縮到概率範圍 - 適合二元分類 - 梯度消失問題 - 訓練慢 二元分類任務
Tanh -1 ~ 1 - 較好的對稱性 - 與Sigmoid相比表現更好 - 梯度消失問題 需要對稱數據的場景
ReLU 0 ~ ∞ - 訓練速度快 - 減少梯度消失 - 可能遇到神經元死亡問題 深層神經網路的隱藏層
Leaky ReLU -∞ ~ ∞ - 解決ReLU神經元死亡問題 - 仍有不穩定梯度問題 深層網路,避免ReLU神經元死亡
Softmax 0 ~ 1 (概率分佈) - 將輸出轉換為概率分佈 - 適合多分類 - 計算量較大 多分類問題的輸出層

**以ReLU vs Sigmoid **
https://ithelp.ithome.com.tw/upload/images/20241014/20121052tlDECHqrq8.png

ReLU vs Sigmoid 優勢對比

激活函數 優勢 適用場景
ReLU - 計算簡單,訓練速度快 深層神經網路的隱藏層
- 減少梯度消失問題,梯度不會趨於零 深度學習,特別是卷積神經網路
- 允許神經網路在非線性變換上有更大的靈活性 大型模型訓練
Sigmoid - 輸出平滑且連續,適合用於概率估計 二元分類問題
- 將輸出壓縮到 0~1 之間,能夠解釋為概率 較淺層的網路模型
- 較為穩定,不會產生劇烈的輸出波動 小型或簡單模型的輸出層
- 適合需要平滑輸出的場合,如一些連續數據模型

簡單說就是從圖形可以看到如果值直接從0跳到1比較不平滑,有點突兀
但是如果是sigmoid我們可以散步在平滑的0到1數值

3. 損失函數(Loss Functions)

  • 均方誤差(MSE, Mean Squared Error):回歸問題中使用,衡量預測值和實際值的平方誤差。
  • 交叉熵(Cross-Entropy):分類問題中使用,測量預測概率分佈與實際分佈的差異。

4. 梯度下降(Gradient Descent)與優化算法

  • 梯度下降算法:計算損失函數的梯度來更新權重,目的是最小化損失。
  • 優化算法
    • SGD(Stochastic Gradient Descent):每次使用一部分數據來計算梯度,減少計算量。
    • Momentum:在梯度更新中引入動量,幫助避免局部最優解。
    • Adam(Adaptive Moment Estimation):動態調整學習率,加速收斂。

5. 正則化技術

  • L2正則化(L2 Regularization):通過懲罰權重的大小來防止過擬合。
  • Dropout:隨機停止部分神經元的激活,防止過度依賴某些神經元,提升泛化能力。

6. 卷積神經網路(CNN, Convolutional Neural Network)

  • 卷積層:提取局部特徵,常用於圖像處理。
  • 池化層:下採樣,減少參數數量,保留重要信息。
  • 應用場景:圖像分類、物體檢測、圖像分割等。

7. 循環神經網路(RNN, Recurrent Neural Network)與LSTM

  • RNN:處理序列數據,記住先前輸入的信息,常用於時間序列、語音和文字。
  • LSTM(Long Short-Term Memory):解決RNN的長期依賴問題,適用於自然語言處理和語音識別。

8. 自注意力機制與Transformer架構

  • 自注意力機制:根據序列中的所有元素計算每個元素的重要性,解決長期依賴問題。
  • Transformer架構:基於自注意力機制,在自然語言處理和機器翻譯中表現優異,摒棄了RNN結構,能處理更長的序列。

9. 深度學習框架

  • TensorFlow:由Google推出,適用於從研究到生產的各種應用。
  • PyTorch:由Facebook推出,易用性高,特別適合學術研究。
  • Keras:基於TensorFlow的高層API,簡化了神經網路的構建和訓練。

10. 大數據與GPU加速

  • 大數據:深度學習模型需要大量數據進行訓練,大數據為其發展奠定了基礎。
  • GPU加速:通過並行計算提升訓練速度,使得訓練深層神經網路變得可行。

3. 用Excel來模擬Model Training

這個章節很簡單,想要讓大家從excel公式中模擬model training的分解動作

3.1 資料來源

學生 英文 數學 自然 投資報酬率
A 0.85 0.5 0.45 0.5
B 0.65 0.4 0.35 0.39
C 0.55 0.75 0.8 0.76
D 0.35 0.98 0.97 0.92
E 0.5 0.9 0.88 0.89

3.2 需求跟情境

https://ithelp.ithome.com.tw/upload/images/20241014/20121052uOIu3xh8eg.png

今天我們得到一個學生成績的總表
報酬率是某家科技公司的職場滿意度的結果

也就是我們要算出這幾名學生各科分數造成的投資報酬率提升函數

這邊我要先破耿,因為我的目標就是讓自然跟數學好的學生會得到好的報酬率

先破梗的原因是讓大家有這個底子,實際上去做操作會比較有fu喔~
/images/emoticon/emoticon39.gif

A * w1 + B * w2 + C * w2 + B = Y 

3.3 公式解釋

公式:

https://ithelp.ithome.com.tw/upload/images/20241014/20121052z1RchE4dS3.png

符號解釋:

  1. A、B、C:這些符號代表輸入變數,也就是不同的特徵或輸入值。在這個情境下,假設它們可能代表學生的科目分數(如英文、數學、自然等)。

    • A 可能代表學生的 英文分數
    • B 可能代表學生的 數學分數
    • C 可能代表學生的 自然分數
  2. w1、w2、w3:這些符號代表 權重(weights)。在機器學習和神經網路中,權重決定了每個輸入變數對最終輸出的影響。不同的輸入會有不同的權重,權重越大,該輸入對結果的影響就越大。

    • w1 是與 A(英文分數) 對應的權重。
    • w2 是與 B(數學分數) 對應的權重。
    • w3 是與 C(自然分數) 對應的權重。
  3. B(第二次出現的B):這裡的 B 並不是變數,而是代表 偏置項(Bias)。偏置項是一個附加的常數,它有助於調整模型的輸出,使其更靈活。偏置不受輸入影響,是一個固定值。

  4. Y:這是 預測值(Output/Prediction),代表根據輸入變數和權重計算出的最終結果。在你的情境中,它可能是學生的 投資報酬率(或其他輸出目標)。

公式解讀:

這個公式表示將每個科目分數(A, B, C)乘以相應的權重(w1, w2, w3),加上偏置項B,來預測某個最終結果(Y)。這類公式通常用於線性回歸或神經網路的單層結構中,來表示輸入和輸出之間的線性關係。

3.3設計Model跟公式流程

https://ithelp.ithome.com.tw/upload/images/20241014/20121052GnHFSU6b2s.png

3.4 實作

Step 1. 計算預測值

將每個科目的分數(如英文、數學、自然)乘上對應的權重 w1、w2、w3,再加上偏置 b,這會產生該學生的預測值 Y_hat(預測的投資報酬率)。

https://ithelp.ithome.com.tw/upload/images/20241014/20121052XbAfLaxTwC.png

https://ithelp.ithome.com.tw/upload/images/20241014/20121052psLyuUDzX5.png

以此類推我們可以把5比學生的結果都列出來拉出所有的predicted

Step 2. 計算誤差(Error)

使用實際的投資報酬率 Y,將其減去預測值 Y_hat,以獲得該學生的誤差 Error。
https://ithelp.ithome.com.tw/upload/images/20241014/20121052PS99bSAvIK.png

此誤差代表模型的預測實際之間的差距

https://ithelp.ithome.com.tw/upload/images/20241014/20121052DJ62uDoMwl.png

Step 3. 誤差平方(Squared Error)

為了讓誤差值總是為加速訓練,我們會將 Error 值平方,得到誤差的平方值。
https://ithelp.ithome.com.tw/upload/images/20241014/20121052AZiLpcUKyG.png

這樣的轉換確保負誤差正誤差同樣被重視,並且強調大的誤差。

https://ithelp.ithome.com.tw/upload/images/20241014/20121052RxDEZombGq.png

大家可以看到我上方是把error做相乘也就是平方的動作

Step4. 平均誤差平方(Mean Squared Error, MSE)

將所有學生的誤差平方值相加,再除以數據筆數,得到平均誤差平方(MSE),這是我們用來衡量整體模型預測準確性的重要指標。

https://ithelp.ithome.com.tw/upload/images/20241014/20121052pKmILFo8RE.png

在excel中我們可以用average(第一筆:第五筆)的方式框起來計算
https://ithelp.ithome.com.tw/upload/images/20241014/20121052ZwvlaCblA6.png


暫停思考一下
到這個地步我們就把基礎的模型建出來了
我們可以手動去調整權重bias來看error有沒有縮小來判斷是否調到最佳參數

但這種方法沒有達到學習跟training的目的
所以我們必須要有可以自動調整權重跟偏差值的公式

也就是說我們要把每個權重的因子做計算來算出w1,w2,w3的變化量
透過原本權重+上變化量就是我們模型的權重調整值 => 這個步驟也稱之為training

Step 5.計算權重變化(Weight Change)

https://ithelp.ithome.com.tw/upload/images/20241014/201210525ESGYxYJXL.png
我們會根據每科的誤差乘上每科的分數來調整權重。

https://ithelp.ithome.com.tw/upload/images/20241014/20121052SHgMXaL2EM.png
這些變化量會反映每個科目對模型預測誤差的貢獻

w1 change來舉例就是英文的權重變化

英文的權重變化 =  ( 英文權重 - 英文預測值) *  英文分數

其他的科目也以此類推


Step 6. 計算偏置變化(Bias Change)

偏置變化量通過直接使用預測誤差來計算。這代表整個模型的偏差。

https://ithelp.ithome.com.tw/upload/images/20241014/201210526XC5MoYHDL.png

偏差比較簡單就是預測值減掉報酬率

Step 7. 平均權重變化與偏置變化

將每個學生的權重變化和偏置變化求平均,得到每次更新時的變化量。
https://ithelp.ithome.com.tw/upload/images/20241014/20121052hhrbbz4XpS.png

https://ithelp.ithome.com.tw/upload/images/20241014/20121052VCxhKpbTGY.png

Step 8. 更新權重與偏置

透過把原本的權重和偏置加上平均變化值來更新權重和偏置,進行第一次訓練更新。

https://ithelp.ithome.com.tw/upload/images/20241014/20121052s9YVYl0l3P.png

https://ithelp.ithome.com.tw/upload/images/20241014/20121052Lm7FVYaDOw.png

透過公式我們操作excel的步驟
就是

  • 先把上面的W1權重框框複製下來
  • 再來把原本W1+W_change= new W1

其他的W也以此類推

Step 9.不斷重複訓練

這些步驟,逐步更新權重和偏置,從而讓模型更加準確。每次訓練後,會進行多次訓練(多層訓練),使模型最終能夠更好地進行預測。

我們只要重複貼上excel的格子就可以進行training動作了

第0回
https://ithelp.ithome.com.tw/upload/images/20241014/201210529LiP6SWrMw.png

MSE = 0.012672752

第5回
https://ithelp.ithome.com.tw/upload/images/20241014/20121052hT0yq55yxL.png

MSE = 0.00295149169258037

這樣我們就學到最簡單的神經網路模型跟model training的功能了 有沒有很酷呢!!?

計算重點是

1. MSE 越小就代表方向是對的
2. training的格子要對齊,否則excel可能會抓錯格子導致公式失敗

https://ithelp.ithome.com.tw/upload/images/20241014/20121052NjLpiVYxGE.png

使用 Excel 訓練好的模型後,當有新的資料時,可以按照以下步驟進行簡單預測:

  • 輸入新數據:把新數據(例如三科成績 A、B、C)輸入 Excel。
    應用公式:將新數據代入模型公式:
    得到預測結果:計算出預測值(Predicted)這就是根據新數據進行預測的結果。

比如說我要預測這筆
https://ithelp.ithome.com.tw/upload/images/20241014/20121052y7d4ZPYb3d.png

可以得到結果如下
https://ithelp.ithome.com.tw/upload/images/20241014/20121052DJGW88qVlb.png

可以把其他部必要得格子刪掉比較好觀察喔

4. 為什麼要學深度學習

實戰來做神經網路輸出

4.1需求

要建立一個簡單的神經網路範例來預測「女神是否喜歡你」,您可以使用 Python 和一些流行的機器學習庫,如 TensorFlow 或 PyTorch。以下是如何設計這個神經網路的步驟,包括數據準備、模型構建和訓練。

  1. 數據準備
    首先,您需要準備數據集,包含以下特徵和標籤:
    特徵:
    第一層(輸入層):身高、年齡、收入
    第二層(隱藏層):體貼、居住地遠近
    標籤:
    女神是否喜歡(0 或 1)

https://ithelp.ithome.com.tw/upload/images/20241014/20121052TTFMn99EuV.png

import pandas as pd
import numpy as np
import tensorflow as tf
from sklearn.model_selection import train_test_split

# 隨機生成模擬數據
np.random.seed(42)

data = {
    'height': np.random.randint(150, 200, size=100),  # 身高
    'age': np.random.randint(18, 40, size=100),      # 年齡
    'income': np.random.randint(30000, 100000, size=100),  # 收入
    'considerate': np.random.randint(0, 2, size=100),  # 體貼 (0: 不體貼, 1: 體貼)
    'distance': np.random.randint(0, 2, size=100),      # 居住地遠近 (0: 遠, 1: 近)
    'liked': np.random.randint(0, 2, size=100)           # 女神是否喜歡 (0: 不喜歡, 1: 喜歡)
}

# 創建 DataFrame
df = pd.DataFrame(data)

# 分割特徵和標籤
X = df[['height', 'age', 'income', 'considerate', 'distance']]
y = df['liked']

# 分割訓練集和測試集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 建立模型
model = tf.keras.Sequential([
    tf.keras.layers.Dense(5, activation='relu', input_shape=(X_train.shape[1],)),  # 隱藏層
    tf.keras.layers.Dense(1, activation='sigmoid')                                   # 輸出層
])

# 編譯模型
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])

# 訓練模型
model.fit(X_train, y_train, epochs=50, batch_size=10)

# 評估模型
loss, accuracy = model.evaluate(X_test, y_test)
print(f'Accuracy: {accuracy * 100:.2f}%')

# 預測新數據(例如:身高180,年齡25,收入50000,體貼1,距離1)
new_data = np.array([[180, 25, 50000, 1, 1]])
prediction = model.predict(new_data)
print(f'Predicted probability of being liked: {prediction[0][0]:.2f}')

由於套件硬體問題
我建議可以透過google colab來玩層這次實戰喔~!!/images/emoticon/emoticon01.gif

結果分析

https://ithelp.ithome.com.tw/upload/images/20241014/20121052DOlStoUC11.png

colab可以讓我們看到許多training的過程
還有一步一步呈現
是非常好用的工具喔~!!!

總結

學習心得總結

  1. 為什麼要學深度學習?

    • 深度學習在多個產業中展現出強大的應用能力,如圖像識別、自動駕駛、語音助理等。
    • 能夠處理傳統機器學習無法解決的複雜問題,特別是高維度的非線性問題。
    • 學習深度學習能提升處理數據的能力,並開拓在 AI 領域的廣泛應用機會。
  2. 深度學習的核心知識

    • 了解神經網路的架構,包括層、神經元、激活函數等基本概念。
    • 掌握訓練過程中的重要步驟,如前向傳播、誤差計算、反向傳播和更新權重。
    • 熟悉各種常用的激活函數和優化算法,以提高模型的表現。
  3. 用 Excel 來模擬 Model Training

    • 使用 Excel 可以簡單模擬神經網路的訓練過程,幫助理解數學公式和權重更新的原理。
    • 透過具體的數據實驗,能直觀了解模型訓練的每個步驟。
  4. 實戰來做神經網路輸出

    • 在實戰中運用所學的知識,通過模型的訓練與驗證,獲得可用的預測結果。
    • 實踐中遇到的挑戰能增強問題解決能力,並深化對深度學習的理解。

我們完成了本次Python的專案了 ~呼

如果還有時間就更新後面學習心得吧!!!/images/emoticon/emoticon01.gif


上一篇
[Day28] Python專案 - 人工智能的開端與Python的共舞(1) 機器學習(預測股票、分類男女生)
下一篇
[Day 30] 第四週、Ron's Python Roadmaps 後記(心得、遺珠之憾)
系列文
從概念到應用:Python實戰開發學習之旅31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言