线性回归模型一二三

news2024/11/17 3:49:21

文章目录

  • 什么是线性回归
  • 线性回归的求解
    • 一元线性回归(最小二乘法)
    • 多元线性回归
  • 衍生求解
    • 梯度下降
    • 智能搜索算法求解(PSO)
    • 简要分析
  • 线性回归与简单神经网络
    • 联系
    • 类比推导
    • 反向传播
  • 总结

什么是线性回归

线性回归的基本假设是,变量之间的关系可以用一个或多个线性方程来近似表示。例如,如果我们只用一个自变量x来预测因变量y,例如:
在这里插入图片描述

那么此时我们可以假设y和x之间有如下的线性方程:

y = β 0 + β 1 x + μ y=\beta_0+\beta_1x+\mu y=β0+β1x+μ

其中, β 0 \beta_0 β0 β 1 \beta_1 β1是线性回归的参数,也叫做回归系数,它们表示了x和y之间的线性关系的强度和方向。 μ \mu μ是误差项,它表示了y的真实值和预测值之间的差异,通常假设它服从均值为0的正态分布。这样一来,假设,我们可以求解出这个方程的大致参数,那么我们就可以非常轻松地完成对后续数据的大体预测。那么这就是一个一般的一元线性回归。

同理,在一般情况下,我们按照对应关系来进行划分,我们还有多元线性回归,例如,我们的数据可能满足如下表格的信息。

x1x2y
126
237
3410
4511

我们接下来需要X到Y的关系进行线性的表述,以便于完成预测等任务。

线性回归的求解

这里,我们从一元线性回归出发。
实际上,我们的根本目标其实是,我们希望找到一条线性直线,能够非常完美的去近似表示数据的分布。

于是我们假设这些数据满足,或者能够用下列公式进行表示:
y = β 0 + β 1 x + μ y=\beta_0+\beta_1x+\mu y=β0+β1x+μ
我们的重点就是方程当中的未知系数,对于我们来说,x,是已知的,当然误差也是未知的,但是当我进行近似求解的时候,误差项将可以被忽视。此时由于系数未知,不同的系数可以产生不同的直线,那么我们需要找到一个合适的系数,能够最大限度的去拟合。 因此在这里我们可以定义,那就是,对于一条拟合的直线来说,我们认为,能够满足总体的预测值与实际值的误差最小的方程就是满足要求的方程。

换一句话说如图所示:
在这里插入图片描述

一元线性回归(最小二乘法)

此时,我们可以很容易的用数学语言去描述我们刚刚说的过程,那就是:

Q = ∑ i = 1 n ( y i − y ^ i ) 2 = ∑ i = 1 n ( y i − ( β ^ 0 + β ^ 1 x i ) ) 2 Q=\sum_{i=1}^n(y_i-\hat{y}_i)^2=\sum_{i=1}^n(y_i-(\hat{\beta}_0+\hat{\beta}_1x_i))^2 Q=i=1n(yiy^i)2=i=1n(yi(β^0+β^1xi))2

而,这个方法就叫做最小二乘法。

对于每一个观测值 ( x i , y i ) (x_i,y_i) (xi,yi),我们计算它的残差(真实值和预测值之间的差值) e i = y i − y ^ i e_i=y_i-\hat{y}_i ei=yiy^i此时我们也可以将这个看作损失函数。

这个损失函数反映了预测值和真实值之间的总偏差,我们希望找到一组回归系数 β ^ 0 \hat{\beta}_0 β^0 β ^ 1 \hat{\beta}_1 β^1,使得这个损失函数达到最小值。这相当于在二维空间中找到一条直线,使得所有数据点到这条直线的距离之和最小。

为了求解最小二乘法,我们利用微积分中求极值的方法,对损失函数分别对 β ^ 0 \hat{\beta}_0 β^0 β ^ 1 \hat{\beta}_1 β^1求偏导数,并令其等于0:

∂ Q ∂ β ^ 0 = − 2 ∑ i = 1 n ( y i − β ^ 0 − β ^ 1 x i ) = 0 \frac{\partial Q}{\partial \hat{\beta}_0}=-2\sum_{i=1}^n(y_i-\hat{\beta}_0-\hat{\beta}_1x_i)=0 β^0Q=2i=1n(yiβ^0β^1xi)=0

∂ Q ∂ β ^ 1 = − 2 ∑ i = 1 n ( y i − β ^ 0 − β ^ 1 x i ) x i = 0 \frac{\partial Q}{\partial \hat{\beta}_1}=-2\sum_{i=1}^n(y_i-\hat{\beta}_0-\hat{\beta}_1x_i)x_i=0 β^1Q=2i=1n(yiβ^0β^1xi)xi=0

解这个方程组:

β ^ 1 = n ∑ i = 1 n x i y i − ∑ i = 1 n x i ∑ i = 1 n y i n ∑ i = 1 n x i 2 − ( ∑ i = 1 n x i ) 2 \hat{\beta}_1=\frac{n\sum_{i=1}^nx_iy_i-\sum_{i=1}^nx_i\sum_{i=1}^ny_i}{n\sum_{i=1}^nx_i^2-(\sum_{i=1}^nx_i)^2} β^1=ni=1nxi2(i=1nxi)2ni=1nxiyii=1nxii=1nyi

β ^ 0 = 1 n ∑ i = 1 n y i − β ^ 1 1 n ∑ i = 1 n x i \hat{\beta}_0=\frac{1}{n}\sum_{i=1}^ny_i-\hat{\beta}_1\frac{1}{n}\sum_{i=1}^nx_i β^0=n1i=1nyiβ^1n1i=1nxi

最后我们完成求解:

y = β ^ 0 + β ^ 1 x y=\hat{\beta}_0+\hat{\beta}_1x y=β^0+β^1x

多元线性回归

对于多元线性回归方程:

y = β 0 + β 1 x 1 + β 2 x 2 + . . . + β k x k + μ y=\beta_0+\beta_1x_1+\beta_2x_2+...+\beta_kx_k+\mu y=β0+β1x1+β2x2+...+βkxk+μ

我们也可以使用类似的方法求解。同样的,我们将公式展开带入:

Q = ∑ i = 1 n ( y i − y ^ i ) 2 = ∑ i = 1 n ( y i − ( β ^ 0 + β ^ 1 x i 1 + β ^ 2 x i 2 + . . . + β ^ k x i k ) ) 2 Q=\sum_{i=1}^n(y_i-\hat{y}_i)^2=\sum_{i=1}^n(y_i-(\hat{\beta}_0+\hat{\beta}_1x_{i1}+\hat{\beta}_2x_{i2}+...+\hat{\beta}_kx_{ik}))^2 Q=i=1n(yiy^i)2=i=1n(yi(β^0+β^1xi1+β^2xi2+...+β^kxik))2

同样的,我们采用我们利用微积分中求极值的方法:

∂ Q ∂ β ^ 0 = − 2 ∑ i = 1 n ( y i − β ^ 0 − β ^ 1 x i 1 − β ^ 2 x i 2 − . . . − β ^ k x i k ) = 0 \frac{\partial Q}{\partial \hat{\beta}_0}=-2\sum_{i=1}^n(y_i-\hat{\beta}_0-\hat{\beta}_1x_{i1}-\hat{\beta}_2x_{i2}-...-\hat{\beta}_kx_{ik})=0 β^0Q=2i=1n(yiβ^0β^1xi1β^2xi2...β^kxik)=0

∂ Q ∂ β ^ 1 = − 2 ∑ i = 1 n ( y i − β ^ 0 − β ^ 1 x i 1 − β ^ 2 x i 2 − . . . − β ^ k x i k ) x i 1 = 0 \frac{\partial Q}{\partial \hat{\beta}_1}=-2\sum_{i=1}^n(y_i-\hat{\beta}_0-\hat{\beta}_1x_{i1}-\hat{\beta}_2x_{i2}-...-\hat{\beta}_kx_{ik})x_{i1}=0 β^1Q=2i=1n(yiβ^0β^1xi1β^2xi2...β^kxik)xi1=0

∂ Q ∂ β ^ 2 = − 2 ∑ i = 1 n ( y i − β ^ 0 − β ^ 1 x i 1 − β ^ 2 x i 2 − . . . − β ^ k x i k ) x i 2 = 0 \frac{\partial Q}{\partial \hat{\beta}_2}=-2\sum_{i=1}^n(y_i-\hat{\beta}_0-\hat{\beta}_1x_{i1}-\hat{\beta}_2x_{i2}-...-\hat{\beta}_kx_{ik})x_{i2}=0 β^2Q=2i=1n(yiβ^0β^1xi1β^2xi2...β^kxik)xi2=0

. . . ... ...

∂ Q ∂ β ^ k = − 2 ∑ i = 1 n ( y i − β ^ 0 − β ^ 1 x i 1 − β ^ 2 x i 2 − . . . − β ^ k x i k ) x i k = 0 \frac{\partial Q}{\partial \hat{\beta}_k}=-2\sum_{i=1}^n(y_i-\hat{\beta}_0-\hat{\beta}_1x_{i1}-\hat{\beta}_2x_{i2}-...-\hat{\beta}_kx_{ik})x_{ik}=0 β^kQ=2i=1n(yiβ^0β^1xi1β^2xi2...β^kxik)xik=0

这个时候,我们转化为矩阵形式(这里省略了…laxtex格式有点问题)

[ ∑ x i j 2 ∑ x i j x i k ∑ x i j x i k ∑ x i k 2 ] [ β ^ j β ^ k ] = [ ∑ y i x i j ∑ y i x i k ] \begin{bmatrix} \sum x_ {ij}^ {2} & \sum x_ {ij} x_ {ik}\\ \sum x_ {ij} x_ {ik} & \sum x_ {ik}^ {2} \end{bmatrix} \begin{bmatrix} \hat {\beta}_{j}\\ \hat {\beta}_{k} \end{bmatrix} =\begin{bmatrix} \sum y_ {i} x_ {ij}\\ \sum y_ {i} x_ {ik} \end{bmatrix} [xij2xijxikxijxikxik2][β^jβ^k]=[yixijyixik]

其中, j , k = 0 , 1 , . . . , n j,k=0,1,...,n j,k=0,1,...,n

为了简化计算,我们可以用矩阵形式来表示多元线性回归方程和最小二乘法。令 x i 0 = 1 x_ {i0}=1 xi0=1,则多元线性回归方程可以写成:
(注:还有一个截距项μ,为了简化和保持统一,μ 我们可以看作是 1*βi)

y = X β + μ y=\mathbf{X}\boldsymbol {\beta}+\boldsymbol {\mu} y=Xβ+μ

其中,

X = [ 1 x 11 x 12 … x 1 k 1 x 21 x 22 … x 2 k ⋮ ⋮ ⋮ ⋱ ⋮ 1 x n 1 x n 2 … x n k ] , y = [ y 1 y 2 ⋮ y n ] , β = [ β 0 β 1 ⋮ β k ] , μ = [ μ 1 μ 2 ⋮ μ n ] \mathbf{X}= \begin{bmatrix} 1 & x_{11} & x_{12} & \dots & x_{1k} \\ 1 & x_{21} & x_{22} & \dots & x_{2k} \\ \vdots & \vdots & \vdots & \ddots & \vdots \\ 1 & x_{n1} & x_{n2} & \dots & x_{nk} \end{bmatrix} , \mathbf{y}= \begin{bmatrix} y_1 \\ y_2 \\ \vdots \\ y_n \end{bmatrix} , \boldsymbol {\beta }= \begin{bmatrix} \beta _0 \\ \beta _1 \\ \vdots \\ \beta _k \end{bmatrix} , \boldsymbol {\mu }= \begin{bmatrix} \mu _1 \\ \mu _2 \\ \vdots \\ \mu _n \end{bmatrix} X= 111x11x21xn1x12x22xn2x1kx2kxnk ,y= y1y2yn ,β= β0β1βk ,μ= μ1μ2μn

损失函数改写写成:

Q = ( y − X β ) ⊤ ( y − X β ) = μ ⊤ μ = ∑ i = 1 n ( y i − x i β ) 2 Q=(y-\mathbf{X}\boldsymbol {\beta })^\top (y-\mathbf{X}\boldsymbol {\beta })=\boldsymbol {\mu }^\top \boldsymbol {\mu }=\sum _ {i=1}^n (y_i-\mathbf{x}_{i}\boldsymbol {\beta })^ {2} Q=(yXβ)(yXβ)=μμ=i=1n(yixiβ)2

其中, x i \mathbf{x}_{i} xi表示 X \mathbf{X} X的第 i i i行。

对损失函数求导,并令其等于零向量,得到:

− 2 ( X μ ) ⊤ = − 2 ( X ( y − X β ) ) ⊤ = − 2 ( X y − X X β ) ⊤ = − 2 ( y ⊤ − ( x j μ ) ⊤ ) = 0 -2(\mathbf{X}\boldsymbol {\mu })^\top =-2(\mathbf{X}(y-\mathbf{X}\boldsymbol {\beta }))^\top =-2(\mathbf{X}\mathbf{y}-\mathbf{X}\mathbf{X}\boldsymbol {\beta })^\top =-2(\mathbf{y}^\top -(\mathbf{x}_{j}\boldsymbol {\mu })^\top )=0 2(Xμ)=2(X(yXβ))=2(XyXXβ)=2(y(xjμ))=0

整理得到:

( x j μ ) ⊤ = ( x j ( y − x j β ) ) ⊤ = ( x j y − x j x j β ) ⊤ = ( x j y ) ⊤ − ( x j x j ) ⊤ ( μ ) ⊤ = ( x j x j ) ⊤ ( μ ) ⊤ (\mathbf{x}_{j}\boldsymbol {\mu })^\top =(\mathbf{x}_{j}(y-\mathbf{x}_{j}\boldsymbol {\beta }))^\top =(\mathbf{x}_{j}\mathbf{y}-\mathbf{x}_{j}\mathbf{x}_{j}\boldsymbol {\beta })^\top =(\mathbf{x}_{j}\mathbf{y})^\top -(\mathbf{x}_{j}\mathbf{x}_{j})^\top (\boldsymbol {\mu })^\top =(\mathbf{x}_{j}\mathbf{x}_{j})^\top (\boldsymbol {\mu })^\top (xjμ)=(xj(yxjβ))=(xjyxjxjβ)=(xjy)(xjxj)(μ)=(xjxj)(μ)

从而得到正规方程组:

( x j x j ) ⊤ ( μ ) ⊤ = ( x j y ) ⊤ (\mathbf{x}_{j}\mathbf{x}_{j})^\top (\boldsymbol {\mu })^\top =(\mathbf{x}_{j}\mathbf{y})^\top (xjxj)(μ)=(xjy)

最后,我们整理一下,方程写成:

X ⊤ X β = X ⊤ y \mathbf{X}^\top \mathbf{X} \boldsymbol{\beta} = \mathbf{X}^\top \mathbf{y} XXβ=Xy

其中, X \mathbf{X} X是自变量矩阵, y \mathbf{y} y是因变量向量, β \boldsymbol{\beta} β是待求的参数向量。
之后我们假设矩阵是可逆的,那么左乘 ( X ⊤ X ) − 1 (\mathbf{X}^\top \mathbf{X})^{-1} (XX)1,得到:

β = ( X ⊤ X ) − 1 X ⊤ y \boldsymbol{\beta} = (\mathbf{X}^\top \mathbf{X})^{-1}\mathbf{X}^\top \mathbf{y} β=(XX)1Xy

完成求解。

衍生求解

