AI 基礎概念
什麼是 AI / ML / DL?
💡 比喻:教小孩學認字 想像你在教一個小朋友認字:
- AI(人工智慧):小朋友「學會認字」這件事本身就是智慧的表現
- ML(機器學習):你拿很多字卡給小朋友看,讓他自己找出規律
- DL(深度學習):小朋友的大腦有很多層神經元在處理資訊,越深層越抽象
所以:AI 是目標,ML 是方法,DL 是更進階的方法。
三者的關係
AI(人工智慧) // AI 是最大的概念,讓機器表現出智慧行為
├── ML(機器學習) // ML 是 AI 的子集,讓機器從資料中學習
│ ├── DL(深度學習) // DL 是 ML 的子集,使用多層神經網路
│ │ ├── CNN // 卷積神經網路,擅長影像辨識
│ │ ├── RNN // 遞歸神經網路,擅長序列資料
│ │ └── Transformer // 注意力機制,現代 LLM 的基礎
│ ├── 決策樹 // 像是一連串的 if-else 判斷
│ ├── SVM // 支持向量機,找最佳分界線
│ └── KNN // K 近鄰演算法,物以類聚
└── 專家系統 // 用人類定義的規則來做決策
用 C# 理解 AI 的概念
// 傳統程式:人類寫規則
public string ClassifyEmail(string email) // 傳統方式:人類定義所有規則
{
if (email.Contains("免費")) // 人類告訴電腦「看到免費就是垃圾信」
return "垃圾信"; // 每個規則都要人寫,很累
if (email.Contains("中獎")) // 而且規則可能不夠全面
return "垃圾信"; // 騙子換個說法就破功了
return "正常信"; // 傳統程式的極限就在這裡
}
// ML 的方式:讓機器從資料中學規則
public class SpamClassifier // ML 方式:機器自己學規則
{
private MLModel _model; // 模型就像是機器的「大腦」
public void Train(List<EmailData> data) // 餵資料給機器學習
{
_model = ML.Train(data); // 機器自己找出垃圾信的規律
} // 不用人類一條一條寫規則
public string Predict(string email) // 用學到的規律來預測
{
return _model.Predict(email); // 機器根據學到的模式判斷
} // 即使遇到新的詐騙手法也能辨識
}
監督式 vs 非監督式 vs 強化學習
💡 比喻:三種教學方式
- 監督式學習:老師出題,每題都有標準答案(有答案的考卷)
- 非監督式學習:給你一堆東西,自己分類(沒人告訴你怎麼分)
- 強化學習:玩遊戲,做對加分做錯扣分(邊玩邊學)
監督式學習 (Supervised Learning)
// 監督式學習:每筆資料都有標籤(答案)
var trainingData = new List<LabeledData> // 訓練資料,每筆都有正確答案
{
new("今天加班到很晚", "負面"), // 告訴機器這句話是「負面」情緒
new("週末去海邊玩", "正面"), // 告訴機器這句話是「正面」情緒
new("考試沒過好難過", "負面"), // 有標籤的資料越多,學得越好
new("升職加薪了耶", "正面"), // 就像老師批改的考卷越多,學生越進步
};
// 常見應用場景
// 1. 分類問題:垃圾郵件偵測、情緒分析、疾病診斷
// 2. 迴歸問題:房價預測、股價趨勢、溫度預報
非監督式學習 (Unsupervised Learning)
// 非監督式學習:資料沒有標籤,讓機器自己找規律
var customers = new List<CustomerData> // 只有資料,沒有分類標籤
{
new(Age: 25, Spending: 5000), // 機器會自己發現這些人消費習慣相似
new(Age: 30, Spending: 4500), // 不需要人類事先定義「這是高消費群」
new(Age: 55, Spending: 15000), // 機器自己會把相似的客戶歸在一起
new(Age: 60, Spending: 18000), // 這就是「分群」(Clustering)
};
// 常見應用場景
// 1. 客戶分群:找出不同類型的消費者
// 2. 異常偵測:找出信用卡盜刷行為
// 3. 推薦系統:「買了這個的人也買了那個」
強化學習 (Reinforcement Learning)
// 強化學習:透過獎勵和懲罰來學習最佳策略
public class GameAgent // 遊戲 AI 代理人
{
public Action ChooseAction(State state) // 根據當前狀態選擇動作
{
// 一開始隨機嘗試(探索)
// 慢慢學會哪些動作會得到獎勵(利用)
// 最終找到最佳策略
return ExploreOrExploit(state); // 探索 vs 利用的平衡
}
public void Learn(double reward) // 根據結果學習
{
// reward > 0:這個動作不錯,下次多做
// reward < 0:這個動作不好,下次少做
UpdateStrategy(reward); // 更新策略,越來越聰明
}
}
// 常見應用場景
// 1. AlphaGo:學會下圍棋
// 2. 自動駕駛:學會開車
// 3. ChatGPT 的 RLHF:根據人類回饋學會更好的回答
訓練集 / 驗證集 / 測試集
💡 比喻:考試準備
- 訓練集 (Training Set):課本和練習題(用來學習的)
- 驗證集 (Validation Set):模擬考(邊學邊測,調整學習方法)
- 測試集 (Test Set):正式考試(學完後才考,評估真正實力)
// 資料分割的概念
var allData = LoadData("dataset.csv"); // 載入所有資料
// 常見的分割比例:70% 訓練、15% 驗證、15% 測試
var trainSet = allData.Take(700); // 70% 的資料拿來訓練模型
var validSet = allData.Skip(700).Take(150); // 15% 拿來調整超參數
var testSet = allData.Skip(850); // 15% 留到最後評估模型效果
// 為什麼要分三份?
// 訓練集:模型從這裡學習規律
// 驗證集:檢查模型有沒有「死記硬背」(過擬合)
// 測試集:最終成績單,模型從沒看過這些資料
資料分割的重要原則
// ❌ 錯誤:用訓練資料來評估模型
model.Train(allData); // 用所有資料訓練
var score = model.Evaluate(allData); // 用同樣資料評估,成績一定很好
// 這就像考試前先看到考卷答案,考 100 分也不代表你真的會
// ✅ 正確:分開訓練和測試資料
model.Train(trainSet); // 只用訓練集學習
model.Tune(validSet); // 用驗證集調整參數
var score = model.Evaluate(testSet); // 用從沒看過的資料評估
// 這才是模型真正的實力
過擬合與欠擬合
💡 比喻:學生的學習狀態
- 過擬合 (Overfitting):死記硬背型學生,課本題目全對,但換個數字就不會
- 欠擬合 (Underfitting):還沒學會的學生,連課本題目都答錯
- 剛好 (Good Fit):真正理解的學生,新題目也能舉一反三
// 用 C# 比喻過擬合
public class OverfitStudent // 過擬合的學生
{
// 死記所有題目的答案
private Dictionary<string, string> _memorized = new() // 把答案背下來
{
["1+1="] = "2", // 背了這題
["2+3="] = "5", // 背了那題
["10+20="] = "30", // 只要是看過的題目都會
};
public string Answer(string question) // 回答問題
{
if (_memorized.ContainsKey(question)) // 如果是背過的題目
return _memorized[question]; // 答對!
return "不知道"; // 新題目就完全不會
}
}
// 用 C# 比喻剛好的學習
public class GoodFitStudent // 真正理解的學生
{
public string Answer(string question) // 回答問題
{
var numbers = ParseNumbers(question); // 理解題目的結構
return (numbers[0] + numbers[1]).ToString(); // 用學到的規則計算
// 即使遇到新的數字組合也能算出答案
}
}
如何避免過擬合?
// 1. 增加訓練資料量
var moreData = CollectMoreData(); // 資料越多,模型越不容易死記硬背
// 2. 正則化 (Regularization)
var options = new TrainingOptions // 訓練設定
{
L2Regularization = 0.01f, // 懲罰過於複雜的模型
}; // 就像告訴學生「不要想太複雜」
// 3. Dropout(隨機丟棄神經元)
var layer = new DropoutLayer(0.5); // 訓練時隨機關閉 50% 的神經元
// 就像考試時隨機遮住一半的筆記,逼你真正理解
// 4. 早停法 (Early Stopping)
while (training) // 持續訓練
{
if (validationLoss > previousLoss) // 如果驗證集的表現開始變差
break; // 就停止訓練,避免過擬合
}
常見 AI 應用場景
// AI 在各領域的應用
var aiApplications = new Dictionary<string, List<string>> // AI 應用場景大全
{
["自然語言處理 NLP"] = new() // 處理人類語言的 AI
{
"ChatGPT / Claude 對話", // 聊天機器人
"機器翻譯", // Google 翻譯
"情緒分析", // 分析評論是正面還是負面
"文件摘要", // 自動整理重點
},
["電腦視覺 CV"] = new() // 處理影像的 AI
{
"人臉辨識", // 手機解鎖
"自動駕駛", // Tesla 的自駕系統
"醫療影像診斷", // AI 看 X 光片
"OCR 文字辨識", // 拍照轉文字
},
["推薦系統"] = new() // 猜你喜歡什麼
{
"Netflix 推薦電影", // 根據你看過的推薦
"YouTube 推薦影片", // 越看越停不下來的原因
"電商推薦商品", // 「買了這個的人也買了...」
},
["生成式 AI"] = new() // 創造新內容
{
"文字生成 (GPT, Claude)", // 寫文章、寫程式
"圖片生成 (DALL-E, MJ)", // 用文字描述生成圖片
"音樂生成 (Suno)", // AI 作曲
"影片生成 (Sora)", // AI 拍電影
},
};
Python vs C# 在 AI 領域的角色
// Python:AI 研究和訓練的首選語言
// 優勢:
// - 豐富的 AI 套件(TensorFlow, PyTorch, scikit-learn)
// - 社群資源最多,論文範例幾乎都用 Python
// - 語法簡潔,適合快速實驗
// C#:AI 應用部署和企業整合的好選擇
// 優勢:
// - ML.NET:微軟官方機器學習框架
// - Semantic Kernel:整合 LLM 的框架
// - ONNX Runtime:跑推論超快
// - 企業級 Web API 整合方便
// 用 C# 呼叫 AI 服務的範例
using var client = new HttpClient(); // 建立 HTTP 客戶端
client.DefaultRequestHeaders.Add( // 加入 API 金鑰
"Authorization", "Bearer YOUR_API_KEY"); // 認證用的標頭
var request = new // 建立請求內容
{
model = "claude-sonnet-4-20250514", // 指定使用的模型
max_tokens = 1024, // 最多回傳 1024 個 token
messages = new[] // 對話訊息陣列
{
new { role = "user", content = "你好" } // 使用者的訊息
}
};
var json = JsonSerializer.Serialize(request); // 把物件轉成 JSON 字串
var content = new StringContent( // 建立請求內容
json, Encoding.UTF8, "application/json"); // 指定編碼和格式
var response = await client.PostAsync( // 發送 POST 請求
"https://api.anthropic.com/v1/messages", // API 端點
content); // 請求內容
var result = await response.Content // 讀取回應
.ReadAsStringAsync(); // 轉成字串
Console.WriteLine(result); // 印出 AI 的回答
🤔 我這樣寫為什麼會錯?
❌ 錯誤 1:以為 AI 就是萬能的
// ❌ 初學者常見迷思
// 「AI 可以取代所有工程師」
// 「AI 什麼都能做,只是我不會用」
// ✅ 正確觀念
// AI 是工具,不是魔法
// AI 擅長:模式辨識、大量資料處理、重複性工作
// AI 不擅長:創造性思考、因果推理、理解常識
// 就像計算機很擅長算數,但它不會「理解」數學
❌ 錯誤 2:混淆 AI、ML、DL 的關係
// ❌ 錯誤理解
// 「AI 和 ML 是不同的東西」
// 「深度學習比機器學習更好」
// ✅ 正確理解
// AI ⊃ ML ⊃ DL(包含關係) // DL 是 ML 的子集,ML 是 AI 的子集
// 不是越深越好,要看問題類型 // 小資料量用深度學習反而會過擬合
// 有時候簡單的線性迴歸就夠用了 // 殺雞不需要用牛刀
❌ 錯誤 3:忽略資料品質
// ❌ 只追求模型,不管資料
var dirtyData = new List<Data> // 品質很差的資料
{
new(null, "正面"), // 輸入是空的
new("很棒", null), // 標籤是空的
new("asdfjkl", "正面"), // 輸入是亂碼
};
model.Train(dirtyData); // 垃圾進,垃圾出 (GIGO)
// ✅ 先清理資料再訓練
var cleanData = dirtyData // 資料清理流程
.Where(d => d.Input != null) // 過濾掉空值
.Where(d => d.Label != null) // 確保標籤存在
.Where(d => IsValidText(d.Input)) // 檢查輸入合法性
.ToList(); // 乾淨的資料才能訓練好的模型
model.Train(cleanData); // 資料品質決定模型品質