# 逻辑斯特回归

逻辑斯特回归(Logistic Regression)是一种广泛应用于分类问题的统计方法。尽管名字中带有 “回归” 一词,但逻辑斯特回归实际上是用于二分类问题的。

# 基本原理

逻辑斯特回归的基本思想是使用逻辑斯特函数(也称为 Sigmoid 函数)将线性回归模型的输出转换为介于 0 和 1 之间的概率,从而用于分类。

# 数学表达

  1. 线性模型: 首先,逻辑斯特回归使用线性回归模型来计算输入变量的线性组合:

    z=wTx+bz=w^Tx+b

    其中,ww 是权重向量,xx 是输入特征向量,bb 是偏置项

  2. 逻辑斯特函数: 然后,将线性组合的结果zz 通过逻辑斯特函数转换为概率:

    y^=σ(z)=11+ez\hat{y}=\sigma(z)=\frac1{1+e^{-z}}

    其中,σ(z)\sigma(z) 是逻辑斯特函数,y^\hat y 是预测的概率值,表示样本属于正类的概率

# 决策边界

逻辑斯特回归的输出是一个概率,通过设定一个阈值(通常为 0.5),将概率转换为二分类结果:

y^={1ifσ(z)0.50ifσ(z)<0.5\hat{y}=\begin{cases}1&\text{if} \ \sigma(z)\geq0.5\\0&\text{if}\ \sigma(z)<0.5\end{cases}

# 损失函数

为了训练逻辑斯特回归模型,使用了对数似然损失函数(Log-Likelihood Loss)或称为交叉熵损失(Cross-Entropy Loss):

J(w,b)=1mi=1mL(y^(i),y(i))=1mi=1m(y(i)logy^(i)+(1y(i))log(1y^(i)))J(w,b)=\frac{1}{m}\sum_{i=1}^{m}\mathcal{L}(\hat{y}^{(i)},y^{(i)})=-\frac{1}{m}\sum_{i=1}^{m}(y^{(i)}\log\hat{y}^{(i)}+(1-y^{(i)})\log(1-\hat{y}^{(i)}))

其中,NN 是样本数量,yiy_i 是第ii - 个样本的真实标签,y^i\hat y_i 是第ii 个样本的预测概率。

# 梯度下降发训练

更新ww:

w=wαdJ(w)dww=w-\alpha \frac {dJ(w)}{dw}

  • α\alpha: 学习率

# 学习率

在深度学习中,学习率(Learning Rate)是一个至关重要的超参数,它控制着模型权重更新的步长大小。在训练神经网络时,学习率决定了每次迭代时模型参数(如权重和偏置)的更新速度。具体来说,学习率影响着梯度下降算法中每一步调整的幅度。以下是学习率在深度学习中的具体意义:

# 学习率的求法和调整方法

确定和调整学习率是深度学习中一个关键的步骤,可以通过以下几种方法来选择和调整学习率:

  1. 固定学习率

    • 直接设定一个固定的学习率值,这是最简单的方法。常用的初始学习率范围在 0.01 到 0.0001 之间,具体取决于问题的复杂度和数据特性。
  2. 学习率调优

    • 网格搜索(Grid Search):在一组预定义的学习率值中进行搜索,选择表现最好的学习率。
    • 随机搜索(Random Search):在一定范围内随机选择学习率值进行实验,找到较好的学习率。
  3. 自适应学习率方法

    • 学习率衰减(Learning Rate Decay)

      :随着训练的进行,逐渐减小学习率。常见的衰减方法有:

      • 时间衰减:学习率随着时间线性或指数衰减,如 α=α01+ktα=α01+ktα=1+ktα0α=α_{01}+kt\alpha = \frac{\alpha_0}{1 + kt}α=1+ktα_0,其中 $\alpha_0 为初始学习率,为初始学习率,k$ 为衰减率,tt 为时间步。
      • 分段常数衰减:在训练过程的不同阶段使用不同的固定学习率。
    • 动量法(Momentum):引入动量项,使参数更新不仅依赖于当前的梯度,还依赖于之前更新的动量,平滑学习率的变化。

    • RMSProp 和 Adam:自适应方法,根据参数的历史梯度调整学习率。Adam 算法是 RMSProp 和动量法的结合,效果较好。

  4. 循环学习率(Cyclical Learning Rates)

    • 让学习率在一定范围内周期性变化,可以帮助模型跳出局部最优解。
    • 常用的方法有三角形策略(Triangular Policy)和余弦退火(Cosine Annealing)。

# 链式法则

要求djdrrf函数的一个变量可以求djdr=djdfdfdr要求 \frac {dj}{dr} \\ r是f函数的一个变量\\可以求 \frac {dj}{dr}=\frac {dj}{df}*\frac {df}{dr}

# 梯度下降

# 逻辑回归梯度下降算法

  1. 初始化

    J=0,dw1=0,dw2=0,db=0J=0,\quad dw_1=0,\quad dw_2=0,\quad db=0

    初始化代价函数JJ 和梯度dw1dw2dbdw_1、dw_2、db 为零。

  2. 循环遍历所有训练样本

    For i = 1 to m\text{For i = 1 to m}

    对每个训练样本 $ (x^(i)}, y({(i)))$ 进行以下操作:

    a. 计算线性组合 zz 和激活值 aa

    z(i)=wTx(i)+ba(i)=σ(z(i))=11+ez(i)z^{(i)}=\mathbf{w}^{T}\mathbf{x}^{(i)}+b\\a^{(i)}=\sigma(z^{(i)})=\frac1{1+e^{-z^{(i)}}}

    其中,$w 是权重向量,是权重向量,x^{(i)}是输入特征向量,是输入特征向量,b$ 是偏置。

    b. 计算损失函数的梯度

    J+=[y(i)loga(i)+(1y(i))log(1a(i))]dz(i)=a(i)y(i)J+=-[y^{(i)}\log a^{(i)}+(1-y^{(i)})\log(1-a^{(i)})]\\dz^{(i)}=a^{(i)}-y^{(i)}

    • yy: 训练样本的实际分类标签。对于二分类问题,yy 通常取值为 0 或 1。
      c. 累积梯度

    dw1+=x1(i)dz(i)dw2+=x2(i)dz(i)db+=dz(i)dw_1+=x_1^{(i)}dz^{(i)}\\dw_2+=x_2^{(i)}dz^{(i)}\\db+=dz^{(i)}

  3. 平均梯度

    J/=mdw1/=m,dw2/=m,db/=mJ/=m\\dw_1/=m,\quad dw_2/=m,\quad db/=m

    将代价函数和梯度的累积值除以样本数 mm,得到平均值。

  4. 更新参数

    w1=w1αdw1w2=w2αdw2b=bαdbw_1=w_1-\alpha dw_1\\w_2=w_2-\alpha dw_2\\b=b-\alpha db

    其中,$\alpha $ 是学习率,用于控制每次参数更新的步长。

# 公式解释

  • 线性组合zz

    z(i)=wTx(i)+bz^{(i)}=\mathbf{w}^T\mathbf{x}^{(i)}+b

    这是输入特征的线性组合加上偏置。

  • 激活函数 σ(z)\sigma(z)

    a(i)=σ(z(i))=11+ez(i)a^{(i)}=\sigma(z^{(i)})=\frac{1}{1+e^{-z^{(i)}}}

    激活函数(sigmoid 函数)将线性组合 zz 转换为概率值 aa

  • 损失函数 JJ

    J=1mi=1m[y(i)loga(i)+(1y(i))log(1a(i))]J=-\frac{1}{m}\sum_{i=1}^{m}\left[y^{(i)}\log a^{(i)}+(1-y^{(i)})\log(1-a^{(i)})\right]

    交叉熵损失函数,用于衡量预测概率 aa 与实际标签 yy 之间的差距。

  • ** 梯度 **dw1,dw2,dbdw_1,dw_2,db

    dw1=Jw1,dw2=Jw2,db=Jbdw_1=\frac{\partial J}{\partial w_1},\quad dw_2=\frac{\partial J}{\partial w_2},\quad db=\frac{\partial J}{\partial b}

    这是损失函数对权重和偏置的导数,用于参数更新。

通过上述步骤,我们可以逐步调整模型参数 wwbb,使得损失函数 JJ 最小化,从而训练出一个良好的逻辑回归模型。图中还提到了一些向量化的方法,可以加速计算过程,特别是在处理大规模数据集时。

# 向量化

非向量化的情况下,逻辑斯特回归可以表示为:

z=ωTx+bz=\omega^Tx+b

计算zz 的过程可以用一个循环来实现:

1
2
3
4
z = 0
for i in range(n_x):
z += w[i] * x[i]
z += b

这里的循环逐个元素地进行乘法和加法操作,效率较低。

向量化的情况下,计算zz 可以利用 NumPy 的 dot 函数进行向量点击运算,具体表示为:

z=np.dot(ω,x)+bz=\text{np.dot}(\omega,x)+b

通过向量化操作,可以将多个标量运算合并成单个向量运算,从而显著提升计算效率。向量化的代码如下:

1
z = np.dot(w, x) + b

# numpy 操作

  • np.dot(w, x) :点积
  • u=np.exp(v) :全成指数aeaa→e^a
  • np.abs :求绝对值
  • np.maximum :求最大值
  • np.log :求对数

# 逻辑斯特向量化

  • 线性组合:z(i)=wTx(i)+bz^{(i)}=w^Tx^{(i)}+b
  • 激活函数:a(i)=σ(z(i))a^{(i)}=\sigma (z^{(i)})

代码向量化

  • X=x^{(1)} x^{(2)} \cdots x^

  • 线性组合计算:z(1)z(2)z(m)=wTX+...bb]z^{(1)} z^{(2)} \cdots z^{(m)} = w^T X + ... b \cdots b ]

  • 代码实现如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9

    # 假设 w 是权重向量,X 是输入特征矩阵,b 是偏置项
    w = np.array([w1, w2, ..., wn]) # 权重向量
    X = np.array([[x1_1, x1_2, ..., x1_m], [x2_1, x2_2, ..., x2_m], ..., [xn_1, xn_2, ..., xn_m]]) # 输入特征矩阵
    b = b_value # 偏置项

    # 向量化计算
    Z = np.dot(w.T, X) + b
    A = 1 / (1 + np.exp(-Z)) # sigmoid 函数

# 反向传播向量化

  • 误差计算:dz(i)=a(i)y(i),其中a(i)是模型预测的输出,y(i)是真实标签dz^{(i)}=a^{(i)}-y^{(i)},其中a^{(i)}是模型预测的输出,y^{(i)}是真实标签
  • 将向量化误差表示为1×m1×m 的向量,dZ=[dz(1)dz(2)dz(m)]dZ=[dz^{(1)} \ \ dz^{(2)} \ \ \cdots dz^{(m)}]
  • 计算:AA: 模型对所有样本的预测值、YY: 所有样本的真实标签.
    A=[a(1)a(2)a(m)]A=\begin{bmatrix}a^{(1)}&a^{(2)}&\cdots&a^{(m)}\end{bmatrix}
    Y=\begin{bmatrix}y^{(1)}&y^{(2)}&\cdots&y^{(m)}\end
  • 误差向量化表示为:dZ=AYdZ=A-Y
  • 计算权重梯度:dw=0dw+=x(i)dz(i)dw=1mi=1mx(i)dz(i)dw=0 \ \ → \ \ \ dw+=x^{(i)}*dz^{(i)} \ \ \ → \ \ \ dw=\frac1m\sum_{i=1}^mx^{(i)}\cdot dz^{(i)}
    dw=1mXdZTdw=\frac1mXdZ^T
  • 计算偏执梯度:db=0db+=dz(i)db=1mi=1mdz(i)db=0 \ \ → \ \ \ db+=dz^{(i)} \ \ \ → \ \ \ db=\frac1m\sum_{i=1}^mdz^{(i)}
    db=1mnp.sum(dZ)db=\frac{1}{m}\text{np.sum}(dZ)

# 神经网络

# a_i^

  • 不同的上表方括号表示神经网络里不同的值
  • ll: 表示神经网络的第ll
  • ii:表示层中的第ii 个节点

# 神经网络

image.png

# 单个神经元

单层神经元如上图,输入向量为x=[x1,x2,x3]x=[x_1,x_2,x_3],输出为y^\hat y

# 计算过程

  1. 线性组合:

    z=wTx+bz=w^Tx+b

    • wTw^T 表示权重向量 w 的转置
    • b 是偏置
  2. 激活函数:

    a=σ(z)a= \sigma (z)

    • $\sigma $ 是激活函数,将线性组合的结果 z 转换为激活值 a
  3. 输出:

    y^=a\hat y=a

    • 激活值aa 作为神经元的输出

# 多层神经网络

上图左下角展示了一个简单的三层神经网络,输入向量x=[x1,x2,x3]x=[x_1,x_2,x_3],通过一层隐藏层到达输出层。

# 计算过程

  1. 输入层到隐藏层:

    • 输入向量xx 通过权重矩阵W[1]W^{[1]} 和偏置向量b[1]b^{[1]} 进行线性组合

      z[1]=W[1]x+b[1]z^{[1]}=W^{[1]}x+b^{[1]}

    • 线性组合的结果z[1]z^{[1]} 通过激活函数σ\sigma 得到隐藏层的激活值哦a^

      a[1]=σ(z[1])a^{[1]}=\sigma(z^{[1]})

  2. 隐藏层到输出层:

    • 隐藏层的激活值a[1]a^{[1]} 通过权重矩阵W[2]W^{[2]} 和偏置向量b[2]b^{[2]} 进行线性组合

      z[2]=W[2]a[1]+b[2]z^{[2]}=W^{[2]}a^{[1]}+b^{[2]}

    • 线性组合的结果z[2]z^{[2]} 通过激活函数σ\sigma 得到输出层的激活值a^

      a[2]=σ(z[2])a^{[2]}=\sigma (z^{[2]})

  3. 损失函数:

    • 输出层的激活值a[2]a^{[2]} 通过损失函数L(a[2]y)L(a^{[2]},y) 与真实标签yy 进行比较,计算损失:

    L(a[2],y)L(a^{[2]},y)

# 伪代码实现

Given input x:

z[1]=W[1]+b[1]a[1]=σ(z[1])z[2]=W[2]a[1]+b[2]a[2]=σ(z[2])z^{[1]}=W^{[1]}+b^{[1]} \\ →a^{[1]}=\sigma(z^{[1]})\\z^{[2]}=W^{[2]}a^{[1]}+b^{[2]} \\→a^{[2]}=\sigma(z^{[2]})

# 计算神经网络输出

QQ_1721360320879.png

# 多层神经网络

QQ_1721360642812.png

# 将多个样本向量化

公式:

for i = 1 to m:z[1](i)=W[1]x(i)+b[1]a[1](i)=σ(z[1](i))z[2](i)=W[2]a[1](i)+b[2]a[2](i)=σ(z[2](i))\begin{gathered} \text{for i = 1 to m:} \\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ {z^{[1](i)}}=W^{[1]}x^{(i)}+b^{[1]} \\ \ \ \ \ \ \ \ \ \ \ {a^{[1](i)}}=\sigma(z^{[1](i)}) \\\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ z^{[2](i)}=W^{[2]}a^{[1](i)}+b^{[2]} \\ \ \ \ \ \ \ \ \ \ \ \ \ a{[2](i)}=\sigma(z^{[2](i)}) \end{gathered}

QQ_1721369470589.png

# 神经网络图

