---
# System prepended metadata

title: 人工智慧

---

# 人工智慧
> 這是一個關於人工智慧的筆記[name=簡志融111010501]

> 大部分的程式碼來自 [ccc112b/py2cs/03-人工智慧](https://github.com/ccc112b/py2cs/tree/master/03-%E4%BA%BA%E5%B7%A5%E6%99%BA%E6%85%A7)
> 其餘另標註來源

## 摘要

[TOC]

## 第一週
> 人工智慧 : 傳統 v.s. 現代
> 原本想讓AI做繁雜的工作，結果AI跑去做最有創意的工作
### AI 的應用
* 語言交談 : 如何與AI合作寫程式
    * [Langchain](https://github.com/langchain-ai/langchain) (很誤導，導致成果很爛)
    * [DSPy](https://github.com/stanfordnlp/dspy) (著重)
* [Suno AI](https://www.suno.ai/) : 作詞曲 AI
* OpenAI
    * GPT 3.5 Turbo v.s. GPT 4 : 價格差20倍
    * [Sora](https://openai.com/sora) : 文字生成影片
    * [Gym](https://www.gymlibrary.dev/index.html) 是一個提供許多測試環境的工具，讓大家有一個共同的環境可以測試自己的 
    RL (reinforcement learning)演算法 (Using Q learning)
    ![lunar_lander_continuous](https://hackmd.io/_uploads/B1qOjPih6.gif =50%x)
        
### AI 基礎
> [梯度](https://zh.wikipedia.org/zh-tw/%E6%A2%AF%E5%BA%A6) : 神經網路的重要數學基礎，找出函數的最低點>>區域最佳值
> (2維函數圖，箭頭表示最斜方向的斜率)
> 
> ![](https://hackmd.io/_uploads/Hkkrxp3Za.png =47%x)

> AI在計算的函數是 Loss Function，常為[交叉熵 Cross entropy](https://zh.wikipedia.org/zh-tw/%E4%BA%A4%E5%8F%89%E7%86%B5)
>  (找出兩個機率到底有多不相同，如果值很小，代表兩者機率幾乎一致)
> * ![0cb6da032ab424eefdca0884cd4113fe578f4293](https://hackmd.io/_uploads/r1QJhF3h6.svg =50%x)

> 牛頓力學、電磁學 >> 向量

> [Dive into Deep Learning](https://d2l.ai/) : 深度學習實作書  (AI發展太快，書很難跟上)
> [李宏毅 Hung-Yi Lee](https://speech.ee.ntu.edu.tw/~hylee/index.php) : 機器學習、深度學習、語意理解、語音辨識
> [Diffusion model](https://en.wikipedia.org/wiki/Diffusion_model) : 現今當紅模型

* 傳統 AI
    * 幾何
        * 微分 : 多變數微分 (全部的[偏微分](https://zh.wikipedia.org/zh-tw/%E5%81%8F%E5%AF%BC%E6%95%B0)排成一排=梯度)
        [py2cs/03-人工智慧/02-優化算法/02-深度學習優化/02-梯度/vecGradient.py](https://github.com/ccc112b/py2cs/blob/master/03-%E4%BA%BA%E5%B7%A5%E6%99%BA%E6%85%A7/02-%E5%84%AA%E5%8C%96%E7%AE%97%E6%B3%95/02-%E6%B7%B1%E5%BA%A6%E5%AD%B8%E7%BF%92%E5%84%AA%E5%8C%96/02-%E6%A2%AF%E5%BA%A6/vecGradient.py)
            ```py=8
            # df(f, p, k) 為函數 f 對變數 k 的偏微分: df / dp[k]
            # 例如在上述 f 範例中 k=0, df/dx, k=1, df/dy
            def df(f, p, k):
                p1 = p.copy()
                p1[k] += step
                return (f(p1) - f(p)) / step

            # 函數 f 在點 p 上的梯度
            def grad(f, p):
                gp = p.copy()
                for k in range(len(p)):
                    gp[k] = df(f, p, k)
                return gp
            ```
            * 找最小值
            [py2cs/03-人工智慧/02-優化算法/02-深度學習優化/03-梯度下降法/gdArray.py](https://github.com/ccc112b/py2cs/blob/master/03-%E4%BA%BA%E5%B7%A5%E6%99%BA%E6%85%A7/02-%E5%84%AA%E5%8C%96%E7%AE%97%E6%B3%95/02-%E6%B7%B1%E5%BA%A6%E5%AD%B8%E7%BF%92%E5%84%AA%E5%8C%96/03-%E6%A2%AF%E5%BA%A6%E4%B8%8B%E9%99%8D%E6%B3%95/gdArray.py)
                ```py=
                import gd as gd

                def f(p):
                    [x, y, z] = p
                    return (x-1)**2+(y-2)**2+(z-3)**2

                p = [0.0, 0.0, 0.0]
                gd.gradientDescendent(f, p)
                ```
            * 直/曲線擬合 (最小平方法 : 回歸擬合；在二維平面上的點找一條擬合的線)
            [py2cs/03-人工智慧/02-優化算法/02-深度學習優化/03-梯度下降法/gdRegression.py](https://github.com/ccc112b/py2cs/blob/master/03-%E4%BA%BA%E5%B7%A5%E6%99%BA%E6%85%A7/02-%E5%84%AA%E5%8C%96%E7%AE%97%E6%B3%95/02-%E6%B7%B1%E5%BA%A6%E5%AD%B8%E7%BF%92%E5%84%AA%E5%8C%96/03-%E6%A2%AF%E5%BA%A6%E4%B8%8B%E9%99%8D%E6%B3%95/gdRegression.py)
            ![Figure_1](https://hackmd.io/_uploads/HyD5CY3np.png =70%x)
            
## 第二週
* 傳統 v.s. 神經網路/深度學習
    * 傳統
        * 程式/演算法
    * 神經網路/深度學習
        * MLP
        * 1998 : CNN
        * 2002 : RNN
        * 2010 : ImageNet、GAN
        * 2018 : Attation、Transformer
        * Future : 大模型、AGI

### 傳統_優化算法-1
> 圖靈認為與之聊天，無法判斷是否為人，即其稱之為有智慧的 ([圖靈測試](https://zh.wikipedia.org/zh-tw/%E5%9B%BE%E7%81%B5%E6%B5%8B%E8%AF%95))
> [Captcha](https://zh.wikipedia.org/zh-tw/%E9%AA%8C%E8%AF%81%E7%A0%81) : 全自動區分電腦和人類的圖靈測試
> ![image](https://hackmd.io/_uploads/Sy-a0Lp2T.png =50%x)

* [爬山演算法](https://github.com/ccc112b/py2cs/tree/master/03-%E4%BA%BA%E5%B7%A5%E6%99%BA%E6%85%A7/02-%E5%84%AA%E5%8C%96%E7%AE%97%E6%B3%95/01-%E5%82%B3%E7%B5%B1%E5%84%AA%E5%8C%96%E6%96%B9%E6%B3%95/01-%E5%84%AA%E5%8C%96/01-%E7%88%AC%E5%B1%B1%E6%BC%94%E7%AE%97%E6%B3%95)
    * 單變數(一維) : 往左右搜尋比自己高的點
    * 雙變數(二維)
        * 固定 : 將目前的點做為中心，前後左右嘗試
        * 隨機 : 固定法有時會有盲點，所以在範圍內隨機找點嘗試
    * 通用 : 在周圍尋找高點；有時如果問題比較奇特，程式會掛掉
* 模擬退火法
* 遺傳演算法
## 第三週
> 老師喉嚨不舒服，[TSP](https://zh.wikipedia.org/zh-tw/%E6%97%85%E8%A1%8C%E6%8E%A8%E9%94%80%E5%91%98%E9%97%AE%E9%A2%98)

## 第四週
### 傳統_優化算法-2
> 傳統的 AI : 算分數 + 搜尋

> [粒子群演算法](https://zh.wikipedia.org/zh-tw/%E7%B2%92%E5%AD%90%E7%BE%A4%E4%BC%98%E5%8C%96) : 圖形化地類比鳥群不可預測的運動。而通過對動物社會行為的觀察，發現在群體中對資訊的社會共享提供一個演化的優勢，並以此作為開發演算法的基礎

> [中心法則](https://zh.wikipedia.org/zh-tw/%E4%B8%AD%E5%BF%83%E6%B3%95%E5%89%87) : DNA製造RNA，RNA製造蛋白質


* 爬山演算法
* [模擬退火法](https://zh.wikipedia.org/zh-tw/%E6%A8%A1%E6%8B%9F%E9%80%80%E7%81%AB) : 以能量的觀點，找谷底；新增**溫度T**，機率決定變差時是否前往
對於一些小山丘較有機會克服
![image](https://hackmd.io/_uploads/rJwbQCJ0T.png =92%x)
* 遺傳演算法
    * [基因演算法](https://zh.wikipedia.org/zh-tw/%E9%81%97%E4%BC%A0%E7%AE%97%E6%B3%95) : 有 crossover 的概念，無法符合則不適用
### 傳統_搜尋算法

* 列舉
    * 遞迴
    * 隨機
    * 排列
    * 組合
* 暴力
    * 開根號
    * 挖礦
* 圖形搜尋 : 將理論抽象化，形成通用的框架
    * 深度優先(DFS) : 遞迴 & 回朔
    * 廣度優先(BFS) : 加一個queue，記住已訪問的點
    * 例子
        * [數字推盤遊戲（n-puzzle）](https://zh.wikipedia.org/zh-tw/%E6%95%B8%E5%AD%97%E6%8E%A8%E7%9B%A4%E9%81%8A%E6%88%B2)
        ![Great_presidential_puzzle2](https://hackmd.io/_uploads/Sk_4eJxCp.jpg =40%x)
        * 狼、羊、菜問題
           ![image](https://hackmd.io/_uploads/H1GgLJe0p.png =40%x)
        * 八皇后問題
          ![image](https://hackmd.io/_uploads/S1EoXJgAa.png =40%x)
        * [A* 搜尋法](https://zh.wikipedia.org/wiki/A*%E6%90%9C%E5%B0%8B%E6%BC%94%E7%AE%97%E6%B3%95) : 常用於遊戲中的NPC的移動計算，或網路遊戲的BOT的移動計算上；相對有效率的算法
          ![image](https://hackmd.io/_uploads/rkeDEQygCa.png)
          
## 第五週
> 進到物理系像是數學系
> 物理的最前沿 : 粒子...
> 台灣物理最重要的 : 半導體物理(穿隧效應)
### 深度學習_優化算法-1
> [Geoffrey Hinton](https://zh.wikipedia.org/zh-tw/%E6%9D%B0%E5%BC%97%E9%87%8C%C2%B7%E8%BE%9B%E9%A1%BF)

* 微分(單變數)
* 梯度(多變數)
    * 偏微分(多變數找一個微)
* 梯度下降法
    * 找最小值
    * 線性擬合(最小平方法)
![Figure_1](https://hackmd.io/_uploads/By8xBGF0p.png =50%x)
* 反傳遞算法
    * [Hacker's guide to Neural Networks](https://karpathy.github.io/neuralnets/)
    ![image](https://hackmd.io/_uploads/HJE09zFA6.png =50%x)
    ![image](https://hackmd.io/_uploads/r1NCnGFAT.png =40%x)
     ***先將 x, y, z 帶入算出 f，再使用鏈鎖規則往回算出梯度***
    * [線性整流函式 (reLU)](https://zh.wikipedia.org/zh-tw/%E7%BA%BF%E6%80%A7%E6%95%B4%E6%B5%81%E5%87%BD%E6%95%B0)

## 第六週

### 深度學習_優化算法-2
> [Softmax with cross-entropy](https://mattpetersen.github.io/softmax-with-cross-entropy) : [Jacobian matrix](https://zh.wikipedia.org/zh-tw/%E9%9B%85%E5%8F%AF%E6%AF%94%E7%9F%A9%E9%98%B5) ![image](https://hackmd.io/_uploads/H198Qvf10.png)
> 
> ![image](https://hackmd.io/_uploads/H1S9gvGJC.png =53%x)

* 微分(單變數)
* 梯度(多變數)
* 梯度下降法
* 反傳遞算法
    * [Hacker's guide to Neural Networks](https://karpathy.github.io/neuralnets/)
    * [線性整流函式 (reLU)](https://zh.wikipedia.org/zh-tw/%E7%BA%BF%E6%80%A7%E6%95%B4%E6%B5%81%E5%87%BD%E6%95%B0) : 主流，但取到平的會掛掉
    * [Activation Functions — Sigmoid & ReLu & tahn & LeakyReLu & ELU](https://medium.com/@adea820616/activation-functions-sigmoid-relu-tahn-20e3ae726ae)
    很多問題並非線性，需如 Sigmoid 的整流函數，但有梯度消失的問題
    ![image](https://hackmd.io/_uploads/rJzfvHf1C.png =40%x)
    * [cross_entropy](https://zh.wikipedia.org/zh-tw/%E4%BA%A4%E5%8F%89%E7%86%B5) : 上一層是 [softmax(歸一化指數函式)](https://zh.wikipedia.org/zh-tw/Softmax%E5%87%BD%E6%95%B0) 
      ![0cb6da032ab424eefdca0884cd4113fe578f4293](https://hackmd.io/_uploads/S1Tzv8fy0.svg)
        ```py=116
        # https://github.com/ccc112b/py2cs/blob/master/03-人工智慧/02-優化算法/02-深度學習優化/04-反傳遞算法/03-macroGrad/macrograd/engine.py
        def cross_entropy(self, yb):#前兩行=上述公式
            log_probs = self.log()  # log(q)
            zb = yb*log_probs       # yb=p ; z=p*log(q)
            outb = zb.sum(axis=1)   # 將 batch 的差異加總
            loss = -outb.sum()      # cross entropy loss
            return loss # 本函數不用指定反傳遞，因為所有運算都已經有反傳遞了，所以直接呼叫 loss.backward() 就能反傳遞了
        ```
    * [auto encoder](https://medium.com/ml-note/autoencoder-%E4%B8%80-%E8%AA%8D%E8%AD%98%E8%88%87%E7%90%86%E8%A7%A3-725854ab25e8) : 將輸入轉為n維向量，希望輸出相同的結果
    ![image](https://hackmd.io/_uploads/rJiM3IM1R.png =80%x)
    
## 第七週
> 清明連假

## 第八週
> 任何函數只要有**最小值或最佳目標**，都可以當 AI 的 Loss function

> 在不知道機率分布的情況下，卻有很多樣本，深度學習想透過調整參數，接近原本的機率源

> 以[期望值](https://zh.wikipedia.org/zh-tw/%E6%9C%9F%E6%9C%9B%E5%80%BC)作為損失函數可能造成過擬合的問題
![bd6194ffb672c07744b9caf5017b157ba185b005](https://hackmd.io/_uploads/r1h7oCEeR.svg)
如果模型在驗證集中表現不如訓練，可能已出現過擬合

> 1948，[Shannon](https://zh.wikipedia.org/zh-tw/%E5%85%8B%E5%8A%B3%E5%BE%B7%C2%B7%E9%A6%99%E5%86%9C)「通訊的一個數學理論」
概率理論是夏農使用的重要工具，同時提出了資訊熵的概念，用于衡量消息的不確定性。
![083841186db3e1e95e1f1cdbd9ba256657d3ccf5](https://hackmd.io/_uploads/HyYj5TNxR.svg)
可決定編碼時最小的位元數，以[霍夫曼編碼](https://zh.wikipedia.org/zh-tw/%E9%9C%8D%E5%A4%AB%E6%9B%BC%E7%BC%96%E7%A0%81)最接近

> [不偏估計(Unbiased Estimator)](https://murphymind.blogspot.com/2011/10/estimation.html#google_vignette)
> [交叉熵](https://en.wikipedia.org/wiki/Cross-entropy)找出兩個機率到底有多不相同，如果值很小，代表兩者幾乎相同
![c6b895514e10a3ce88773852cba1cb1e248ed763](https://hackmd.io/_uploads/rkZF3pExC.svg)

> [karpathy / llm.c](https://github.com/karpathy/llm.c) 以 C語言 寫訓練 GPT2 的程式
> ***[The Unreasonable Effectiveness of RNN](https://karpathy.github.io/2015/05/21/rnn-effectiveness/) : 為何 RNN 有不合理的有效性?***

### AI 套件
> 傳統套件有planning問題，需定義、描述問題，且不太能有誤差
* 傳統
    * 圖形搜尋套件 : [NetworkX](https://networkx.org/) 能解決問題定義很明確，知道輸入，就可以知道輸出
    * [NumPy](https://numpy.org/) : 簡易創建、變形陣列；線代，矩陣相乘、內積
    * [SciPy](https://scipy.org/) : 線性、整數、混合規劃
    * [SymPy](https://www.sympy.org/en/index.html) : 符號計算
* 現代(神經網路、深度學習)
    * [PyTorch](https://pytorch.org/)
        ```py=
        # https://github.com/ccc112b/py2cs/blob/master/03-人工智慧/03-使用套件/02-深度學習套件/02-autograd/autograd2.py
        import torch
        x = torch.tensor([1.0,2.0], requires_grad=True)
        z = x.norm() #歐式距離
        z.backward()
        print('z=', z)
        print('x.grad=', x.grad)
        ```
    * [pythorch / Loss function](https://pytorch.org/docs/stable/nn.html#loss-functions) 只要在表現不好時只變大，表現好時值變小，就可以用
## 第九週
> [奧坎剃刀](https://zh.wikipedia.org/wiki/%E5%A5%A5%E5%8D%A1%E5%A7%86%E5%89%83%E5%88%80) : 又稱簡約法則，如果沒有必要就不應當假設很多東西 

> [歐氏幾何](https://zh.wikipedia.org/zh-tw/%E6%AC%A7%E5%87%A0%E9%87%8C%E5%BE%97%E5%87%A0%E4%BD%95)的公設要求只能用尺規作圖
> 沿襲因尼羅河氾濫而產生的埃及數學

> [非歐幾里得幾何](https://zh.wikipedia.org/wiki/%E9%9D%9E%E6%AC%A7%E5%87%A0%E9%87%8C%E5%BE%97%E5%87%A0%E4%BD%95)

> [羅氏幾何](https://zh.wikipedia.org/wiki/%E5%8F%8C%E6%9B%B2%E5%87%A0%E4%BD%95) : 又稱雙曲幾何，第一個非歐幾何。
> 在其之上，畢氏定理不成立 (球體亦同)
![image](https://hackmd.io/_uploads/S1WeheRe0.png =30%x)

> [karpathy/nanoGPT](https://github.com/karpathy/nanoGPT)
The simplest, fastest repository for training/finetuning medium-sized GPTs.

### AI models
> 機器學習是給樣本和答案，找出之間的對應關係 (函式f(x))
> 其中分群不一樣，不給答案分出群體
> 要在盡可能簡化的條件，找出最貼近的函式
> 不太可能找到完全一樣，如果有可能是過擬合

> 事實上 LLM 不符合奧坎剃刀法則
> LLM 其實是一位猜測員，不斷猜測下一個字到人類可以理解

* Classification(分類，有標記) : 已知的N類選一類
    * LLM
        * ChatGPT
        * Copilot
        * [Claude](https://claude.ai/) 與 LLM 不同，開發較少參數的模型，卻能匹敵多參數模型
        * [perplexity](https://www.perplexity.ai/) 會讓模型讀文章再回答，部份解決 LLM 幻覺
* Regression(回歸)
    * 線性擬合
* Clustering(分群，無標記)
    * 線性規劃

### 傳統_機器學習
> [Precision and recall](https://en.wikipedia.org/wiki/Precision_and_recall)
![1_Ub0nZTXYT8MxLzrz0P7jPA](https://hackmd.io/_uploads/BJHV6ZCgC.png =70%x)

* 分類
    1. 蒐集取得資料 : 有現有資料集，e.g.鳶尾花
    2. 分析
        * [混淆矩陣](https://zh.wikipedia.org/zh-tw/%E6%B7%B7%E6%B7%86%E7%9F%A9%E9%98%B5)
        * Precision
        * Recall
        * F1-score
* 分群
    * 資料可用 scikit-learn 產生
        ```py=5
        # https://github.com/ccc112b/py2cs/blob/master/03-人工智慧/04-機器學習/01-傳統機器學習/03-分群/04-clusterData/cluster_data1.py
        X, y = datasets.make_blobs(n_samples=n, centers=4, cluster_std=0.60, random_state=0)
        X, y = datasets.make_moons(n_samples=n, noise=0.1)
        X, y = datasets.make_circles(n_samples=n, noise=0.1, factor=0.5)
        X, y = np.random.rand(n, 2), None
        ```
* 回歸
    * 線性回歸
        ```py=
        # https://github.com/ccc112b/py2cs/blob/master/03-人工智慧/04-機器學習/01-傳統機器學習/04-迴歸/06-regression/linear2.py
        from sklearn import linear_model
        reg = linear_model.LinearRegression()
        x = [[0, 0], [1, 1], [2, 2]]
        y = [0, 1, 2]
        reg.fit(x, y)
        print(reg.coef_)
        ```
    * [K-近鄰演算法](https://www.javatpoint.com/k-nearest-neighbor-algorithm-for-machine-learning)
        1. 給 K 確定群數
        2. 計算 K 個鄰居的歐氏距離
        3. 根據計算出的歐氏距離取 K 最近鄰
        4. 在這k個鄰居中，計算每個類別中的數據點數
        5. 將新數據點分配給鄰居數量最大的類別
## 第十週
> 現在與六年前(2018)多了生成式AI
> AI大部分是模仿人類，尤其是感官，甚至到現在的機器人

> 傳統邏輯無法倒果為因，而貝式定理可以(Bool)
* 人工智慧的方法
    * 統計 : 2011-2017，找機率最大的解答，[中央極限定理](https://zh.wikipedia.org/zh-tw/%E4%B8%AD%E5%BF%83%E6%9E%81%E9%99%90%E5%AE%9A%E7%90%86)、[貝氏定理](https://zh.wikipedia.org/zh-tw/%E8%B4%9D%E5%8F%B6%E6%96%AF%E5%AE%9A%E7%90%86)
    * 優化 : 現在 AI 幾乎都是，如:神經網路
    * 搜尋 : 下棋
    * 比對 : Eliza
    * 推理 : 知識庫回答

> 傳統神經網路 : 多層感知器(一堆全連階層，效果不好)
> 現代神經網路 : 因為更多層，改稱**深度學習**

* 深度學習神經網路 : 多層感知器 + 
    * 卷積神經網路 CNN (1998) : **學習遮罩**，辨識影像，[ConvNetJS MNIST demo](https://cs.stanford.edu/people/karpathy/convnetjs/demo/mnist.html)
        * 卷積層遮罩函數取邊緣，池化層可降低維度，ReLU激活函數，全連接層
    * 循環神經網路 RNN、LSTM
    * 生成對抗網路 GAN
    * 強化學習機制 Reinforcement Learning : 下棋、倒車
### 神經網路
#### 傳統
> 多層感知器效果無法達到很好，如果表現太好可能是過擬合

> Dropout 隨機捏掉神經元，提升網路的容錯及健康度，避免過擬合
```py=12
# https://github.com/ccc112b/py2cs/blob/master/03-人工智慧/05-神經網路/01-傳統神經網路/01-MNIST/train.py
n_epochs = 6
batch_size_train = 64
batch_size_test = 1000
learning_rate = 0.01
momentum = 0.5         # 為防止梯度消失突然停止而增加動量
log_interval = 10
```
#### 深度學習
> 神經網路的模型可以亂試，只要確保輸入跟輸出的 size

> NAS (Neural Architecture Search) : 拼湊出最好的網路

> 一層的效果可能也不錯

> 最後硬 train 一發就解決了[name=李宏毅教授]
```py=0
# https://github.com/ccc112b/py2cs/blob/master/03-人工智慧/05-神經網路/02-深度學習/01-MNIST/fc1.py
import torch.nn as nn
import torch.nn.functional as F

class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.fc1 = nn.Linear(28*28, 10)

    def forward(self, x):
        x = x.view(-1, 28*28)
        x = self.fc1(x)
        return x
```
## 第十一週

### 強化學習
> 強化學習套件 : [Gymnasium](https://gymnasium.farama.org/) 提供一個測試強化學習模型的環境

> 問題的輸出可分為 **離散** 跟 **連續的**
> 強化學習很多算法是 Q-learning 的延伸，如:Sarsa

#### 理論
> 近期 AI 的進步在於 [馬可夫鏈 (Markov Chains)](https://zh.wikipedia.org/zh-tw/%E9%A9%AC%E5%B0%94%E5%8F%AF%E5%A4%AB%E9%93%BE)
> 「在狀態轉移的過程中，下一個狀態只受到現在狀態的影響，與過去狀態無關」。
> 參數越多，越容易猜對下一步，因此造就大語言模型的成功

> Reference [演算法/吉布斯&馬可夫](https://hackmd.io/@Jung217/HJ-AsTPka#%E5%90%89%E5%B8%83%E6%96%AF-amp-%E9%A6%AC%E5%8F%AF%E5%A4%AB)

* [馬可夫模型](https://en.wikipedia.org/wiki/Markov_model)：雖然算機率，但只是數字相乘，沒有隨機採樣
    * [馬可夫鏈](https://zh.wikipedia.org/zh-tw/%E9%A9%AC%E5%B0%94%E5%8F%AF%E5%A4%AB%E9%93%BE)
* [吉布斯採樣](https://zh.wikipedia.org/zh-tw/%E5%90%89%E5%B8%83%E6%96%AF%E9%87%87%E6%A0%B7) : 不斷矩陣相乘，最後會收斂，只要轉移矩陣確定，收斂的值都一樣(粗略平衡)
* 蒙地卡羅法
    * mcmc(蒙地卡羅-馬可夫) : 模擬達到要求順序的機率
    * mcmcgibbs(...-吉布斯) : 模擬平衡機率(收斂時，a、b個別機率，0.625\*0.3 = 0.375*0.5)

> 如果樣本太少無機率可言，無法抽樣，造成維度災難
> 在語言模型中用向量代替解決問題

> [馬可夫決策過程（Markov decision process，MDP）](https://zh.wikipedia.org/zh-tw/%E9%A6%AC%E5%8F%AF%E5%A4%AB%E6%B1%BA%E7%AD%96%E9%81%8E%E7%A8%8B)
> 是離散時間隨機控制過程，包含**狀態的轉移**及**相應的動作**
![Markov_Decision_Process.svg](https://hackmd.io/_uploads/r17r6ugMC.png =60%x)


> [貝爾曼方程](https://zh.wikipedia.org/wiki/%E8%B2%9D%E7%88%BE%E6%9B%BC%E6%96%B9%E7%A8%8B)最大化動作機率

## 第十二週

### 語言處理

#### 理論
> 自然語言沒有絕對的邏輯
> 因此無法向程式語言一樣被編譯

> 如果真的設計出一套完整的生成語法邏輯，包含完整的中/英文
> 一定會過度，會產生不能用的句子
##### 格狀語法 (Case Grammar)


*欄位填充機制* : 格狀語法感覺並不像是一種語法，而是一種圖形表達結構。為了將語句對應到格狀語法，必須採用某種方法，可以將詞彙填入到這些格子 (Case) 當中。

* Eliza 聊天程式 : 將特定語句找出 >> 後面變* >> 用設定好的片段更改後回應

##### 理解程度較深的問題
> 需要練習或訓練的問題

* LLM 只能回應 Sys1，但 Sys2 不能
    | LLM 回應 | 問題 | 例子 |
    | -------- | -------- | -------- |
    | System1     | 立即反應淺層問題     |   其他   |
    | System2     | 需要思考深度問題     | 數學、下棋     |
* COT (Chain Of Thought)
    * 問一個問題，請 AI 一步一步思考，稱為 Zero Shot COT
    * 問一個問題，**給一個例子**，請 AI 一步一步思考，稱為 One Shot COT
* RAG (Retrieval Augmented Generation) : 搜尋 >> 閱讀 >> 生成回答

#### 傳統
> 很多套件現已不支援
* 逐字翻譯
    * 小世界語言
* 欄位填充
    * Eliza聊天
* 喬姆斯基的語法
#### 深度學習
* 詞向量 : 與其他詞產生連結，依照距離都能夠歸納出相似的詞
    > 詞向量證明用向量比用整數代表詞之間的關系更好
    > 但現今已不重要，用**embedded層**取代，才能融入到神經網路中

## 第十三週
> OpenAI 發佈 GPT-4o[name=2024/05/14]

> 深度學習的未來 : 多模態整合
### Groq API
> [Groq](https://groq.com/)
* Groq API 範例
    ```py
    import os

    from groq import Groq

    client = Groq(
        api_key=os.environ.get("GROQ_API_KEY"),
    )

    chat_completion = client.chat.completions.create(
        messages=[
            {
                "role": "user",
                "content": "Explain the importance of fast language models",
            }
        ],
        model="llama3-8b-8192",
    )

    print(chat_completion.choices[0].message.content)
    ```
    
## 第十四週

### 提示工程
> [提示工程指南](https://www.promptingguide.ai/zh)

> 隨 LLM 發展，提示工程是一門新的學問

> Temperature 參數 : 增加/減少回答的可能性
> 提示詞的基本 : 人事時地物

#### COT & RAG
> 因為 LLM 會跳躍性思考，因此要讓它逐步思考
> 
> 鏈式思考 COT : XXXXX，**請你一步一步來**
> 檢索增強生成 RAG : 搜尋 >> 閱讀 >> 生成回答，e.g. [Perplexity](https://www.perplexity.ai/)

| 名稱 | 零樣本 (Zero Shot) | 少樣本|
| -------- | -------- | -------- |
| 例子     | none     | few     |

#### ReAct
> Reason + Act

> 將不理解的詞進行搜尋，再繼續回答問題

> [LangChain](https://www.langchain.com/)、[DSPy](https://github.com/stanfordnlp/dspy)

* [ReAct 提示](https://www.promptingguide.ai/zh/techniques/react#react-%E6%8F%90%E7%A4%BA)
    ```
    問題 科羅拉多造山帶東部區域延伸到的區域的海拔範圍是多少?
    思考 1 我需要搜索科羅拉多造山帶，找到科羅拉多造山帶東段延伸的區域，然後找到該區域的海拔範圍。
    操作 1 搜索 [科羅拉多造山帶]
    觀察 1 科羅拉多造山帶是科羅拉多及其周邊地區造山運動的一段。
    思考 2 它沒有提到東部地區。所以我需要查一下東部地區。
    操作 2 查找 [東部地區]
    觀察 2 (結果 1 / 1) 東部區域延伸至高平原，稱為中原造山帶。
    思考 3 科羅拉多造山運動的東部區域延伸到高平原。所以我需要搜索高平原，找到它的海拔範圍。
    操作 3 搜索 [高平原]
    觀察 3 高平原指的是兩個截然不同的陸地區域之一。
    思考 4 我需要搜索高平原（美國）
    操作 4 搜索 [高平原（美國）]
    觀察 4 高平原是大平原的一個分區。從東到西，高平原的海拔從 1800 到 7000 英尺 (550 到 2130 米) 不等。[3]
    思考 5 高平原海拔高度從 1800 到 7000 英尺，所以答案是 1800 到 7000 英尺。
    操作 5 結束 [1800 到 7000 英尺]
    ```
## 第十五週
> 張量要小心維度

### 電腦下棋
#### 傳統
> 1952年，圖靈寫了一個西洋棋程式。可是，當時沒有一台電腦有足夠的運算能力去執行這個程式，他就模仿電腦，每走一步要用半小時。最後程式輸了。

* 下棋程式要點:
    * 表示棋盤的方式(二維陣列)
    * 評估函數
    * 搜尋策略的改良(主要)
        * [Minimax](https://en.wikipedia.org/wiki/Minimax) : 我方時MAX，對方時MIN
          ![image](https://hackmd.io/_uploads/BylPPPSEA.png =60%x)
        * [Alpha–beta pruning](https://en.wikipedia.org/wiki/Alpha%E2%80%93beta_pruning) : 順序選擇好，修剪才會好 (從分數高的地方搜尋，下往上看兩層)
          ![image](https://hackmd.io/_uploads/Hyu4uwH4R.png =61%x)
#### 深度學習
> 黃士傑 [MCTS蒙地卡羅樹搜尋](https://zh.wikipedia.org/zh-tw/%E8%92%99%E7%89%B9%E5%8D%A1%E6%B4%9B%E6%A0%91%E6%90%9C%E7%B4%A2)

## 第十六週
### 影像視覺
#### 傳統
> 以特徵為主
* 臉部辨識 : 使用特徵工程，使用遮罩判斷
    ![image](https://hackmd.io/_uploads/SJIcGcR40.png =50%x)
* 手寫(數)字 : 正規化(切成一樣大小) >> 特徵提取
* 指紋識別 : 7個特徵可以分辨全世界的指紋
#### 深度學習
> 之所以叫深度學習，因為神經網路可以變深很多層
##### Models
* [GAN 生成對抗網路](https://zh.wikipedia.org/zh-tw/%E7%94%9F%E6%88%90%E5%AF%B9%E6%8A%97%E7%BD%91%E7%BB%9C) : 早期使用，用兩個對抗，一個評分，一個生成
* [Diffusion 擴散模型](https://zh.wikipedia.org/wiki/%E6%89%A9%E6%95%A3%E6%A8%A1%E5%9E%8B)
![image](https://hackmd.io/_uploads/rkXbI9C4C.png =60%x)
* [ResNet 殘差網路](https://zh.wikipedia.org/zh-tw/%E6%AE%8B%E5%B7%AE%E7%A5%9E%E7%BB%8F%E7%BD%91%E7%BB%9C) : 跳躍連接，保留輸入，可以很多層
![image](https://hackmd.io/_uploads/S1OMkiANA.png)
###### 應用
* 生成影像
* 圖片/影片換臉 : [changeface.online](https://www.changeface.online/)

### 知識推論
> 傳統明確精準，但要很多規則才能
> 現代廣度很大，深度很淺，但答案不一定對

#### 傳統
> 需100%確認才能回答
* 推理引擎 : 將邏輯及事實列出來推論 (專家系統的原型)
  A<=B : -B | A
  [恆真句 tautology](https://zh.wikipedia.org/wiki/%E6%81%86%E7%9C%9F%E5%BC%8F) : 又稱套套邏輯，指在任何解釋下皆為真的命題
    ```py=0
    # https://github.com/ccc112b/py2cs/blob/master/03-人工智慧/11-知識推論/01-傳統知識推論/kbTest.py
    from kb import KB

    code = "A<=B. B<=C&D. C<=E. D<=F. E. F. Z<=C&D&G."
    kb1 = KB()
    kb1.load(code)
    kb1.forwardChaining()
    ```
#### 深度學習
* LLM 大語言模型
* Attentiom
* 向量資料庫
* MOE