神经网络(Neural networks)¶

计算图与反向传播¶

计算图:将神经网络的计算过程使用不同的节点表示,对于线性分类而言: image.png 使用计算图可以很方便的使用反向传播算法来计算梯度

每个节点根据上游传递的梯度值,结合本地的参数计算梯度进行反向传播计算

example: $$f(x,W)=||W\cdot x||^2=\sum_{i=1}^n(Wx)_{\boldsymbol{i}}^2$$ image.png $$\begin{aligned} & q=W\cdot x= \begin{pmatrix} {W_{1,1}x_{1}+\cdots+W_{1,n}x_{n}} \\ {\vdots} \\ {W_{n,1}x_{1}+\cdots+W_{n,n}x_{n}} \end{pmatrix} \\ & f(q)=||q||^2=q_1^2+\cdots+q_n^2 \end{aligned}$$

  • $\frac{\partial f}{\partial q}$
  • $\frac{\partial f}{\partial W}$
  • $\frac{\partial f}{\partial x}$

$$\begin{aligned} & \frac{\partial q_k}{\partial W_{i,j}}=\mathbf{1}_{k=i}x_j \\ \\ & \frac{\partial f}{\partial W_{i,j}} =\sum_k\frac{\partial f}{\partial q_k}\frac{\partial q_k}{\partial W_{i,j}} =\sum_k(2q_k)(\mathbf{1}_{k=i}x_j) =2q_ix_j \end{aligned}$$ $\nabla_Wf=2q\cdot x^T$

$\frac{\partial f}{\partial q_i}=2q_i$

$\frac{\partial f}{\partial q}=2q$

$\begin{gathered} \frac{\partial q_k}{\partial x_i}=W_{k,i} \\ \frac{\partial f}{\partial x_i}=\sum_k\frac{\partial f}{\partial q_k}\frac{\partial q_k}{\partial x_i} \\ =\sum_{k}2q_{k}W_{k,i} \end{gathered}$ $\nabla_xf=2W^T\cdot q$

一篇有关于矩阵求导的参考文章

一个乘法节点实现的例子:

class Multiply(object):
    def forward(x,y):
        z = x * y
        self.x = x
        self.y = y
        return z
    def backward(dz):
        dx = self.y * dz 
        dy = self.x * dz
        return [dx,dy]

卷积神经网络(CNN)¶

卷积¶

希望提取图像中的结构信息

卷积核:在整个图像上滑动的一个矩阵与图像进行点积运算,可以提取出图像中的特征,卷积核也可以称为一个神经元的感受野 image.png image.png

一个卷积核往往只能提取到某一种特征,因此我们会使用多组卷积核对特征进行提取。

初始的卷积核会提取一些图像的低级特征,比如边缘;

后续的卷积核则会提取到一些更加复杂的特征。 image.png

卷积处理之后的输出尺寸:$(N-F)/stride+1$

N,F,stride分别是图像尺寸,卷积核大小和滑动步长

为了使卷积处理之后的矩阵大小不变,我们可以在矩阵的边缘进行填充

池化层¶

减小矩阵的尺寸,降低采样率;减少后续训练的参数量

  • 最大池化:image.png
  • 平均值池化

全连接层¶

处理神经网络最终的输出