此时,一个最基本的线性回归问题就被我们求解出来了。那么这个时候我们再回到我们刚刚一开始说的,其实不难发现,我们所有的一切,几乎都是围绕着:
Q = ∑ i = 1 n ( y i − y ^ i ) 2 = ∑ i = 1 n ( y i − ( β ^ 0 + β ^ 1 x i ) ) 2 Q=\sum_{i=1}^n(y_i-\hat{y}_i)^2=\sum_{i=1}^n(y_i-(\hat{\beta}_0+\hat{\beta}_1x_i))^2 Q=i=1n(yiy^i)2=i=1n(yi(β^0+β^1xi))2

进行展开,通过它,我们可以求解出未知的系数。

那么问题来了,求解这个公式,我们有没有其他的方案?例如我们刚刚推到出我们使用正规方程来求解出我们的参数,但是这个过程当中存在求逆矩阵的过程,当参数量较大,特征多的情况下,这个逆矩阵显然很难求解,同时如果矩阵不是方阵,此时我们还只能求解伪逆,例如通过SVD等方案得到方阵进行运算(暴力理解)。那么这样一来,求解的系数似乎也不是那么准确。

此时,我们不得不面对残酷的现实,那就是理论求解,和实际上的工程实现当中存在一个新的误差,因为这个误差无论如何都难以避免,哪怕在不存在刚刚提到的问题,在计算机求解的过程当中也存在精度问题让结果不是100%准确。

梯度下降

因此,我们还可以使用其他的方案,我的目的是正对Q进行求解,我们系数当作未知数,对Q的请求当作最小化问题,当然实际上它就是最小化问题。

那么什么是梯度下降?用下面一张图其实非常好理解
在这里插入图片描述

我们这里同样以一元线性回归为例子,当然多元的依然是一样的,前面的证明都是一样的。

通过上面这两个公式,我们可以求解出对应的偏导数:
∂ Q ∂ β ^ 0 = − 2 ∑ i = 1 n ( y i − β ^ 0 − β ^ 1 x i ) \frac{\partial Q}{\partial \hat{\beta}_0}=-2\sum_{i=1}^n(y_i-\hat{\beta}_0-\hat{\beta}_1x_i) β^0Q=2i=1n(yiβ^0β^1xi)

∂ Q ∂ β ^ 1 = − 2 ∑ i = 1 n ( y i − β ^ 0 − β ^ 1 x i ) x i \frac{\partial Q}{\partial \hat{\beta}_1}=-2\sum_{i=1}^n(y_i-\hat{\beta}_0-\hat{\beta}_1x_i)x_i β^1Q=2i=1n(yiβ^0β^1xi)xi

一开始,我们可以先随机初始化,对应的系数 β ^ 0 \hat{\beta}_0 β^0, β ^ 1 \hat{\beta}_1 β^1 。此时我们最小化问题,显然只要让 β ^ 0 \hat{\beta}_0 β^0, β ^ 1 \hat{\beta}_1 β^1 往梯度相反的方向移动就好了,γ在这里表示学习率。

β ^ 0 = β ^ 0 − γ ∂ Q ∂ β ^ 0 \hat{\beta}_0 = \hat{\beta}_0 - γ\frac{\partial Q}{\partial \hat{\beta}_0} β^0=β^0γβ^0Q

β ^ 1 = β ^ 1 − γ ∂ Q ∂ β ^ 1 \hat{\beta}_1 = \hat{\beta}_1 - γ\frac{\partial Q}{\partial \hat{\beta}_1} β^1=β^1γβ^1Q

下面是一段代码示例:
(这里偷了个懒,使用pytorch实现了自动求导功能)

import torch
import numpy as np
from matplotlib import pyplot as plt
#1,准备数据y=3X+0.8,准备参数
x = torch.rand([500,1])
# 这个是我们需要拟合的目标函数
y=3*x+0.8
w=torch.rand([1,1],requires_grad=True)
b=torch.tensor(0,requires_grad=True,dtype=torch.float32)

leanning = 0.01

for i in range(100):
    y_predict = torch.matmul(x,w)+b
    loss = (y - y_predict).pow(2).mean()
    if(w.grad is not None):
        w.grad.data.zero_()
    if(b.grad is not None):
        b.grad.data.zero_()
        
    loss.backward()
    w.data = w.data - leanning*w.grad
    b.data = b.data - leanning*b.grad
    # 在net当中会自动更新,咱们这个是最古老的版本
    if((1+i)%100==0):
        print("w,b,loss",w.item(),b.item(),loss.item())        
fig, ax = plt.subplots() # 创建图实例
ax.plot(x.numpy().reshape(-1),y.numpy().reshape(-1),label='y_true')
y_predict = torch.matmul(x,w)+b
ax.plot(x.numpy().reshape(-1),y_predict.detach().numpy().reshape(-1),label='y_pred')


运行结果如下:
在这里插入图片描述
当然这里还要值得一提的是,对应梯度的更新,也是有不同的策略的,这里就不展开说明了。

智能搜索算法求解(PSO)

那么同样的,显然我们还可以使用智能搜索算法来进行求解。
例如,在这里,我们可以简单地使用PSO算法来进行求解。
如果你熟悉,PSO算法的话,当然不熟悉也没关系,这只是一个拓展。
我们可以很容易的进行如下操作,使得可以使用PSO算法进行求解。
这段代码使用了PSO算法来求解线性回归的最优参数,具体步骤如下:

  1. 定义目标函数J(theta, X_b, y),其中theta为待求解的参数向量,X_b为增广矩阵,y为样本标签。

  2. 构造100个样本数据,其中X为100x1大小的矩阵,y为100x1大小的矩阵。

  3. 将X矩阵的第一列加上一列1,得到增广矩阵X_b。

  4. 定义参数上下界lb和ub。

  5. 使用PSO算法求解最优参数theta_best和目标函数的最小值fopt,其中args=(X_b, y)表示传入X_b和y作为参数。

