[自然語言處理](https://app.notion.com/p/3e6fc631b03081b4a9e8f91f3411f61f) › [W4(10/1)](https://app.notion.com/p/3ecfc631b03081b8aa2cf4a97467ed41) › 05|影片 [1:03:02–1:19:35](https://www.youtube.com/watch?v=7kgOuhuIjvY&t=3782s)|投影片 W2_Word p.43–47|上一章 [04 上下文相關的詞向量(0:49–1:03)](https://app.notion.com/p/3ecfc631b030814cb876f1cf87428b37)|下一章 [06 PyTorch:訓練主循環與 Tensor(0:00–0:25)](https://app.notion.com/p/3ecfc631b03081579f0eeb810083a514) ## 重點 - 深度學習專案有三個基本元件:model(把輸入和輸出串起來的結構)、loss function(量你離目標多遠)、optimizer(決定參數下一步怎麼改)。做研究常改 loss,很少改 optimizer。 - 訓練流程固定六步:準備資料 → 建模型 → 選 loss(常用 cross-entropy)→ 選 optimizer(常用 Adam)→ 訓練 → 評估。 - 老師強調 activation function 非常重要:它讓 NN 能做非線性映射,處理「一刀切不開」的資料。常見的有 sigmoid、ReLU、tanh、GELU。 ## Exam-ready - **Model**: "A model refers to the architecture or structure used to represent relationships between input data and output predictions."(W2_Word p.44) - 中文:model 是一種架構,用來表示「輸入資料」和「輸出預測」之間的關係。白話:model 就是那台把輸入變成答案的機器。architecture(架構)、represent(表示)、predictions(預測)。 - **Optimizer**: "An optimizer is an algorithm used to adjust the parameters of the model during training in order to minimize the error between predicted and actual output values."(W2_Word p.44) - 中文:optimizer 是一種演算法,在訓練時調整模型參數,讓「預測值」和「真實值」的誤差越來越小。白話:它決定下一步參數往哪改、改多少。adjust(調整)、parameters(參數)、minimize(最小化)。 - **Loss function**: "A loss function (objective function) measures the difference between the predicted output of a model and the true target output."(W2_Word p.44) - 中文:loss function(也叫目標函數)量的是模型預測和正確答案之間差多少。白話:它是一把尺,告訴你離目標還有多遠。objective function(目標函數)、measures(衡量)、target(目標)。 - **Adam**: "Adam: Adaptive Moment Estimation"(W2_Word p.45) - 中文:Adam 是「自適應動量估計」的縮寫,是一種常用的 optimizer。白話:它會自己判斷這一步該走大步還是小步。adaptive(自適應的)、moment(動量)、estimation(估計)。 - **Activation function**: "The core idea of using activation functions is to introduce nonlinearity into neural networks."(W2_Word p.46)【老師強調】(1:09:02) - 中文:使用 activation function 的核心想法,是把「非線性」帶進神經網路。白話:沒有它,NN 再多層也只會畫直線。introduce(引入)、nonlinearity(非線性)。 - **Why nonlinearity**: "Neural network models aim to avoid the final processing stage being merely a linear transformation of the inputs, so that the model is able to have good performance on complex problems."(W2_Word p.46) - 中文:神經網路要避免「最後的結果只是輸入的線性轉換」,這樣模型才能在複雜問題上表現好。白話:只會加權相加的模型,學不會彎彎曲曲的規律。merely(僅僅)、linear transformation(線性轉換)、complex(複雜的)。 - **Sigmoid** (range [0, 1]): "It often used in binary classification tasks where a threshold is needed to predict probabilities of belonging to one of the two classes."(W2_Word p.47) - 中文:sigmoid 輸出在 0 到 1 之間,常用在二元分類,配一個門檻值來判斷屬於兩類中的哪一類。白話:輸出像機率,超過 0.5 就判成「是」。binary classification(二元分類)、threshold(門檻)。 - **tanh** (range [-1, 1]): "It is often preferred over sigmoid for hidden layers as it produces zero-centered output"(W2_Word p.47) - 中文:tanh 輸出在 -1 到 1 之間,因為輸出以 0 為中心,隱藏層常選它而不選 sigmoid。白話:正負對稱,訓練起來比較穩。hidden layers(隱藏層)、zero-centered(以零為中心)。 - **ReLU** (range [0, +inf]): "It introduce nonlinearity and avoid gradient vanishing"(W2_Word p.47) - 中文:ReLU 帶來非線性,而且能避免梯度消失。白話:小於 0 變 0,大於 0 原樣輸出,簡單又不會讓訓練卡住。gradient vanishing(梯度消失)。 - **Softmax** (range [0, 1], sum up to 1): "It is commonly used in multi-class classification tasks where the model needs to predict the probability distribution over classes."(W2_Word p.47) - 中文:softmax 常用在多類別分類,讓模型輸出「每一類的機率」,加起來等於 1。白話:把一排分數變成一份機率分配。multi-class(多類別)、probability distribution(機率分配)。 ## [1:03:02](https://www.youtube.com/watch?v=7kgOuhuIjvY&t=3782s) NN 為什麼快速帶過 老師說接下來的 NN 內容跟第一堂 lab(裝 PyTorch、訓練一個簡單的 NN)有關,本來是機器學習課的內容,所以快速帶過。 為什麼還要講?因為現在的深度學習幾乎都建立在 NN 上。差別只在架構,例如用不用 Transformer。以前常見的 SVM、決策樹,現在做這類任務已經很少用。 SVM(支援向量機)和決策樹是 NN 流行之前的機器學習方法:SVM 找一條最寬的分界線把資料切成兩邊,決策樹像一連串是非題,一路問到答案(我補充)。Transformer 是現在 ChatGPT 這類大型語言模型用的 NN 架構,之後的課會講。 投影片 p.43 把這件事接回語言模型:"Neural LMs leverage neural networks to learn and represent complex language patterns." 意思是:neural language model(神經語言模型)用神經網路去學、去表示複雜的語言規律。詞向量裡藏著特徵,需要一個模型結構來處理它;投影片列的兩種基本結構是 FFN(前饋網路)和 RNN(循環神經網路)。 詞向量就是用一排數字代表一個字(第 3 週學過:word2vec 讓意思相近的字數字也相近,例如貓和狗靠得近,[W3](https://app.notion.com/p/3e6fc631b03081ff9776f36fab3e6e50))。FFN 是資料從輸入一路往前算到輸出、不回頭的最基本網路;RNN 會把前一個字算完的結果帶給下一個字,適合處理一串文字(我補充;老師下週從 p.48 接著講這兩個)。 考試可能怎麼問:為什麼現代 NLP 幾乎都用神經網路?
老師原話是什麼? 「其實都是Based on這個NN的一個這樣的一個Architecture在做,其實幾乎沒有別的選擇」(1:03:40) 「你不太會用以前的所謂像什麼SVM啊、Decision Tree啊去做這樣的事情」(1:04:12)
## [1:04:20](https://www.youtube.com/watch?v=7kgOuhuIjvY&t=3860s) Model、Optimizer、Loss function 一個深度學習專案有三個元件。model 用權重把輸入和輸出串起來;loss function 量你現在離目標還有多遠;optimizer 根據這個距離,決定參數接下來怎麼改。 這裡的「權重」(weight)就是「參數」(parameter):模型裡一大堆可以調整的數字。模型一開始等於亂猜,訓練就是一直調這些數字,直到預測變準(我補充)。 最容易卡住的「為什麼要分成兩個」:loss 只負責「打分數」,不負責「怎麼改」。量出來差很多,不代表知道往哪走,所以需要 optimizer 來決定方向和步伐。 老師補充:做小型深度學習研究時,常會自己設計 loss function;optimizer 很少動,除非你專門研究 optimizer。 下面這張圖是三個元件怎麼一起轉: ```mermaid flowchart LR A["輸入資料"] --> B["Model 用權重算出預測"] B --> C["Loss function 量預測和答案差多少"] C --> D["Optimizer 決定參數怎麼改"] D --> B ``` 圖裡的回圈就是「訓練」:每轉一圈,參數就被改一次,預測就更接近答案。
用生活例子講? 老師的比喻是讀書:loss function 告訴你「還有十門課沒讀」,optimizer 告訴你「接下來該怎麼讀、先讀哪門」。 也可以想成開車導航:loss 是「離目的地還有幾公里」,optimizer 是「下一個路口往哪轉、開多快」。
## [1:05:53](https://www.youtube.com/watch?v=7kgOuhuIjvY&t=3953s) 訓練流程與 Adam 訓練 NN 的標準流程有六步,下面這張圖照順序排出來: ```mermaid flowchart LR A["1 準備資料:訓練集與測試集"] --> B["2 建模型:PyTorch 等框架"] B --> C["3 選 loss:常用 cross-entropy"] C --> D["4 選 optimizer:Adam、SGD"] D --> E["5 用訓練集訓練"] E --> F["6 用測試集評估:F1、LCS 等指標"] ``` 框架方面,TensorFlow 早期比較紅,因為好上手;但它包裝太多、不好改,所以現在多半用 PyTorch。 圖裡幾個名詞的白話(我補充):框架是寫 NN 用的現成工具包,PyTorch 和 TensorFlow 都是。訓練集是給模型練習的題目,測試集是留到最後、模型沒看過的考題。cross-entropy(交叉熵)是分類題最常用的 loss:模型給正確答案的機率越低,扣分越重(第 3 週老師說過 NN 和 cross entropy 要自己補,就是這個)。SGD(隨機梯度下降)是最基本的 optimizer:每次拿一小批資料,照固定步伐往 loss 變小的方向走一步(AI 第 3 週學過:梯度就是「往哪個方向走,分數變化最快」,[AI W3](https://app.notion.com/p/3e6fc631b0308137bbd8e73f5c6f1b62))。F1 是同時看「抓得準不準」和「抓得全不全」的分數;LCS(最長共同子序列)看模型輸出和標準答案有多少字順序一樣,常用來評分模型寫出來的文字。 optimizer 做的事,是看你跟目標的差距,決定這一步跨大步還是小步。Adam 的特色是會動態調整 momentum(動量,可以想成「延續上一步的慣性」):該慢的時候慢,該快的時候快。 老師講了一個真實笑話:有篇論文寫「It's done by Adam」,審稿人回「Who is Adam?」,以為 Adam 是一個人。老師用它說明現在有些審稿不太專業。 考試可能怎麼問:請描述訓練一個神經網路的步驟。 下面的進階摺疊在回答:「optimizer 一直改參數,到底改出什麼結果?」它用一個只有一個數字要調的小模型,跑給你看 loss 從 16 變 4、最後變 0,代表預測一步步貼近正確答案。看懂「loss 越來越小」就夠,不用記算式。
它到底怎麼運作?(進階,可跳過) 用一個只有一個參數的小例子跑兩步(我補充)。 - 設定:模型是「預測 = w × 輸入」,輸入 2,正確答案 6,一開始 w = 1。 - 第 1 步:預測 = 2,loss 用「差距的平方」= (6 − 2)² = 16。optimizer 發現 w 太小,把 w 往上調到 2。 - 第 2 步:預測 = 4,loss = (6 − 4)² = 4,變小了,代表方向對。optimizer 再把 w 往上調。 - 一直轉到 w = 3,預測 = 6,loss = 0。 Adam 的差別在「每步調多少」:一路都往同一方向時,它會加大步伐;方向開始來回跳時,它會縮小步伐。
## [1:08:44](https://www.youtube.com/watch?v=7kgOuhuIjvY&t=4124s) 宣布下課、改看 lab 老師說作業一要走的就是剛剛那套流程,但程式碼大多是現成的,自己要改的地方不多。 接著宣布下課:接下來的一個半小時,回去看第一個 lab 的錄影(就是本週第 06–09 章的 PyTorch 教學)。有問題在 Slido 上問,助教會回覆。 注意:老師宣布下課後,又多講了約 5 分鐘的 activation function,才真正收尾。 ## [1:09:02](https://www.youtube.com/watch?v=7kgOuhuIjvY&t=4142s) Activation function:非線性 【老師強調】(1:09:02) activation function 的概念非常重要。它是 NN 能走進「真正有用的年代」的關鍵。 為什麼?如果只用線性的方法,只能用一條直線把資料「一刀切成兩邊」。很多資料不是一刀能分開的。NN 每個神經元的核心其實還是加權相加(像 regression,迴歸),但神經元之間接上 activation function,串起來之後就能處理非線性問題。 神經元(neuron)是 NN 裡最小的計算單位:把收到的幾個數字各乘一個權重再加起來,再丟進 activation function 決定輸出多少。迴歸(regression)就是只做前半段「加權相加」來預測一個數字,所以只會畫直線(我補充)。 下面這張投影片圖把四種常見的 activation function 畫在一起: [[IMG: C:\D槽\TAICA課程\_work\notes-v2\nlp-w4\img\brief_W2_Word_p046.png | 投影片 p.46:sigmoid、ReLU、tanh、GELU 四條曲線疊在一起]] 圖上橫軸是輸入 x,縱軸是輸出。sigmoid 和 tanh 是平緩的 S 形;ReLU 左邊平在 0、右邊斜直往上;GELU 很像 ReLU,但在 0 附近比較圓滑。 圖上重點: - 標題 Activation functions:激活函數,接在神經元後面的那個小函式。 - 第一句:使用 activation function 的核心想法,是把「非線性」帶進神經網路。 - 第二句:要避免網路最後的結果只是輸入的「線性轉換」(只是加權相加),模型才能處理複雜問題。 - 第三句:常用的有 Sigmoid、ReLU、tanh、GeLU。 - 右邊的圖:橫軸 x 是輸入、縱軸 f(x) 是輸出。這張圖在講「同一個輸入,被不同函式變成多少」:sigmoid 壓在 0 到 1,tanh 壓在 -1 到 1,ReLU 和 GELU 把負的變成(接近)0、正的一路往上。 考試可能怎麼問:為什麼神經網路需要 activation function?
要先懂什麼? 「線性」的意思是:輸出 = 輸入乘上權重再相加。它的特性是,兩層線性疊起來,結果還是一層線性(我補充)。例如先乘 2 再乘 3,等於直接乘 6。 所以沒有 activation function 的話,NN 疊一百層也等於一層,只能畫直線。中間插一個非線性的函式,這個「合併」就做不到了,模型才真的變得更有表達力。
## [1:10:10](https://www.youtube.com/watch?v=7kgOuhuIjvY&t=4210s) Sigmoid、ReLU 與硬體加速 sigmoid 把輸出壓在 0 到 1 之間。它只在 x 接近 0 時敏感;x 很大或很小時,輸出幾乎不變。ReLU 比較「暴力」:小於 0 的一律變 0,大於 0 的原樣輸出。 靈感來自大腦:神經元之間靠鉀離子、鈉離子的濃度傳訊號,濃度到一定程度才觸發。activation function 不是真的在模擬大腦,而是借用這種「過濾」的控制效果。 ReLU 的問題是在 0 那一點突然轉折,不可微分,對訓練不好。GELU 這類函式就是 ReLU 的平滑版本,連續又可微。 可微分的意思是:曲線上每一點都算得出斜率(我補充)。optimizer 要靠斜率,也就是梯度(AI 第 3 週學過:梯度告訴你往哪個方向走、分數變化最快,[AI W3](https://app.notion.com/p/3e6fc631b0308137bbd8e73f5c6f1b62)),才知道參數該往哪改;某一點算不出斜率,就像導航在那個路口突然沒訊號。 注意:老師口頭把 tanh 和 GELU 放在一起,說成「ReLU 的平滑版」。照投影片的圖,tanh 是 -1 到 1 的 S 形曲線,跟 sigmoid 同一類;貼近 ReLU 的平滑版是 GELU。 做硬體加速時,這些函式太難用電路做(每個神經元都要算一次,成本很高)。所以會改設計一個容易用電路做出來的近似函式,速度快很多,再去看模型效能掉了多少。 下面整理投影片 p.47 的四個函式: | 函式 | 輸出範圍 | 常用在哪 | |---|---|---| | softmax | 0 到 1,全部加起來等於 1 | 多類別分類,輸出每一類的機率 | | sigmoid | 0 到 1 | 二元分類,配門檻值判斷 | | tanh | -1 到 1 | 隱藏層,輸出以 0 為中心 | | ReLU | 0 到無限大 | 帶來非線性、避免梯度消失 | 老師對這張表只用一句帶過:可以把它們想成特殊的正規化函式,對數值做一點壓縮和調整。 表裡名詞的白話(我補充):二元分類是只有兩種答案的題目(例如是不是垃圾信);多類別分類是三種以上答案選一個;隱藏層是輸入層和輸出層中間的那些層;以 0 為中心是輸出有正有負、平均在 0 附近;梯度消失是訓練訊號從後面往前面的層傳時越乘越小,前面的層幾乎學不到東西。這裡的正規化,是指把數字壓到固定範圍。 下面的進階摺疊在回答:「同一個數字丟進不同函式,會變成什麼?」它把 -2、0、3 丟進 sigmoid、ReLU、tanh,讓你親眼看到三種輸出範圍;後半段說明梯度消失怎麼發生:sigmoid 兩端太平、斜率太小,乘過很多層之後訊號就沒了。
用生活例子講? sigmoid 像音量旋鈕的「安全範圍」:不管你轉多大,音量最多到 1、最小到 0,中間那段最靈敏。 ReLU 像水龍頭的單向閥:負的(倒流)一律擋掉變 0,正的就原樣流過去。
它到底怎麼運作?(進階,可跳過) 拿三個輸入 x = -2、0、3 跑一次(數值四捨五入)。 - sigmoid:-2 → 0.12;0 → 0.5;3 → 0.95。三個都被壓進 0 到 1。 - ReLU:-2 → 0;0 → 0;3 → 3。負的砍掉,正的不變。 - tanh:-2 → -0.96;0 → 0;3 → 0.995。範圍是 -1 到 1,以 0 為中心。 梯度消失是什麼(我補充):sigmoid 在 x = 3 時曲線已經很平,斜率只剩約 0.045;很多層這樣的小數乘起來,訓練訊號就傳不回前面的層。ReLU 在正數區斜率固定是 1,不會越乘越小。
## [1:13:47](https://www.youtube.com/watch?v=7kgOuhuIjvY&t=4427s) 收尾:PyTorch tutorial 老師正式收尾,請大家去看 PyTorch tutorial。它從安裝開始,再帶建 NN 的 Python 程式碼,有一部分講的是 TensorFlow。 已經有訓練模型基礎的人會覺得比較簡單,挑自己需要的部分看就好。第一部分大約一個半小時。 ## [1:14:39](https://www.youtube.com/watch?v=7kgOuhuIjvY&t=4479s) Slido 問答 老師回答 Slido 上的幾個問題: - 作業效能:用個人 Colab 額度就跑得完。跑很久的話,要自己檢查哪裡有問題。 - NTU COOL 名單:後加選的人匯入比較慢,老師會問辦公室。 - PPMI 的 context 怎麼取:課堂例子只是舉例,可以依應用自己設計。在 word2vec 裡,context 就是 window size,例如取 2,看前後兩個字有誰一起出現。 - feature selection:以前是人工設計特徵(例如語法、詞性)。在 embedding 裡,300 維或 768 維的每一維就是特徵,由模型自己學。 - lab 算不算分:不算分,是幫經驗較少的同學熟悉實作和作業,像助教課。 - 語料和 lab 在哪:語料在 GitHub;lab 的投影片和助教預錄影片在 NTU COOL 和 GitHub 都有。 這段用到的前面概念:PPMI 是看「兩個字一起出現的次數,比偶然多多少」來做詞向量(本週第 02 章學過,[02](https://app.notion.com/p/3ecfc631b03081daa362fba68ecb5a0c));word2vec 是用神經網路學出稠密詞向量的方法,window size 是它看目標字前後幾個字當上下文(第 3 週學過,[W3](https://app.notion.com/p/3e6fc631b03081ff9776f36fab3e6e50));embedding 就是詞向量,300 維、768 維是指一個字用 300 或 768 個數字表示。Colab 是 Google 的免費線上寫程式環境,NTU COOL 是課程平台,Slido 是課堂匿名提問工具(我補充)。
老師原話是什麼? 「其實這個feature的select是模型自己去學的」(1:17:06)
## Self-check
Q1. Why are activation functions important in neural networks?(中文:為什麼神經網路需要 activation function?) **Answer**: Activation functions introduce nonlinearity. Without them, stacking layers still gives only a linear transformation of the inputs, so the network could only separate data with a straight line. With nonlinearity between neurons, the network can solve complex, non-linearly separable problems. 中文:activation function 把非線性帶進神經網路。沒有它的話,疊再多層也只是輸入的線性轉換,等於只能用一條直線把資料切成兩邊。神經元之間加上非線性函式後,網路才能處理一刀切不開的複雜問題。這是老師強調 NN 能變得實用的關鍵。
Q2. Compare the roles of the loss function and the optimizer.(中文:比較 loss function 和 optimizer 的角色。) **Answer**: The loss function measures the difference between the model's predicted output and the true target. The optimizer is an algorithm that uses this error to adjust the model's parameters during training so the error becomes smaller. The loss tells how far you are; the optimizer decides how to move. 中文:loss function 量的是模型預測和正確答案差多少,像一把尺。optimizer 則根據這個誤差,在訓練時調整模型參數,讓誤差越來越小,像導航決定下一步怎麼走。一個量「還差多遠」,一個決定「接下來怎麼改」。
Q3. Why is ReLU often preferred over sigmoid, and why were smooth versions like GELU proposed?(中文:為什麼常用 ReLU 而不用 sigmoid?為什麼又有 GELU 這種平滑版本?) **Answer**: Sigmoid is only sensitive near zero; for large positive or negative inputs its slope is almost zero, which causes gradient vanishing. ReLU keeps positive values unchanged, so it adds nonlinearity and avoids gradient vanishing. However, ReLU has a sharp corner at zero and is not differentiable there, so smooth versions like GELU approximate ReLU with a continuous, differentiable curve. 中文:sigmoid 只在 0 附近敏感,輸入很大或很小時斜率幾乎是 0,容易造成梯度消失。ReLU 正數原樣輸出,既有非線性又能避免梯度消失。但 ReLU 在 0 點突然轉折、不可微分,所以有 GELU 這種平滑、可微的版本來逼近 ReLU。
Q4. Describe the typical steps of training a neural network.(中文:描述訓練神經網路的典型步驟。) **Answer**: (1) Prepare training and testing datasets. (2) Construct the model with a framework such as PyTorch. (3) Select a loss function, such as cross-entropy. (4) Choose an optimizer, such as Adam or SGD. (5) Train the model on the training set. (6) Evaluate it on the testing set with metrics such as F1. 中文:一、準備訓練集和測試集。二、用 PyTorch 等框架建模型。三、選 loss function,例如 cross-entropy。四、選 optimizer,例如 Adam 或 SGD。五、用訓練集訓練模型。六、用測試集評估,指標例如 F1。
讀完了嗎?下一章:[06 PyTorch:訓練主循環與 Tensor(0:00–0:25)](https://app.notion.com/p/3ecfc631b03081579f0eeb810083a514)|回到週頁:[W4(10/1)](https://app.notion.com/p/3ecfc631b03081b8aa2cf4a97467ed41)