神经网络(Neural networks)¶
计算图与反向传播¶
计算图:将神经网络的计算过程使用不同的节点表示,对于线性分类而言: 使用计算图可以很方便的使用反向传播算法来计算梯度
每个节点根据上游传递的梯度值,结合本地的参数计算梯度进行反向传播计算
example: $$f(x,W)=||W\cdot x||^2=\sum_{i=1}^n(Wx)_{\boldsymbol{i}}^2$$
$$\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)¶
卷积¶
希望提取图像中的结构信息
卷积核:在整个图像上滑动的一个矩阵与图像进行点积运算,可以提取出图像中的特征,卷积核也可以称为一个神经元的感受野
一个卷积核往往只能提取到某一种特征,因此我们会使用多组卷积核对特征进行提取。
初始的卷积核会提取一些图像的低级特征,比如边缘;
后续的卷积核则会提取到一些更加复杂的特征。
卷积处理之后的输出尺寸:$(N-F)/stride+1$
N,F,stride分别是图像尺寸,卷积核大小和滑动步长
为了使卷积处理之后的矩阵大小不变,我们可以在矩阵的边缘进行填充
池化层¶
减小矩阵的尺寸,降低采样率;减少后续训练的参数量
- 最大池化:
- 平均值池化
全连接层¶
处理神经网络最终的输出