对应的代码如下:


import numpy as np
import matplotlib.pyplot as plt
from pyswarm import pso

# 定义目标函数
def J(theta, X_b, y):
    m = len(y)
    return 1/(2*m) * np.sum((X_b.dot(theta)-y)**2)

# 构造样本数据
X = 2 * np.random.rand(100, 1)
Y=3*X+0.8

# 把X矩阵的第一列加上一列1,得到增广矩阵X_b
X_b = np.c_[np.ones((100, 1)), X]

# 定义参数上下界
lb = np.array([-5, -5])
ub = np.array([5, 5])

# 使用PSO算法求解最优参数
theta_best, fopt = pso(J, lb, ub, args=(X_b, Y))

# 打印最优参数 theta_best
print(theta_best)
Y_P = theta_best[0]*X + theta_best[1]
# 绘制拟合直线和散点图
plt.plot(X, Y, "b.",label="real")
plt.plot(X, Y_P, "r-",label="preditct")
plt.legend()
plt.show()

运行结果如下:
在这里插入图片描述

简要分析

用PSO、正规方程和梯度下降这三种方法虽然都可以求解线性回归问题,它们但是他们都各有优缺点。

  1. 正规方程

正规方程是一种解析解法,可以直接求得最优的回归系数。在数据量不大的情况下,正规方程的计算速度较快,而且对于线性可分的数据集,其解析解是唯一存在的,因此具有较好的鲁棒性。但是,对于大规模数据集,在计算矩阵的逆和矩阵乘法时,时间和空间复杂度都较高,计算效率低下。此外,如果自变量之间存在相关性或者特征维度很高,计算矩阵逆的过程中可能会出现数值不稳定的问题。

  1. 梯度下降

梯度下降是一种迭代算法,每次根据目标函数的梯度方向调整参数,使得目标函数值不断逼近最小值,直到收敛为止。相比于正规方程,梯度下降算法不需要显式求解矩阵逆,因此可以处理更大规模的数据集,并且可以自动适应参数空间的曲面形状,可以处理非凸函数等复杂情况。但是,梯度下降算法需要调整学习率等超参数,并且容易陷入局部最优解,收敛速度也不一定最优。

  1. PSO

相比于前两种方法,PSO是一种启发式、全局搜索的优化算法,可以用于求解更为复杂的非线性回归问题,并且具有较好的鲁棒性和泛化能力。同时,相较于梯度下降算法等其他迭代算法,PSO算法的并行化实现更为简单,在大规模数据的场景中具有一定的优势。但是,PSO算法利用局部搜索和全局搜索来寻找最优解,因此其计算效率较低,同时也无法保证一定能找到全局最优解。

线性回归与简单神经网络

联系

线性回归与简单神经网络,在很大程度上非常相似,实际上,当然我们采用梯度下降算法来求解线性回归方程时,其就相当于一个简单的不带激活函数的神经网络。

它们都是用来进行回归分析的方法,它们的主要区别在于模型的复杂度和灵活性。

线性回归是一种基本的、简单的模型,它假设自变量和因变量之间存在一个线性关系,并通过最小二乘法来求解最优的回归系数。线性回归的模型形式为:

y = θ 0 + θ 1 x 1 + θ 2 x 2 + ⋯ + θ n x n + ϵ y = \theta_0 + \theta_1 x_1 + \theta_2 x_2 + \cdots + \theta_n x_n + \epsilon y=θ0+θ1x1+θ2x2++θnxn+ϵ

其中 y y y 是因变量, x i x_i xi 是第 i i i 个自变量, θ i \theta_i θi 是回归系数, ϵ \epsilon ϵ 是随机误差。

简单神经网络(Single-Layer Feedforward Neural Network,SLFN)是一种比线性回归更加灵活的模型,可以处理输入输出之间的非线性关系。它由多个神经元组成,每个神经元包括一个偏置项和多个输入权重,经过激活函数的处理之后输出一个值。若仅含有一个隐层的 SLFN 可以表示出任意复杂度的连续函数。它的模型形式为:

z i = φ ( w i , 0 + w i , 1 x 1 + w i , 2 x 2 + ⋯ + w i , n x n ) y = ∑ i = 1 m v i z i + ϵ \begin{aligned} z_i &= \varphi(w_{i,0} + w_{i,1} x_1 + w_{i,2} x_2 + \cdots + w_{i,n} x_n) \\ y &= \sum\limits_{i=1}^m v_i z_i + \epsilon \end{aligned} ziy=φ(wi,0+wi,1x1+wi,2x2++wi,nxn)=i=1mvizi+ϵ

其中 z i z_i zi 是第 i i i 个隐层神经元的输出, φ ( ⋅ ) \varphi(\cdot) φ() 是激活函数, w i , j w_{i,j} wi,j 是输入到第 i i i 个神经元的第 j j j 个权重, v i v_i vi 是第 i i i 个隐层神经元到输出层的权重,其它符号含义同线性回归。

相比于线性回归,简单神经网络具有更多的参数和更高的模型复杂度,因此需要更多的样本数据进行训练和更长的训练时间。当然,简单神经网络也比线性回归更容易出现过拟合等问题。

