### [AI / ML領域相關學習筆記入口頁面](https://hackmd.io/@YungHuiHsu/BySsb5dfp)
### [Deeplearning.ai GenAI/LLM系列課程筆記](https://learn.deeplearning.ai/)
#### [Large Language Models with Semantic Search。大型語言模型與語義搜索 ](https://hackmd.io/@YungHuiHsu/rku-vjhZT)
#### [LangChain for LLM Application Development](https://hackmd.io/1r4pzdfFRwOIRrhtF9iFKQ)
#### [Finetuning Large Language Models。微調大型語言模型](https://hackmd.io/@YungHuiHsu/HJ6AT8XG6)
- [為何要微調(Why finetune)](https://hackmd.io/@YungHuiHsu/HJ6AT8XG6)
- [微調的適用範圍(Where finetuning fits in)](https://hackmd.io/@YungHuiHsu/Bkfyyh7zp)
- [指令調整(Instruction-tuning)](https://hackmd.io/@YungHuiHsu/B18Hg2XMa)
- [資料準備(Data preparation)](https://hackmd.io/@YungHuiHsu/ByR-G24GT)
- [訓練過程(Training process)](https://hackmd.io/@YungHuiHsu/rJP6F2Vf6)
- [評估與迭代(Evaluation and iteration)](https://hackmd.io/@YungHuiHsu/ryfM524Ga)
- [考量與開始(Considerations on getting started now)](https://hackmd.io/@YungHuiHsu/r1KGob8fT)
---
# Finetuning Large Language Models
## [評估與迭代(Evaluation and iteration)](https://learn.deeplearning.ai/finetuning-large-language-models/lesson/7/evaluation-and-iteration)
### 課程概要
* AI 的目的是透過迭代不斷改進模型,評估模型效能是關鍵步驟
* 由於缺乏明確的評估指標,人工評估和高品質的測試資料集對生成模型的評估至關重要
* EleutherAI 提供了一套包括 包括 ARC、HellaSwag、MMLU 和 TruthfulQA等評估方法
* 錯誤分析和模型的手動檢查是評估模型效能的有效方法
* 學術基準測試,如 ARC,可能與實際應用場景不完全相關
### 評估生成模型的困難性(Evaluating generative models is notoriously difficult)
* 生成模型的評估是出了名的困難
* 模型的性能隨著時間的推移不斷提高,而評估指標實際上很難跟上這種速度

1. 人工專家評估是最可靠的
* 由於缺乏明確的評估指標,人工評估成為了最可靠的方式
* 需要有對領域有深入了解的專家來評估模型的輸出
2. 良好的測試資料至關重要
* 高品質 (High-quality)
* 測試資料集必須是高品質的,這意味著它必須是由專家或經過嚴格審查的資料
* 準確 (Accurate)
* 資料集必須經過檢查以確保其準確性
* 泛化 (Generalized)
* 資料集應該涵蓋您希望模型涵蓋的各種測試案例。
* 未在訓練資料中出現 (Not seen in training data)
* 為了確保模型的真正效能,測試資料集中的資料不應該在訓練資料中出現。
3. Elo 比較(Elo comparisons)也很受歡迎
- Elo 排名是一種比較模型性能的方法,最初用於國際象棋排名。現在,它被用來進行模型之間的A-B測試或多模型之間的比較,以了解哪些模型的表現較好
### LLM基準測試: 評估方法組合(LLM Benchmarks: Suite of Evaluation Methods )
大型語言模型的評估需要多種方法來確定其效能。這些基準測試提供了一系列的評估工具,以確定模型在不同任務上的表現

常見的 LLM 基準測試包括:
* ARC (AI2 Reasoning Challenge) 理解和推理能力測驗
* 包含了一系列的多選題目,這些題目都是從學生的科學考試中選出來的,且被認為是對於當前的機器閱讀理解系統來說具有挑戰性的
* ARC 的題目需要深入的理解和推理能力,而不僅僅是表面的文字匹配
* 限制:
* 初級學校的問題集合,因此它可能無法充分評估模型在高級或專業領域的知識。
* 偏重於基礎學科知識,而不是模型的推理或解釋能力
* HellaSwag 用於常識推理的資料集
* 用於評估語言模型推理能力的資料集。它包含了一系列的情境描述和四個可能的結尾,目的是選擇最合適的結尾
* 資料集的設計是為了使傳統的語言模型難以正確預測,從而強迫模型進行深入的推理
* 限制
* "常識"是一個主觀的概念,可能因文化或背景而異,這可能影響模型的評估結果。例如對於熱帶地區的人,冰塊不是生活中的常識
* MMLU (Multi-task Language Understanding)
* 評估模型在zero-shot和 few-shot中的預訓練知識而設計,使其更具挑戰性且更接近於我們評估人類的方式。
* 該基準涵蓋了57個主題,包括STEM、人文學科、社會科學等,難度從初級到專業級別,測試世界知識和問題解決能力。
* 主題從傳統領域如數學和歷史,到專業領域如法律和倫理,其主題的細緻度和廣度使其成為識別模型盲點的理想基準
* 限制
* 偏重於基礎知識,而不是深入的專業知識
:::info
- Zero-shot Learning (零樣本學習)
- 在深度學習中,Zero-shot Learning是指模型在沒有看過任何目標類別的訓練樣本的情況下,仍能夠識別或處理該類別的能力。這通常是通過將學到的知識從已知類別轉移到未知類別來實現的
- Few-shot Learning (少量樣本學習)
- Few-shot Learning是指模型在只有非常少量的目標類別訓練樣本(例如1個或5個樣本)的情況下,仍然能夠有效地識別或處理該類別的能力。這通常需要模型具有很強的泛化能力,並能夠從非常有限的資料中快速學習
:::
* TruthfulQA
* 它測量模型再現在線上常見的虛假信息的傾向
* 這個測試的目的是確定模型是否容易被誤導或再現不真實的信息
* 限制
* 不足以評估模型在辨識真實和虛假信息之間的微妙差異
* 由於網絡上的資訊持續變化,模型需要不斷地更新和調整以保持其效能
### 錯誤分析 (Error Analysis)

進行錯誤分析是確保模型質量和效能的關鍵步驟。通過了解模型的弱點,可以更有針對性地進行改進、提高模型的整體性能
- 在微調之前了解基礎模型的行為 (Understand base model behavior before finetuning)
* 在進行模型的微調之前,首先需要了解基礎模型的行為、分析常見的錯誤並分類
* 這有助於了解和描述基礎模型的表現,從而知道哪些資料對於微調最有幫助
- 錯誤分類 (Categorize errors)
* 識別模型最常見的錯誤類型,以及可能導致這些錯誤的原因
* 一旦識別出錯誤,就可以透過補充訓練資料、迭代訓練修復問題
* 例如,如果模型經常拼錯某些詞,可以在資料集中修正這些拼寫錯誤,或者提供更多的正確拼寫的例子
## Lab: [06_Evaluation_lab_student](https://learn.deeplearning.ai/finetuning-large-language-models/lesson/7/evaluation-and-iteration)
### 深入了解Lamini的llama庫的核心代碼
```python=
finetuned_model = BasicModelRunner(
"lamini/lamini_docs_finetuned"
)
finetuned_output = finetuned_model(
test_dataset_list # batched!
)
```
### 運行模型並與預期答案進行比較
* 首先,加載我們一直在使用的測試資料集
* 使用HuggingFace加載微調後的模型
* 加載一個基本的評估指標來評估模型的輸出是否與預期答案完全匹配
```py=
def is_exact_match(a, b):
return a.strip() == b.strip()
```
* 這種比較對於生成任務來說是非常困難的,因為有很多可能的答案
* 進行評估時,確保模型處於評估模式,以禁用dropout等功能
### 在整個資料集上運行
* 運行模型並查看其在整個資料集上的表現
* 這可能需要一些時間,因此建議先在資料集的一小部分上運行
* 進行評估後,可以手動檢查模型的輸出,看看它與目標答案有多接近
### 評估所有資料
* 除了在資料集的一小部分上進行評估外,還可以在HuggingFace上加載所有資料並手動評估
* 手動檢查在精心策劃的測試集上被認為是最有效的評估方法
```py=
n = 10
metrics = {'exact_matches': []}
predictions = []
for i, item in tqdm(enumerate(test_dataset)):
print("i Evaluating: " + str(item))
question = item['question']
answer = item['answer']
try:
predicted_answer = inference(question, model, tokenizer)
except:
continue
predictions.append([predicted_answer, answer])
#fixed: exact_match = is_exact_match(generated_answer, answer)
exact_match = is_exact_match(predicted_answer, answer)
metrics['exact_matches'].append(exact_match)
if i > n and n != -1:
break
print('Number of exact matches: ', sum(metrics['exact_matches']))
```
- 想當然,用一字不差的匹配方式而非語意當評估指標,會得到精準匹配數量為0的結果
```text=
Number of exact matches: 0
```

### 嘗試ARC基準測試
* ARC是EleutherAI提出的四個大型語言模型(LLM)基準測試之一
* 這些基準測試來自學術論文,用於評估模型在基礎學校問題上的表現
* 儘管這些基準測試在學術界很受歡迎,但它們可能與您的具體用例不相關
* ARC基準測試的得分可能會因模型的微調和大小而有所不同
```text=
!python lm-evaluation-harness/main.py --model hf-causal --model_args pretrained=lamini/lamini_docs_finetuned --tasks arc_easy --device cpu
```
---
## 補充資料
#### [TheoremOne/llm-benchmarker-suite](https://github.com/TheoremOne/llm-benchmarker-suite)

##### 觀察
| Benchmark (Higher is Better) | MPT (7B) | Falcon (7B) | LLaMA-2 (7B) | Llama-2 (13B) | MPT (30B) | Falcon (40B) | LLaMA-1 (65B) | LLaMA-2 (70B) |
|-----------------------------|----------|-------------|--------------|---------------|----------|--------------|---------------|---------------|
| MMLU | 26.8 | 26.2 | 45.3 | 54.8 | 46.9 | 55.4 | 63.4 | 68.9 |
| TriviaQA | 59.6 | 56.8 | 68.9 | 77.2 | 71.3 | 78.6 | 84.5 | 85 |
| Natural Questions | 17.8 | 18.1 | 22.7 | 28.0 | 23.0 | 29.5 | 31.0 | 33.0 |
| GSM8K | 6.8 | 6.8 | 14.6 | 28.7 | 15.2 | 19.6 | 50.9 | 56.8 |
| HumanEval | 18.3 | N/A | 12.8 | 18.3 | 25.0 | N/A | 23.7 | 29.9 |
| AGI/Eval | 23.5 | 21.2 | 29.3 | 39.1 | 33.8 | 37.0 | 47.6 | 54.2 |
| BoolQ | 75.0 | 67.5 | 77.4 | 81.7 | 79.0 | 83.1 | 85.3 | 85.0 |
| HellaSWAG | 76.4 | 74.1 | 77.2 | 80.7 | 79.9 | 83.6 | 84.2 | 85.3 |
| OpenBookQA | 51.4 | 51.6 | 58.6 | 57.0 | 52.0 | 52.0 | 60.2 | 60.2 |
| QuAC | 37.7 | 18.8 | 39.7 | 44.8 | 41.1 | 43.3 | 39.8 | 49.3 |
| Winogrande | 68.3 | 66.3 | 69.2 | 72.8 | 71.0 | 76.9 | 77.0 | 80.2 |
1. **模型大小影響**
較大的模型在大多數基準測試中始終表現出改進的性能。LLaMA-2 70B 尤其脫穎而出,在 10 項基準測試中的 6 項中獲得最高分。這表明模型大小對於在一系列任務中取得優異結果起著至關重要的作用。
2. **尺寸-性能例外**
儘管存在總體趨勢,但在某些情況下,較小的型號勝過較大的型號。值得注意的是,LLaMA 65B 在 BoolQ 和 QuAC 上的表現優於 LLaMA-2 70B。這種現象提出了一個問題:特定任務的細微差別是否會導致這些例外。
3. **基準特定趨勢**
模型的相對表現在不同的基準中存在顯著差異。例如,在 MMLU 上,LLaMA-2 70B 表現出霸主地位,而在 BoolQ 上,模型則表現出極具競爭力的表現。這項觀察結果表明,模型的有效性取決於當前任務的特定特徵。例如,BoolQ 代表相對簡單的資料集,而 MMLU 評估法學碩士的是/否問題的回答能力,要求不太複雜的語言理解。
4. **模型大小帶來的效能提升**
增加模型大小所獲得的收益在各個基準測試中並不一致。例如,從 MPT 7B 到 MPT 30B 的過渡在 MMLU 上產生了顯著的改進,而在 BoolQ 上的增益相對較小。這意味著模型大小和效能增強之間的關係是複雜的並且可能依賴任務。
5. **權衡和任務複雜性**
模型大小擴展帶來的對比性能改進表明模型複雜性和任務特異性之間可能存在權衡。較小的模型可能擅長於具有明確定義模式的任務,而較大的模型可能擅長於需要更廣泛的上下文理解的更複雜、更細緻的任務。
### Orca LLM
#### [Orca: Progressive Learning from Complex Explanation Traces of GPT-4](https://arxiv.org/abs/2306.02707)

#### [2023.09。mvrlink.com。Orca LLM:模拟 ChatGPT 的推理过程](https://www.mvrlink.com/orca-llm-simulating-the-reasoning-processes-of-chatgpt/)
> 从GPT-4的**复杂解释痕迹**中逐步学习介绍了Orca,这是一个13亿参数模型,旨在模仿GPT-4等大型基础模型(LFM)的推理过程。与传统的大型语言模型(LLM)不同,Orca采用独特的培训方法,将渐进式学习和教师协助相结合,以克服较小的学生模型与较大的学生模型之间的能力差距
#### [2023.10。Cameron R. Wolfe, Ph.D。Orca: Properly Imitating Proprietary LLMs](https://towardsdatascience.com/orca-properly-imitating-proprietary-llms-44ffa0293adb)
> Leveraging imitation to create high-quality, open-source LLMs
> 我們可以使用模型本身來監督它自己或其他人工智慧模型的行為嗎?
#### [2323.06。iamgeekydude.com。Orca LLM – Microsoft Research’s Surprise Model](https://iamgeekydude.com/2023/06/28/orca-llm-microsoft-researchs-surprise-model/)


### FreeWilly
#### [2023.07。Stability AI发布FreeWilly系列开源LLM,实力不输ChatGPT](https://zhuanlan.zhihu.com/p/645791689)
> * FreeWilly1 和 FreeWilly2这两种模型都擅长推理和理解语言的微妙之处,并通过各种基准进行验证。
> * 数据生成过程受到 Microsoft 方法的启发,使用来自特定数据集的高质量指令。
> * 尽管与以前的模型相比,FreeWilly 模型在较小的数据集上进行了训练,但仍表现出卓越的性能。
> * FreeWilly2 在某些领域击败了 GPT-4,在大多数领域击败了 GPT-3。
#### [2023.08。https://www.cloudbooklet.com/。How to Get Started with Stability AI FreeWilly](https://www.cloudbooklet.com/use-stability-ai-freewilly/)
