# 章節包:自然語言處理(NLP)W3(9/24)第 03 章「word2vec 的訓練方式」
影片 1:02:56–1:28:24,YouTube ID g0QE6O17BWE。Notion 章節頁 https://app.notion.com/p/3e6fc631b03081f1b4bfe71efbd2cd7a(頁 ID 3e6fc631b03081f1b4bfe71efbd2cd7a),頁面標題「03 word2vec 的訓練方式(1:02–1:28)」。
## 1. 第一行(直接照抄,不要改)
[自然語言處理](https://app.notion.com/p/3e6fc631b03081b4a9e8f91f3411f61f) › [W3(9/24)](https://app.notion.com/p/3e6fc631b03081ff9776f36fab3e6e50) › 03|影片 [1:02:56–1:28:24](https://www.youtube.com/watch?v=g0QE6O17BWE&t=3776s)|投影片 W1_NLP_brief_v2 p.81–90|上一章 [02 分布假說與 LSA/LSI(0:36–0:53)](https://app.notion.com/p/3e6fc631b030815a90adc80645bf2668)|下一章 [04 GloVe、FastText 與向量檢索(1:28–1:46)](https://app.notion.com/p/3e6fc631b03081c5b27ce6cbad0d3d3a)
## 1b. 最後一行(直接照抄,放在 Self-check 後面,當全頁最後一行)
讀完了嗎?下一章:[04 GloVe、FastText 與向量檢索(1:28–1:46)](https://app.notion.com/p/3e6fc631b03081c5b27ce6cbad0d3d3a)|回到週頁:[W3(9/24)](https://app.notion.com/p/3e6fc631b03081ff9776f36fab3e6e50)
## 2. 各段標題(照順序;每段一個 ## 標題,直接照抄連結)
- `## [1:02:56](https://www.youtube.com/watch?v=g0QE6O17BWE&t=3776s) 課間 Slido 問答` 老師講什麼:NTU COOL 的加選是批次處理的。BM25 只是 TF-IDF 的變形,屬於經驗法則。詞向量通常幾百維,不會超過 1K。word vector 分不出「蘋果」和「蘋果電腦」,所以之後需要會看上下文的向量(contextual vector)。
- `## [1:06:49](https://www.youtube.com/watch?v=g0QE6O17BWE&t=4009s) 無限猴子:語言有機率規律` 老師講什麼:用中山大學的猴子,以及「無限多隻猴子總能打出莎士比亞」來說明:人類文章裡的字有機率分布。所以可以讓電腦學「看到這幾個字,下一個字應該是什麼」。
- `## [1:09:40](https://www.youtube.com/watch?v=g0QE6O17BWE&t=4180s) unigram 與 bigram 語言模型` 老師講什麼:unigram 假設字與字互相獨立,一句話的機率就是每個字的機率相乘;bigram 只看前一個字。再延伸到 n-gram。GPT 解碼下一個 token 也是同樣的精神。
- `## [1:11:20](https://www.youtube.com/watch?v=g0QE6O17BWE&t=4280s) CBOW 與 Skip-gram` 老師講什麼:word2vec 論文提出兩種學法。CBOW 像克漏字,看前後文猜中間的字;Skip-gram 反過來,看中間的字猜周邊的字。實務上比較常用 Skip-gram。
- `## [1:13:00](https://www.youtube.com/watch?v=g0QE6O17BWE&t=4380s) 從語料自己造訓練資料` 老師講什麼:context window 設 1 時,掃過句子就得到 (the, cat)、(cat, licked) 這類配對;window 越大,配對越多。老師強調這是設計訓練資料的巧思,後來 BERT 的遮字訓練也是同一招。
- `## [1:16:18](https://www.youtube.com/watch?v=g0QE6O17BWE&t=4578s) 一層隱藏層的神經網路` 老師講什麼:老師不講 NN 的細節,推薦 McCormick 的教學。word2vec 只有 V 和 U 兩個矩陣:輸入 one-hot,隱藏層例如 300 個神經元,輸出要預測周邊的字。「能預測周邊的字就懂字義」是很強的假設;學完以後的 V 就是詞向量。
- `## [1:22:29](https://www.youtube.com/watch?v=g0QE6O17BWE&t=4949s) 一步步拆解:one-hot、查表、輸出權重` 老師講什麼:用只有 8 個字的字典舉例:one-hot 乘上 V,等於把 V 的某一列取出來(embedding lookup,查表)。U 是輸出權重,跟每個字的輸出向量做內積,再經過 softmax,就得到整個字典的機率分布。
- `## [1:25:36](https://www.youtube.com/watch?v=g0QE6O17BWE&t=5136s) 算誤差:cross entropy 與反向傳播` 老師講什麼:前向算出的機率跟正確答案算 cross entropy(交叉熵),再用反向傳播調整 V 和 U。學完把 V 拉出來就是 word embedding。作業一做的就是這件事,但用套件就好,不用自己刻。
## 3. 老師強調/會考/不考的地方(原句已驗證;寫進筆記時 ASR 錯字要改正)
- (1:13:44) [強調] 「其實你會覺得很trivial,但是這個動作其實是一個非常,你說有創意嗎,或是說一個人類的一個,我覺得是一個訓練上的一種巧思」 → Skip-gram 從沒有標註的語料,自己造出輸入與輸出的配對
- (1:15:28) [強調] 「自動化的方式產生一個這樣的監督式這樣的學習,這其實都是後來一個在NLP非常常用的概念」 → 自動產生監督資料(self-supervised)是 NLP 的常用概念,BERT 遮字訓練也是
- (1:16:41) [強調] 「的確我不會講NN的東西,所以你可能要自己catch一下這些概念」 → 老師不教神經網路,要自己補 NN 基礎(需要前置知識摺疊)
- (1:27:09) [強調] 「但是希望你可以去了解說,為什麼人家這個一層的NN就可以搞這麼厲害的事情」 → 要懂為什麼只有一層的網路、只做預測周邊字的訓練,就能學出詞向量
## 4. 這章摘要與重要度
先回答課間 Slido 提問,再從 unigram、bigram 語言模型講到 word2vec 的 Skip-gram:怎麼從語料自己造出訓練資料,以及只有一層隱藏層的網路怎麼學出詞向量。(核心)
## 5. 整堂課的提醒(ASR 錯字、老師口誤、投影片缺公式等;只用跟這章有關的)
- 0:00:00 那句「有任何疑問或感想,歡迎留言…點讚、訂閱、分享」是語音辨識幻覺,不是老師講的;0:01:21–0:02:30 是設定畫面,0:02:31 才開始上課。
- 0:42:31–0:43:48 疑似麥克風干擾(老師先問「有帶電池嗎」,接著說「為什麼幹擾」),逐字稿變成重複的「這個是電」加亂碼,約 1 分多鐘的內容遺失,大約是 brief p.74 的前半段。
- 作業一說明(1:46:39–2:02:06)用的是 NLP_HW1_word_emb.pdf,不在兩份投影片文字檔裡。本機有原檔(自然語言處理\NTHU_Natural_Language_Processing\2026\Assignments\Assignment1\),也有整理好的 自然語言處理\HW1\HW1_Word_Analogy_規定.md。
- W2 投影片這堂實際講到 p.17(困惑度),不只「開頭幾頁」;W2 p.4 跟 brief p.66(Markov/Shannon)是同一張,老師 2:16:45 自己說兩份投影片有重疊。
- YouTube 影片標題寫「Fall 2025」,實際是 2026-09-24 這堂(以網址為準)。
- brief p.68、p.69、p.89 是純圖頁(只有標題或 [IMAGE-ONLY]),0:26:48–0:36:38 那幾張類比圖各在 p.68 還是 p.69,從文字檔確認不了,寫章節時要轉成 PNG 看圖。
- 0:42:31–0:43:48 逐字稿是亂碼(重複「這個是電」加日文、俄文字元),約 1 分多鐘內容遺失,大概是老師在講 p.74「有出現不見得是相關」的前半;需要的話回去看影片。
- 作業一說明 PDF(NLP_HW1_word_emb.pdf)沒有 _text 文字版,第 5 章的 slides 欄無法標頁碼;需要的話先跑 slides_to_text.py。
- SOP 第 1 節寫 NLP-W3 用 W2 投影片的「開頭幾頁」,實際講到 W2 p.17(困惑度),建議改成 W2 p.1–17。
- 老師兩次說詞向量預設「700 多維」(1:04:34、1:22:11),可能跟 BERT 的 768 維混在一起;就我所知,Gensim word2vec 預設 vector_size 是 100,Google News 預訓練向量是 300 維。寫筆記前要再查證。
- 1:28:38 老師先說 GloVe 是 2013 年、又改口說 2014;投影片 p.91 寫 2014,考試照投影片寫。1:32:25 老師說「一般認為 GloVe 比 word2vec 好」,但投影片 p.93 寫「It depends」,Exam-ready 照投影片寫。
- 逐字稿裡 property/priority/publicity 大多是 probability(例:2:34:56「一串字的priority」),但 0:23:03「在算publicity的時候」比較像 perplexity,要看上下文,不能一律取代。
- 新發現的語音辨識錯字(建議加進 fix_transcript.py):WATTO VECTOR/what-to-vector/Wall-to-back/VoltoVector/waterbath/photo vector=word2vec;GrowVac/grow back=GloVe;Fosting=WordSim;Categor Label=character level;angry/engram=n-gram;CBUS=syllabus;基礎學習跟深入學習=機器學習跟深度學習;GPT ISO=GPTZero;turn in=Turnitin;Tica=TAICA;biblicoding=vibe coding;Contactual=contextual;Cross Entry=cross entropy;Wall-Embedded=word embedding;ntu庫=NTU COOL;Chanon=Shannon;Markup=Markov;annual p=NLP;Geno=genome;多利養=Dolly 羊;絞交=繳交;超習=抄襲;1:06:15「到Fur以後」可能是 BERT(不確定)。
## 6. 投影片文字(這章範圍)
**這幾頁的公式或內容只在圖裡(文字檔抓不到),寫 Exam-ready 與公式前先用 Read 看這幾張圖:**
- W1_NLP_brief p.81 → C:\D槽\TAICA課程\_work\notes-v2\nlp-w3\img\brief_W1_NLP_brief_p081.png
- W1_NLP_brief p.82 → C:\D槽\TAICA課程\_work\notes-v2\nlp-w3\img\brief_W1_NLP_brief_p082.png
- W1_NLP_brief p.83 → C:\D槽\TAICA課程\_work\notes-v2\nlp-w3\img\brief_W1_NLP_brief_p083.png
- W1_NLP_brief p.84 → C:\D槽\TAICA課程\_work\notes-v2\nlp-w3\img\brief_W1_NLP_brief_p084.png
- W1_NLP_brief p.86 → C:\D槽\TAICA課程\_work\notes-v2\nlp-w3\img\brief_W1_NLP_brief_p086.png
- W1_NLP_brief p.89 → C:\D槽\TAICA課程\_work\notes-v2\nlp-w3\img\brief_W1_NLP_brief_p089.png
--- W1_NLP_brief p.81 ---
Probabilistic Model: Some Choices
Unary language model
Binary language model
word2vec models (using window to get more context)
Continuous Bag of Words (CBOW)
Skip-Gram (which we will focus on)
Ridiculous not to
consider word order
Better but still limited
by short context
distance
The cat [center word] its fur
[left context] licked [right context]
81
--- W1_NLP_brief p.82 ---
Skip-Gram: Training Data
Corpus
Context window
size = 1
Training Word Pairs
What if context size > 1?
●
More word pairs
●
Only pass two words to the model at a time
The cat licked its fur. The truck
moved.
Center
Context
the
cat
cat
the
cat
licked
licked
cat
licked
its
...
...
82
--- W1_NLP_brief p.83 ---
Model Parameters
word2vec uses a single hidden layer feedforward neural network
1. Input to hidden layer
matrix has our target word
embeddings
2. Hidden to output layer
matrix has another set of
word embeddings called
output embeddings
http://mccormickml.com/2016/04/19/word2vec-tutorial-the-skip-gram-model/
83
--- W1_NLP_brief p.84 ---
Recap: Skip-Gram
Ingredients:
1. A probabilistic model
2. Small chunks of data for training
3. Model parameters
Iterative process:
1. Generate probability estimates
2. Calculate the error in the estimates
3. Update the parameters until optimized
Training word pairs
Neural network parameters V and U
84
--- W1_NLP_brief p.85 ---
Generate Probability Estimates
(1) Input vector selects
input embedding from
hidden layer matrix
(2) Softmax over
multiplication with
output matrix creates
probability distribution
over the vocabulary
This should be high for
context words, low for
others
85
Output weight for “ability”
--- W1_NLP_brief p.86 ---
Network Input
We imagine the words are encoded as “one-hot” vectors (all zeros except a one at the the word
index in the embedding matrix)
the =
cat =
licked =
etc...
86
--- W1_NLP_brief p.87 ---
Embedding Lookup
In practice we don’t do matrix multiplication, but just use the word index to pick out the vector.
87
V
--- W1_NLP_brief p.88 ---
Probability Over Vocab
Our word vector does a dot product with every word’s output embedding, then applying
softmax gives a probability distribution over the vocabulary
88
Output weight for cat
--- W1_NLP_brief p.89 ---
Calculate Error in Estimates
89
[IMAGE-ONLY]
--- W1_NLP_brief p.90 ---
Loss Function
Cross entropy measures the distance between probability distributions
*
90
## 7. 逐字稿(1:02:56 前後各多 1 分鐘,原始行)
[01:02:56] 我們看一下那個slide上有幾個問題
[01:03:12] 就是說我想ntu庫他當初有一個schedule
[01:03:18] 就是什麼加選的時間
[01:03:21] 然後他會批次處理這些前一段加選的這樣子
[01:03:25] 所以可能應該是近期會收到
[01:03:29] 不過anyway就是如果你下週還沒有就再問一下
[01:03:34] 這樣子所以可能應該是近期會收到不過anyway就是如果你下週還沒有就再問一下
[01:03:34] 這樣子因為要開始要寫作業
[01:03:38] 有同學問這個BM25這個那個公式
[01:03:42] 那當初那個式子其實是隻是並沒有要細講每一個東西
[01:03:51] 只是精神上只是告訴你說
[01:03:54] 他就是一個變形的TFIDF這樣子
[01:03:58] 那可能我可以再補充一下上面的一些細節
[01:04:03] 對那不過
[01:04:04] 當初他們做這些東西的概念都是蠻heuristic
[01:04:08] 就是經驗法則
[01:04:11] 就是這樣調一調調一調
[01:04:13] 在這樣的計算底下效果不錯這樣子
[01:04:17] OK
[01:04:18] 第二個如何決定Vector要幾個維度
[01:04:22] 這個
[01:04:24] 這個你在本來這邊問
[01:04:26] 其實以前
[01:04:28] 以前這個Document Vector基本上就是Vocabulary Size
[01:04:33] 但是如果你說要
[01:04:34] 決定Vector
[01:04:36] 這個是我們等下做Embedding的時候會講到的
[01:04:41] 當然你會覺得說我是不是Feature越多越好
[01:04:44] 就像我們在做機器學習一樣
[01:04:46] 我就開大一點幾萬維這樣去表示一個東西
[01:04:51] 的確多一點的確有好處了
[01:04:54] 但是一般後來在做這邊的每一個字的Embedding
[01:04:58] 其實都不會太多
[01:05:00] 就是了不起到1K
[01:05:02] 但是通常也不會到1K
[01:05:04] 這個標準的我記得好像是一個7658還是什麼
[01:05:09] 就是大概一個這樣的幾百個數字的維度
[01:05:13] 就可以來表示所有的這樣的概念
[01:05:17] 當然多也有好處
[01:05:19] 只是說多
[01:05:21] 也有做一些實驗就是
[01:05:23] 如果你有興趣
[01:05:24] 可以找一些這樣Paper
[01:05:25] 但是一般我們在講我Embedding之後
[01:05:27] 你就發現說到那邊
[01:05:29] 其實大家Default做出來
[01:05:31] 大概就是那個700多個維度
[01:05:33] 嗯
[01:05:34] 那複習從World Vector變成Document Vector
[01:05:40] 當然我會講這個差別
[01:05:44] 就是說你發現你用這個World Vector
[01:05:46] 都發現它其實還是不對
[01:05:48] 就是做出來的Apple還是那個向量
[01:05:51] 你在講蘋果在講蘋果電腦
[01:05:53] 都還是Apple那個向量
[01:05:55] 所以後面我們才會說
[01:05:57] 所以所謂這種Contactual Vector還是很重要
[01:06:01] 那就是說怎麼把這個字
[01:06:04] 在那個句子的意思學出來
[01:06:07] 學完之後
[01:06:07] 我們會想去看整個句子
[01:06:09] 或是整篇文章的向量
[01:06:11] 這個當然就是更後期在講
[01:06:15] 這個可能到Fur以後
[01:06:17] 才會有這樣的比較合理一點
[01:06:21] 比較Practical的技術去做所謂的Document Vector
[01:06:25] 大概是這樣
[01:06:27] 那這個NTU COOL上的作業
[01:06:29] 因為當初其實是Mino過來沒錯
[01:06:31] 但是理論上我們應該是
[01:06:33] 呃還沒有Open了
[01:06:34] 但是第一個Assignment應該是看得到的
[01:06:38] 那我們今天會把一些資訊都把它全部Update一下
[01:06:44] 那可能到時候大家再上去看一下
[01:06:47] 好
[01:06:49] 那我們就回到課程部分
[01:06:56] 在講這個之前
[01:06:58] 可能你會覺得怎麼跳到這個機率
[01:07:00] 這個其實會有點關係
[01:07:02] 就是
[01:07:04] 剛好昨天去開會
[01:07:08] 剛遇到中山大學老師
[01:07:10] 他說我們學校的猴子呢
[01:07:12] 都比研究生還勤勞這樣子
[01:07:14] 就是這個早上七八點就會來辦公室報到這樣子
[01:07:19] 然後傍晚也會來一次這樣子
[01:07:22] 對他們現在真的泛濫
[01:07:24] 就是幾乎就是大家可能看過網路上那個影片
[01:07:28] 他們說那是真的
[01:07:29] 沒錯
[01:07:30] 那個有遇過這樣子
[01:07:33] 嗯
[01:07:33] 嗯
[01:07:33] 嗯
[01:07:34] 嗯
[01:07:34] 嗯
[01:07:34] ,那為什麼要講猴子這件事情
[01:07:36] 那在講這個語料的時候
[01:07:39] 其實大家都會有一個有一個說法叫做無限猴
[01:07:45] 不是無限乘
[01:07:46] 就是無限猴
[01:07:47] 就是你你叫你有一大堆的猴子
[01:07:51] 然後給他們一臺電腦
[01:07:53] 就叫他們在鍵盤上打一堆字
[01:07:56] 這樣子
[01:07:57] 因為你有很多隻猴子
[01:07:58] 這樣子
[01:07:59] 其中一定可以有一隻猴子
[01:08:02] 可以打出這個莎士比亞的
[01:08:04] 文章這樣子
[01:08:05] 哦
[01:08:06] 依照機率的觀點來看是合理
[01:08:09] 哦
[01:08:09] 因為莎士比亞的鉅子
[01:08:11] 哦
[01:08:12] 這個字跟著這個字
[01:08:13] 然後雖然很長嗎
[01:08:15] 一篇文章很長
[01:08:16] 但是那個Property是算了出來的
[01:08:18] 那Property算出來之後呢
[01:08:20] 你只要把期望值變成1
[01:08:23] 就會僱用這麼多隻猴子去打這樣子
[01:08:26] 哦
[01:08:26] 哎
[01:08:26] 就有一隻這個可以變成莎士比亞這樣子
[01:08:30] 哦
[01:08:31] 這這其實大家也是告訴你說人類的文章
[01:08:34] 這樣的字的分佈
[01:08:36] 哎
[01:08:36] 他有一定的機率的演算法是
[01:08:39] 哎
[01:08:39] 哦
[01:08:40] 來這個莎士比亞的字
[01:08:42] 到這邊就會講什麼
[01:08:43] 這樣子
[01:08:44] 哦
[01:08:44] 所以他是有一個pattern
[01:08:46] 有一個機率的
[01:08:47] 哦
[01:08:48] 所以如果我們可以學會
[01:08:52] 讓電腦學會說啊
[01:08:53] 你看到這幾個字
[01:08:54] 下一個字應該是什麼
[01:08:56] 以人類的nudge來看
[01:08:58] 他應該是什麼字的時候
[01:09:00] 哎
[01:09:00] 這樣的表示是不是有一點用來呈現
[01:09:04] 這個語言
[01:09:05] 或是每個字的概念的這樣的一個量化的呈現
[01:09:10] 哦
[01:09:10] 所以這個這個年代大家就希望說
[01:09:13] 哎
[01:09:14] 那
[01:09:15] 那我把這個計算的公式寫好之後
[01:09:18] 我就讓電腦去根據人類的文章去學一學
[01:09:24] 哦
[01:09:24] 學完之後
[01:09:25] 他是不是就可以算出哦
[01:09:27] 這個字應該要表示這樣在機率的計算的時候
[01:09:31] 才會是什麼
[01:09:32] 哦
[01:09:32] 才會符合人類的文章的方式啊
[01:09:34] 這樣的分佈哦
[01:09:35] 所以那個年代一堆人在做這件事情哦
[01:09:40] 不過這個這個probability的想法有很多層面
[01:09:44] 或是很多的細緻度
[01:09:46] 那我們來看一下所謂的呃
[01:09:49] 我可以非常單純的啊
[01:09:51] 這個unary language model
[01:09:53] 就是字跟字之間是完全獨立的啊
[01:09:56] 就是我看到一個句子哎
[01:09:58] 他其實他這個句子發生的機率就是每個字發生的機率相乘哦
[01:10:02] 那依照機率來看就是
[01:10:04] 字跟字之間是是完全獨立的事件哦
[01:10:07] 但其實這樣文字不是哦
[01:10:10] 至少會長這樣哦
[01:10:11] binary language model
[01:10:12] 這個其實已經也非常的陽春了
[01:10:15] 就是我下一個字只跟前一個字有關哦
[01:10:19] 我會再看多一點的字這樣子哦
[01:10:22] 所以我一句一句話出來
[01:10:23] 我要算這句話
[01:10:25] 他到底在人類的語言史上發生的機率
[01:10:29] 我就去算所有人類的文字中
[01:10:33] 這個字
[01:10:34] 後面會跟著這個字的property我算出來
[01:10:37] 然後就把這個property乘出來這樣子哦
[01:10:41] 那這個是binary
[01:10:42] 那你可以想象說哎
[01:10:44] 我如果這個更長一點
[01:10:47] 我tri-gram或是4-gram或是更長或是做到n-gram
[01:10:50] 那是不是就好像很complete去計算這件事情
[01:10:55] OK所以我們之後再算所謂的perplexity
[01:10:58] 其實精神上也是這樣
[01:11:00] 我覺得我看到這些字之後
[01:11:02] 看到你你輸入了這些prong之後
[01:11:06] 這個這個GPT要decode下一個token
[01:11:09] 哪一個機率是哪一個字的機率是最高的
[01:11:12] 這樣子哦
[01:11:13] 有點這個味道哦
[01:11:14] 他就我們就是希望能夠可算這個東西是可計算
[01:11:20] 那但是有時候我們說哎
[01:11:22] 那那我要怎麼讓電腦去學這件事情哦
[01:11:26] 那這個是在這個是word2vec當初的paper model
[01:11:30] 提到這兩種的
[01:11:33] 就是有點像
[01:11:36] 你可以說哎你是不是像克漏字的學習
[01:11:38] 但是他要給兩種不同的學習的方式哦
[01:11:42] 那大家就知道說先記一下名字
[01:11:45] 一個叫CBOW一個叫Skip-gram
[01:11:48] 那CBOW其實是比較有點像克漏字的
[01:11:51] 其實叫continuous break of wall
[01:11:53] 就是他其實在算什麼
[01:11:56] 當我這個句子我知道他的前後文
[01:11:59] 我知道前後文的時候
[01:12:02] 我要猜他的center wall
[01:12:05] 就是猜他中間那個
[01:12:06] 那個字哦
[01:12:07] 我可以算他property
[01:12:09] 就有點像克漏字
[01:12:10] 這是CBOW
[01:12:12] 但是一般來講CBOW我們
[01:12:15] 在訓練比較不是那麼直覺
[01:12:17] 然後也比較不容易
[01:12:18] 反向我們會做Skip-gram
[01:12:22] 就是我們會當你看到這個字的時候
[01:12:25] 他前面應該長什麼
[01:12:27] 後面應該長什麼
[01:12:28] 這樣子哦
[01:12:29] 就是有各種可能各種可能比較比較克漏字
[01:12:32] 比較像哎
[01:12:33] 你看到這個字的時候
[01:12:35] 你前面
[01:12:36] 聯想到什麼
[01:12:36] 後面聯想到什麼
[01:12:38] 他會去算出這樣的property
[01:12:41] 那我們之後會帶那個WV的model
[01:12:44] 經驗上就是用這種方式去算的
[01:12:47] 其實有點也像這種BIGRAND的方式
[01:12:51] 就是我給你一個字
[01:12:53] 他下一個字
[01:12:53] 但是我們會看他的co-occurrence周邊的字
[01:12:56] 這樣子
[01:13:00] 所以我們有了語料庫之後
[01:13:02] 根據該Skip-gram
[01:13:03] 我們就一個contact window size是1的
[01:13:06] 就是比如說這句話
[01:13:09] 那我從第一個字開始
[01:13:11] contact window是1代表我就接連的一個字
[01:13:16] 那CENTERWALL是折
[01:13:17] 然後我的contact就是CAT
[01:13:19] 下一個CENTERWALL是CAT的時候
[01:13:21] 他的contact就是折跟lickit
[01:13:24] 就是這樣子
[01:13:26] 就是語料來
[01:13:27] 我就scan一遍
[01:13:28] 我就可以建立出這個TRAINING的WALLPAYER
[01:13:32] 有INPUT有OUTPUT
[01:13:34] 我那字太美好了
[01:13:35] 就是
[01:13:36] 可以訓練
[01:13:37] 就是我有一個SUPERVISED DATA做這件事情
[01:13:43] 我剛才講這個步驟
[01:13:44] 其實你會覺得很trivial
[01:13:47] 但是這個動作其實是一個
[01:13:51] 非常
[01:13:53] 你說有創意嗎
[01:13:54] 或是說一個人類的一個
[01:13:58] 我覺得是一個訓練上的一種巧思
[01:14:02] 就是說
[01:14:03] 當你在記憶學習
[01:14:05] 你只能說
[01:14:05] 老師這個SUPERVISED DATA訓練資料很少
[01:14:09] 每次跟廠商合作
[01:14:10] 他們只標十筆
[01:14:11] 就叫我們做出一個很厲害的模型
[01:14:13] 怎麼可能
[01:14:14] 所以SUPERVISED DATA的多廣跟誇合體
[01:14:18] 會影響模型的能力
[01:14:21] 這大概無用字
[01:14:22] 但是通常絕對你拿不到這麼多
[01:14:26] 尤其是在做大量語料的東西的時候
[01:14:28] 你不帶個人去找語言學家去標說
[01:14:30] 這個字他理論上前後字是不是
[01:14:32] 所以你就要自己設計你的訓練資料
[01:14:37] 那怎麼設計
[01:14:38] 說好吧
[01:14:39] 來找同學一起這樣十個人
[01:14:41] 然後每天都熬夜去標這些
[01:14:44] 其實不用那麼複雜
[01:14:45] 你就自己設計一個方式
[01:14:49] 從UNSUPERVISED的COPUS
[01:14:53] 這個概念就很簡單
[01:14:54] 我就看到CONTEXT
[01:14:56] 他的前後文應該是什麼
[01:14:59] 我的INPUT看到這個字
[01:15:01] 我的OUTPUT應該是CAT
[01:15:02] 我看到CAT的我的OUTPUT應該是THE跟NICKED
[01:15:06] 這樣子
[01:15:07] 所以你就可以去寫一個程式
[01:15:09] scan一下
[01:15:10] 這個把維基百科抓下來
[01:15:12] scan一下這個word pair
[01:15:16] 那你說我可以做CONTEXT WINDOW SIZE.2
[01:15:20] 我就發現變多了
[01:15:22] 一個字前後兩個字
[01:15:24] 他的PAGE就變多
[01:15:26] 我就可以看更多的東西
[01:15:28] 那自動化的方式
[01:15:30] 產生一個這樣的監督式
[01:15:32] 這樣的學習
[01:15:33] 這其實都是後來
[01:15:35] 一個在NLP非常常用的概念
[01:15:40] 因為我們不太可能去找人
[01:15:42] 去標很多的這樣的訓練資料
[01:15:44] 所以這也是為什麼像TRANSFORMAL
[01:15:46] 後來像BIRD這種模型
[01:15:48] 做克漏字
[01:15:50] 做NLM
[01:15:51] 做MASKING這種動作
[01:15:52] 其實就是你可以設計一下
[01:15:54] 這種UNSUPERVISED TRAINING的方法
[01:15:57] 使得他可以大量的自己在那邊學
[01:16:00] 你不用人在介入
[01:16:01] 那人
[01:16:02] 唯一要介入就是提供人類所有的knowledge
[01:16:05] 這樣子
[01:16:06] 好
[01:16:07] 那這是CONTACT WINDOW.1的
[01:16:09] 當然你會覺得好像就是
[01:16:11] 就是SERUNDING的一個字
[01:16:12] 但是2的時候
[01:16:13] 你可以發現
[01:16:14] 我就SERUNDING兩個字這樣子
[01:16:16] OK
[01:16:18] 好
[01:16:19] 我們先看這個圖
[01:16:21] 其實之前有同學問我說
[01:16:22] 如果沒有學過機器學習
[01:16:25] 學這麼個課會不會有點辛苦
[01:16:29] 其實我是覺得還好
[01:16:31] 但是我不知道
[01:16:32] 如果你沒學過機器學習
[01:16:34] 你看這個圖會有什麼感覺
[01:16:37] 可能我不知道你的想象力豐富這樣子
[01:16:41] 的確我不會講NN的東西
[01:16:43] 所以你可能要自己catch一下這些概念
[01:16:48] 那講WATTO VECTOR
[01:16:49] 其實我上面擺一個連結
[01:16:51] 這個連結其實我覺得是蠻平易近人
[01:16:55] 就是你可以看懂那裡面的概念
[01:16:59] 我們先來看這件事情
[01:17:01] 他其實WATTO VECTOR是什麼概念呢?
[01:17:02] 他其實就是在一個非常簡單的一層hidden layer的NN模型做訓練
[01:17:09] 這樣一層其實你可以想像
[01:17:12] 如果你做過類似人性網路的學習
[01:17:14] 你就知道就兩個矩陣
[01:17:16] 就是這邊的A局的weight跟這邊的A局的weight
[01:17:20] 所以我們就是要train出這兩個matrix
[01:17:25] 這兩個matrix前面是V
[01:17:27] 其實就是我們要的embedding或embedding
[01:17:30] 為什麼?
[01:17:30] 這個就是我們要的
[01:17:31] 我們之後再講
[01:17:32] 就是這樣你可以想像一個這樣簡單的一層hidden layer
[01:17:36] 然後我的input是什麼?
[01:17:38] 我的input是我的one-hot的train data
[01:17:43] 就是剛才我們的train data長這個樣子
[01:17:46] 就是這個字進來輸出就是這個字
[01:17:50] 這個字進來我們還不知道他什麼概念
[01:17:52] 但是我就給他one-hot
[01:17:54] 比如說我們的字典
[01:17:56] 1萬個字
[01:17:57] 那他就是長度1萬的一個one-hot的Vector
[01:18:01] 這個one-hot的Vector進來之後
[01:18:03] 假設這個模型已經學好了
[01:18:06] 他就會學會中間這個hidden layer的neuron的表示
[01:18:12] 所以是什麼?
[01:18:13] 我如果這邊有300個neuron代表什麼?
[01:18:16] 我就用這300個hidden state
[01:18:19] 有300個數字
[01:18:20] 300個數字來表示中間我input的這一個one-hot之後
[01:18:25] 他應該要長這300個數字
[01:18:28] 再透過這300個數字呢?
[01:18:30] 這300個數字可能就是描述我這個圖的例子
[01:18:34] 是paper的例子
[01:18:35] 就是這個螞蟻
[01:18:37] 就是這個hands
[01:18:38] 我用這300個數字來描述這個單字
[01:18:41] 然後這300個數字呢
[01:18:42] 再透過這些combination
[01:18:45] 然後去預測他的surrounding text
[01:18:50] 他的context是什麼?
[01:18:52] 所以比如說剛才的這個cat進來之後
[01:18:56] 我就抓出這300個cat應該表示什麼之後
[01:19:00] 再透過
[01:19:00] 那個combination之後
[01:19:01] 我就能就預測說
[01:19:02] 你的surrounding text應該是the跟decade
[01:19:06] 機率要很高
[01:19:07] 其他都要很低這樣子
[01:19:09] 所以如果模型在透過這樣學習
[01:19:13] 他能夠很正確的預測出這個字的surrounding text
[01:19:18] 就在那個contact window下surrounding text
[01:19:21] 那我們其實是可以claim說
[01:19:24] 這樣的模型學會的這樣的一個表示其實是知道
[01:19:30] 人類的文字的概念
[01:19:33] 這是一個非常strong的假設
[01:19:37] 就是他只是預測他的surrounding text
[01:19:40] 但是你說可以預測surrounding text
[01:19:43] 那就懂得文字了這樣子
[01:19:45] 這個這邊的一個claim是這個樣子
[01:19:49] 就跟以前
[01:19:50] 以後我們在講transformer之後
[01:19:53] 就知道說原來做完克漏字之後
[01:19:55] 這個birth就可以告訴我們整句的表示是什麼
[01:20:00] 有點像這樣的味道
[01:20:01] 只是當初是一個非常
[01:20:03] 這個當初其實還沒有deep learning
[01:20:05] 所以他就是這個一層hidden layer的東西去選
[01:20:09] 那我們當初說這兩個vector
[01:20:13] 一個是v的matrix
[01:20:15] 一個是u的matrix
[01:20:17] 那其實整個模型圈完之後
[01:20:20] 其實你的embedding在哪裡
[01:20:21] 你的embedding就是前面第一個v
[01:20:24] 就是你這個第一層的weight的矩陣
[01:20:29] 那個等下
[01:20:30] 你就可以知道這是什麼意思
[01:20:33] 所以在這整個過程
[01:20:34] 這整個過程其實就是
[01:20:36] 我們會有一個機率模型
[01:20:38] 這機率模型就長這樣
[01:20:39] 非常簡單的兩層的這個NN
[01:20:43] 然後你會有剛才我們切出來那些trump
[01:20:45] 那些word pair
[01:20:47] input什麼字output什麼字這樣子
[01:20:49] 然後你現在做模型的參數的學習
[01:20:54] 這邊的學習過程其實就是NN的學習
[01:20:57] 因為你有output data
[01:20:59] 你有output data
[01:21:00] 你就知道說input什麼應該output什麼
[01:21:02] 所以你可以算出loss
[01:21:04] 你可以算出這個NN的loss是什麼
[01:21:07] 然後你就可以去update整個這個參數
[01:21:10] 就是那個uv的參數
[01:21:12] 使得這整個模型圈完之後
[01:21:15] 收斂完之後loss變低了之後
[01:21:17] 它能夠很精確的預測出這個字cat
[01:21:21] cat進去之後
[01:21:22] 它能夠預測出這根decade這樣子
[01:21:26] 它其實精神上就是這樣
[01:21:28] 只是說我們現在是用
[01:21:30] 我們的model就是說我看到CenterWall
[01:21:33] 我要去預測ContextWall
[01:21:36] 所以CenterWall在這裡
[01:21:40] 然後ContextWall在這裡
[01:21:41] 它要能夠predict這樣子
[01:21:44] 所以當然有很多細節
[01:21:48] 包含說我們的VocabularSize一萬
[01:21:51] 我這邊也是VocabularSize一萬
[01:21:53] 就是你要cat要能夠預測
[01:21:56] 所有相對於在這個字典裡面
[01:21:59] 一萬個字的Probability
[01:22:01] 那中間這個就是可能可能剛才有同學問的
[01:22:05] 這個WallVector要設多大的這個這一塊
[01:22:09] 那你可以設300
[01:22:11] 當然我記得好像Default是700多的樣子
[01:22:13] anyway就是你可以自己調整
[01:22:16] 我才說老師我錢很多
[01:22:17] 我設一萬好不好
[01:22:19] 可以但是效果不會比較好
[01:22:22] 就是你可以用更大更長的Vector
[01:22:25] 來學會這個東西的表示
[01:22:29] 好這個這邊的步驟其實就是
[01:22:32] 把NN的細節再帶一遍
[01:22:35] 我先用例子來講一下
[01:22:38] 就是說好比如說我們進來的字就是這些字
[01:22:42] 我們Vocabular就是這個8個字
[01:22:45] 所以我的一開始One-Hot Vector長度就是8
[01:22:48] 然後就是One-Hot像這個cat就是在第二個字是1這樣子
[01:22:52] 所以我的Input就是一個One-Hot
[01:22:55] 而且是VocabularSize的長度這樣的一個Vector
[01:22:59] 然後我透過這個V
[01:23:01] 我們就假設他已經學完了
[01:23:02] 學完之後我這個V做什麼事情
[01:23:07] 他其實就是存著每一個字的最後的Embedding
[01:23:11] 雖然一開始我們不是這樣假設這件事情
[01:23:14] 但是這樣的一箇中間這個Metrics學到了
[01:23:17] 其實因為我這個One-Hot
[01:23:19] 我這One-Hot其實就是把中間這一個第二個Row把它提取出來
[01:23:25] 所以當我看到cat的時候
[01:23:27] 我就Output第二個Row
[01:23:28] 第二個Row就是cat的最後學到的我Embedding
[01:23:32] 這個我Embedding其實你可以想像我們現在在這裡
[01:23:36] 這cat的Vector就是在這300個neuron的數字這樣子
[01:23:40] 這300個neuron的數字cat這是第二層的部分
[01:23:46] cat在後面那一層的Umetrics
[01:23:51] Umetrics其實當初這樣寫有點不太對
[01:23:55] 你會覺得這是也是cat的Metrics
[01:23:57] 不是他其實是對cat來講的Output Weight
[01:24:02] 這什麼意思呢
[01:24:05] 我這邊Highlight這個意思就是
[01:24:08] 這個當初cat進來之後
[01:24:09] 我把這cat的300個數字透過一個
[01:24:15] 你知道NN就是一個Weighted Sound
[01:24:17] 就是我一個把這300個數字做一個加權
[01:24:20] 然後從Max之後我就輸出一個值
[01:24:24] 這個值就是Ability的值的Probability
[01:24:28] 當然中間有一些neuron來源我就省略了
[01:24:32] 這樣的計算代表什麼
[01:24:34] 就是好吧
[01:24:35] 那意思說我可以根據你當初學會的貓的這300個數字
[01:24:41] 加權一下這是cat的Weight
[01:24:45] 這個橘色的箭頭就是cat的Weight
[01:24:47] 然後他可以算出說
[01:24:49] 原來cat跟Ability之間的關係就是學這幾個權重
[01:24:55] 那這個U就大了
[01:24:57] 這U就大多了
[01:25:00] 也不是大多
[01:25:01] 其實是一樣
[01:25:01] 因為這邊也是100
[01:25:02] 這邊是10000到300
[01:25:04] 這邊是300到10000這樣子
[01:25:08] 只是說這邊要學的比較複雜一點
[01:25:11] 就是學我這300個值怎麼去輸出每一個字的Probability
[01:25:18] 你也不要管他怎麼學
[01:25:19] 反正就是NN
[01:25:20] 你只要給他的World Pair Input Output
[01:25:23] 他就可以靠著Loss Backpropagation去學會這些Weight
[01:25:27] 然後學會這個Weight
[01:25:29] 學完Weight的時候
[01:25:31] 我們就把這個Matrix
[01:25:32] 拉出來當成是我學會的Weight Embedded
[01:25:36] OK
[01:25:38] 所以這個過程大概這樣
[01:25:40] 那後面這邊就是在NN學的過程
[01:25:44] 就是你的Input是這樣
[01:25:46] Output是這樣
[01:25:47] 這是你的Training Data
[01:25:48] 但是你真正的Forward Pass之後
[01:25:51] 你的Y Head值會長這樣
[01:25:54] 你會做Normalize之後
[01:25:56] 你會發現這個Probability大概是這樣子
[01:25:59] 有高有低
[01:25:59] 有些比較高這樣子
[01:26:00] 有些比較低
[01:26:02] 我想大家都會做
[01:26:03] 就是我們就算一個Cross Entry
[01:26:06] 就算我的標準答案這樣
[01:26:08] 跟你算出來的每一個這個所有的這些Logic的這種Probability分佈
[01:26:16] 那我可以算一個Loss
[01:26:18] 就是我理論上這個要1
[01:26:20] 你這個Probability怎麼那麼低
[01:26:22] 我就要調整一下
[01:26:23] 我就要Backpropagation回去
[01:26:25] 改變一下我的參數
[01:26:29] 這個參數還有這個參數這樣子
[01:26:31] 這是兩個都是當初的
[01:26:32] NN的參數的東西
[01:26:36] 所以它其實不是DeepLine的東西
[01:26:37] 它其實是一個非常小的模型
[01:26:39] 小的一個以前類神經網路剛開始的長相
[01:26:43] 就是一層Hidden Layer做出來的東西
[01:26:47] 只是靠著這樣學習
[01:26:48] 學到後來發現我們的V-Metrics
[01:26:52] 貌似這些Wall-Embedded
[01:26:55] OK
[01:27:00] 所以我其實都不是用很Homo的東西在講
[01:27:07] 我都是用比較口語的東西在講
[01:27:09] 但是希望你可以去了解說
[01:27:12] 為什麼人家這個一層的NN就可以搞這麼厲害的事情
[01:27:17] 那為什麼這樣的一個Wall-Pair
[01:27:19] Context-Wall的學習的過程
[01:27:24] 我就可以學會說
[01:27:25] 原來這個做出來的Metrics
[01:27:27] 就是每一個字的Embedded
[01:27:30] 然後透過這個字的Embedded
[01:27:32] 我再透過這個
[01:27:34] 這有點像字跟字之間的Bullation
[01:27:37] 你的Metrics去計算出它的Context的Probability
[01:27:43] OK
[01:27:45] 這樣算完之後
[01:27:46] 我就可以得到Wall-Embedded
[01:27:48] 就不再是One-Hot的東西了這樣子
[01:27:52] OK
[01:27:53] 所以我們的第一個Assignment
[01:27:56] 你就是要做這件事情
[01:27:59] 那當然你不用自己刻這些模型
[01:28:03] 那你就呼叫這些Package就有現成的模型
[01:28:06] 或者說以後你也不用做這些模型了
[01:28:07] 你也不用自己創建了
[01:28:08] 反正這些現成的套件Wall-Embedded
[01:28:11] 雖然也不見得會一直用Wall-Embedded
[01:28:14] 反正Wall-Embedded就可以拿人家創建好了
[01:28:17] 然後或我自己再Update一下
[01:28:19] 或我自己創建放Scratch也可以
[01:28:21] 但是精神上就是這樣
[01:28:24] 那我後面有擺兩個
[01:28:29] 一個是GloVe一個是FastText
[01:28:32] 當初做這個Wall-to-back出來之後有一些延伸
[01:28:36] Wall-to-back大概是2013年
[01:28:38] 然後GloVe是2013年
[01:28:40] 現在是2014年
[01:28:42] 大佬在這
[01:28:44] Crystal在這
[01:28:45] Stanford
[01:28:46] 就是他們其實都跟得很快
[01:28:47] 這些新的東西
[01:28:49] 立刻就把展開所有的研究的問題都出來了這樣子
[01:28:55] 那他的想法是什麼
[01:28:57] 你看到這個Global這個字你就知道
[01:29:00] 原來Wall-to-back的是Local
[01:29:02] 它是Global這樣子
[01:29:03] 你可以做這樣的對比
[01:29:05] 的確我們當然剛才的
[01:29:10] 剛才的做康復的這個方式
[01:29:11] Context Window那一塊
[01:29:14] 非常Local
[01:29:15] Context Window等於1
[01:29:17] 你說老師我做大一點做到3
[01:29:22] 也蠻Local的這樣子
[01:29:24] 那GloVe他算的是什麼
## 8. 寫作規則
(這是 `_筆記SOP.md` 第 3.1、4、5、6 節的濃縮版。兩者衝突時以 SOP 為準。)
讀者:碩士生,兩門課期末是英文考試。要只看筆記就能學會,講得比老師好懂。畫面要簡潔。
**概念優先(2026-09-26 主理人)**:主理人只想懂概念,不想補數學、不想看程式碼和座標圖。兩門課的考試也都是問答題、不考算式(AI W1 1:16:52;NLP W3 1:47:41、2:48:36)。所以:
- 每段預設看得到的只有:白話摘要(2–4 句)+**一句生活比喻**(例:模擬退火像投資理財,年輕時敢冒險、越老越保守)+「考試可能怎麼問」一句。
- 數學推導、公式、手算、程式碼、座標圖,全部收進標題寫「(進階,可跳過)」的摺疊,例如「它到底怎麼運作?(進階,可跳過)」。每段最多一個進階摺疊,不要寫長篇計算。
- 演算法要能「用文字說出步驟」(考試可能要你描述),這一點放在預設看得到的地方,不用數字。
- **重心比例**:白話理論與概念模式(它在解決什麼問題、核心想法、跟別的方法差在哪、優缺點、生活比喻)占主要篇幅;數學與程式細節只用一兩句帶過,細節收進進階摺疊。
**圖文並茂(2026-09-26 主理人:不要只有文字)**:
- 每章至少 2–3 個圖,放在**預設看得到**的地方,每個圖前後各用一兩句白話說明「這張圖在看什麼」。
- 流程、步驟、因果、比較 → 用 mermaid 流程圖(```mermaid,flowchart LR 或 TD;節點文字用中文、加雙引號;一張圖不超過 10 個節點)。
- 投影片上的示意圖、架構圖 → 用 [[IMG: …]] 放投影片圖。
- 仍守「每個 ## 段落最多一種視覺元素」。
### 輸出兩個檔
1. `chNN.md`(Notion 寫法,不含頁面標題),結構固定:
- 第一行:章節包第 1 節那行,原樣照抄。
- `## 重點`:三點中文,每點一到兩句。
- `## Exam-ready`:3–10 行英文,**從章節包的投影片文字逐字抄**,每行 `- **Term**: "原句"(Ch3 p.14)`。老師有明確證據才在行尾加 `【老師強調】(h:mm:ss)`。
**每一行下面一定要有一行縮排的中文解釋**(主理人英文不好,看不懂的英文等於沒用):
```
- **Hill climbing**: "It keeps track of one current state and on each iteration moves to the neighboring state with highest value."(Ch4 p.5)
- 中文:爬山法只記住「現在這一個狀態」,每一輪都移到分數最高的鄰居。白話:一直往比較高的地方走一步。
```
中文要先把句子意思講清楚,再補一句白話;難的英文單字括號附中文(例:neighboring state(鄰近狀態))。
- 章節包第 2 節的每一段:`## [h:mm:ss](連結) 標題`(照抄),下面 2–4 句白話摘要,其餘全部收進摺疊:
```
問句(例:用生活例子講,BFS 在做什麼?)
內容
```
摺疊種類(需要才放):用生活例子講?/它到底怎麼運作?/要先懂什麼?(老師假設你會的數學或概念,短版教學)/老師原話是什麼?(「原話」(h:mm:ss),只放重要的,最多 5 句)。
- 「它到底怎麼運作?」要用一組小數字把這段的演算法**真的跑 1–3 步**(例:算出梯度、更新一次、比較兩個 α),不是只示範定義的加減乘除。全章盡量沿用同一組數字,讓前一段的答案能在下一段被驗證。
- 每段正文要回答讀者最可能卡住的一個「為什麼」。投影片公式方向跟題目相反、或投影片說「解不出來」時,用一兩句講出原因,自己補的標(我補充)。
- 投影片句子停在公式前(公式在圖裡)時:Exam-ready 在粗體詞條上補公式、引號內保持原句;正文寫出同一條式子。公式圖看章節包第 6 節列出的 PNG。
- `## Self-check`:2–4 題英文考題,答案收摺疊。**至少一題考老師強調的內容**;不出「老師和投影片哪裡不同」這類不會考的題目。每題格式:
```
Q1. English question?(中文:中文題目)
**Answer**: English answer.
中文:把答案完整講一遍(不是只翻一句),讓看不懂英文的人也知道要怎麼答。
```
- **最後一行**:章節包第 1b 節那行(下一章連結),原樣照抄。讓讀完的人直接點下一章。
- 不要把章節包或這份規則裡的指示句寫進筆記(例如「寫筆記時照投影片寫」「已改正 ASR 錯字」)。
- 長度 8,000–14,000 字元。
2. `chNN.concepts.json`:JSON 陣列,4–12 個考試可能問的術語,每個物件:
`name`(英文)、`zh`、`type`(概念/演算法/公式/人物事件/前置知識/行政)、`signal`("老師說會考"/"老師強調"/"核心(我判斷)"/"")、`evidence`(有 signal 前兩種時必填:原句+時間)、`definition_en`(投影片原句;沒有就註明 (textbook)/(lecture)/(my wording))、`plain`(一句中文)、`a4`(≤150 字元英文,可夾極短中文;期末拼貼用的小方塊)、`time`、`slides`、`prereq`(英文名陣列)。
### 風格鐵律
- 不用 emoji 或裝飾符號(✓✗★⚠ 都不要;→ 可以)。不用 callout。不用 `$`。時間不要用 code 樣式。
- 每個 `##` 段落最多一種視覺元素:一張圖、或一個表格、或一個 mermaid。
- 摺疊標題是問句,前面不加符號。
- 圖片最多 3 張,只放文字取代不了的圖。放法:單獨一行 `[[IMG: | 中文圖說]]`,PNG 用 `slides_to_png.py <圖片資料夾> <頁> --dpi=110` 產生。
- 考試訊號只在老師明確說時標。老師只說「不用背」「不講」就寫「注意:……」。
- 老師口誤或跟投影片不同:照投影片寫,加「注意:老師口頭說的是……」。
- 引用老師的話時,ASR 錯字改成正確的字。
### 沒有投影片時
不要憑記憶逐字重現課本段落或數值表。英文定義用自己的話寫、句尾標 (my wording);Exam-ready 每行標「(自擬,投影片待補)」。例子只用老師講的。
### 寫完之後(只做一次)
跑檢查:
`C:\Users\user\.cache\meeting-record\venv\Scripts\python.exe C:\Users\user\.claude\scripts\check_note.py --transcript <逐字稿> --slides <投影片 txt …> --start <起> --end <訖> --vid <影片 ID>`
- STYLE/VISUAL/TIME/FORMAT:全部改掉。
- QUOTE:確認是不是你改正了 ASR 錯字(是就保留),不是就改成原文或拿掉引號。
- ENGLISH:確認是不是投影片斷行造成的(是就保留),不是就改成投影片原句。
**省額度守則**:章節包裡已經有你需要的全部資料。不要再去讀整份逐字稿、整份投影片、segments.json 或手冊。一次寫好整個檔(Write 一次),檢查後集中修改。