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