QQ_1721369714169.png

图片左上角展示了一个简单的神经网络结构,输入层有三个节点 $ x_1, x_2, x_3,经过一个隐藏层,输出一个预测值,经过一个隐藏层,输出一个预测值 \hat {y}$。

右上角的代码片段 for i = 1 to m: 表示我们对 m 个样本逐个进行处理。

  • z[1](i)=W[1]x(i)+b[1]z^{[1]}(i)=W^{[1]}x^{(i)}+b^{[1]} 表示第ii 个样本在第一层的线性组合
  • a[1](i)=σ(z[1](i))a^{[1]}(i)=\sigma(z^{[1]}(i)) 表示通过激活函数σ\sigma 计算出第ii 个样本在第一层的激活值
  • z[2](i)=W[2]a[1](i)+b[2]z^{[2]}(i)=W^{[2]}a^{[1]}(i)+b^{[2]} 表示第ii 个样本在第二层的线性组合
  • a[2](i)=σ(z[2](i))a^{[2]}(i)=\sigma(z^{[2]}(i)) 表示通过激活函数σ\sigma 计算出第ii 个样本在第二层的激活值

输入矩阵 X:

  • 每一列表示一个样本的数据,每一行表示一个特征
  • X=[x(1),x(2),,x(m)],其中x(i)X=[x^{(1)},x^{(2)},\ldots,x^{(m)}]\text{,其中 }x^{(i)} 表示第ii 个样本的输入向量

向量化处理:

矩阵W[1]再加上偏置b[1]A[1]=σ(Z[1])表示对线性组合结果应用激活函数σZ[2]=W[2]A[1]+b[2]表示将第一层的激活值矩阵A[1]乘以权重矩W[2]再加上偏置b[2]A[2]=σ(Z[2])表示对,,层的线性组合结果应用激活函数σ\begin{aligned} &\text{矩阵 }W^{[1]}\text{ 再加上偏置 }b^{[1]}。 \\ &· A^{[1]}=\sigma(Z^{[1]})\text{ 表示对线性组合结果应用激活函数 }\sigma\text{。} \\ &· Z^{[2]}=W^{[2]}A^{[1]}+b^{[2]}\text{ 表示将第一层的激活值矩阵 }A^{[1]}\text{ 乘以权重矩} \\ &\text{阵 }W^{[2]}\text{ 再加上偏置 }b^{[2]}。 \\ &A^{[2]}=\sigma(Z^{[2]})\text{ 表示对}^{\prime}\text{,}\downarrow\text{,层的线性组合结果应用激活函数 }\sigma\text{。} \end{aligned}

第一层激活矩阵:

矩阵A[1]包含了所有样本在第一层的激活值每一列表示一个样本的激活值,每一行表示一个神经元的输出。A[1]=[a[1](1),a[1](2),,a[1](m)],其中a[1](i)表示第i个样本在第一层的激活向量。\begin{aligned} & \text{矩阵 } A^{[1]} \text{ 包含了所有样本在第一层的激活值 } \\ &\text{每一列表示一个样本的激活值,每一行表示一个神经元的输出。} \\ & A^{[1]} = \left[ a^{[1]}(1), a^{[1]}(2), \ldots, a^{[1]}(m) \right], \text{ 其中 } a^{[1]}(i) \text{ 表示第 } i \text{ 个样本在第一层的激活向量。} \end{aligned}

# 激活函数

# σ函数\sigma函数

σ=11+ex\sigma=\frac{1}{1+e^{-x}}

# $ tanh$ 函数

tanh(x)=exexex+ex\tanh(x) = \frac{e^x - e^{-x}}{e^x + e^{-x}}

# 传播

反向传播(Backpropagation)是训练神经网络的核心算法之一,通过计算损失函数对每个参数的梯度,指导模型参数的更新。以下是反向传播算法的详细介绍,包括其基本原理、数学推导以及在神经网络中的应用。

# 基本原理

