答案頁 · 12 道題

Python 梯度下降:一步一步靠近練習答案

本頁彙整 Python 梯度下降:一步一步靠近 的 12 道練習。先做練習頁,再回到這裡核對準確答案和原因。

快速答案

本答案頁包含 Python 梯度下降:一步一步靠近 的 4 道選擇題、4 道填空題和 4 道輸出預測題,每題都給出準確答案和簡短解釋。

答案已完整展示,建議先嘗試作答,再用本頁核對。第一次練習最好從互動練習頁開始。

01 · 選擇題

梯度下降更新時從參數中減去什麼?

  1. 損失
  2. 步數
  3. 截距
  4. 梯度乘以學習率正確答案

答案: 梯度乘以學習率

為什麼: 梯度給出損失增加的方向,乘以學習率則控制步子大小。

02 · 選擇題

如果梯度為負,正常更新後 w 會怎樣?

  1. 完全不變
  2. 增大正確答案
  3. 減小
  4. 立刻變成零

答案: 增大

為什麼: 減去負梯度相當於給 w 加上一個正數。

03 · 選擇題

學習率過大的主要風險是什麼?

  1. 更新可能衝過谷底併發散正確答案
  2. Python 無法乘浮點數
  3. 損失會變成整數
  4. 梯度會消失

答案: 更新可能衝過谷底併發散

為什麼: 步子太大會越過最小值,讓下一次梯度更大。

04 · 選擇題

執行結果是什麼?

def gradient(w, xs, ys):
    return 2 * sum((w * x - y) * x for x, y in zip(xs, ys)) / len(xs)

print(gradient(0, [1, 2], [1, 2]))
  1. 5.0
  2. 0.0
  3. -5.0正確答案
  4. -2.5

答案: -5.0

為什麼: 當 w = 0 時每個殘差都是負數,所以梯度為負。

05 · 填空題

補全梯度下降更新。

def gradient(w, xs, ys):
    return 2 * sum((w * x - y) * x for x, y in zip(xs, ys)) / len(xs)

w = 1.0
w -= 0.1 * ____(w, [1, 2], [2, 4])
print(w)

答案: gradient

為什麼: 更新從 w 中減去學習率乘以梯度。

06 · 填空題

補全平方損失求導產生的係數。

def gradient(w, xs, ys):
    return ____ * sum((w * x - y) * x for x, y in zip(xs, ys)) / len(xs)

print(gradient(1, [1, 2], [2, 4]))

答案: 2

為什麼: 對 (w*x - y) 的平方求導會帶來係數 2。

07 · 填空題

補全損失中的平均操作。

def loss(w, xs, ys):
    return sum((w * x - y) ** 2 for x, y in zip(xs, ys)) / ____(xs)

print(loss(1, [1, 2], [2, 4]))

答案: len

為什麼: 總平方誤差除以觀測數量。

08 · 填空題

補全迴圈,使其執行三次更新。

def gradient(w, xs, ys):
    return 2 * sum((w * x - y) * x for x, y in zip(xs, ys)) / len(xs)

w = 1.0
for _ in range(____):
    w -= 0.1 * gradient(w, [1, 2], [2, 4])
print(round(w, 3))

答案: 3

為什麼: range(3) 會產生三次迭代。

09 · 輸出預測

這段程式列印出什麼?

def loss(w, xs, ys):
    return sum((w * x - y) ** 2 for x, y in zip(xs, ys)) / len(xs)

print(loss(2, [1, 2], [2, 4]))

答案: 0.0

為什麼: 當 w = 2 時每個預測都等於目標,所以損失是 0.0。

10 · 輸出預測

程式碼的輸出結果是什麼?

def gradient(w, xs, ys):
    return 2 * sum((w * x - y) * x for x, y in zip(xs, ys)) / len(xs)

print(gradient(2, [1, 2], [2, 4]))

答案: 0.0

為什麼: 模型已經完全配適資料,每個殘差都是零,所以梯度是 0.0。

11 · 輸出預測

螢幕上會顯示什麼?

def gradient(w, xs, ys):
    return 2 * sum((w * x - y) * x for x, y in zip(xs, ys)) / len(xs)

w = 1.0
w -= 0.1 * gradient(w, [1, 2], [2, 4])
print(w)

答案: 1.5

為什麼: 梯度是 -5.0,減去 0.1 乘以 -5.0,w 從 1.0 增加到 1.5。

12 · 輸出預測

這段程式碼會輸出什麼?

def gradient(w, xs, ys):
    return 2 * sum((w * x - y) * x for x, y in zip(xs, ys)) / len(xs)

w = 1.0
for _ in range(2):
    w -= 0.1 * gradient(w, [1, 2], [2, 4])
print(w)

答案: 1.75

為什麼: 第一次更新到達 1.5,第二次到達 1.75。

先試一遍題目

打開 Python 梯度下降:一步一步靠近 練習頁,用即時回饋回答同樣的 12 道題。

練習本課