关于对神经网络的求解,对于单层神经网络模型我们参考采用梯度下降算法来求解线性回归的方式类似。
当然对于多层的线性神经网络模型来说。这个过程其实也是类似的。在这里我们可以和线性回归进行简单的对比融合。

类比推导

在线性回归过程当作,我们一直将我们需要求解的方程Q当作损失函数,之后采用对应的方法去求解,那个时候,我们将其叫做损失函数。那么在这里同样的,我们对这个公式进一步简化。

这是一个简单的神经网络模型,图像化是这样的:
在这里插入图片描述

假设这是个具有 L L L 层的前馈神经网络,其中第 l l l 层的权重矩阵为 W [ l ] W^{[l]} W[l],偏置向量为 b [ l ] b^{[l]} b[l],激活函数为 a [ l ] ( ⋅ ) a^{[l]}(\cdot) a[l]()。输入样本为 x \boldsymbol{x} x,输出样本为 y \boldsymbol{y} y,则该神经网络的损失函数可以表示为:

L ( y , y ^ ) = 1 2 ∣ ∣ y − y ^ ∣ ∣ 2 \mathcal{L}(\boldsymbol{y}, \hat{\boldsymbol{y}}) = \frac{1}{2} ||\boldsymbol{y}-\hat{\boldsymbol{y}}||^2 L(y,y^)=21∣∣yy^2

其中, y ^ \hat{\boldsymbol{y}} y^ 表示神经网络对输入样本 x \boldsymbol{x} x 的预测值。

反向传播

此时我们需要求出每一层的权重矩阵和偏置向量对损失函数的梯度(这个过程其实相当于在前面的使用梯度下降求解未知系数的过程),以便用梯度下降算法来优化权重和偏置。而这个求解过程,我们叫做反向传播的过程。

对于输出层,我们可以直接计算其权重矩阵和偏置向量对损失函数的梯度。根据链式法则,输出层权重矩阵的梯度可以表示为:

∂ L ∂ W [ L ] = ∂ L ∂ y ^ ∂ y ^ ∂ ( W [ L ] a [ L − 1 ] + b [ L ] ) ∂ ( W [ L ] a [ L − 1 ] + b [ L ] ) ∂ W [ L ] \frac{\partial\mathcal{L}}{\partial W^{[L]}} = \frac{\partial\mathcal{L}}{\partial \hat{\boldsymbol{y}}} \frac{\partial\hat{\boldsymbol{y}}}{\partial (W^{[L]}\boldsymbol{a}^{[L-1]}+b^{[L]})} \frac{\partial(W^{[L]}\boldsymbol{a}^{[L-1]}+b^{[L]})}{\partial W^{[L]}} W[L]L=y^L(W[L]a[L1]+b[L])y^W[L](W[L]a[L1]+b[L])

其中, a [ L − 1 ] \boldsymbol{a}^{[L-1]} a[L1] 表示第 L − 1 L-1 L1 层的激活值。通过链式法则,可以将上述公式转化为:

∂ L ∂ W [ L ] = ( y ^ − y ) a [ L − 1 ] ( W [ L ] a [ L − 1 ] + b [ L ] ) ′ = ( y ^ − y ) a [ L − 1 ] ( z [ L ] ) \begin{aligned} \frac{\partial\mathcal{L}}{\partial W^{[L]}} &= (\hat{\boldsymbol{y}} - \boldsymbol{y}) a^{[L-1]}(W^{[L]}\boldsymbol{a}^{[L-1]}+b^{[L]})' \\ &= (\hat{\boldsymbol{y}} - \boldsymbol{y}) a^{[L-1]}(\boldsymbol{z}^{[L]})\\ \end{aligned} W[L]L=(y^y)a[L1](W[L]a[L1]+b[L])=(y^y)a[L1](z[L])

其中, z [ L ] = W [ L ] a [ L − 1 ] + b [ L ] \boldsymbol{z}^{[L]} = W^{[L]}\boldsymbol{a}^{[L-1]}+b^{[L]} z[L]=W[L]a[L1]+b[L] 表示第 L L L 层的加权和, ′ ' 表示对其求导。

同样地,输出层偏置向量的梯度可以表示为:

∂ L ∂ b [ L ] = ∂ L ∂ y ^ ∂ y ^ ∂ ( W [ L ] a [ L − 1 ] + b [ L ] ) ∂ ( W [ L ] a [ L − 1 ] + b [ L ] ) ∂ b [ L ] = ( y ^ − y ) \frac{\partial\mathcal{L}}{\partial b^{[L]}} = \frac{\partial\mathcal{L}}{\partial \hat{\boldsymbol{y}}} \frac{\partial\hat{\boldsymbol{y}}}{\partial (W^{[L]}\boldsymbol{a}^{[L-1]}+b^{[L]})} \frac{\partial(W^{[L]}\boldsymbol{a}^{[L-1]}+b^{[L]})}{\partial b^{[L]}} = (\hat{\boldsymbol{y}} - \boldsymbol{y}) b[L]L=y^L(W[L]a[L1]+b[L])y^b[L](W[L]a[L1]+b[L])=(y^y)

接下来,我们需要通过反向传播算法递归计算出每一层的权重矩阵和偏置向量对损失函数的梯度。以第 l l l 层的权重矩阵为例,第 l l l 层的梯度可以表示为:

∂ L ∂ W [ l ] = ∂ L ∂ z [ l ] ∂ z [ l ] ∂ W [ l ] = ∂ L ∂ a [ l ] ∂ a [ l ] ∂ z [ l ] ∂ z [ l ] ∂ W [ l ] = ∂ L ∂ a [ l ] g [ l ] ′ ( z [ l ] ) ( a [ l − 1 ] ) T \begin{aligned} \frac{\partial\mathcal{L}}{\partial W^{[l]}} &= \frac{\partial\mathcal{L}}{\partial\boldsymbol{z}^{[l]}} \frac{\partial\boldsymbol{z}^{[l]}}{\partial W^{[l]}} \\ &= \frac{\partial\mathcal{L}}{\partial\boldsymbol{a}^{[l]}} \frac{\partial\boldsymbol{a}^{[l]}}{\partial\boldsymbol{z}^{[l]}} \frac{\partial\boldsymbol{z}^{[l]}}{\partial W^{[l]}} \\ &= \frac{\partial\mathcal{L}}{\partial\boldsymbol{a}^{[l]}} g^{[l]\prime}(\boldsymbol{z}^{[l]}) (\boldsymbol{a}^{[l-1]})^T \end{aligned} W[l]L=z[l]LW[l]z[l]=a[l]Lz[l]a[l]W[l]z[l]=a[l]Lg[l](z[l])(a[l1])T

其中, g [ l ] ( ⋅ ) g^{[l]}(\cdot) g[l]() 表示第 l l l 层的激活函数, g [ l ] ′ ( ⋅ ) g^{[l]\prime}(\cdot) g[l]() 表示其导数。

对于第 l l l 层的偏置向量,其梯度为:

∂ L ∂ b [ l ] = ∂ L ∂ z [ l ] ∂ z [ l ] ∂ b [ l ] = ∂ L ∂ a [ l ] g [ l ] ′ ( z [ l ] ) \frac{\partial\mathcal{L}}{\partial b^{[l]}} = \frac{\partial\mathcal{L}}{\partial\boldsymbol{z}^{[l]}} \frac{\partial\boldsymbol{z}^{[l]}}{\partial b^{[l]}} = \frac{\partial\mathcal{L}}{\partial\boldsymbol{a}^{[l]}} g^{[l]\prime}(\boldsymbol{z}^{[l]}) b[l]L=z[l]Lb[l]z[l]=a[l]Lg[l](z[l])

通过递归地计算每一层的梯度,我们可以得到整个神经网络的权重矩阵和偏置向量对损失函数的梯度,从而利用梯度下降算法来更新网络参数,以最小化或最大化损失函数。

之后,和先前梯度下降求解线性回归一样:
β ^ 0 = β ^ 0 − γ ∂ Q ∂ β ^ 0 \hat{\beta}_0 = \hat{\beta}_0 - γ\frac{\partial Q}{\partial \hat{\beta}_0} β^0=β^0γβ^0Q

β ^ 1 = β ^ 1 − γ ∂ Q ∂ β ^ 1 \hat{\beta}_1 = \hat{\beta}_1 - γ\frac{\partial Q}{\partial \hat{\beta}_1} β^1=β^1γβ^1Q

只是,此时,我们的 β ^ 1 , β ^ 0 \hat{\beta}_1,\hat{\beta}_0 β^1,β^0变成了 W [ L ] , b [ L ] W^{[L]},b^{[L]} W[L],b[L]。我们把每一层都当作一个线性回归处理。

总结

以上,就是我们对应线性回归模型的讲解,谢谢!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/604993.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java JUC并发编程调优

前言 1、JUC是指有关 java.util.concurrent包以及其子包,这些包都是有关线程操作的包 2、HTTPS服务请求中,WEB服务只负责创建主线程来接收外部的HTTPS请求,如果不做任何处理,默认业务逻辑是通过主线程来做的,如果业务…

预训练大语言模型的三种微调技术总结:fine-tuning、parameter-efficient fine-tuning和prompt-tuning

