# GAI 2024 Project 2.A Report 資訊114 F74106026 李星辰 [Project Requirements](https://hackmd.io/@w-cKMxhqRAGOleYimY6D3Q/HJ-O4fOCT) [Jupyter Notebook](https://github.com/xing5740/GenerativeAIPractice/blob/main/generativeAI_project2A.ipynb) ## Model Analysis ### Model Design 沿用sample code當中的架構,但我新增了一層RNN,也就是 embedding layer -> 3 RNN layer -> output layer ![image](https://hackmd.io/_uploads/SkgZNBteA.png) loss function是cross entrophy, 忽略<pad>字元造成的loss,讓模型可以專注於等號後的結果,也就是我們真正想要的答案 optimizer則是常用的Adam ![image](https://hackmd.io/_uploads/r1j2MdtlR.png) 超參數設定如下: ![image](https://hackmd.io/_uploads/HkWh7dKeC.png) ### Process of Loss Reduction loss在第一個epoch浮動較大,從最開始的超過1.5變成0.8,後面幾個epoch則變化較小,最後逐漸收斂至0.6 ![image](https://hackmd.io/_uploads/Syz-MOYgR.png) ### Results of Validation and Testing train, val, test的資料比例分別是0.8, 0.1, 0.1,validation和train同步進行,test則是在整個train process結束後進行 Test的方法是從test dataset中取一個batch,丟到model中進行predict,然後將predict出的y與原本的y進行比較 (只比較y當中不是<pad>的部分),準確率大約是0.3,結果如下圖: ![image](https://hackmd.io/_uploads/HkyfX_YeR.png) ## Dataset analysis ### Characteristics 除了完整的dataset之外,我還另外生成了兩種dataset variation,我對data進行的處理如下: - **Dataset 1: 去除乘法、保留加減法** 利用pandas.Series.str.contains對data進行filter,只留下加減法的算式 ![image](https://hackmd.io/_uploads/Hkz0iHYgR.png) - **Dataset 2: 去除Dataset 1當中極端值** 計算dataset 1的平均字串長度$\mu$與標準差$\sigma$,保留長度在$\mu - 2\sigma$到$\mu + 2\sigma$之間的字串 ![image](https://hackmd.io/_uploads/rJ3cg9YlC.png) 3個資料集的訓練及測試結果如下 - 完整Data: ![image](https://hackmd.io/_uploads/S1m77khg0.png) ![image](https://hackmd.io/_uploads/HJb87J3x0.png) - Dataset 1: ![image](https://hackmd.io/_uploads/Syz-MOYgR.png) ![image](https://hackmd.io/_uploads/HkyfX_YeR.png) - Dataset 2: ![image](https://hackmd.io/_uploads/BJ7p0qYxA.png) ![image](https://hackmd.io/_uploads/ByWe1jFeR.png) 分成兩部分討論: 1. 完整Data與Variations 從上面的結果可以發現,用完整Data訓練出的模型loss值較高、準確率較低。而Dataset 1測試的準確率不高,但細看model output可以發現其實與正確答案相當接近 我僅保留加減法的運算,是希望模型能夠專注於加減法運算,不要被更複雜的乘法干擾,進而達到比較好的效果。觀察上面的結果,我認為有達到我最初預期的成效 2. Variations (Dataset 1 & Dataset 2) 在dataset 2當中,我會想要以長度作為data篩選的標準,是因為我當初認為以字串的資料而言,最能夠代表的feature除了運算符號外,只剩下長度而已,所以取長度位於兩個標準差內的字串作為訓練資料 但從結果來看,兩者loss與準確率差異並不大,甚至dataset 2的表現比較差。我推測是因為字串長度並非模型訓練的關鍵資訊,且去除長度為極端值的資料後,資料數量下降,導致model表現變差 ## Discussion 我使用的dataset是上面的dataset 1 (加減法),總共有三種不同超參數的model: | Batch Size | Learning Rate (lr) | | -------- | -------- | | 64 | 0.001 | | 128 | 0.001 | | 64 | 0.002 | 3個model的訓練與測試結果如下 - batch_size=64, lr=0.001: ![image](https://hackmd.io/_uploads/Syz-MOYgR.png) ![image](https://hackmd.io/_uploads/HkyfX_YeR.png) - batch_size=128, lr=0.001: ![image](https://hackmd.io/_uploads/H1QtFOKg0.png) ![image](https://hackmd.io/_uploads/HysAtdFeR.png) - batch_size=64, lr=0.005: ![image](https://hackmd.io/_uploads/S1yP0OFxR.png) ![image](https://hackmd.io/_uploads/SJABCOtgC.png) ### Batch Size 從上面的結果可以看出,當batch size增加時,loss明顯增加,準確率明顯下降 (一題都沒答對) 猜測原因如下: batch size代表看了多少資料後對參數進行調整,learning rate則代表對參數進行調整的幅度 所以當batch_size提升、learning rate不變,代表單一樣本對參數更新的影響減少,所以train的效果不明顯;或是在訓練時只看到batch內data,進而陷入局部最優解,使得輸出結果不理想 ### Learning Rate 從上面的結果可以看出,當learning rate增加時,loss同樣明顯增加,準確率明顯下降 (準確率從0.3變成0.1) 猜測原因如下: learning rate增加表示每次對參數進行調整的幅度加大,會造成訓練過程中震盪,難以收斂至最優解,或是離最優解越來越遠,造成loss值增大,最終輸出結果不理想