神经网络

24 年 6 月 8 日 星期六
1493 字
8 分钟

感知机

原始形式的感知机是一种简单的线性分类模型,它通过找到一个分割超平面来将数据集分为两类。其数学模型可以表示为:f(x)=sign(wx+b)f(x) = \text{sign}(w \cdot x + b) 其中,ww 是权重向量,bb 是偏置项,且 sign\text{sign} 函数是符号函数,用于输出分类结果(+1 或 -1)。在训练过程中,权重和偏置的更新规则如下:

  • 如果 yi(wxi+b)0y_i(w \cdot x_i + b) \leq 0,则: ww+ηyixiw \leftarrow w + \eta y_i x_i bb+ηyib \leftarrow b + \eta y_i 这里的 η\eta 是学习率,yiy_i 是实际的类别标签。

对偶形式感知机

之前提到ww的更新方式是w=w+ηyixiw = w + \eta y_{i}x_{i} ,如果初始ww为零 则w=ηyixiw = \eta y_{i}x_{i},这里就可以看出来,ww实际上就是每个数据的标签yiy_{i}和数据向量xix_{i}作用的结果,每个数据一旦没有被正确分类就会对ww作用很多次,下面我们通过一个变量mjm_{j}来记录数据xjx_{j}ww的作用次数,从而可以直接表示出ww

迭代到最后 结果就是w=ηj=1Nmjyjxjw = \eta\sum\limits_{j=1}^{N}m_{j}y_{j}x_{j} (这里相比之前 添加了所有数据对ww的影响,之前的也有只是没体现出来)

其中,mjm_{j}(xj,yj)(x_{j}, y_{j})在这次之前被错误分类的次数,初始为0

αj=mjη\alpha_{j}=m_{j}\etaw=j=1Nαjyjxjw = \sum\limits_{j=1}^{N}\alpha_{j}y_{j}x_{j} 代入最开始的迭代式yi(wxi+b)0y_i(w \cdot x_i + b) \leq 0,得到yi(j=1Nαjyjxjxi+b)0y_i(\sum\limits_{j=1}^{N}\alpha_{j}y_{j}x_{j} \cdot x_i + b) \leq 0 注意到这个判断误分类的形式里面是计算两个样本$x_{i}$和$x_$的内积,而且这个内积计算的结果在下面的迭代次数中可以重用。如果我们事先用矩阵运算计算出所有的样本之间的内积,那么在算法运行时, 仅仅一次的矩阵内积运算比多次的循环计算省时。 计算量最大的判断误分类这儿就省下了很多的时间,,这也是对偶形式的感知机模型比原始形式优的原因。

之后迭代试如下

  • 如果 yi(j=1Nαjyjxjxi+b)0y_i(\sum_{j=1}^N \alpha_j y_j x_j \cdot x_i + b) \leq 0,则: αiαi+η\alpha_i \leftarrow \alpha_i + \eta bb+ηyib \leftarrow b + \eta y_i 收敛后通过公式w=ηj=1Nmjyjxjw = \eta\sum\limits_{j=1}^{N}m_{j}y_{j}x_{j}得到权值向量ww 刘建平感知机模型

DNN(Deep Neural Network)模型推导

神经网络的基本单元是感知机,但通过增加隐藏层和非线性激活函数,神经网络能够处理更加复杂的非线性问题。

神经网络的结构

  1. 输入层:接收输入数据。
  2. 隐藏层:通过权重和激活函数进行计算。
  3. 输出层:生成最终的预测结果。

参数的定义

在神经网络中,权重 ( w ) 和偏置 ( b ) 是需要学习的参数。权重 wijlw_{ij}^l 表示从第 ll 层的第 jj 个神经元到第 l+1l+1 层的第 ii 个神经元的连接权重。

权重 w243w_{24}^3 表示第二层的第4个神经元到第三层的第2个神经元的权重。上面代表第几层(从2开始,因为输入层没有变换),下面代表从哪个神经元到哪个神经元,这里是目的和来源相反的。每个ww对应一个箭头(变换) ![[./img/神经网络参数w.png]]

权重 b32b_{3}^{2} 表示第二层的第3个神经元的偏移,上面的次数代表第几层,下面代表第几个神经元,参数b对应于某个神经元 ![[./img/神经网络参数b.png|500]]

前向传播

前向传播是指从输入层到输出层逐层计算神经元的输出值的过程。假设有一个三层神经网络(输入层、隐藏层、输出层),其计算过程如下: ![[./img/神经网络_向前传播.png|500]]

  1. 输入层到隐藏层a12=σ(z12)=σ(w111x1+w121x2+w131x2+b12)a22=σ(z22)=σ(w211x1+w221x2+w231x2+b22)a32=σ(z32)=σ(w311x1+w321x2+w331x2+b32)\begin{aligned} a_{1}^{2} = \sigma(z_{1}^{2}) = \sigma(w_{11}^1 x_1 + w_{12}^1 x_{2}+ w_{13}^1 x_2+ b_{1}^{2})\\ a_{2}^{2} = \sigma(z_{2}^{2}) = \sigma(w_{21}^1 x_1 + w_{22}^1 x_{2}+ w_{23}^1 x_2+ b_{2}^{2})\\ a_{3}^{2} = \sigma(z_{3}^{2}) = \sigma(w_{31}^1 x_1 + w_{32}^1 x_{2}+ w_{33}^1 x_2+ b_{3}^{2}) \end{aligned}
  2. 隐藏层到输出层a13=σ(z13)=σ(w113a12+w123a22+w133a23+b13)a_{1}^{3} = \sigma(z_{1}^{3}) = \sigma(w_{11}^3 a_{1}^{2} + w_{12}^{3} a_{2}^{2}+ w_{13}^3 a_{2}^{3}+ b_{1}^{3}) 其中,σ\sigma 表示激活函数(如Sigmoid、ReLU等)。 这里可以简单转化为 ajl=σ(zjl)=σ(k=1mwjklakl1+bjl)a_{j}^{l}= \sigma(z_{j}^{l})= \sigma(\sum\limits_{k=1}^{m}w_{jk}^{l}a_{k}^{l-1}+b_{j}^{l}) 其中m代表前一层神经元的个数,这里ll要大于等于2,当l=2l=2时,ak0a_{k}^{0}代表输入x1,...,xnx_{1}, ..., x_{n} 进而转换成矩阵形式 al=σ(zl)=σ(wlal1+bl)a^{l} = \sigma(z^{l}) = \sigma(w^{l}a^{l-1}+b^{l})