预训练大模型,尤其是大语言模型已经是当前最火热的AI技术。2018年Google发布BERT模型(BERT在DataLearner官方模型卡信息:https://www.datalearner.com/ai-models/pretrained-models/BERT )的时候,大家还没有意识到本轮…

国际植物命名数据库(International Plant Names Index)

功能介绍 https://www.ipni.org/ 是国际植物命名数据库(International Plant Names Index)的官方网站。国际植物命名数据库是一个全球性的植物命名和分类资源,旨在提供植物命名信息的权威来源。以下是该网站的一些特点和功能: 植…

wmvcore.dll丢失怎么弄?解决wmvcore.dll丢失问题

wmvcore.dll是Windows Media Player中的一个重要组件,它负责处理视频和音频文件的编码和解码。如果您在使用Windows Media Player或其他媒体播放器时遇到了wmvcore.dll丢失的问题,那么您可能无法播放视频或音频文件。在这种情况下,您可以使用…

干货|接口测试必备技能-常见接口协议解析

【摘要】 服务与服务之间传递数据包,往往会因为不同的应用场景,使用不同的通讯协议进行传递。比如网站的访问,常常会使用 HTTP 协议进行传递,文件传输使用 FTP,邮件传递使用 SMTP。上述的三种类型的协议都处于网络模型…

电流环参数自整定及其原理

前言 电流环参数自整定是通过程序计算电流环PI调节器增益以实现环路响应仅受用户设定PI调节器带宽影响,而和电机本身参数无关的目的。 本文分析电流环参数自整定背后的原理,并通过仿真进行验证。 1、永磁同步电机dq轴数学模型 本文提到的电流环参数自…

【论文总结】Creating a Secure Underlay for the Internet

为互联网创建一个安全的底层 摘要: 对手可以利用跨域路由漏洞拦截通信并破坏关键互联网应用的安全性。与此同时,部署诸如边界网关安全协议(BGPsec)和下一代网络上的可扩展性、控制和隔离(SCION)等安全路由…

38 KVM管理设备-管理虚拟机USB

文章目录 38 KVM管理设备-管理虚拟机USB38.1 配置USB控制器38.1.1 概述38.1.2 注意事项38.1.3 配置方法 38.2 配置USB直通设备38.2.1 概述38.2.2 注意事项38.2.3 配置说明38.2.4 配置方法 38 KVM管理设备-管理虚拟机USB 为了方便在虚拟机内部使用USBkey设备、USB海量存储设备等…

蓝桥杯单片机基础模板一:动态数码管显示

蓝桥杯单片机有一些基础模块的写法,他是没有一定的公式模板的。 好比动态数码管扫描显示,原理就是快速地 传输段选和位选。 但因为电路上添加了74HC573芯片,导致了我们移植别处 51单片机的动态扫描代码 会出现诸多问题,比如闪烁…

期末学习总结模板

期末学习总结精选篇1 转眼间研究生的生活已经有一学期了,感觉才参加复试没多久,回头想想,这一年过的真快,因为生病,耽误了很多时间,收获太少,遗憾太多。 本学期的收获: 1、暑假里看了…

Elasticsearch文件存储

分析Elasticsearch Index文件是如何存储的? 主要是想看一下FST文件是以什么粒度创建的? 首先通过kibana找一个索引的shard,此处咱们就以logstash-2023.05.30索引为例 查看下shard分布情况 GET /_cat/shards/logstash-2023.05.30?vindex …

AtCoder Beginner Contest 303——A-E题讲解

蒟蒻来讲题,还望大家喜。若哪有问题,大家尽可提! Hello, 大家好哇!本初中生蒟蒻讲解一下AtCoder Beginner Contest 303这场比赛的A-E题! A - Similar String 原题 Problem Statement Two characters x x x and y…

Python IDLE介绍

目录 IDE(集成开发环境)是什么 Python IDLE使用方法详解 Python IDLE常用快捷键 IDE(集成开发环境)是什么 IDE 是 Integrated Development Environment 的缩写,中文称为集成开发环境,用来表示辅助程序员…

一、Fuzzing速成之AFL实战

文章目录 一、Fuzzing基本知识1、什么是Fuzzing?2、Fuzzing运行流程 二、Fuzzing实战1、下载AFL压缩包2、安装AFL3、Fuzzing 一、Fuzzing基本知识 1、什么是Fuzzing? 维基百科将模糊测试定义为:     模糊测试 (fuzz testing, fuzzing)…

【Python 文本挖掘】零基础也能轻松掌握的学习路线与参考资料

Python文本挖掘是利用Python语言和相关文本挖掘工具对大量文本数据进行分析和挖掘的过程。Python在文本挖掘方面广泛应用于自然语言处理、情感分析、主题建模、关键词提取等领域。 学习Python文本挖掘需要掌握Python编程基础、数据分析和可视化、自然语言处理、机器学习等知识…

Flutter:功能型组件(3)- 拖拽组件、缩放平移组件

拖拽组件 拖拽组件包含 Draggable、LongPressDraggable 和 DragTarget。 Draggable、LongPressDraggable 为可拖拽的组件,LongPressDraggable 继承自Draggable,因此用法和 Draggable 完全一样,唯一的区别就是 LongPressDraggable 触发拖动的…

nginx添加nginx-sticky-module模块步骤

nginx-sticky-module模块是nginx实现负载均衡的一种方案,和ip_hash负载均衡算法会有区别的 ip_hash 根据客户端ip将请求分配到不同的服务器上.sticky 根据服务器个客户端的cookie,客户端再次请求是会带上此cookie,nginx会把有次cookie的请求转发到颁发cookie的服务器上. 安装…

AI工具合集!一共600+覆盖全行业,除了ChatGPT,那你也会喜欢这些其他的AI工具

如果你喜欢ChatGPT,那你也会喜欢这些其他的AI工具。 AI正在改变我们的工作方式,我不想错过充分利用它的机会,所以我尝试了一系列AI工具来节省时间,提高我的工作效率。 这里有个集合了600ai工具的合集包。 序号AI工具名称AI分类A…

I.MX RT1170加密启动详解(4):OTFAD XIP加密运行代码

本节将介绍基于AES加密的OTFAD引擎,它可以在不影响AES-128-CTR性能的情况下实时解密数据。OTFAD包括对AES密钥展开机制的完整硬件支持,它可以解密最多4个唯一的AES上下文。每个上下文都有一个用户定义的128位的Image Encryption Key(IEK)、一个64位的计数…

uniapp的movable-view、movable-area

uniapp的movable-view、movable-area movable-view: 可以在页面中拖拽滑动必须在movable-area组件中,并且必须是直接子节点必须设置width和height属性,不设置默认为10px提供特殊事件:htouchmove和vtouchmove movable-area&#xf…