反向传播算法的基本思想是通过链式法则(Chain Rule),从输出层开始,逐层向后计算每个参数对损失函数的梯度。这个过程包括两个主要步骤:

# 前向传播

计算神经网络的输出 —— 前向传播是指将输入数据通过神经网络层层传递,直到得到最终的输出。假设有一个简单的三层神经网络(输入层、隐藏层、输出层),其计算过程如下:

  • 激活函数:

    a=σ(z)=11+eza=\sigma(z)=\frac{1}{1+e^{-z}}

  • 输出层误差:

    dZ=y^y=aydZ=\hat y-y=a-y

  • 激活值aa 对损失函数的偏导数:

    J+=[y(i)loga(i)+(1y(i))log(1a(i))]dL=La=ya+1y1aJ+=-[y^{(i)}\log a^{(i)}+(1-y^{(i)})\log(1-a^{(i)})]\\d\mathcal{L}=\frac{\partial\mathcal{L}}{\partial a}=-\frac ya+\frac{1-y}{1-a}

  • 线性组合zz 的梯度:

    dZ=dLσ(z)σ(z)=σ(z)(1σ(z))是 sigmoid 函数的导数。因为a=σ(z),所以dZ=ay已经考虑了这部分。dZ=d\mathcal{L}\cdot\sigma'(z)\\\bullet\quad\sigma^{\prime}(z)=\sigma(z)(1-\sigma(z))\text{ 是 sigmoid 函数的导数。}\\\bullet\quad\text{因为 }a=\sigma(z)\text{,所以 }dZ=a-y\text{ 已经考虑了这部分。}

输入层到隐藏层

  1. z(1)=W(1)x+b(1)a(1)=σ(z(1))z^{(1)}=W^{(1)}x+b^{(1)}\\a^{(1)}=\sigma(z^{(1)})

    其中,W(1)W^{(1)} 是输入层到隐藏层的权重矩阵,b(1)b^{(1)} 是偏置,σ\sigma 是激活函数

  2. 隐藏层到输出层

    z(2)=W(2)a(1)+b(2)a(2)=σ(z(2))z^{(2)}=W^{(2)}a^{(1)}+b^{(2)}\\a^{(2)}=\sigma(z^{(2)})

    其中,W(2)W^{(2)} 是隐藏层到输出层的权重矩阵,b(2)b^{(2)} 是偏置

  3. 输出层:

    y=a(2)y=a^{(2)}

    例子:

  • 计算函数ff 的输出zz

    z=f(x,y)z=f(x,y)

# 反向传播

反向传播的目的是计算损失函数LL 对每个参数的梯度。这个过程包括以下步骤:

  1. 计算输出层的误差

    δ(2)=Lz(2)=La(2)σ(z(2))\delta^{(2)}=\frac{\partial L}{\partial z^{(2)}}=\frac{\partial L}{\partial a^{(2)}}\cdot\sigma^{\prime}(z^{(2)})

    其中,δ(2)\delta^{(2)} 是输出层的误差,σ(z(2))\sigma^{\prime}(z^{(2)}) 是激活函数的导数

  2. 计算隐藏层的误差

    δ(1)=Lz(1)=(W(2))Tδ(2)σ(z(1))\delta^{(1)}=\frac{\partial L}{\partial z^{(1)}}=(W^{(2)})^T\delta^{(2)}\cdot\sigma'(z^{(1)})

    其中,δ(1)\delta^{(1)} 是隐藏层的误差

  3. 计算梯度

    • 对权重的梯度:

      LW(2)=δ(2)(a(1))TLW(1)=δ(1)xT\frac{\partial L}{\partial W^{(2)}}=\delta^{(2)}(a^{(1)})^T\\\frac{\partial L}{\partial W^{(1)}}=\delta^{(1)}x^T

      • 123
      • QQ_1721034670405.png
    • 对偏置的梯度:

      Lb(2)=δ(2)Lb(1)=δ(1)\frac{\partial L}{\partial b^{(2)}}=\delta^{(2)}\\\frac{\partial L}{\partial b^{(1)}}=\delta^{(1)}

      • 这个公式表明输出层的偏置梯度就是输出层的误差。
      • 这个公式表明隐藏层的偏置梯度就是隐藏层的误差
  • 从损失函数LL 对输出zz 的梯度楷书:

    Lz\frac{\partial L}{\partial z}

  • 计算局部梯度zx\frac{\partial z}{\partial x} 和\frac{\partial z}

  • 通过链式法则,计算损失函数LL 对输入xxyy 的梯度:

    Lx=LzzxLy=Lzzy\frac{\partial L}{\partial x}=\frac{\partial L}{\partial z}\cdot\frac{\partial z}{\partial x}\\\frac{\partial L}{\partial y}=\frac{\partial L}{\partial z}\cdot\frac{\partial z}{\partial y}

