快速答案
本答案頁包含 Python 梯度下降:一步一步靠近 的 4 道選擇題、4 道填空題和 4 道輸出預測題,每題都給出準確答案和簡短解釋。
答案已完整展示,建議先嘗試作答,再用本頁核對。第一次練習最好從互動練習頁開始。
梯度下降更新時從參數中減去什麼?
答案: 梯度乘以學習率
為什麼: 梯度給出損失增加的方向,乘以學習率則控制步子大小。
如果梯度為負,正常更新後 w 會怎樣?
答案: 增大
為什麼: 減去負梯度相當於給 w 加上一個正數。
學習率過大的主要風險是什麼?
答案: 更新可能衝過谷底併發散
為什麼: 步子太大會越過最小值,讓下一次梯度更大。
執行結果是什麼?
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]))答案: -5.0
為什麼: 當 w = 0 時每個殘差都是負數,所以梯度為負。
補全梯度下降更新。
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 中減去學習率乘以梯度。
補全平方損失求導產生的係數。
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。
補全損失中的平均操作。
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
為什麼: 總平方誤差除以觀測數量。
補全迴圈,使其執行三次更新。
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) 會產生三次迭代。
這段程式列印出什麼?
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。
程式碼的輸出結果是什麼?
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。
螢幕上會顯示什麼?
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。
這段程式碼會輸出什麼?
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 道題。