☕ NEW! 完成新手任務即可參加抽獎!LINE 星巴克禮券等你拿,名額有限!        🎉 推廣活動:邀請好友註冊 DevLearn,累積推薦抽 LINE 星巴克禮券! 活動詳情 →        🔥 活動期間 2026/4/1 - 5/31 |已有 0 人參加       
AI 模型 初學

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);               // 資料品質決定模型品質

💡 大家的想法 · 0

載入中...
💬 即時聊天室 🟢 0 人在線
😀 😎 🤓 💻 🎮 🎸 🔥
➕ 新問題
📋 我的工單
💬 LINE 社群
🔒
需要註冊才能使用此功能
註冊帳號即可解鎖測驗、遊戲、簽到、筆記下載等所有功能,完全免費!
免費註冊