---
# System prepended metadata

title: 生成式AI講義

---

# AI原理講義

## 1.AI前導
:::spoiler 為什麼要學AI?
(例.)因為透過AI可以節省很多簡單重複的工作，就像人類在工業革命發明蒸汽機讓我們節省大量人力一樣，AI的發明可以讓我們跳過很多工作時細節的步驟，專注於大方向的概念中
:::
### 名詞解釋
1. **Artificial Intelligence(人工智慧)**:
    就是我們所熟知的AI，依據AI能做到的事情還能再細分為兩種類型
    - 弱AI:只能專注解決特定領域的問題
    - 強AI:另一個人類，可以為我們做到所有人類能做的事情
2. **Machine Learning(機器學習)**:
    簡稱為ML，透過演算法、函數等方法讓機器找出規則
3. **Deep Learning(深度學習)**:
    簡稱為DL，一種機器學習的方法
    
我們可以將三者簡單歸類為以下這張圖，簡單來說，ML 是AI 的一個領域，DL 則又是 ML 中的一種方法
![image](https://hackmd.io/_uploads/BymOfRIgC.png)

### 模型訓練
:::spoiler AI的核心概念是什麼?
A:找出最貼合數據的函數(模型)，並依此來預測其他的資料
:::
1. **線性方程式**:
    假設今天在平面座標上有兩點(2,5)和(3,7)我們就可以通過解y=ax+b找到通過兩點的直線
    
    $$
    5 = {2a+b}
    $$
    
    $$
    7 = {3a+b}
    $$
    
    $$
    y={2x+1}
    $$

    當我們知道了線的方程式後，就能夠預測點會出現在哪裡，如x=1時
    
    $$
    y={2*1+1}=3
    $$
    
2. **模型的方程式**:
    接下來讓我們將上面提到的概念延伸
    ![image](https://hackmd.io/_uploads/HJhrhAIeC.png)

    :::spoiler 如何判斷是貓還是狗?
    (e.g)耳朵的形狀、眼睛的顏色、頭型等等...
    :::
    我們能夠輕易辨別兩個物種的不同是因為我們透過經驗學習出了狗與貓的特徵，並在下次遇到類似情況時根據學習到的特徵去辨別是貓還是狗
    
    - 訓練流程:
        接下來讓我們以訓練機器辨認狗為例
    ![image](https://hackmd.io/_uploads/rJ1M0A8eR.png)
    ```flow
    st=>start: 給一張狗的圖片
    e=>end: 訓練完成
    op=>operation: 根據反饋更改參數
    cond=>condition: 模型判斷是狗?

    st->op->cond
    cond(yes)->e
    cond(no)->op
    ```
    訓練完以後我們就能讓模型去判斷其他類似圖片是不是狗了
    ![image](https://hackmd.io/_uploads/H1qc1JDeC.png)
    
3. **實際應用**:
    我們也可以利用上述的方法來預測房價
    
| 坪數 | 房價 |
| ---- | ---- |
| 20   | 300  |
| 27   | 320  |
| 35   | 650  |
| 48   | 600  |
| 79   | 1200 |
|預測圖| ![image](https://hackmd.io/_uploads/rkTAWJDg0.png)|
   
   然而對於房屋來說除了坪數還有很多需要考慮的東西，如屋齡、地段、風水等
   我們把這些因素納入考慮，每個因素都有自己的權重(weight)，我們可以將價格寫成下列這種方程式
   
   $$
   y={w_{1}x_{1}+w_{2}x_{2}+w_{3}x_{3}+....}
   $$
   
   x1:坪數 x2:地段 x3:風水 -> 我們稱這些條件為特徵(feature)
   y:價格 -> 得出的結果稱為標籤(label)
:::spoiler 地段跟風水太過抽象，該怎麼加入模型裡呢?
A:透過一種叫做資料預處理的方式，我們就能夠對這些抽象的條件進行數據化
:::

4. **資料預處理**:

| 坪數 | 風水 | 房價 |
| ---- | ---- | ---- |
| 20   | 吉   | 300  |
| 27   | 兇   | 320  |
| 35   | 小吉 | 650  |
| 48   | 吉   | 600  |
| 79   | 小兇 | 1200 |
    將風水的條件加入後，對於機器來說，吉與兇的差別太過於抽象=>
    
| 坪數 | 風水 | 房價 |
| ---- | ---- | ---- |
| 20   | 2    | 300  |
| 27   | -2   | 320  |
| 35   | 1    | 650  |
| 48   | 3    | 600  |
| 79   | -1   | 1200 |
    若改成數字表示，不僅能更容易讓機器進行運算，也能大致看出資料的相對關係
    
| 地段 | 台北 | 台中 |台南|
| ---- | ---- | ---- |---|
| 台北   | 1   | 0  |0|
| 台南   | 0   | 0  |1|
| 台中   | 0   | 1  |0|
| 台北   | 1   | 0  |0|
| 台中   | 0   | 1  |0|
    我們能夠將地段分類為三個區段，台北、台中、台南
    
| 地段 | 台北 | 台中 |
| ---- | ---- | ---- |
| 台北   | 1   | 0  |
| 台南   | 0   | 0  |
| 台中   | 0   | 1  |
| 台北   | 1   | 0  |
| 台中   | 0   | 1  |
    還能夠進一步將台南刪減，讓0,0等於台南

以上就是簡單的資料預處理概念

## 2.學習方式
### 監督式學習
監督式學習的特色是每筆資料都有正確答案

1. **迴歸(regression)**:
    我們可以把迴歸看成是給機器解的填充題，要機器答出一個預測的精確答案，如同上面提到的一樣，我們希望能夠從給定的資料中找到一個符合資料的模型(函數)
    
    那要如何找到最符合資料的那條線呢?
    ![image](https://hackmd.io/_uploads/SyqMwh8WA.png)
    當今天有多個數據點(x₁, y₁), (x₂, y₂)...(xₙ, yₙ)，且想找出一條直線y=ax+b，讓直線和各個點的距離為最小，也就是函數值減數據值的絕對值(點到線的垂直距離)
    $$  
    {|y_{1}-(ax_{1}+b)|+|y_{2}-(ax_{2}+b)|+...|y_{n}-(ax_{n}+b)|}   
    $$
    雖然我們知道絕對值能夠表示點到線之間的距離，但對於電腦來說，絕對值的運算太過於繁瑣了，因此在實際計算上我們會取平方作為運算，能夠得到一樣的效果
    $$  
    {{(y_{1}-(ax_{1}+b))}^{2}+{(y_{2}-(ax_{2}+b))}^{2}+...{(y_{n}-(ax_{n}+b))}^{2}}   
    $$
    
    對於直線來說，我們可以推導出迴歸直線的公式
    
    $$  
    y-u_{y}=\frac{S_{xy}}{S_{xx}} (x-u_{x}) 
    $$
    其中
    $$
    u_{x}是x的平均值
    u_{y}是y的平均值
    $$
    因為最接近的直線必通過兩點平均值，把兩者平均值帶入會發現等式成立
    $$
    而S_{xx}與S_{xy}就是我們拿來計算最小差距的工具了
    $$
    具體來說式子會長這樣
    $$
    S_{xx}=(x_{1}-u_{x})^{2}+(x_{2}-u_{x})^{2}+...(x_{n}-u_{x})^{2}
    $$
    $$
    S_{xy}=(x_{1}-u_{x})(y_{1}-u_{y})+(x_{2}-u_{x})(y_{2}-u_{y})+...(x_{n}-u_{x})(y_{n}-u_{y})
    $$
    關於為什麼這條線是最相關，詳細的證明高中的二維數據分析會提到，這裡就不多贅述
    
2. **分類(classification)**:
    我們可以把分類想像成一道給機器解的選擇題，讓他判斷給的資料是屬於哪一類
    我們可以依據BMI將人分成過重和沒過重兩類，這時我們可以把資料預處理成下面圖表
    
| BMI  | 18  |   25  |  24   |  30   |  20   | 17  |
| ---- | --- | --- | --- | --- | --- | --- |
| 過重 | 0   |  1   |   1  |   1  |  0   | 0   |
    
    把資料畫成圖並取線性迴歸會長這樣
![image](https://hackmd.io/_uploads/S1W0qDvx0.png)
    對於資料好像不太具有代表性
:::spoiler 有什麼函數可以更貼近於我們的資料呢?
A:如sigmoid、relu、tanhx等激活函數就可以將我們的曲線「掰彎」
:::

3. **激活函數**:
    激活函數的作用在於，將前面產生的函數值映射到0和1之間(和我們上面處理過的資料一樣)，並進一步將模型複雜化，下面我們以sigmoid函數來示範運作情況
    
    $$
    y={w_{1}x_{1}+w_{2}x_{2}+w_{3}x_{3}+.....}
    $$
    
    經過轉換
    
    $$
    sigmoid={\frac{1}{1+e^{-y}}}={\frac{1}{1+e^{-{(w_{1}x_{1}+w_{2}x_{2}+w_{3}x_{3}+.....)}}}}
    $$

    接下來讓我們來看看有無激活函數對模型的區別
    ![image](https://hackmd.io/_uploads/SkAOk_vxA.png)
    加入了激活函數之後，整個函數圖形就像是被摺疊了一樣

4. **最近鄰居法(K-nearest neighbors)**:
    當我們要進行分類的時候，還有一個方法可以使用，就是最近鄰居法(簡稱KNN)
    - 原理:拿到一個新資料點時，找出K個離他最近的資料，投票決勝負
    
    ![image](https://hackmd.io/_uploads/HJ1olOPl0.png)
    以上圖做為舉例，當K=3時，我們會依據離綠點最近的三個點來判斷其屬性，在這裡最近的3個點為1藍2紅，所以我們判斷綠點應為紅色類別。
    然而，當K=5時，最近的5個點為3藍2紅，所以我們判斷綠點應為藍色類別。
    
    >由此例子可以發現，我們根據K的不同，我們會得出不同的答案，因此K值取多少是關鍵
    ```
       在什麼情況適合用較小K值?什麼情況適合用較大K值? 

    ```

### 非監督式學習
非監督式學習的特色是每筆資料都沒有正確答案(標籤)，相對的我們會對每筆資料做分群
1. **分群**:
    我們先假定給機器一堆未知屬性的圖片
    ![image](https://hackmd.io/_uploads/S1hsX_DxA.png)
    我們可以透過觀察圖片特徵來訓練機器將圖片分為兩堆
    ![image](https://hackmd.io/_uploads/rkjcEdwgA.png)
    然而，對於機器來說，他並不了解這兩堆分別代表什麼意思

2. **集群分析(K-Means Clustering)**:
    要將資料分群，我們可以使用集群分析的方法
    1. 先給定一堆未標籤的資料，並隨機取兩點為群心(分成n群就點n個點)，表示分為兩群
        ![image](https://hackmd.io/_uploads/rJS95uDlR.png)
        ![image](https://hackmd.io/_uploads/Hy255ODl0.png)
    2. 對所有資料找到距離最近的群心，如x1到藍色群心距離d1小於x1到紅色群心距離d2，因此將x1標記為藍色
        ![image](https://hackmd.io/_uploads/rJCyqdDeC.png)
    3. 若是判斷到兩點距離遠近，可以直接做兩群心的中垂線(分類線)來判斷屬於哪類
        ![image](https://hackmd.io/_uploads/B1vY5ODgA.png)
    4. 利用新的資料找出新的群心
        ![image](https://hackmd.io/_uploads/BJQZiuvlR.png)
    5. 找出新的分類線
        ![image](https://hackmd.io/_uploads/HyKfi_vgA.png)
    6. 重複2-5步驟直到群心變動不大
    
    對於超過兩群的情況，可以參考以下影片的模擬
    {%youtube 2lZZ_FzlIJY %}
    
### 半監督式學習
半監督式學習結合了以上提到的兩種方法，使用少量有標籤樣本和大量無標籤樣本作為訓練資料
1. **自訓練方法(Self-training)**:
    - 原始訓練資料:有標籤無標籤都有
        ![image](https://hackmd.io/_uploads/r1CHHI5g0.png)
    - 目標:讓模型把所有資料都標上標籤再去訓練新的模型
        ![image](https://hackmd.io/_uploads/r1_jrIqlR.png)
        然而，上圖的方法可能會導致一些較難分類的資料分類錯誤
    - 改進方法:訓練多個世代的模型，每次都標記有把握的資料
        ![image](https://hackmd.io/_uploads/SkCSIU5g0.png)
    - Self-traning的限制
        self-traning無法應用在迴歸上，因為對於機器來說，迴歸的資料無法讓模型進行更新，每一代的模型都會長一樣，因此無法達到self-traning的目的
        ![image](https://hackmd.io/_uploads/S1OWOOZbA.png)
        我們先根據原始資料對其他資料上標籤，然後得到新的資料
        ![image](https://hackmd.io/_uploads/rk1h_O-bA.png)
        然後根據新的資料訓練新的模型，我們會得到與之前迴歸模型結果相同的模型

2. **直推式學習(Transductive learning)**:
    - 原始訓練資料:
        原始資料分為有標籤和無標籤
        ![image](https://hackmd.io/_uploads/H1gNDI9eC.png)
    - 對資料分群:
        先將所有資料視為無標籤，然後利用前面提到的K-means做分群
        ![image](https://hackmd.io/_uploads/HkUBP8qlC.png)
    - 投票選出其他:
        對每一群內進行投票，找到該群最多的分類
        ![image](https://hackmd.io/_uploads/ryOPv8qeC.png)


### 強化式學習
強化式學習的資料通常並沒有固定的標準答案，因此我們透過設計一套獎懲機制來讓AI自我學習，我們可以先從遊玩遊戲的角度來解說這套機制

1. **Space invaders**:
     ![image](https://hackmd.io/_uploads/SkccKR5x0.png)
    space invaders是一款相當古老的電子遊戲，我們可以將遊戲內容作簡單分析
    - 可採取動作: 1.向左 2.向右 3.開火
    - 遊戲中要素: 1.分數 2.生命
    - 分數取得規則: 1.被擊中-5分 2.擊中外星人+5分 3.擊中補給+10分
    - 遊戲目標: 存活並取得更高分數
    在遊玩的過程中，我們會依據上述的規則去更改、改進我們的操作，以避開外星人的攻擊，並盡可能取得高分，經過數場遊玩，我們可能學習到在子彈快到時閃躲、或甚至外星人的排列規律等，這個過程就和強化式學習十分相似
    
2. **強化式學習如何運作**:
    在強化是學習當中，我們可以先簡單分成環境(environment)和主體(actor)，我們可以將兩者看待成上面例子的遊戲環境和玩家的相互關係
    那麼強化式學習的流程就會長得像這個樣子
    ```flow
    st=>start: 環境給出觀察(observation)給主體
    e=>end: 結束
    op=>operation: 主體根據觀察做出動作(action)
    op2=>operation: 環境給主體獎賞(reward)
    st->op->op2->st
    ```
    1. 套用到space invaders:
        以前面的例子來看，我們可以把遊戲當作環境、AI當成主體，這時AI可能會執行以下動作:
        ![image](https://hackmd.io/_uploads/rkt9amGbC.png)
        1. 先向右移動，但因為沒有破壞物件所以沒有獎賞

        ![image](https://hackmd.io/_uploads/BJcfCXGbR.png)
        2. 再執行開火動作擊毀一個敵方，獲得10點的獎賞

        ![image](https://hackmd.io/_uploads/ry5vCmGbC.png)
        3. 把這個過程套用到上面的訓練流程可以得到這個結果

        - 訓練目標:執行很多次遊戲(我們稱一回遊戲為一個episode)並讓reward最大化
    
    2. 套用到象棋:
        學會如何實作強化式學習後，我們將原理應用在訓練象棋AI上
        1. 象棋的遊戲結果只有贏和輸，我們先將贏的獎賞定為1、輸的獎賞定為2
        
        ![image](https://hackmd.io/_uploads/HktdlVzWR.png)
        2. 讓小兵向前移動一步，發現自己沒有贏也沒有輸，獎賞為0
        
        ![image](https://hackmd.io/_uploads/B1z1ZNGZA.png)
        3. 把這個過程套用到上面的訓練流程可以得到這個結果
        
        :::spoiler 這樣的執行步驟有沒有什麼問題呢?
        A:如果將贏或輸的獎賞定為1或-1的話，會有太多步驟不會得到獎賞
        ，我們稱之為稀疏獎勵(sparse reward)
        :::

3. **獎勵塑型(reward shaping)**:
    為了解決稀疏獎勵的問題，我們必須自定義一些獎勵
    - 可能幫助勝利的因素:吃掉對面的棋子
    - 可能導致敗北的因素:棋子被對面吃掉
    簡單歸類出上面兩個類別後我們可以定義出以下獎賞
    
| 棋子類型 | 吃   | 被吃 |
| -------- | ---- | ---- |
|    將(帥)       |   +100   |  -100    |
|     車     |   +15   |   -15   |
|     炮     |   +10   |  -10    |
| ...   | ... | ... |


## 3.深度學習
### 特色
1. **生物神經元**:
深度學習的特色是模擬生物的神經元互動方式
![image](https://hackmd.io/_uploads/SJK0EzZm0.png)
神經細胞會透過軸突和樹突不斷傳遞信號給下一個細胞，在深度學習中，我們就是模仿這種方式一層一層的傳遞資料最後得到輸出
我們可以簡單分成下列三種層級:

輸入層:  接受資訊，以數字型態儲存，傳到下一層

隱藏層:  分析並處理前一層資料，傳到下一層

輸入層:  拿到分析完後的結果
![image](https://hackmd.io/_uploads/HypYIGbXA.png)
從上圖可以發現，每一個神經元都與下一層的「每個」神經元相連 
2. **神經元的輸入**:
對於一個神經元，可以接收上一層的所有神經元的數據，並給他一個權重
![image](https://hackmd.io/_uploads/S1FkvMb70.png)
最後經由上面提到的激活函數(如sigmoid)處理
![image](https://hackmd.io/_uploads/HkCJuMWm0.png)
複習一下sigmoid函數是長這樣
    $$
    y={w_{1}x_{1}+w_{2}x_{2}+w_{3}x_{3}+.....}
    $$
    
經過轉換
    
$$
    sigmoid={\frac{1}{1+e^{-y}}}={\frac{1}{1+e^{-{(w_{1}x_{1}+w_{2}x_{2}+w_{3}x_{3}+.....)}}}}
$$

3. **讀取圖片**:
若我們現在想要讓機器辨識出圖片中是什麼數字該怎麼做呢?
![image](https://hackmd.io/_uploads/ByanuzWQR.png)

首先我們會把圖片切割成一格一格的，並用數字表示該像素的顏色
![image](https://hackmd.io/_uploads/S1W7KMb7R.png)

然後將這些格子編號
![image](https://hackmd.io/_uploads/S1BLYz-XC.png)

最後轉向就可以當成輸入的資料了
![image](https://hackmd.io/_uploads/r1_KFzZXC.png)

在實際的圖片當中很可能不只有黑跟白兩種顏色，因此我們利用灰階值取代，灰階值是介於0到1的數值，數字越大就越亮(接近白色)
![image](https://hackmd.io/_uploads/SJYKcMZQR.png)

4. **輸出層**:
輸出層有10個神經元，分別代表數字0~9的出現機率，我們的目標就是要讓對應正確答案的神經元機率為最高
![image](https://hackmd.io/_uploads/Hk48sfbmC.png)

5. **隱藏層**:
除了最左邊的輸入層以及最右邊的輸出層以外，剩下的都屬於隱藏層
![image](https://hackmd.io/_uploads/HJikOSz7R.png)
觀察一下上圖的特徵，我們發現了兩個特別的地方
- 為什麼需要那麼多層呢?
- 為什麼第二層隱藏層神經元數量變少了?

要解釋這個問題，我們可以先從研究8這個數字開始
首先，我們將8拆解為兩個部分
![image](https://hackmd.io/_uploads/Sk9adrfX0.png)
然後我們分別指定這兩個部件到一個神經元
![image](https://hackmd.io/_uploads/SyUZFHMmA.png)

如果以上兩個部件的出現機率都很高，我們可以推導出8這個數字的出現機率也很高
- 那為什麼這兩個神經元會是放在第二層呢?

對於機器來說，分出的這兩塊其實已經算是非常大的區塊了，我們還可以對其中一個圓形拆解，例如下圖
![image](https://hackmd.io/_uploads/HktaFrz7C.png)
這時我們也分別指定一個神經元給四個圈圈的部件，因為是圈圈的部件，所以應該要在圈圈的前一層
![image](https://hackmd.io/_uploads/r1FmqHGXC.png)

總結來說，數字由數個特徵組成(8 = 上圈圈 + 下圈圈)

而特徵又由數個子特徵組成(圈圈 = 左上圓弧 + 左下圓弧 + 右下圓弧 + 右上圓弧)

- 而這種使用子特徵的好處在哪裡呢?

接下來讓我們導入另一個數字5到這個模型當中，我們一樣先拆分部件與子部件
![image](https://hackmd.io/_uploads/rk5RcHMXA.png)
這時神奇的事情發生了，我們會發現原來子部件還可以重複進行利用(兩個圓弧)
![image](https://hackmd.io/_uploads/HyF-sHfQR.png)

### 梯度下降
在上面提到的模型裡，我們會需要讓模型不斷改動每一格的權重，那我們為了要找出一個最棒的函式，就需要利用梯度下降法去尋找特定的權重數值

1. 成本函數
前面我們有提到找到算出距離的算法(平方)，並想辦法使他最小
$$  
    {{(y_{1}-(ax_{1}+b))}^{2}+{(y_{2}-(ax_{2}+b))}^{2}+...{(y_{n}-(ax_{n}+b))}^{2}}   
$$

而我們定義成本函數(cost)就是上面的式子再除以n個點(取平均)

$$  
    成本函數=\frac{{(y_{1}-(ax_{1}+b))}^{2}+{(y_{2}-(ax_{2}+b))}^{2}+...{(y_{n}-(ax_{n}+b))}^{2}}{n}   
$$
當成本函數(cost)的數值越小，這個函數就越貼近我們的需求
因此，我們的目標就是找到最好的a和b
![image](https://hackmd.io/_uploads/BJE3IUzQC.png)
我們以上圖做為代表，計算a和b代入後的cost
首先我們先簡化問題撇除b不看
![image](https://hackmd.io/_uploads/rJLDPUzXA.png)

| a   | cost    |
| --- | ------- |
| 13  | 14218.2 |
| 14  | 8676.8  |
| 15  | 7495.0  |
| 16  | 10672.8 |

像這樣不斷地帶入點之後，我們繪製在圖表上後發現，這是一條拋物線
![image](https://hackmd.io/_uploads/r10UuUz70.png)
但是我們要如何找到最棒的a值呢?

2. 梯度下降
如果使用窮舉，會耗費太多的時間，因此我們要使用梯度下降這個計算方式
- 我們先取隨機一點為起始點
在這裡我們取a=11作為起點
![image](https://hackmd.io/_uploads/HJVLKIGXA.png)

- 求出該點的切線斜率
我們只要取出該點的斜率，就能夠得知該函數的傾斜方向，如下圖中低點是在起點的右邊，因此斜率為負
![image](https://hackmd.io/_uploads/HyPpFLzQC.png)

- 找到新的起始點

$$
    a_{new}=a_{old}-m
$$
$$
    a_{new}=11-(-3)=14
$$
- 再次計算斜率，重複進行上面步驟
![image](https://hackmd.io/_uploads/HyVqqUzQC.png)
$$
    a_{new}=a_{old}-m
$$
$$
    a_{new}=14-(-1.5)=15.5
$$
![image](https://hackmd.io/_uploads/Sye7jUfX0.png)
$$
    a_{new}=a_{old}-m
$$
$$
    a_{new}=15.5-(0.5)=15
$$


3. 學習率
因為每個模型每次要調整的幅度可能不一樣，我們設定學習率為步伐大小，則移動量變成斜率×學習率

- 學習率太小
    如果學習率過小，那我們就會需要花費更多的步驟去調整模型以找到最佳的成本函數，如下圖
![image](https://hackmd.io/_uploads/HkJfuUeEA.png)
這時如果稍微增加學習率，就可以讓每一個步伐的距離增加，在參數變多時大幅減少計算時間
![image](https://hackmd.io/_uploads/Hk0dOUxEA.png)


- 學習率太大
    如果學習率太大，則我們可能會在最佳成本函數的點周圍不斷跳動，最糟糕的情況可能會離最佳點越來越遠
    ![image](https://hackmd.io/_uploads/H1g6uLgEC.png)
    

- 學習率範例
    接下來讓我們來看看一些學習率設定問題所導致的情況
    - 學習率過大(學習率=1)
    ![1_StvoG20bZY6rAbVKGcxWnw](https://hackmd.io/_uploads/S12Vz5lER.gif)

    - 經過調整(學習率=0.9)
    ![1_-36NUUMhBq7J1rL8agmEgw](https://hackmd.io/_uploads/r1sVzcgVR.gif)
    
    - 學習率過小(學習率=0.00001)
    ![1_QkG6kdDJ1p6M62sdUX6brQ](https://hackmd.io/_uploads/H13Vz9xER.gif)
    - 經過調整(學習率=0.0004)
    ![1_gt1aMVhydotP2I7urp-Z0A](https://hackmd.io/_uploads/ByhEfceVC.gif)
    - 再次調整(學習率=0.0003)
    ![1_yDhjLYUAX8l-yrVC1thDOA](https://hackmd.io/_uploads/rkTVf9lVC.gif)
    



# 文字生成講義

## 1. 原理

### CHATGPT是什麼
CHAT：聊天
G：生成式（Generative）
P：預訓練（Pre-trained）
T：變換器（Transformer）

* **大型語言模型**
基於大量資料進行預訓練的超大型深度學習模型。早期是將字詞轉換成數值，但看不出字詞間的關係，現在則是使用多維向量儲存（字詞嵌入），使用一系列編碼器及解碼器檢驗字詞間上下文的關係。

* **自然語言處理**
是一種機器學習技術，讓電腦能夠解譯、操縱及理解人類語言。結合運算語言學理解人類語言，透過機器學習訓練期理解語句中含意（暗諷），使用深度學習模型讓他像人類大腦般思考。

簡單來說，CHATGPT是一款基於大型語言模型的系統，並且適用於各種有關自然語言處理方面的事務。

:::spoiler CHATGPT能做什麼
（參考）可以生成文本、回答問題、翻譯...，處理各種有關語言上面的事務。
:::

### Token
Token語言文本的基本單位。把一串字串分成好幾小節，每一小節稱為一個token。

* **unforgiven** 
    1. 模型一：un + forg + iven = 3個token
    2. 模型二：un + for + giv + en = 4個token

* **清水高中**
    1. 模型一：清 + 水 + 高 + 中 = 4個token
    2. 模型二：清水 + 高中 = 2個token

### 大型語言模型運作

依據不同模型，每個字串得出的token數量會不一樣。

1. **訓練資料**
訓練機器知道怎麼接龍，例如輸入「床前明月」，機器就知道要輸出「光」；輸入「疑似地上」，機器就知道要輸出「霜」。

2. **機器學習**
透過訓練的資料找出函式所需要的參數，接著帶入函式使用。第一個過程稱為學習、訓練，第二個過程則是測試、推論。

3. **輸入問題**
以「海線一中是哪個高中為例」。

4. **過程**
每個句子可以接的token有複數個可能，每個token有它的出現機率，接著CHATGPT會像擲骰子選出輸出符號，像是「清」就有40%的機率被選種。

![IMG_1190](https://hackmd.io/_uploads/B11JLeE-R.jpg)

CHATGPT生成答案的方式就像接龍一樣，不斷加入新的token，直到輸出為END時停下並輸出。

![IMG_1166](https://hackmd.io/_uploads/BknOBEOx0.jpg)

![IMG_1189](https://hackmd.io/_uploads/HJabakNZA.jpg)

5. **輸出結果**
以這個例子會輸出「清水高中」。

### CHATGPT學習方式

* **一般機器學習(監督式學習)**
機器運用人類的資料來學習，人類提供一些指令，機器學習該如何根據這些指令做出正確回應，稱為監督式學習。像是詢問「台灣最高的山是哪座山?」，AI會將「玉」、「山」串起來，並輸出，這些都是人類事先整理過的資料，然而我們沒有這麼多時間及人力整理好所有資料並提供機器學習。

* **預訓練(pre-train)**
透過網路上龐大的資料來學習，產生最初始的參數，以此做為訓練的第一階段。接著第二階段使用人類整理的資料，並將第一階段的參數丟給第二階段當初始參數，在第二階段進行最佳化，即微調(fine-tuning)，第一階段與第二階段的參數不會相差太遠，第一階段的過程稱為預訓練，也稱為自監督式學習。

![螢幕擷取畫面 2024-04-30 180551](https://hackmd.io/_uploads/H1ERfBCbR.png)

* **適配器(Adapter)**
為了讓第一階段與第二階段參數相差不要太遠，還有減少運算量，因此第二階段的過程中，只在第一階段的參數後加入少量的新未知數，並找出他們的參數。

* **監督是學習重要性**
若今天只使用第一段，蒐集大量網路資料學習，可能會出現機器不知道要回答的問題，如下圖。因此第二階段使用監督式學習，教導機器對指令做出正確回應將非常重要。

![螢幕擷取畫面 2024-04-22 210203](https://hackmd.io/_uploads/Sy9Nek4WA.png)

## 2. 提示工程

### 提示(prompt)
當我們prompt只下「撰寫一篇作文」時，CHATGPT會這樣回答

![螢幕擷取畫面 2024-04-22 224610](https://hackmd.io/_uploads/rJZB_lV-C.png)

如果再將我們的prompt變得更細節，「撰寫一篇"隙縫的聯想"的作文」時，會得到這樣的回覆

![螢幕擷取畫面 2024-04-22 224745](https://hackmd.io/_uploads/BkmiOxV-C.png)

因此如何下prompt是非常關鍵的，以下為一個關於prompt的小遊戲可以玩玩看
https://gandalf.lakera.ai/


### 提示工程-基礎技法

1. **策略一:撰寫清晰的指令**

    * 技巧一:提供更多詳盡的資訊
        把問題寫的詳細一點，，要確保所有重要資訊即要求皆有提到，否則模型只能猜測你的意思。假設我們今天要在Excel中計算一行數字的總和，如果只問「我該如何在 Excel 中進行加法計算？」，那模型只能猜測你想要加一列還是一行的總和。或許可以改成「我該如何在 Excel 中自動計算一行中的美元總額？我想要的是自動為整張表格的每行進行計算，最終所有的總計數都顯示在右側名為“總計”的列中。」，明確的告訴模型你想要在Excel中做的事，這樣模型就不需要猜測你的目的。
        
        1. 我該如何在 Excel 中進行加法計算？
        ![螢幕擷取畫面 2024-04-23 185225](https://hackmd.io/_uploads/rJXbmGSb0.png)

        
        2. 我該如何在 Excel 中自動計算一行中的美元總額？我想要的是自動為整張表格的每行進行計算，最終所有的總計數都顯示在右側名為“總計”的列中。
        ![螢幕擷取畫面 2024-04-23 185214](https://hackmd.io/_uploads/rJA-QGrbR.png)

        
    * 技巧二:讓模型扮演一個角色
        我們可以讓模型模仿一個角色來回答我們的問題。假設我們今天要面試，如果只問「如何準備面試?」，那模型不知道你是一位面試官還是面試著，也不知道你要進行怎樣的面試。如果改成「我是一位高三的學生，即將準備面試，而你是一位XX系的教授，請幫我模擬面試，你需要問我一連串的問題，我回答後需要給我一個分數(滿分十分)並給我一些意見進行修改。」讓他模擬一個角色將更好幫助他進入狀況。
        
        1. 如何準備面試?
        ![螢幕擷取畫面 2024-04-23 185201](https://hackmd.io/_uploads/HJ8HQMHbR.png)
        
        3. 我是一位高三的學生，即將準備面試，而你是一位XX系的教授，請幫我模擬面試，你需要問我一連串的問題，我回答後需要給我一個分數(滿分十分)並給我一些意見進行修改。
        ![螢幕擷取畫面 2024-04-23 185445](https://hackmd.io/_uploads/BkFtQzHbC.png)

    * 技巧三:利用分隔符號清晰區分輸入的不同部分
        利用"""來標記重點，能更好的讓模型了解問題的重點。假設我們今天想請模型撰寫一篇文章的大意，這樣詢問「請幫以下文章進行總結:"""文章"""」會比「請總結文章: 文章」讓模型更了解重點內容。
        
    * 技巧四:明確說明完成任務所需的每個步驟
        有時候需要會想要讓模型回答一連串相關問題，我們可以用列點的方式讓模型更清楚該如何回答問題。
        
        ![螢幕擷取畫面 2024-04-23 191935](https://hackmd.io/_uploads/B1GwYzH-C.png)

    * 技巧五:明確輸出長度要求
        有時候會覺得模型回答得太過冗長或是太過簡短，或許我們可以限制模型的回答長度來得到理想的答案。
        
        ![螢幕擷取畫面 2024-04-23 192451](https://hackmd.io/_uploads/rJDo9MSZC.png)
        
        ![螢幕擷取畫面 2024-04-23 192459](https://hackmd.io/_uploads/Skd29GBbC.png)

2. **策略二:提供參考文本**
 
    * 技巧: 使用參考文本來構建答案
        1. 
        ![螢幕擷取畫面 2024-04-26 114611](https://hackmd.io/_uploads/S1Zm4i_ZA.png)
        
        ![螢幕擷取畫面 2024-04-26 110003](https://hackmd.io/_uploads/SJJSVj_WC.png)
        ![螢幕擷取畫面 2024-04-26 110011](https://hackmd.io/_uploads/rJ1HEs_WC.png)
        2. 
        ![螢幕擷取畫面 2024-04-26 114620](https://hackmd.io/_uploads/Hky_VsOZC.png)
        
        ![螢幕擷取畫面 2024-04-26 114812](https://hackmd.io/_uploads/SJ1dNi_-0.png)
        
        ![螢幕擷取畫面 2024-04-26 114819](https://hackmd.io/_uploads/HkyO4suWA.png)




3. **策略三:把複雜的任務拆分成簡單的子任務**

    * 技巧一:把問題分類定義操作
        我們可以先把問題分類好，讓模型可以理解問題內容。
        
        1. 假設今天要製作一個客服，我們可以定義以下問題。
        ![螢幕擷取畫面 2024-04-26 110516](https://hackmd.io/_uploads/SyRd5qOWR.png)

    * 技巧二:總結或過濾之前的對話
        因為模型的記憶有限，所以可以讓他先總結之前的對話。
        
        ![螢幕擷取畫面 2024-04-26 110347](https://hackmd.io/_uploads/S1pq9q_ZA.png)


4. **策略四:使用外部工具**

    * 技巧一:使用外掛程式(Plugin)

        ![螢幕擷取畫面 2024-04-23 202754](https://hackmd.io/_uploads/HJ08tQBZC.png)

    * 技巧二:使用程式執行來進行更準確的計算
        每個機器都有他計算精確值的有效位數，或許我們能讓模型使用程式計算，使他的精確值位數變多。
        
        1. 如果只讓模型計算會發現答案是錯的
        ![螢幕擷取畫面 2024-04-26 101605](https://hackmd.io/_uploads/SkR3CtdZ0.png)
        
        2. 正確答案
        ![螢幕擷取畫面 2024-04-26 101619](https://hackmd.io/_uploads/HJC2CK_ZR.png)

        3. 讓模型運用程式來計算，就會是正確答案
        ![螢幕擷取畫面 2024-04-26 101639](https://hackmd.io/_uploads/Sy0hCKdWR.png)

        ![螢幕擷取畫面 2024-04-26 101653](https://hackmd.io/_uploads/SJ0hRt_bR.png)

        
### 提示工程-進階技法
* **In-Context Learning(在上下文學習)**
    透過prompts來引導模型，而不需要重新訓練模型，像是我們想教模型一個新的詞語或概念，可以在prompts提供一些關於這個詞語或概念的描述，然後再問模型，AI就可以根據這個特定的上下文進行學習和回應。
    ![螢幕擷取畫面 2024-04-30 183101](https://hackmd.io/_uploads/rJ1sOBRWA.png)
    
    然而In-Context Learning真的會教會模型新知識嗎?根據研究顯示，模型是學會這種回答風格而不是學會新知識。例子中是「動物->食性」，假設今天輸入的沒關聯性，這樣模型就無法表現好。
    
    ![螢幕擷取畫面 2024-04-30 191212](https://hackmd.io/_uploads/SJ5KmICZC.png)

    1. Zero shot
        一般的一問一答方式，是透過模型的預訓練來完成回答。
        
        ![螢幕擷取畫面 2024-04-30 184910](https://hackmd.io/_uploads/r1v33SAZ0.png)

    2. One shot
        給一個範例讓模型學習
        ![螢幕擷取畫面 2024-04-30 184845](https://hackmd.io/_uploads/rJT9nSC-0.png)
    
    3. Few shot
        給少量範例，讓模型根據prompt所提供的資料學習
        
        ![螢幕擷取畫面 2024-04-30 185038](https://hackmd.io/_uploads/HkmXTrAbC.png)
        
        ![螢幕擷取畫面 2024-04-30 185050](https://hackmd.io/_uploads/rJ77arA-A.png)

* **Chain of Thought(CoT)**
    透過提供模型推理步驟讓模型模仿，進而提高模型答案的準確率。我們可以在提問中加入「That's think step by step.」，讓模型一步步思考，得出準確率較高的結果。
    
    ![螢幕擷取畫面 2024-04-30 185919](https://hackmd.io/_uploads/HJKM1U0bC.png)
   ![螢幕擷取畫面 2024-04-30 185936](https://hackmd.io/_uploads/HyhOk8AW0.png)
    ![螢幕擷取畫面 2024-04-30 185945](https://hackmd.io/_uploads/SJVVk8AbC.png)

## 應用

### CHATGPT

* 公司: OPENAI
* 免費: GPT3.5
* 付費: GPT4/GPT4 Turbo (附DALL·E)
* 優點: 較穩定、安全
* 缺點: 須付費才能使用更多功能

### Copilot

* 公司: Microsoft
* 免費: Copilot App/網頁版
* 付費: Copilot with Office 365
* 優點: 免費GPT4、可聯網、可看圖/生圖、可連接Microsoft自家產品
* 缺點: 生成速度較慢

![螢幕擷取畫面 2024-04-30 190918](https://hackmd.io/_uploads/B1O_ZIAWA.png)
![螢幕擷取畫面 2024-04-30 190923](https://hackmd.io/_uploads/rydu-LCbR.png)

### Gemini

* 公司: Google
* 免費: Gemini 1.0
* 付費: Gemini 1.5
* 優點: 生成速度很快、可聯網、可讀圖、對中文較熟悉
* 缺點: 不能生圖

### Claude

* Claude
* 公司: Anthropic
* 免費: Claude 3
* 付費: Claude 3 Haiku、Claude 3 Sonnet、Claude 3 Opus
* 優點: 可讀很多資料、可讀檔、免費版能力堪比GPT4
* 缺點: 無聯網、無生圖

![螢幕擷取畫面 2024-04-30 190641](https://hackmd.io/_uploads/B1NAlICZR.png)

### Coze

* 公司: 字節跳動
* 免費: Coze
* 付費: 無
* 優點: 可免費使用GPT4幾乎所有功能
* 缺點: GPT4生成速度慢

1. **登入**
    ![螢幕擷取畫面 2024-04-26 102741](https://hackmd.io/_uploads/H1Ztj5d-A.png)

    ![螢幕擷取畫面 2024-04-26 103053](https://hackmd.io/_uploads/r1SQA9d-A.png)

2. **建立機器人**
    ![螢幕擷取畫面 2024-04-26 103215](https://hackmd.io/_uploads/ByPD05_-0.png)
    * Workplace: 選Personal
    * Bot name: 自行定義機器人名字
    ![螢幕擷取畫面 2024-04-26 103243](https://hackmd.io/_uploads/SyDDC9ObA.png)

3. **設定機器人**

    * Model: 語言模型
    * Temperature: 結果與事實的接近度
    * Response max length: AI可回答的最大長度
    * Dialog round: AI的記憶力
    * 調整模型參數
    ![螢幕擷取畫面 2024-04-26 103312-3](https://hackmd.io/_uploads/H1xUhJjObR.png)
    
    ![螢幕擷取畫面 2024-04-26 104153](https://hackmd.io/_uploads/S1U3ys_ZA.png)
    
    * 選取外掛程式
    ![螢幕擷取畫面 2024-04-26 103312-1](https://hackmd.io/_uploads/SkHRJiOZC.png)

    * 加入這些
    ![螢幕擷取畫面 2024-04-26 104408](https://hackmd.io/_uploads/HkSRko_ZR.png)
    ![螢幕擷取畫面 2024-04-26 104432](https://hackmd.io/_uploads/HJSAyjdbR.png)
    ![螢幕擷取畫面 2024-04-26 104451](https://hackmd.io/_uploads/S1H0yi_bC.png)
    
4. **建立自己資料庫**
    假設今天是一位律師，他就可以把各種法律條文加入這裡，方便AI查閱。

    ![螢幕擷取畫面 2024-04-26 103312-2](https://hackmd.io/_uploads/ryMmlidb0.png)

    ![螢幕擷取畫面 2024-04-26 105040](https://hackmd.io/_uploads/HkfXxouWC.png)

    ![螢幕擷取畫面 2024-04-26 105029](https://hackmd.io/_uploads/rywU7sOb0.png)

    ![螢幕擷取畫面 2024-04-26 105057](https://hackmd.io/_uploads/HyQCSH0ZC.png)
    * 加入資料
    ![螢幕擷取畫面 2024-04-26 105120](https://hackmd.io/_uploads/S1MmxjO-A.png)








# 圖片生成式AI

## 1.圖片AI的框架(Framework)
1. 文字編碼器(text encoder)
    : 將輸入的文字資料轉換為向量(vector)或編碼的過程
            
2. 生成模型(generation model)
    : 將向量或編碼轉換為圖片，後面我們將介紹幾個較著名的模型
- **名詞解釋**:
    1. **Latent Representation(壓縮資料)**: 對輸入資料壓縮、簡化過後的資料型態
    2. **高斯分布(常態分佈)**: 一種常見的連續機率分布，講述在樣本數增大時會趨近的分布曲線，如下圖
![](https://hackmd.io/_uploads/B16wsprRa.png)
- **訓練過程**:
    1. 用文字的資料產生中間產物圖片壓縮的結果，可以是小圖或是壓縮資料
    2. 先從高斯分布裡取樣出壓縮資料
    3. 不斷加上文字(文字也是以壓縮資料型態來表示)，然後經過去躁(Denoise)的模型去掉噪音(noise)
    4. 反覆直到產出的結果夠好
3. decoder
    : 解碼器，將編碼或向量轉換為輸出圖片的模型
- **訓練過程**:
    1. 如果輸入為小圖:
        - 輸入小圖
        - 將其還原成圖片，令其與輸入圖片相似
    2. 如果輸入為壓縮資料:
        - 訓練Autoencoder
        - 利用編碼器將圖片轉變一個壓縮資料
        - 用解碼器將其還原為圖片，並令其與輸入圖片相似
## 2.VAE模型(Variational AutoEncoder)
1. **中文名稱**: 變分自編碼器
2. **訓練流程**: 輸入->編碼器->code->解碼器->輸出
 ![image](https://hackmd.io/_uploads/Hk9Qa6H06.png)
 
 我們首先來看看VAE的前身AE是怎麼樣運作的
 ![image](https://hackmd.io/_uploads/SkCyrlWQA.png)
我們以以上這幾個圖片做舉例，可以將圖片歸類出幾個圖片中的物件

| 物件     |
| -------- |
| 天空     |
| 雲       |
| 左邊的山 |
| 中間的山 |
| 右邊的山 |
| 河       |
| 太陽     |

對於這些物件，我們可以描述他的位置、大小及顏色，如以下範例
![螢幕擷取畫面 2024-05-26 164901](https://hackmd.io/_uploads/HygPu_xEA.png)
![螢幕擷取畫面 2024-05-26 164934](https://hackmd.io/_uploads/SyxDuug4A.png)
![螢幕擷取畫面 2024-05-26 165109](https://hackmd.io/_uploads/SJlvOOxNR.png)
![螢幕擷取畫面 2024-05-26 165216](https://hackmd.io/_uploads/BkePudlVR.png)

而編碼器的作用，就是把圖片轉為這些能夠被機器處理的數據

![螢幕擷取畫面 2024-05-26 220801](https://hackmd.io/_uploads/B1oUfTxV0.png)


然後再經由解碼器把處理完的數據轉換為圖片

![螢幕擷取畫面 2024-05-26 165457](https://hackmd.io/_uploads/B1jZYugE0.png)

以上就是自編碼器(AutoEncoder)的訓練過程，而VAE模型，則是在過程中再加入一個步驟以讓資料更多元化
     
     
     
3. **Variance of noise(雜訊)**
     在VAE當中，我們會將編碼器轉換的輸出資料與雜訊做疊加，產生新資料
     
     在上面的範例中，我們先以編碼器將輸入圖片轉為可處理的資料，然後VAE則是在這個步驟加入隨機數字以產生不同於原圖的圖片，這個隨機數字就是所謂的噪點(Noise)
     
     ![螢幕擷取畫面 2024-05-26 220743](https://hackmd.io/_uploads/Hyf_GalN0.png)

    原本圖片的數據可能是淡藍與深橘的天空，但加入噪點過後，新生成的圖片可能擁有綠色的特徵，最後我們再把變換過後的數據丟進解碼器，轉換回圖片
    假設原本的數據可能是300(橘色)，那我們加入的噪點就是以此為基準進行上下的浮動調整，最後可能得到250~350的數據(紅色到黃色)
    ![image](https://hackmd.io/_uploads/ryDX5ebmA.png)


4. **優勢**: 
    1. 良好的生成能力
    2. 統計特性
        
因為我們加入了隨機值進入資料，對於電腦來說，可以學習到的是資料的大範圍趨勢，而非過於死板的非0即1的判斷，可以拼湊出兩者的各種線性組合。
![image](https://hackmd.io/_uploads/BycAql-QC.png)
如上圖，由VAE所生成的圖片除了我們自己給出的資料以外，還會自行組合出中間的圖片，達到漸變的感覺

5. **VAE的問題**: 無法產出以假亂真的圖片
    1. 產出的圖片畫質較差
    2. 容易產出相似卻在細節上有邏輯缺陷的圖
    3. 計算複雜，增加訓練難度
![image](https://hackmd.io/_uploads/HyOd9l-m0.png)

上圖模型中產生的7分別多了一個像素點在7的下方及外側，點在下方可能對於人類來說可以接受，但外側的一點對於電腦判讀來說可能相差不遠(只差一個像素)，以人類角度來判讀就有些不盡完美

## 3.GAN模型(Generative Adversarial Network)
1. **中文名稱**:生成對抗網路
2. **訓練流程**:輸入->編碼器->生成器(Generator)->鑑別器(Discriminator)->解碼器->輸出
3. **生成器**:一種神經網路，在模型中負責生成圖片，並想辦法不被辨識出來
4. **鑑別器**:一種神經網路，在模型中負責分辨圖片是人為還是生成器所生成出來的圖片
5. **模型更新步驟**:
先來看看訓練GAN模型的流程
![IMG_4042](https://hackmd.io/_uploads/rkTKSO4NR.jpg)

- 會有好幾代的生成器與鑑別器
- 生成器的輸出便是鑑別器的輸入
簡單來說，就是生成器要努力生成出能夠騙過鑑別器的圖片，然後鑑別器則是要辨認那些圖片是生成器生成的，並且兩者透過彼此的輸出去更新自己的模型

下圖為簡單的訓練過程:
 ![螢幕擷取畫面 2024-03-23 111326](https://hackmd.io/_uploads/HJ2mFajCT.png)
6. **優點**：高品質生成、多樣性
7. **缺點**：訓練不穩定難以除錯、模型崩壞，以下是模型訓練時可能會發生的錯誤
![image](https://hackmd.io/_uploads/SJbYfrzbA.png)
可以發現GAN的模型生成的圖片會過於侷限在某個特徵上，造成容易生成相近的圖片
![image](https://hackmd.io/_uploads/B10usWWQA.png)
上圖當中GAN模型所生成的圖片有15張是非常相近的

## VAE與GAN比較

| Model | VAE | GAN|
|--------|----|----|
| 影響生成 | 更適用於需要統計建模的任務 | 更適用於產生高品質的影像 |
| 訓練穩定度 | 訓練過程通常較穩定 | 可能需要更精細的調試 |
| 複雜性與可解釋性 | 提供了更好的統計特性和解釋性 | 通常更難以理解和調試 |

## 4.Diffusion模型
1. **中文名稱**:擴散模型
2. **訓練流程**: 輸入->增加噪點->去噪器->輸出
    - 前半流程(Forward Process):
        我們需要將一張圖片經過不斷增加噪點數次
        ![image](https://hackmd.io/_uploads/rkzHpb-70.png)
    - 反向流程(Reverse Process):
        將前項流程得到的有噪點圖片經過去噪器把圖片還原，在輸入資料中我們需要給模型一個有噪點圖片並告訴它這是第幾次處理的有噪點圖片
```graphviz
digraph hierarchy {

                nodesep=0.5 // increases the separation between nodes
                
                node [color=Red,fontname=Courier,shape=box] //All nodes will this shape and colour
                edge [color=Blue, style=dashed] //All the lines look like this
                輸入 ->{有噪點圖片 第幾步}
                去噪器 ->{噪點預測器noise_predicter 噪點圖案 圖片減掉噪點}
                
}
```
現在我們以貓咪的圖片作為範例，看看實際訓練的詳細流程
- 首先我們會將一張圖片加入隨機的噪點，然後重複數次
    ![image](https://hackmd.io/_uploads/HycVOUGb0.png)
- 選取一張有噪點圖片並將其輸入到噪點預測器裡面，然後透過生成的資料去預測出噪點
- 將有噪點圖片減掉預測出來的噪點得到去噪圖片
    ![image](https://hackmd.io/_uploads/ryn5oIzZ0.png)
- 將以上過程加入文字
    ![image](https://hackmd.io/_uploads/ByHjRUzW0.png)
因為添加噪點是採取隨機添加的機制，所以實際上我們只需要訓練去噪器而已
3. **優點**:只需要訓練去噪器，因此相對好訓練；流程是分階段式的處理，細節清楚明瞭
4. **缺點**:採樣速度較慢，因為我們需要對原圖加很多次的隨機噪點，一筆資料就要處理較多時間
    ![image](https://hackmd.io/_uploads/r1tW1PG-C.png)
## 總結
以上介紹的多種模型可以透過相互結合的方式達到不同的效果，我們可以在一個模型裡面套用多種的模型，達成不同的功能或目的
1. **VAE和Diffusion的比較**:
    VAE簡單來說就是利用編碼器將圖片轉換為壓縮資料後再利用解碼器轉換回圖片，而Diffusion則是透過重複添加噪點再去噪的方式來生成圖片，如下圖
  ![image](https://hackmd.io/_uploads/ByKd3WNbA.png)
2. **VAN與GAN的結合**:
     ![image](https://hackmd.io/_uploads/rkuDC-4-A.png)
    VAE的解碼器和GAN的概念相近，都是透過輸入向量後得到圖片的過程，我們能夠將解碼器視為生成器，並額外加入鑑別器來進行解碼器(在這裡也是生成器)的訓練
3. **Diffusion與GAN的結合**:
    
    在這張圖中， 鑑別器在進行比較時，用的是加上噪點的版本，優點是可以避免在比較時真實圖像和生成圖像相差太大，以達到穩定模型的目的。
    如果我們針對同一張圖片加上不同種的噪點，也可以增加數據效率與生成器的多樣性


## 附錄-卷積神經網路(Convolutional Neural Network,CNN)
1. 目的:為了降低輸入的參數，避免浪費大量算力
2. 原理:
- 卷積
     : 大圖片對應小特徵的相似程度
     
假設今天要判斷一個圖片是否為叉叉，我們可以先將線條分成左上右下及右上左下兩種，如例圖我們先使用左上右下的線條作為我們的kernel，疊合後依序相乘後取平均就得到了一個像素點「附近」跟對應特徵的相似度。
    - -1代表1 * (-1)或(-1) * 1，即相反元素疊合在同一個位置
    - 1代表1 * 1或(-1) * (-1)，即相同元素疊合在同一個位置
    - 取平均後-1代表特徵與每個像素點剛好完全相反，1代表完全符合特徵

![image](https://hackmd.io/_uploads/HkX5SIU1C.png)
- 池化
    : 壓縮圖片的同時盡量保留重要資訊
    
做法是取相鄰元素中最相似(最大值)的作為代表
![image](https://hackmd.io/_uploads/S12c_UI10.png)
可以發現上圖經過池化之後資料減少到了1/4，然後我們這時就能做神經網路的處理了
        
 
- CNN的缺點:缺乏對圖像本身的全局理解
    雖然CNN在提取視覺特徵方面很出色，但它們無法對這特徵之間的相對關係進行連結，如下圖CNN可能無法找到臉部器官的對應位置
    ![image](https://hackmd.io/_uploads/BJoxu-4-A.png)


# 影片生成式AI
## 影片生成軟體sora
1. sora簡介
    sora是由OpenAI所發布的一項影片生成模型，目的是透過文字提示生成真實並且具吸引力的圖片，這項工具的出現象徵著人工智慧不僅在文字生成上面，在視覺內容方面也有重大的進展

OpenAI的發展:
    
| 模型名稱    | Chat GPT      |     DALL‧E 3            | SORA                      |
| --- | ---------- | -------------------------- | ------------------------ |
|  模型類型   |    文字生成AI        |     圖片生成AI     |                      影片生成AI  |
|  發行日期| 2022/11/30   |2023/10 | 2024/02/15 |
2. 使用原理
    sora是使用diffusion模型與transformer模型的結合應用
:::spoiler 要怎麼讓transformer對圖片進行讀取與輸出呢? 
A:我們會使用圖像塊(patch)來替代transformer裡的token進行運算，成為新的Vision Transformer (ViT) 視覺transformer架構
:::
Transformer如今已經成為熱門的神經網路架構，並且已經大量的應用在自然語言(NLP)任務上，在圖像及影像方面，透過將Transformer架構中的編碼器抽離出來轉變成了ViT架構在影像分類技術上取得了重大的突破。
ViT拋棄了圖像AI所使用的傳統CNN技術並以 self-attention(自我注意力機制) 計算做取代，並在分類問題上取得不錯的成績
3. transformer模型(使用patch)
- 分割圖片:我們首先會將原圖片分割成為固定大小的圖像塊(patch)，並對其添加位置的相關資訊(圖塊是有順序性的)後轉換成向量，如下圖中原圖被依序分割成了9個區塊，除了原本資訊還添加了包含起始位置的0-9位置資訊
![image](https://hackmd.io/_uploads/r1DBc-E-R.png)

- 運算:將處理過的資料輸入進transformer模型，進行特徵的抓取
- 分類:對輸出的特徵進行分類

4. **sora的優缺點**:
- 優點:生成影片時長較長、解析度較高
- 缺點:生成影片時間較長(使用Difusion模型)、場景中物件過多時會造成不合物理、光影等邏輯的片段


## FlexClip使用教學
1.到官網點擊右上角註冊建立新帳號

![image](https://hackmd.io/_uploads/SJJY9KgN0.png)

2.登入後點擊AI影片生成器

![image](https://hackmd.io/_uploads/SyZM3YlN0.png)

3.點擊AI文字生成影片
![image](https://hackmd.io/_uploads/HJuM6YgN0.png)

4.在框框裡面打出讓AI生成影片的指令，並點擊生成
![image](https://hackmd.io/_uploads/HJPSTFl4C.png)

5.AI會生成出一些短影片，選取需要的影片並編輯播放順序，最後匯出
![image](https://hackmd.io/_uploads/SyWvl9lEA.png)

6.利用編輯影片的功能去做微調
![image](https://hackmd.io/_uploads/rkonx5lVC.png)

7.輸出可以選擇影片或GIF檔，這裡我們選擇影片
![image](https://hackmd.io/_uploads/ByEJWqgN0.png)



