机器学习顾名思义就是让机器去进行学习,而学习则需要有大量的数据,机器学习大体上的思路是对一堆数据建立一个初始化参数的模型,用初始化参数求得的值与真实值做对比再对参数进行更新。
横轴是我们的特征值x,纵轴是我们需要得到的标签值y,我们假设特征值x乘上一个 θ再加上一个偏置b就可以得到:
h ( x ) = θ 0 + θ 1 x 1 h(x)=θ_0+θ_1x_1 h(x)=θ0+θ1x1
但是很多时候特征值不止一个,比如说我去银行贷款,那么贷款的额度就需要根据你的年龄和工资来评判,那么年龄和工资就是额度的两个特征值,可以得到:
h ( x ) = θ 0 + θ 1 x 1 + θ 2 x 2 h(x)=θ_0+θ_1x_1+θ_2x_2 h(x)=θ0+θ1x1+θ2x2
那么如果有一组数据有n个特征值,此时可以建立:
h ( x i ) = θ 0 + θ 1 x 1 + θ 2 x 2 + . . . . . . + θ i x i = ∑ i = 0 m θ i x i h(x_i)=\theta_0+\theta_1x_1+\theta_2x_2+......+\theta_ix_i=\sum_{i=0}^m\theta_ix_i h(xi)=θ0+θ1x1+θ2x2+......+θixi=∑i=0mθixi
其中我们规定 x 0 = 1 x_0=1 x0=1。
通常我们得到一个模型之后首先会初始化参数 θ \theta θ,根据已有的特征值和 θ \theta θ可以得到预测值,那么第一次初始化参数得到的预测值肯定是不准确的,所以我们将预测值与真实值做对比建立一个误差函数。误差函数有很多,针对分类和回归问题也有不同的误差函数,在这里就以最小二乘法为例:
假设我们有 j j j个样本,每个样本有 i i i个特征值, 那么误差函数就可以表示为:
L o s s ( y ∣ x ( i ) , θ ( i ) ) = 1 m ∑ j = 0 m ( y j − h ( x j ( i ) ) ) 2 Loss(y|x^{(i)},\theta^{(i)})=\frac{1}{m}\sum_{j=0}^m(y_j-h(x^{(i)}_j))^2 Loss(y∣x(i),θ(i))=m1∑j=0m(yj−h(xj(i)))2
现在我们要求 θ \theta θ为多少时误差函数最小,那么就要对 θ \theta θ求偏导:
∂ L o s s ( y ∣ x ( i ) , θ ( i ) ) ∂ θ = 1 2 m ∑ j = 0 m ( y j − h ( x j ( i ) ) ) x j ( i ) \frac{\partial Loss(y|x^{(i)},\theta^{(i)})}{\partial \theta}=\frac{1}{2m}\sum_{j=0}^m(y_j - h(x_j^{(i)}))x_j^{(i)} ∂θ∂Loss(y∣x(i),θ(i))=2m1∑j=0m(yj−h(xj(i)))xj(i)
根据数据我们得到了模型和误差函数,接下来就要进行优化参数了。梯度下降算法是机器学习的一个核心,目的是通过梯度下降的方向来不断更新我们初始的参数 θ \theta θ。
那么优化前首先要理解学习率(leraning rate)的概念,比如说人下山要下到山的最低点,人要想最快达到最低点就必须沿着梯度的方向下山那么每一步下多少呢,此时就引入了学习率,就是人每一步下山的多少。
然后就是参数优化公式:
θ i = θ i ′ − α ∂ L o s s ∂ θ \theta_i=\theta_i^{'}-\alpha\frac{\partial Loss}{\partial\theta} θi=θi′−α∂θ∂Loss
此外梯度下降算法有不同的优化方式:
1.批量梯度下降(Batch Gradient Descent)
θ i = θ i ′ + α 1 m ∑ j = 0 m ( y i − h ( x j ( i ) ) ) x j ( i ) \theta_i=\theta_i^{'}+\alpha\frac{1}{m}\sum_{j=0}^m(y_i-h(x_j^{(i)}))x_j^{(i)} θi=θi′+αm1∑j=0m(yi−h(xj(i)))xj(i)
批量梯度下降容易得到最优解,但是由于每次考虑所有的样本,速度会很慢
2.随机梯度下降(Stochastic Gradient Descent):
θ i = θ i ′ + α ( y i − h ( x j ( i ) ) ) x j ( i ) \theta_i=\theta_i^{'}+\alpha(y_i-h(x_j^{(i)}))x_j^{(i)} θi=θi′+α(yi−h(xj(i)))xj(i)
每次找一个样本,迭代速度快,但不一定每次都朝着收敛的方向
3.小批量梯度下降(Mini-Batch Gradient Descent):
小批量梯度下降是对批量梯度下降以及随机梯度下降的一个折中办法。其思想是:每次迭代使用 batch_size 个样本来对参数进行更新。
θ i = θ i ′ + α 1 10 ∑ k = 2 j = 9 ( y i − h ( x j ( i ) ) ) x j ( i ) \theta_i=\theta_i^{'}+\alpha\frac{1}{10}\sum_{k=2}^{j=9}(y_i-h(x_j^{(i)}))x_j^{(i)} θi=θi′+α101∑k=2j=9(yi−h(xj(i)))xj(i)
下面是一个梯度下降小实例:
# 其中的参数可以试着自己修改,比如学习率不同对优化的影响
# 规定数据 特征值x1, x2对应一个y
x1, x2, y = 3, 5, 100
# 建立模型
def fuc(theta1, theta2, learn_rate):
# 预测值
y_pre = theta1 * x1 + theta2 * x2
# 损失值
loss = (y - y_pre)**2
# 求导
loss_theta = - 2 * (y - y_pre) * (x1 + x2)
# 更新theta
theta_new1 = theta1 - learn_rate * loss_theta
theta_new2 = theta2 - learn_rate * loss_theta
return theta_new1, theta_new2, loss, y_pre
theta1, theta2, learn_rate = 1, 2, 0.01
# 训练
while (1):
theta1, theta2, loss, y_pre = fuc(theta1, theta2, learn_rate)
# 当loss小于某值停止训练并输出theta,loss,pre值
if loss < 0.01:
print("theta is:", theta1, theta2)
print("loss is:", loss)
print("pre is:", y_pre)
print("accurate is:", y_pre/y)
break
theta is: 11.876467355975683 12.876467355975683
loss is: 0.001757660048461526
pre is: 99.95807554355198
accurate is: 0.999962710942764