很明显的,这个线性回归的问题在高中就已经研究过了,当时使用的是最小二乘法,但我们现在要使用的是梯度下降方法bgd。这种方法可谓是所有优化方法中最基本的一个,适用场景非常广泛,而且实现也很简单。到目前为止,深度学习的主流方法依然是离不开梯度下降,其他优化算法也只是梯度下降的变种而已。
让我们先将线性回归的问题再简化一下,假设x只是一个实数,有没有偏置,也就是说 y=ωx y = ω x 那么loss就会是:
以此类推,代码如下:
import numpy as np
import math
# 普通的全梯度下降方法
sample = 10
num_input = 5
#加入训练数据
normalRand = np.random.normal(0,0.1,sample)
weight = [7,99,-1,-333,0.06]
x_train = np.random.random((sample, num_input))
y_train = np.zeros((sample,1))
for i in range (0,len(x_train)):
total = 0
for j in range(0,len(x_train[i])):
total += weight[j]*x_train[i,j]
y_train[i] = total+normalRand[i]
# 训练
weight = np.random.random(num_input+1)
rate = 0.05
for epoch in range(0,100):
# 计算loss
predictY = np.zeros((len(x_train,)))
for i in range(0,len(x_train)):
predictY[i] = np.dot(x_train[i],weight[0:num_input])+weight[num_input]
loss = 0
for i in range(0,len(x_train)):
loss += (predictY[i]-y_train[i])**2
print("epoch: %d-loss: %f"%(epoch,loss))
# 计算梯度并更新
for i in range(0,len(weight)-1):
grade = 0
for j in range(0,len(x_train)):
grade += 2*(predictY[j]-y_train[j])*x_train[j,i]
weight[i] = weight[i] - rate*grade
grade = 0
for j in range(0,len(x_train)):
grade += 2*(predictY[j]-y_train[j])
weight[num_input] = weight[num_input] - rate*grade
print(weight)
做实验时,很容易发现,学习速率 η η 过大,损失函数不收敛,过小,收敛速度很慢。
github地址:代码