随机梯度下降

数据:
在这里插入图片描述
假设线性模型 y ^ = x ∗ w \hat{y}=x*w y^=xw,那么对w值进行预测:
在这里插入图片描述
在这个过程中,对权重w进行更新,即 w = w − α ∂ c o s t ∂ ω w=w-\alpha \frac{\partial cost}{\partial \omega} w=wαωcost
公式推导:
∂ cost ⁡ ( ω ) ∂ ω = ∂ ∂ ω 1 N ∑ n = 1 N ( x n ⋅ ω − y n ) 2 = 1 N ∑ n = 1 N ∂ ∂ ω ( x n ⋅ ω − y n ) 2 = 1 N ∑ n = 1 N 2 ⋅ ( x n ⋅ ω − y n ) ∂ ( x n ⋅ ω − y n ) ∂ ω = 1 N ∑ n = 1 N 2 ⋅ x n ⋅ ( x n ⋅ ω − y n ) \begin{aligned} \frac{\partial \operatorname{cost}(\omega)}{\partial \omega} &=\frac{\partial}{\partial \omega} \frac{1}{N} \sum_{n=1}^{N}\left(x_{n} \cdot \omega-y_{n}\right)^{2} \\ &=\frac{1}{N} \sum_{n=1}^{N} \frac{\partial}{\partial \omega}\left(x_{n} \cdot \omega-y_{n}\right)^{2} \\ &=\frac{1}{N} \sum_{n=1}^{N} 2 \cdot\left(x_{n} \cdot \omega-y_{n}\right) \frac{\partial\left(x_{n} \cdot \omega-y_{n}\right)}{\partial \omega} \\ &=\frac{1}{N} \sum_{n=1}^{N} 2 \cdot x_{n} \cdot\left(x_{n} \cdot \omega-y_{n}\right) \end{aligned} ωcost(ω)=ωN1n=1N(xnωyn)2=N1n=1Nω(xnωyn)2=N1n=1N2(xnωyn)ω(xnωyn)=N1n=1N2xn(xnωyn)

于是,可以得到:
ω = ω − α 1 N ∑ n = 1 N 2 ⋅ x n ⋅ ( x n ⋅ ω − y n ) \omega=\omega-\alpha \frac{1}{N} \sum_{n=1}^{N} 2 \cdot x_{n} \cdot\left(x_{n} \cdot \omega-y_{n}\right) ω=ωαN1n=1N2xn(xnωyn)
实例:

import numpy as np
import matplotlib.pyplot as plt

x_data = [1.0, 2.0, 3.0]#数据
y_data = [2.0, 4.0, 6.0]
w = 1.0#初始化权重

def forward(x):#定义模型
    return x * w

def cost(xs,ys):#定义损失函数
    cost=0
    for x,y in zip(xs,ys):
        y_pred=forward(x)
        cost+=(y_pred-y)**2
    return cost/len(xs)

def gradient(xs,ys):#定义梯度函数
    grad=0
    for x,y in zip(xs,ys):
        grad+=2*x*(x*w-y)
    return grad/len(xs)

print("Predict before training",4,forward(4))

for epoch in range(100):#训练100次
    cost_val = cost(x_data,y_data)
    grad_val = gradient(x_data,y_data)
    w -= 0.01*grad_val
    print("Epoch:",epoch,'w=',w,"loss=",cost_val)
    
print('Predict after training',4,forward(4))

训练结果:
在这里插入图片描述
随机梯度下降
在这里插入图片描述
实例:

import numpy as np
import matplotlib.pyplot as plt

x_data = [1.0, 2.0, 3.0]#数据
y_data = [2.0, 4.0, 6.0]
w = 1.0#初始化权重

def forward(x):#定义模型
    return x * w

def loss(x,y):#计算损失函数
    y_pred = forward(x)
    return (y_pred - y) ** 2

def gradient(x,y):#定义损失函数导数
    return 2 * x * (x * w - y)

print('Predict before training',4,forward(4))

for epoch in range(100):#按每个梯度更新权重训练数据
    for x,y in zip(x_data,y_data):
        grad = gradient(x,y)
        w = w - 0.01 * grad
        print("\tgrad:",x,y,grad)
        l = loss(x,y)
        
    print("progress:",epoch,"w=",w,"loss=",l)

print('Predict after training',4,forward(4))

结果:
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

1100dp

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值