# 梯度下降法的基本算法

# 参数定义

神经网络层数包括权重WW 和偏置bb,其中:

  • W[1]W^{[1]}b[1]b^{[1]} 是第 1 层的权重和偏置
  • W[2]W^{[2]}b[2]b^{[2]} 是第 2 层的权重和偏置

# 成本函数

成本函数JJ 定义如下:

J(W[1],b[1],W[2],b[2],)=1mi=1mL(y^(i),y(i))J(W^{[1]},b^{[1]},W^{[2]},b^{[2]},\ldots)=\frac{1}{m}\sum_{i=1}^{m}\mathcal{L}(\hat{y}^{(i)},y^{(i)})

其中:

  • mm 是训练样本的数量
  • L\mathcal{L} 是损失函数(例如,均方误差或交叉熵)
  • y^\hat{y} 是预测值
  • yy 是真实值

# 梯度下降算法

  • 计算预测值y^\hat y
  • 计算梯度:
    • 对权重WWdW[l]dW^{[l]}=JW[l]\frac{\partial J}{\partial W^{[l]}}
    • 对偏置bbdb[i]=Jb[l]db^{[i]}=\frac{\partial J}{\partial b^{[l]}}
  • 更新参数:
    • W[l]:=W[l]αJW[l]W^{[l]}:=W^{[l]}-\alpha\frac{\partial J}{\partial W^{[l]}}
    • b[l]:=b[l]αJb[l]b^{[l]}:=b^{[l]}-\alpha\frac{\partial J}{\partial b^{[l]}}
    • 其中α\alpha 是学习率

# 反向传播代码实现

QQ_1721474062767.png

# Question:为什么偏置的梯度推导代码如上?

假设我们已经计算出第l层的线性组合Z[l]和激活值A[l]:Z[l]=W[l]A[l1]+b[l]A[l]=g[l](Z[l])现在,我们需要计算dW[l]。根据链式法则:dW[l]=JW[l]=JZ[l]Z[l]W[l]我们知道:Z[l]W[l]=A[l1]T因此,我们得到:dW[l]=dZ[l]A[l1]T由于我们是在所有样本上计算平均值,所以:dW[l]=1mi=1mdZ[l](i)A[l1](i)T在矩阵形式下,所有样本的和可以表示为矩阵乘法:dW[l]=1mdZ[l]A[l1]T总结这就是为什么:JW[l]=dW[l]=1mdZ[l]A[l1]T\begin{aligned} &假设我们已经计算出第l层的线性组合Z^{[l]}\text{ 和激活值 }A^{[l]}: \\ &Z^{[l]}=W^{[l]}A^{[l-1]}+b^{[l]} \\ &A^{[l]}=g^{[l]}(Z^{[l]}) \\ &\text{现在,我们需要计算 }dW^{[l]}\text{。根据链式法则}: \\ &dW^{[l]}=\frac{\partial J}{\partial W^{[l]}}=\frac{\partial J}{\partial Z^{[l]}}\cdot\frac{\partial Z^{[l]}}{\partial W^{[l]}} \\ &我们知道: \\ &\frac{\partial Z^{[l]}}{\partial W^{[l]}}=A^{[l-1]T} \\ &因此,我们得到: \\ &dW^{[l]}=dZ^{[l]}\cdot A^{[l-1]T} \\ &\text{由于我们是在所有样本上计算平均值,所以:} \\ &dW^{[l]}=\frac{1}{m}\sum_{i=1}^{m}dZ^{[l](i)}\cdot A^{[l-1](i)T} \\ &\text{在矩阵形式下,所有样本的和可以表示为矩阵乘法:} \\ &dW^{[l]}=\frac{1}{m}dZ^{[l]}A^{[l-1]T} \\ &\text{总结} \\ &\text{这就是为什么:} \\ &\frac{\partial J}{\partial W^{[l]}}=dW^{[l]}=\frac{1}{m}dZ^{[l]}A^{[l-1]T} \end{aligned}

# Question: 为什么Z[l]W[l]=A[l1]T\frac{\partial Z^{[l]}}{\partial W^{[l]}}=A^{[l-1]T}?

首先观察一个关键公式:

Z[l]=W[l]A[l1]+b[l]Z^{[l]}=W^{[l]}A^{[l-1]}+b^{[l]}

image.png

# 随机初始化

# 为什么权重初始化不能为零

  • 如果将所有权重初始化为零,那么每一层的所有神经元将产生相同的输出,导致反向传播时的梯度对称。这种对称性意味着每一层的所有神经元将以相同的方式更新,从而阻止网络有效地学习。
  • a=Wx+ba=Wx+b, 当权重W[1]W[2]W^{[1]}和W^{[2]} 初始化为零时,激活值a1[1]a1[2]a_1^{[1]}和a_1^{[2]} 相同
  • 梯度ΔW\Delta W 也是对称的,意味着\Delta W=\begin{bmatrix}u&u\\v&v\end
  • 由权重更新规则,W[l]=W[l]αΔW(其中α是学习率)W^{[l]}=W^{[l]}-\alpha\Delta W (\text{其中 }\alpha\text{ 是学习率}),若权重初始化为零,则不会打破对称性

计算规则:

ΔW=LW\Delta W=\frac{\partial L}{\partial W}

1.计算损失函数对Z[2]的偏导数:dZ[2]=A[2]Y2.u表示误差:dZ[2]=u\begin{gathered} 1.\text{ 计算损失函数对 }Z^{[2]}\text{ 的偏导数:} \\ dZ^{[2]}=A^{[2]}-Y \\ 2. \text{用} u \text{表示误差}: \\ dZ^{[2]}=u \end{gathered}

dce2ce1cce49d3bdc4659eea6e157db4.png

# 如何随机初始化权重

在训练神经网络时,正确初始化权重对于有效训练非常重要。随机初始化权重可以避免神经元在每一层的输出相同,从而打破对称性,提高网络的学习能力。

# 网络结构

  • 输入层有两个输入x1x_1x2x_2
  • 隐藏层有两个神经元a1[1]a_1^{[1]} 和a_2^
  • 输出层有一个神经元a_1^

# 权重和偏置初始化

隐藏层权重W[1]W^{[1]} 随机初始化,可以采用正态分布:

W[1]=np.random.randn(2,2)×0.01W^{[1]}=\text{np.random.randn}(2,2)\times0.01

这段代码的含义是生成一个 2×2 的矩阵,矩阵中的每个元素都是从标准正态分布(均值为 0,标准差为 1)中随机抽取的数,然后将这些数乘以 0.01。最终结果是一个 2×2 的矩阵,其中每个元素都是一个很小的随机数。

将隐藏层偏置b[1]b^{[1]} 初始化为零:

b[1]=np.zeros((2,1))b^{[1]}=\text{np.zeros}((2,1))

再将输出层权重W[2]W^{[2]} 和偏置b[2]b^{[2]} 初始化为随机值和零:

W[2]=...b[2]=0\begin{aligned}W^{[2]}&=...\\b^{[2]}&=0\end{aligned}