反向传播

在这个问题中,您想要了解如何从损失函数 J(W,b,x,y)J(W, b, x, y) 对权重 WLW^L 和偏置 bLb^L 的导数推导过程。

损失函数

损失函数 JJ 定义为均方误差:

J(W,b,x,y)=12aLy2=12σ(zL)y2J(W, b, x, y) = \frac{1}{2} \lVert a^L - y \rVert^2 = \frac{1}{2} \lVert \sigma(z^L) - y \rVert^2

其中 aLa^L 是输出层的激活值,zLz^L 是输出层的加权输入,即 zL=WLaL1+bLz^L = W^L a^{L-1} + b^L

对权重 WLW^L 的梯度

为了计算 JWL\frac{\partial J}{\partial W^L},我们需要使用链式法则。首先,从损失函数对输出层激活 aLa^L 的偏导数开始:

JaL=aLy\frac{\partial J}{\partial a^L} = a^L - y

接着,我们需要 aLa^LzLz^L 的偏导数,这是激活函数 σ\sigma 的导数:

aLzL=σ(zL)\frac{\partial a^L}{\partial z^L} = \sigma'(z^L)

根据链式法则,JzL\frac{\partial J}{\partial z^L} 为:

JzL=JaLaLzL=JaLσ(zL)=(aLy)σ(zL)\frac{\partial J}{\partial z^L} =\frac{\partial J}{\partial a^L}\frac{\partial a^{L}}{\partial z^L}= \frac{\partial J}{\partial a^L} \odot \sigma'(z^L) = (a^L - y) \odot \sigma'(z^L)

称这个结果为误差 δL\delta^L:

δL=(aLy)σ(zL)\delta^L = (a^L - y) \odot \sigma'(z^L)

最后,zLz^LWLW^L 的偏导数是前一层的激活 aL1a^{L-1},因此:

JWL=δL(aL1)T\frac{\partial J}{\partial W^L} = \delta^L (a^{L-1})^T

对偏置 bLb^L 的梯度

类似地,zLz^L 对偏置 bLb^L 的偏导数是一个单位向量(zL=WLaL1+bLz^{L}= W^L a^{L-1} + b^L,偏置的梯度是误差 δL\delta^L),因此:

JbL=JaLaLzLzLbL=δLI=δL\frac{\partial J}{\partial b^L} = \frac{\partial J}{\partial a^L}\frac{\partial a^{L}}{\partial z^L}\frac{\partial z^{L}}{\partial b^L}=\delta^{L}I=\delta^{L}

递推

在实际应用中,知道δl+1\delta^{l+1}(最开始是δL\delta^{L})后,要知道δl\delta^{l}需要使用数学归纳法

δl=Jzl=(zl+1zl)TJzl+1=(zl+1zl)Tδl+1\delta^{l}=\frac{\partial J}{\partial z^{l}}=(\frac{\partial z^{l+1}}{\partial z^{l}})^{T}\frac{\partial J}{\partial z^{l+1}}=(\frac{\partial z^{l+1}}{\partial z^l})^{T}\delta^{l+1}

其中,zl+1zl\frac{\partial z^{l+1}}{\partial z^{l}}需要推导 zl+1=Wl+1al+bl=Wl+1δ(zl)+blz^{l+1} = W^{l+1} a^{l} + b^{l}=W^{l+1}\delta(z^{l})+b^{l}zlz^{l}进行求导

zl+1zl=Wl+1diag(σ(zl))\frac{\partial z^{l+1}}{\partial z^{l}}=W^{l+1}diag(\sigma^{'}(z^{l}) )

从而

δl=(zl+1zl)Tδl+1=(Wl+1diag(σ(zl))Tδl+1=(Wl+1)Tδl+1σ(zl)\begin{aligned} \delta^{l}&=(\frac{\partial z^{l+1}}{\partial z^l})^{T}\delta^{l+1}=(W^{l+1}diag(\sigma^{'}(z^{l}))^{T}\delta^{l+1}\\ &=(W^{l+1})^{T}\delta^{l+1}\odot\sigma^{'}(z^{l}) \end{aligned}

因此只需要求出最后一层的δL\delta^{L}就可以推导出前面的

文章标题:神经网络

文章作者:Blank

文章链接:https://blankxiao.github.io/posts/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0/%E7%A5%9E%E7%BB%8F%E7%BD%91%E7%BB%9C[复制]

最后修改时间:


商业转载请联系站长获得授权,非商业转载请注明本文出处及文章链接,您可以自由地在任何媒体以任何形式复制和分发作品,也可以修改和创作,但是分发衍生作品时必须采用相同的许可协议。
本文采用CC BY-NC-SA 4.0进行许可。