# 人工智慧
> 這是一個關於人工智慧的筆記[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)

### AI 基礎
> [梯度](https://zh.wikipedia.org/zh-tw/%E6%A2%AF%E5%BA%A6) : 神經網路的重要數學基礎,找出函數的最低點>>區域最佳值
> (2維函數圖,箭頭表示最斜方向的斜率)
>
> 
> AI在計算的函數是 Loss Function,常為[交叉熵 Cross entropy](https://zh.wikipedia.org/zh-tw/%E4%BA%A4%E5%8F%89%E7%86%B5)
> (找出兩個機率到底有多不相同,如果值很小,代表兩者機率幾乎一致)
> * 
> 牛頓力學、電磁學 >> 向量
> [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)

## 第二週
* 傳統 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) : 全自動區分電腦和人類的圖靈測試
> 
* [爬山演算法](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**,機率決定變差時是否前往
對於一些小山丘較有機會克服

* 遺傳演算法
* [基因演算法](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)

* 狼、羊、菜問題

* 八皇后問題

* [A* 搜尋法](https://zh.wikipedia.org/wiki/A*%E6%90%9C%E5%B0%8B%E6%BC%94%E7%AE%97%E6%B3%95) : 常用於遊戲中的NPC的移動計算,或網路遊戲的BOT的移動計算上;相對有效率的算法

## 第五週
> 進到物理系像是數學系
> 物理的最前沿 : 粒子...
> 台灣物理最重要的 : 半導體物理(穿隧效應)
### 深度學習_優化算法-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)
* 微分(單變數)
* 梯度(多變數)
* 偏微分(多變數找一個微)
* 梯度下降法
* 找最小值
* 線性擬合(最小平方法)

* 反傳遞算法
* [Hacker's guide to Neural Networks](https://karpathy.github.io/neuralnets/)


***先將 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) 
>
> 
* 微分(單變數)
* 梯度(多變數)
* 梯度下降法
* 反傳遞算法
* [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 的整流函數,但有梯度消失的問題

* [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)

```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維向量,希望輸出相同的結果

## 第七週
> 清明連假
## 第八週
> 任何函數只要有**最小值或最佳目標**,都可以當 AI 的 Loss function
> 在不知道機率分布的情況下,卻有很多樣本,深度學習想透過調整參數,接近原本的機率源
> 以[期望值](https://zh.wikipedia.org/zh-tw/%E6%9C%9F%E6%9C%9B%E5%80%BC)作為損失函數可能造成過擬合的問題

如果模型在驗證集中表現不如訓練,可能已出現過擬合
> 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)「通訊的一個數學理論」
概率理論是夏農使用的重要工具,同時提出了資訊熵的概念,用于衡量消息的不確定性。

可決定編碼時最小的位元數,以[霍夫曼編碼](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)找出兩個機率到底有多不相同,如果值很小,代表兩者幾乎相同

> [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) : 又稱雙曲幾何,第一個非歐幾何。
> 在其之上,畢氏定理不成立 (球體亦同)

> [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. 蒐集取得資料 : 有現有資料集,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)
> 是離散時間隨機控制過程,包含**狀態的轉移**及**相應的動作**

> [貝爾曼方程](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

* [Alpha–beta pruning](https://en.wikipedia.org/wiki/Alpha%E2%80%93beta_pruning) : 順序選擇好,修剪才會好 (從分數高的地方搜尋,下往上看兩層)

#### 深度學習
> 黃士傑 [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)
## 第十六週
### 影像視覺
#### 傳統
> 以特徵為主
* 臉部辨識 : 使用特徵工程,使用遮罩判斷

* 手寫(數)字 : 正規化(切成一樣大小) >> 特徵提取
* 指紋識別 : 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)

* [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) : 跳躍連接,保留輸入,可以很多層

###### 應用
* 生成影像
* 圖片/影片換臉 : [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