# 第1周:
## 一維函數微分
![1](https://hackmd.io/_uploads/SJffnCS3p.png)
## 梯度
### 此圖可以看到這是三維的曲面代表是二維的函數,高度為函數值,輸入:x、y,高度:f(x,y),箭頭所表示上方所對應的點梯度為多少,梯度為最斜方向的斜率,因此給予任意一點都會計算出箭頭方向,此稱為梯度。
![2](https://hackmd.io/_uploads/HJhNaRH26.png)
## 偏微分
### 把某一特定的當成變數,其餘當成常數,x*x對應x微分->2x,xy對應x微分-->y(常數),y*y對應x微分->把y視為常數,因此為0
![3](https://hackmd.io/_uploads/ByLW-183T.png)
### 梯度算法:執行迴圈把所有偏微分排成一排,最後得到的向量為梯度
![4](https://hackmd.io/_uploads/ryc7zy8hp.png)
![5](https://hackmd.io/_uploads/H1F_NyL3a.png)
## 向量:空間的距離到零之間
## Loss function(區域最低點):損失函數中的損失就是實際值和預測值的殘差。
## CrossEntropy(交叉熵):
### 觀測預測的機率分佈與實際機率分布的誤差範圍
### 舉個例子:我們預測的機率分佈為橘色區塊,真實的機率分佈為紅色區塊,藍色的地方就是 cross-entropy 區塊,紫色現為計算出來的值。
### 前面提到,預測值與實際值差越多,也就是代表內涵的資訊量愈大,也就是不確定越多,也就是 Cross-entropy 會越高。
![11](https://hackmd.io/_uploads/SJsTbLI26.png)
### 反之,如果疊合的區塊越多,就代表不確定性越少,也就是 cross-entropy 會越小
![12](https://hackmd.io/_uploads/BkB1M8Lhp.png)
## 梯度下降法:
### 給予隨機三變數,透過梯度下降法就會找到三變數的最低點
### 最低點為x=1,y=2,z=3
![8](https://hackmd.io/_uploads/r1gdRS82a.png)
![9](https://hackmd.io/_uploads/r1D4kLU2a.png)
### 尋找損失函數,在MSE中,在5個點上(y)-線性方程上的線所預測x、y值為多少,最後得到的誤差再乘以平方加總表示為最小平方法
### 損失函數=MSE
### 使用梯度下降找出預測損失率的最小值且最後繪畫出結果圖
![6](https://hackmd.io/_uploads/ryhHHk82p.png)
### 梯度下降法顯示了尋找5個點並在同一條線上擬合,被稱為回歸
![7](https://hackmd.io/_uploads/ByPISkInp.png)
### SOTA:State of the ART(先進科技)
# 第2周:
## 簡易爬山演算法 -- 針對單變數函數
### 從第19行看到f為任一單變數函數、x=0,第3行執行一個while迴圈,看左右兩邊有沒有更好的解,如果有就移過去。然後反覆的作這樣的動作,直到旁邊的解都比現在的更差時,程式就停止,然後將那個位於山頂的解傳回
![2](https://hackmd.io/_uploads/BJOwJYa2a.png)
![3](https://hackmd.io/_uploads/rkEM1K62T.png)
## 二維爬山演算法
### 前者函數 f(x) 只有一個變數,因此只能調整 x 值的大小,二維爬山演算法是對於兩個變數的 f(x,y) 而言,除了調整 x 以外,還可以調整 y
![4](https://hackmd.io/_uploads/B1sV-ta2T.png)
![5](https://hackmd.io/_uploads/Bk04ZFp3T.png)
## 爬山演算法-通用框架
![1](https://hackmd.io/_uploads/SkbCJOT3a.png)
# 第3周:
## 旅行推銷員問題
### 給定一系列城市和每對城市之間的距離,求解訪問每座城市一次並回到起始城市的最短迴路。
### citys 變數表示包含了城市座標的列表,path 變數表示初始路徑,distance(p1, p2) 函式:計算兩個城市之間距離,pathLength(p) 函式:計算給定路徑長度
![1](https://hackmd.io/_uploads/HJ4yH8OpT.png)
# 第4周:
## 模擬退火演算法:
### 能量相等於爬山演算法中的高度,差別在於是使用一個隨機機率決定變差時是否要過去
### 採用以溫度調控的機率特性,讓爬山演算法有機會跳脫較差的區域,因而找到更好的解。
### 跳出局部最優解,尋找到全局最優解或接近全局最優解。這是因為它允許在一定機率下接受較差的解,特別是在高溫階段,而隨著溫度降低,這種機率也逐漸減小,從而逐步收斂到一個較優的解。
![5](https://hackmd.io/_uploads/BJinoylC6.png)
## 基因演算法:
```
傳演算法具有保存良好基因的特性,並且藉由下列公式不斷改進。這個公式就是交配 (Crossover) 機制所造成的效果。
> 良好基因 (父) + 良好基因 (母) = 更好的個體
```
## 使用隨機來列舉:
![7](https://hackmd.io/_uploads/rkM-kxxR6.png)
## 使用隨機進行排列:
![8](https://hackmd.io/_uploads/rJVvyeg0p.png)
## 深度優先搜尋(DFS)演算法的工作原理如下:
```
1.首先將圖的任一個頂點放在堆疊的頂端。
2.取出堆疊頂部的項目並將其新增至存取清單。
3.建立該頂點的相鄰節點的清單。將不在存取清單中的新增至堆疊頂部。
4.不斷重複步驟2和3,直到堆疊為空。
```
## Ans:
### 先使用具有 5 個頂點的無向圖
![1](https://hackmd.io/_uploads/BJ6QFdMF6.png)
### 從頂點 0 開始,DFS 演算法首先將其放入 Visited 清單中,並將其所有相鄰頂點放入堆疊中。
![2](https://hackmd.io/_uploads/ryvKKuGKT.png)
### 接下來,訪問堆疊頂部的元素(即 1)並訪問其相鄰節點,由於 0 已經被訪問過,所以我們訪問 2。
![3](https://hackmd.io/_uploads/r1xxJq_MKT.png)
### 頂點 2 在 4 中有一個未訪問的相鄰頂點,因此我們將其添加到堆疊頂部並訪問它。
![4](https://hackmd.io/_uploads/S1HGqdfYT.png)
![5](https://hackmd.io/_uploads/BJOG9_Gtp.png)
### 當我們訪問完最後一個元素3之後,它就沒有任何未訪問過的相鄰節點了,所以我們就完成了圖的深度優先遍歷。
![6](https://hackmd.io/_uploads/HJbBcdMKT.png)
## 廣度優先搜尋(BFS)運作方式:從根開始,先訪問某一層的所有節點,然後遍歷下一層的節點,直到訪問完所有節點,為此,使用隊列。目前層級的所有相鄰未存取節點都被推入佇列,當前層級的節點被標記為已存取並從佇列中彈出
## Ans:
### 最初佇列和存取陣列都是空的
![7](https://hackmd.io/_uploads/Sy-oOa7Yp.png)
### 將節點0推入佇列並標記為已存取
![8](https://hackmd.io/_uploads/HJDTd6XYa.png)
### 將節點0從佇列的前面移除,並存取未造訪的鄰居並將它們推入佇列。
![9](https://hackmd.io/_uploads/BkKyYaQKa.png)
### 將節點1從佇列的前面移除,並存取未造訪的鄰居並將它們推入佇列
![10](https://hackmd.io/_uploads/rJDftpXKa.png)
### 將節點2從佇列的前面移除,並存取未造訪的鄰居並將它們推入佇列
![11](https://hackmd.io/_uploads/By1StamKp.png)
### 將節點3從佇列的前面移除,並存取未造訪的鄰居並將它們推入佇列,我們可以看到節點 3 的每個鄰居都被訪問,因此移動到佇列前面的下一個節點。
![12](https://hackmd.io/_uploads/H1qdKpXKp.png)
### 將節點4從佇列的前面移除,並存取未造訪的鄰居並將它們推入佇列,我們可以看到節點 4 的每個鄰居都被訪問,因此移動到佇列前面的下一個節點。
![13](https://hackmd.io/_uploads/rJXstpQYT.png)
### 最後,Queue 變空了,所以,終止這些迭代過程。
## 佇列有一個特性就是先進先出(First In First Out, FIFO),意思就是在一個串列中,先讀取的資料先輸出。
## A*搜尋演算法:
## 原理:
```
f(n)=g(n)+h(n)
f(n)為起點到終點的距離
g(n)為起點到任意頂點(目前位置)的實際距離
h(n)為任意頂點到目標頂點(終點)的估算距離
f(start) = 0 + h(start)
h(n) = |goal.x - n.x| + |goal.y - n.y| # 曼哈頓距離
```
### 曼哈頓距離:只能以直或橫線的方式來移動
### 適用於遊戲中的尋徑
# 第5周:
### 深度學習=神經網路, 差別在於深度學習多了模型
## 梯度
### 對每個變數用偏微分(偏導數)一次,且把那些已經偏微分過的變數蒐集起來
### 各方向向量的集合
![1](https://hackmd.io/_uploads/BkfBXncAT.png)
## 梯度下降:
### 如果梯度計算出來不是0,就會往逆梯度方向前進(-1*h),如果往正梯度走會不斷上升。
![2](https://hackmd.io/_uploads/HkwQOh50p.png)
## 正傳遞:
![42](https://hackmd.io/_uploads/B1ONIq4Bp.png)
## 反傳遞:
### q的偏微分=z,z的偏微分=q,已知f=1,要算出q的偏微分就是z,往回乘-->q=1*-4=-4,z就不需要算偏微分了,因為已經是輸入值(樣本),z=3,神經網路只能調整中間的權重,不能調整輸入值,剩下計算內容請看下圖:
![43](https://hackmd.io/_uploads/B1mRic4r6.png)
## 反傳遞算法:
### data-->正傳遞的計算值(q=x+y)、grad-->梯度,prev前面網路節點的部分是例如:q的prev是x、y,f的prev是q、z,init是建構函數(前後都加底線)
![48](https://hackmd.io/_uploads/rylM1iVHT.png)
```
f(x,y,z)=(x+y)*z
```
### 反傳遞算法:
![3](https://hackmd.io/_uploads/HygHF35R6.png)
# 第6周:
### 線性 -> 符合向量加法乘法或是兩個變數之間的變化是直線型態的
### 範例:y = 2x + 3
### 非線性 -> 非直線,二次曲線
### 範例: y = x^2
### 參考
https://medium.com/@adea820616/activation-functions-sigmoid-relu-tahn-20e3ae726ae
## ReLu:
### 會導致梯度變0,梯度下降失效,神經網路收斂
![12](https://hackmd.io/_uploads/ByLnQAPeC.png)
## Leaky ReLu(解決Relu的缺點):
### 改善後可繼續執行
![13](https://hackmd.io/_uploads/rkmwNRvl0.png)
## micrograd:
### f = x**n,微分等於nx^n-1次方*反傳遞值
![1](https://hackmd.io/_uploads/rycvqQ5lR.png)
## macrograd:
### 單一值 -> value、scalar(純量)
### 多維 -> tensor(張量)
### 在shape中,向量、常數、矩陣甚至是三維(多矩陣)都可作為一個張量
### tensor代表n維陣列
![2](https://hackmd.io/_uploads/ryw1hQ9xA.png)
### 乘法不是內積,原理是原數與原數相乘
![螢幕擷取畫面 2024-04-15 122911](https://hackmd.io/_uploads/r1vdaXqgR.png)
### 矩陣相乘的反傳遞
### 反傳遞 -> 向量反傳遞回來
### self.data.T是指data矩陣的transforms相乘反傳遞out.grad
![437947946_2394555880875468_5979634973217162891_n](https://hackmd.io/_uploads/H14I-N5eA.jpg)
![4](https://hackmd.io/_uploads/rkwlCQ5lA.png)
### 參考
https://github.com/cccbook/py2gpt/wiki/softmax
https://mattpetersen.github.io/softmax-with-cross-entropy
### 從這個公式可以看到把每個(X)i輸入後取e^x次方,考慮到有n個,因此全部加總當分母,分子為加總的其中一個
![6](https://hackmd.io/_uploads/ByAMVE5eA.png)
### 答案為s - y ,其中的 s = softmax(x)
![5](https://hackmd.io/_uploads/ryzkX4cxC.png)
## autoGrad:
### sine用數值的方法計算sine函數
![7](https://hackmd.io/_uploads/HJZdDVcgC.png)
### 線性回歸 -> 尋找一條線去做擬合
### 採用邏輯回歸採用加上sigmoid函數,建立dataset開始訓練,並做梯度下降
![8](https://hackmd.io/_uploads/BkD4Y4cgR.png)
## AutoEncoder:
### 一個Encoder,輸出一個vector,其中這個輸出的vector又可以稱為Laten Representation、Latent Code,而Decoder的部份則是以Encoder的output做為input,試圖還原輸入的資訊。訓練的時候,我們要讓Encoder的輸入與Decoder的輸出愈接近愈好。
### 這種模型由兩部分組成:編碼器(encoder)和解碼器(decoder)。編碼器負責將輸入資料壓縮成低維表示,而解碼器則負責將這個低維表示解碼成原始輸入資料。
![9](https://hackmd.io/_uploads/B1kt9V5x0.png)
## softmax:
### x與y的誤差就是梯度
### 計算交叉熵損失函數對 softmax 輸出的梯度時,結果通常是 softmax 輸出和目標值之間的差異。這種差異代表了模型預測和實際目標之間的誤差。
### 如果我們用 s-y,我們得到了一個向量,其中每個元素表示對應類別的預測值和目標值之間的差異。換句話說,這個向量代表了模型的誤差。
![10](https://hackmd.io/_uploads/Bk4eJB5gR.png)
## CrossEntropy(交叉熵):
### 觀測預測的機率分佈與實際機率分布的誤差範圍
### 舉個例子:我們預測的機率分佈為橘色區塊,真實的機率分佈為紅色區塊,藍色的地方就是 cross-entropy 區塊,紫色現為計算出來的值。
### 前面提到,預測值與實際值差越多,也就是代表內涵的資訊量愈大,也就是不確定越多,也就是 Cross-entropy 會越高。
![11](https://hackmd.io/_uploads/SJsTbLI26.png)
### 反之,如果疊合的區塊越多,就代表不確定性越少,也就是 cross-entropy 會越小
![12](https://hackmd.io/_uploads/BkB1M8Lhp.png)
# 第8周:
### 圖片相關套件:NetworkX
## 使用套件
## scipy:
### integrality中的c必須是整數
![2](https://hackmd.io/_uploads/S17daiwe0.png)
## sympy-符號計算:
### sin(x)*exp(x)先做一次微分再來做二次微分
![3](https://hackmd.io/_uploads/Bya4Aiwg0.png)
## autograd:
### 不論是向量、單純數值、矩陣都可用tensor表示
### requires_grad=True 該欄位要有梯度
### o.backward() 呼叫
### 最後x2+y2等於梯度,單一個等於偏微分
![4](https://hackmd.io/_uploads/ryfX-2ve0.png)
### [1.0,2.0] ->向量
### norm表示所有元素的平方和的開根號->歐氏距離
### 計算過程
![6](https://hackmd.io/_uploads/rJpCE2vgC.png)
![7](https://hackmd.io/_uploads/B1WJr3weA.png)
![5](https://hackmd.io/_uploads/ryCAfhPgA.png)
## torchGd:
### learning_rate學習率 、loop_max最大迴圈數
### loss = loss_fn(x) 呼叫損失函數
### 為了讓損失降低,使用loss.backward()算出梯度
### torch.no_grad() 梯度下降
### x -= learning_rate * x.grad 對每個參數往逆梯度方向前進,前進的距離要看learning_rate,learning_rate為1e-3為0.001
![9](https://hackmd.io/_uploads/HJ9P8nPxA.png)
## Cross-entropy:
### 樣本是以統計
### 機率是已知實體、來源分布
![10](https://hackmd.io/_uploads/r1-aunveR.png)
### p(x)為真、q(x)為假
### 以機率為範例:
### 2位元*2、1位元*1
### 前者Pi指出現機率,後者的log Pi,log是取2為底,Pi是編碼位長度是先預設a -> 11 、b -> 10 、 c -> 0
### 最後平均位元數的機率為二分之三,表示最小(最佳編碼方式)
### Cross-entropy的目的為越小越好,透過樣本學習等,最終希望讓Pi=Qi,並找到實際是分布多少
![437803853_3556650621262849_2491719683633727906_n](https://hackmd.io/_uploads/Bkixw6veC.jpg)
### self為一個向量[1/2,1/4],並取log(log_probs),yb(標準答案)乘以log_probs等於zb(Plog(q))
![11](https://hackmd.io/_uploads/HkRSmTPlR.png)
### 編碼上最佳化可當作ai的目標函數
### Pytorch損失函數
https://pytorch.org/docs/stable/nn.html
### 不偏估計:估計量的期望值等於真實參數值
# 第9周:
## 歐式里得幾何:
### 第五-平行公理
### 圖(1)說明如果角1和角2是平行線,則兩者相加為180度,,反之如果小於或大於180度就不是平行線,角1和角2為同側內角
### 圖(2)角2和角3為同位角,180-角1=角2,180-角1=角3,得知角2=角3,如果相等,則平行線
### 圖(3)2條線平行,則為內錯角,角1和角3為對鄰角,因此相等,角2和角3為同位角,也相等
### 如果有任意2條線符合上述其中一個條件,則平行線
![1](https://hackmd.io/_uploads/SyyD58Rg0.png)
## 分類:
### 讀取資料->將target欄位去掉->x(輸入),只取target欄位->y(輸出)
![2](https://hackmd.io/_uploads/rkRtRURxR.png)
## 混淆矩陣(Confusion Matrix):
### 判斷輸出的內容是否正常,從這邊可以知道TP、TN越大越好
![4](https://hackmd.io/_uploads/S1voZvAxA.png)
![3](https://hackmd.io/_uploads/rkrWgwAgC.png)
## precision(精確率):
### 被預測為 Positive 的資料中,有多少是真的 Positive
### 表示預測结果为正例的樣本中實際為正樣本的比例
![5](https://hackmd.io/_uploads/SklPEv0eA.png)
## recall(召回率):
### 在原本 Positive 的資料中被預測出多少
### 表示預測结果為正樣本中實際正樣本数量占全部樣本中正樣本的比例。
![6](https://hackmd.io/_uploads/SkP0EwCeC.png)
## F1-score:
### 精確率和召回率的一个加權平均
## LLM(Large Language Model):
### 可以辨識和產生文字
### 分類:有標記
### 分群:無監督,把一些類似的標籤分在一起
## 分群:
### make_blobs產生群體資料、centers表示多少群、noise設定的大小會影響規則變化
### make_moons產生半月型資料
![7](https://hackmd.io/_uploads/HymgDwRx0.png)
## 迴歸:
### 兩個或多個變數間是否相關
### 在已知或標記的資料集上訓練演算法,然後使用演算法來預測未知值。
### predict表示預測
![8](https://hackmd.io/_uploads/rk9FdD0gA.png)
## knn(最近鄰居法):
### 以圖中為範例,假設以3近鄰來說,隨機給一個樣本,取最近的三個,將會是2個紅色三角型跟一個藍色正方形,最後結果為紅色,因為它是離樣本最近的
![9](https://hackmd.io/_uploads/HkHJ5vRxA.png)
# 第10周:
## 人工智慧:
### 優化法-爬山演算法
### 搜尋法-深度優先搜尋DFS
## 神經網路:
### momentum(動量)可以解決梯度下降變成0就無法執行
## 隨機梯度下降(SGD):
### 學習率太大,容易造成參數更新呈現鋸齒狀的更新,這是很沒有效率的路徑。
### 需考慮動量、步伐大小
## dropout:
### 停止運作某些神經,就像是從神經網路將這些神經去除一樣
### Dropout 為什麼可以解決 Overfitting
### 造成Overfitting: Network 過於複雜(參數量很多)但是擁有的訓練資料又很少
### Sigmoid函数是理解神經網路如何學習複雜問題
## ReLU:
### 一種類神經網路中活化函數 (activation function)的一種
### 用來增加類神經網路模型的非線性,讓我們定義的類神經網路可以更加活化學習,避免像是線性函數一樣較為死板。
### kernel size -> 卷積的矩陣
### in_channel 代表輸入的feature 層數
### out_channel代表輸出的feature 層數
### stride 控制圖像長寬尺寸的方式,會影響Feature map大小
# 第11周:
## 馬可夫鏈
### 一種隨機過程,它具有馬可夫性質,即當前狀態的未來發展只與當前狀態有關,與過去狀態無關。一個馬可夫鏈可以用一個有限或無限的狀態集合來表示,並且每個狀態都有一個轉移概率矩陣,表示在當前狀態下轉移到下一個狀態的概率。
## 馬可夫鏈-迭代學習機率:
### 初斂平衡- 每個節點輸出輸入的機率是一樣
### 細緻平衡- 每條線輸出輸入的機率是一樣
## 狀態機率平衡-gibbs算法+蒙地卡羅法:
### gibbs算法- 在已知「轉移矩陣」的情況下求解每個狀態的平衡機率值
### 蒙地卡羅法-隨機模擬出最後結果,一種機率式狀態機,與狀態機不同的是有機率,轉移是機率式的狀態
## 序列式的機率
### 一開始b的機率為0.8,b轉移到a的機率 -> b=>a = 0.5,a轉移到b -> 0.3,b轉移到b -> 0.5,全部相乘 -> 0.06
![1](https://hackmd.io/_uploads/H1F9RTxMR.png)
## 平衡機率:
### 底下結果來看,第一輪->a:0.2*0.7 + 0.8*0.5 =0.54 、b:0.2*0.3 + 0.8*0.5=0.46
### 第二輪-> a:0.54*0.7 + 0.46 0.5 =0.608 、b:0.54*0.3+0.46*0.5=0.392
### 接著就以此類推,da代表(下一輪機率)a-(上一輪機率)a,db代表(下一輪機率)b-(上一輪機率)b,step代表da*da+db*db的平方根,差異小於0.001就停止,最後印出
![3](https://hackmd.io/_uploads/SJH0QAxf0.png)
## 在蒙地卡羅法上執行gibbs算法:
### MCMC 的 Gibbs 抽樣方法,通過一定數量的迭代(這裡是 1000000 次)來模擬系統的狀態,並更新機率 P,以便最終收斂到一個平衡分佈
![4](https://hackmd.io/_uploads/rknA_ReGC.png)
## 馬可夫決策過程:
### 其優化目標是為決策者找到一個好的策略
### 舉例:假設你是一個機器人,被派往一個倉庫進行自動化運送,你需要從倉庫的起點將商品送到不同的目的地,然後返回起點。每個目的地都有不同的距離和交通情況,並且完成每次運送都會獲得一定的報酬。然而,你也需要考慮到移動的成本,例如能量消耗和時間成本。為了達到這個目標,你可以使用各種策略,例如選擇移動到最近目的地的位置,或者優先選擇最有可能通過的路徑。通過分析每個可能的行動和狀態轉移,你可以找到一個最優的策略。
## 貝爾曼方程:
### 簡化強化學習或者馬爾可夫决策問題
### 舉例馬爾可夫獎勵過程的價值函数(Value function)的定義,分為即時獎勵Rt+1、加了權重y的後續狀態的價值函數yu(St+1)
### 以下是其數學表達式:
```
v(s)=E[Rt+1+yv(St+1)| St-s]
```
### 對於貝爾曼方程只往前考慮一步。在某個狀態下,我做了一個行動,得到了立即回報。我就可以將這個立即回報加上未來後續狀態的價值函數做為我的總體回報。也就是上式中的Rt+1+yv(St+1)
## Q-Learning 算法:
### 无模型(model-free)的强化学习算法,它通过迭代地更新动作值函数来逐渐逼近最优动作值函数,从而实现最优的决策。
### 公式:`$$Q(s_t, a_t)←Q(s_t, a_t)+\alpha(reward+\gamma \max_{a} Q(s_{t+1},a)-Q(s_t,a_t))$$`
### $Q(s_t, a_t)表示在特定狀態st下採取特定動作at所得到的預期收益值。
### alpha是指學習效率,控制了每次更新中新資訊對於原有估計的影響程度。
### reward 是在狀態st下執行動作at後所獲得的即時獎勵。
### gamma是折扣因子,用於衡量未來獎勵的價值。
### max_{a} Q(s_{t+1},a)表示在狀態st+1中,採取所有可能動作後的最大預期收益值。
# 第12周:
![1](https://hackmd.io/_uploads/Hka05-5zA.png)
## Type0語言 - 遞歸可枚舉語言 (Recursive Enumerable , RE):
### 所有語言的集合
### 枚舉器是圖靈機的一種變種,不需要接受输入,枚舉器E所打印出的字串的集合稱為該枚舉器的語言。
### 透過一個特定的枚舉器(記為E)逐步列舉出的語言集合。這個枚舉器會列印出所有屬於該語言集合的字串。如果一個語言集合S可以由某個枚舉器E完全列舉出來,那麼稱這個語言集合S是遞歸可枚舉的。
### 範例:有一个程式E,它能夠打印出所有的偶數,那么所有的偶數的集合就是遞歸可枚舉的,因为我们可以通過這個程式逐步列舉出所有的偶數。
## Type1 語言- 對上下文敏感的語言 (Context-Sensitive):
### 每個規則的左邊至少要有一個非終端項目 A,但其前後可以連接任意規則
### 前後文之間是有關係的
### 範例-生成aaabbbccc 的案例:
![2](https://hackmd.io/_uploads/Sk2djb5MC.png)
## Type 2 語言-上下文無關的語言(Context Free):
### 規則左邊只能有一個非終端項目 (以 A 代表),規則右邊則沒有限制
### 用自然語言表示:
![3](https://hackmd.io/_uploads/S14cab5fA.png)
## Type 3語言- 正規式(Regular):
### 規則的左右兩邊都最多只能有一個非終端項目 (以 A, B 表示) ,而且右端的終端項目 (以 a 表示) 只能放在非終端項目 B 的前面
### 舉例-正規表達式表示ab*,*表示前一個字符的零次或多次重複
### 結果能以'a', 'ab', 'abb', 'abbb', 等等
## 格狀語法 (Case Grammar):
### 不需要先進行剖析,程式會跳過剖析的階段,直接採用物件導向式的方式,會自行根據語意規 則比對的方式進行理解
### 不像是一種語法,而是一種圖形表達結構,透過`欄位填充機制`可將詞彙填入到這些格子
### 根據理解後所得出的結果為:爸爸用榔頭敲釘子
![5](https://hackmd.io/_uploads/BJPXnZsf0.png)
### 參考:
https://github.com/cccresearch/ai2
## 大型語言模型(LLM)
### 深度學習模型,透過吸收大量的文本數據去學習,能從大量的內容中之間的關係,然後回答問題、翻譯、生成文本等
### 無法處理需要深度思考的 System2 問題
## 範例-AI2 -- 呼叫 System2的LLM:
### 可以看到在輸出的時候,用 <python>code</python> 把那些需要 plugin 介入的部分標示出來。
### 而這些 plugin code 當中,對於 LLM 已經知道該呼叫那些函數去做的,由 Python 程式去處理,而不知道該由哪些函數去處理的,則是交給system2()函數去處理。
![6](https://hackmd.io/_uploads/r1P_MMsfC.png)
### 參考:
https://github.com/cccbook/py2gpt/wiki/rnn
## Rnn循環神經網路:
### 沒有循環神經網路 -> 組合邏輯 ,反之 -> 循序邏輯
### RNN 循環神經網路透過加入循環,讓 RNN 可以記住過去的資訊在隱藏層 h 中
![7](https://hackmd.io/_uploads/Syqo8MizA.png)
### 程式碼:
### `self.rnn`定義了一個循環神經網路層,根據method參數,它可以是一個RNN或GRU層,它接受嵌入向量作為輸入,並返回隱藏狀態。
### 其做法為 -> 將x丟給h,變成新的值,再丟給h,這邊表示為線性層,輸出為h,輸入x+h,但輸出跟輸入的h都是同一個,因此就變成循環了
```
class RNNLM(nn.Module):
def __init__(self, method, vocab_size, embed_size, hidden_size, num_layers):
super(RNNLM, self).__init__()
method = method.upper()
self.embed = nn.Embedding(vocab_size, embed_size)
self.rnn = nn.RNN(embed_size, hidden_size, num_layers, batch_first=True) # RNN 也可以改為 GRU
self.linear = nn.Linear(hidden_size, vocab_size)
def forward(self, x, h):
# Embed word ids to vectors
x = self.embed(x)
# Forward propagate
out, h = self.rnn(x, h)
# Reshape output to (batch_size*seq_length, hidden_size)
out = out.reshape(out.size(0)*out.size(1), out.size(2))
# Decode hidden states of all time steps
out = self.linear(out)
return out, h
```
### 這邊可以看到使用RNN或GRU去做循環,hiddens表示n層,做了t次循環
### `ht = self.cell(xt, hprev)`使用RNN或GRU計算`ht`(隱藏狀態)
### `hprev = ht`將當前計算得到的隱藏狀態ht更新為下一個的前一隱藏狀態hprev
![8](https://hackmd.io/_uploads/B1egyXjz0.png)
## 詞向量 word2vec:
### 用於將詞彙表示為連續向量空間中的點
### 模型分別為CBOW、Skip-Gram
### Skip-Gram的想法是用一個詞去預測該情況
### CBOW與Skip-Gram相反,使用目標字詞(中間字詞)來推測周圍字詞(上下文)
### NLP-讓電腦去解釋或理解人類使用的語言
# 第13周:
## groq
### 加速 AI 模型
### API與openai是相容的,除了引入套件不同
### 模型大部分都是開放原始碼的
## Chat:
### openai_key有抓到環境變數就可以使用,否則就不行
![1](https://hackmd.io/_uploads/SJKcYrmmC.png)
### 所使用的模型,如果都沒有就會顯示找不到該模型
![2](https://hackmd.io/_uploads/S1EL5BXQ0.png)
## ai2:
### chat1呼叫API,chat2呼叫API且取回該回應,再把程式碼給取代並呼叫python
![3](https://hackmd.io/_uploads/ryG2oBXQA.png)
## lib:
### 把程式碼中的python的內容使用正規表達式顯示出來
### 呼叫run執行
![4](https://hackmd.io/_uploads/S1fchS7mA.png)
### run的部分是呼叫exec,呼叫時除了把程式碼丟入,然後再設定一個變數_rrr999,最後把變數裡面的值取回來
![5](https://hackmd.io/_uploads/HJ3GpBQ7A.png)
## db:
### 執行&查詢
![6](https://hackmd.io/_uploads/B1dHArQm0.png)
### 呼叫memory_add會插入memory表格
### 呼叫calendar_add會插入calendar表格
### dump可以了解資料庫裡面的內容
### close前要先commit
![7](https://hackmd.io/_uploads/Hyyv0Bm7A.png)
# 第14周:
## 提示工程:
### Temperature - 溫度越高,模型的後選項結果就會越多,便會從中亂數選擇一個,溫度為0就只會選擇第一名而已,因此希望最後結果是比較確定的,溫度參數可以調整越小越好
### 提示詞 - 提示越具体和详细,结果就越好,避免不精确(具体和直接),避免说不要做什么,而是说要做什么
### 透過指令來產生,例如:
```
### 指令 ###
将以下文本翻译成西班牙语:
文本:“hello!”
```
### 結果:
```
¡Hola!
```
### 零样本提示 - 沒有給予ai一個例子去參考,容易造成表現不佳
### 少样本提示 - 有給予ai一個例子去參考,這樣可以使模型实现更好的性能
## 链式思考(CoT) - 通过逐步展开问题并在每个回答中保留之前问题的背景信息,适用于处理复杂或多层次的问题
### 優點:擴大语言模型的能力,解决语言模型的的局限性、大語言模型會跳躍性思考等問題
## 自动思维链(Auto-CoT) - 對具有多樣性的问题進行採樣,並生成推理链来構建示例
## 检索增强生成 (RAG) - 對大型语言模型输出進行優化,使其能够在生成之前引用其他網路上的資訊,這樣最後回答結果比較不容易出錯
## ReAct 框架 - 開放原始碼的前端 JavaScript 工具庫,用於基於 UI 組件構建使用者介面
### 運作方式:問大語言模型問句讓它自己去找不懂的地方,然後自己去搜尋,閱讀完後再回答
# 第15周:
## 電腦下棋:
![1](https://hackmd.io/_uploads/BJGxHWJHC.png)
### 將類別設定棋盤物件,設定最多有幾行、幾列等,預設為'-',表示未下棋的地方
![2](https://hackmd.io/_uploads/SkdbpvkBR.png)
### 將棋盤格式化成字串,標記成`0 1 2 3 4 5 6 7 8 9 a b c d e f`等,
![3](https://hackmd.io/_uploads/Byq2avJrC.png)
### patternCheck表示在檢查連幾子、連線的方式為直式、橫式等
![4](https://hackmd.io/_uploads/HJHD0vyS0.png)
### 檢查是否贏了,勝利條件為連五子,patternCheck在計算連五子的部分
![5](https://hackmd.io/_uploads/B1vGJuySC.png)
### 分別代表攻擊手(狀態為1)、防禦手(狀態為2)分數,連0子~連五子的分數
![6](https://hackmd.io/_uploads/Sk3FydyHA.png)
### `z9` 某一軸都沒有增加
### `i9`逐漸增加
### `d9`逐漸減少
![11](https://hackmd.io/_uploads/SyVn9ukSR.png)
### 計算棋盤、第r行、第c列等分數
### mScores表示根據 mode 參數選擇攻擊或防守的分數
### start 表示棋型的起始位置
### zero+inc表示水平的得分
### inc 表示計算棋型的增量
### `score += mScores[length]`將滿足規則的棋型的分數加到總分數中
![7](https://hackmd.io/_uploads/rJdNxdJB0.png)
### 主程式
### 棋盤大小為16x16
### 檢查 o 是否為 'P'(代表人類玩家),如果是的話就呼叫 peopleTurn(b, 'o') 讓人類玩家下棋。否則就呼叫 computerTurn(b, 'o') 讓電腦下棋
![8](https://hackmd.io/_uploads/HJ2hgOJrC.png)
### peopleTurn表示讓使用者輸入下子的位置
### 如果該位置不是'-'表示已被佔據,不是的話就可下棋,顯示x或o是由哪方下的手,turn表示x或o
### 如果下的那一步是已經重複過的,就會顯示檢查該位置是否已被佔據,便會引發error,再次呼叫peopleTurn
![9](https://hackmd.io/_uploads/HyLpzdJr0.png)
### computerTurn表示讓電腦下棋
### 對於每個列、欄檢查一遍,檢查自己是x或o,對方是x或o
### getScore根據棋盤的狀態和棋子的位置計算分數
### attack 表示這次下棋是攻擊
### turn 是現在的棋子('o' 或 'x'),用於計算攻擊分數
### 檢查這個位置的分數是否高於目前最高的分數。如果是的話,就更新最高分數和對應的位置 (r, c)。這樣,電腦就會選擇分數最高的位置下棋。
![10](https://hackmd.io/_uploads/HkwHmOJBR.png)
## Min-Max對局搜尋法:
### 16x16棋盤有 256 格,代表第一子的下法有 256 種,第二子的下法就有 255 種...
### 假設是搜尋4層,第4層表示Max層無法再往下,在第3層表示Min層,會從下方選擇最小的,從10和無限大來看,會選擇10,選擇完後就會往上,以此類推
### 有的是Max或Min,主要原因是要看是我方下棋或是敵方,我方的話會選擇Max,敵方的話因為要限制對方得分,所以選擇Min是最好選擇
![12](https://hackmd.io/_uploads/ry4NW4lHR.png)
## 演算法:
### 節點表示棋盤
### 當depth(深度)=0時,會回傳盤面評估函數
### 如果是maximizingPlayer 表示我方希望越大越好
### 對下的那些子取最大的並回傳回來
### 如果是 minimizing player
### 就取讓他得分最小的子並回傳回來
### 我方攻擊時取最大的子去下,當敵方下的時候,我方下的子是要讓敵方攻擊時,自己的失分最少
![13](https://hackmd.io/_uploads/HyDe7VxrA.png)
## Alpha-Beta 修剪法:
### 有紅色的兩槓表示可以看到4(最小的)上去後,後面的值都不用計算
### 可以看到第3層的5和4,已確定5比4大,第3層的規則是要取最小的,所以跟5無關,因此會把它修剪掉
### 至於可以看到第4層中的5、9、8、6這邊是Max層,由於5是單獨一個,其他3個是要互相比較,可以直接看到第1層的Min層,所以不管9、8、6如何比較,最小的還是5,因此可以直接把第2層的8直接修剪掉
![14](https://hackmd.io/_uploads/SyiorExrR.png)
## 演算法:
### 與順序有關
### 從下子的區域取最高分開始搜尋並計算分數,才會比較好修剪
# 第16周:
## 影像視覺
### 人臉辨識 - 使用偵測的遮罩去對人臉進行動作,會找到眼睛、鼻子等五官,就可做出辨識出人臉的效果
### 程式碼大部分都在做影像輸出/輸入的處理
## 深度學習
### torchvision -此函式庫包含了視覺相關、預訓練好的模型 ->可做影像辨識
### resnet殘差學習 - 本來是一層一層就會學習,但殘差學習是把前一層的輸入保留,並學習之間的差
### 原本:輸入→特徵
### 變成:輸入→ 輸入 + 殘差
### 好處是即使多一層,什麼都沒有學到,殘差=0,但這樣不會讓模型退化,反之,有學到的話,就是新的特徵,使模型長得更深
![15](https://hackmd.io/_uploads/HJgLJslB0.png)
### `label_colors` 設定辨識到哪種物體時要使用哪個顏色
![16](https://hackmd.io/_uploads/Hy6-bogSR.png)
### Torchtext - 屬於pytorch的文字套件
### Huggingface - 開源模型集散地,整合大量的模型、資料集
### Llama 3 -開源大語言模型
## 知識推論 -推理引擎
### 規則
![18](https://hackmd.io/_uploads/S1_EHjeBR.png)
### 如果B出現,A也會出現,可知B可以推論到A
### C、D都有就可以推論B
### E、F表示成立
### `Z<=C&D&G.` G.這邊還不是事實,因此不算成立,因此Z就不成立
![17](https://hackmd.io/_uploads/rJE_rjlB0.png)
## tautology(套套邏輯) -該式子一定是正確的
### 例子:
```
A=B,B=C,則A=C
```
# 第17周: