梯度下降求解y=ax+b

梯度下降求解y=ax+b

题目要求:

给你海量的 [x, y] 数据,梯度下降求解y=ax+b,a 和 b。其中输入如下:

x=np.array([1,2,3,4,5])y=np.array([2,4,5,7,8])

方案解答:

1. 构造损失函数

训练模型时,目标就是最小化均方误差 MSE(均方误差损失函数)。对于回归问题:
MSE = L = 1 N ∑ i = 1 N ( y i − y ^ i ) 2 \text{MSE} = \mathcal{L} = \frac{1}{N}\sum_{i=1}^N \big(y_i - \hat{y}_i\big)^2MSE=L=N1i=1N(yiy^i)2
其中:
y i y_iyi:真实标签
y ^ i \hat{y}_iy^i:模型预测值

将预测值代入MSE损失函数:
MSE = L ( a , b ) = 1 2 N ∑ i = 1 N ( y i − ( a x i + b ) ) 2 \text{MSE} = \mathcal{L}(a,b) = \frac{1}{2N}\sum_{i=1}^N \big(y_i - (ax_i + b)\big)^2MSE=L(a,b)=2N1i=1N(yi(axi+b))2
除以 2是为求导后消去系数,方便计算。

2. 对参数求偏导

(1)对参数a aa求偏导(化简之后):
∂ L ∂ a = 1 n ∑ i = 1 n ( a x i + b − y i ) ⋅ x i (1) \frac{\partial \mathcal{L}}{\partial a} = \frac{1}{n}\sum_{i=1}^{n} \big(ax_i + b - y_i\big)\cdot x_i \tag{1}aL=n1i=1n(axi+byi)xi(1)

(2)对参数b bb求偏导(化简之后):
∂ L ∂ b = 1 n ∑ i = 1 n ( a x i + b − y i ) (2) \frac{\partial \mathcal{L}}{\partial b} = \frac{1}{n}\sum_{i=1}^{n} \big(ax_i + b - y_i\big) \tag{2}bL=n1i=1n(axi+byi)(2)

(3)梯度下降参数更新公式(η \etaη为学习率):
a = a − η ⋅ ∂ L ∂ a b = b − η ⋅ ∂ L ∂ b \begin{align*} a &= a - \eta \cdot \frac{\partial \mathcal{L}}{\partial a} \\ b &= b - \eta \cdot \frac{\partial \mathcal{L}}{\partial b} \end{align*}ab=aηaL=bηbL

3. Python实现
importnumpyasnp x=np.array([1,2,3,4,5])y=np.array([2,4,5,7,8])n=len(x)# 超参数lr=0.01# 学习率epochs=30000# 迭代次数a,b=0.0,0.0# 初始值for_inrange(epochs):y_hat=a*x+b da=np.sum((y_hat-y)*x)/n db=np.sum(y_hat-y)/n a-=lr*da b-=lr*dbprint(f"a ={a:.4f}, b ={b:.4f}")
4. 其他类似学习题目

算法题 - 求一个正数的开方根(梯度下降法)