神经网络

image

上图是一个最简单2层的神经网络,最左边一层是输入的数据,通常这一层不计入到神经网络的纬度中.

如果我们把一个神经元单独提取出来的话,你会发现它就是一个逻辑回归.所以说神经网络可以理解为非常多的逻辑回归组合而成的.

image

由于神经网络的推导过于复杂,所以我们先从简单的逻辑回归开始逐步推导神经网络.

在文中你可能会看到这几种符号表示:

W^{[1]} ,中括号表示层数,这里指第1层的参数.

W^{[1] (1)} ,小括号表示第几个训练样本,这里指第一层第一个训练样本的参数.

W^{[1]}_1 ,下标表示第几个神经元,这里指第一层第一个神经元的参数.

W^{\{1\}} ,大括号表示第几批数据,后面会通过将训练样本分配以提高速度.

单样本逻辑回归

x :表示1个样本,样本有n个特征,所以为(n,1)的向量.

y :样本的标记值,为二进制常数.

w :线性方程的参数,每个特征对应一个参数,为(n,1)的向量

b :线性方程的偏置值,为常数.

image

正向传播:

z = w^Tx + b

a = sigmoid(z)

J = - y \log(a) - (1-y ) \log(1-a)

反向传播:

\frac{dJ}{da} = -\frac{y}{a} + \frac{1-y}{1-a}

\frac{da}{dz} = a(1-a)

\frac{dJ}{dz} = \frac{dJ}{da}\frac{da}{dz} = a - y

根据链式法则求参数的导数:

\frac{dJ}{dw} = \frac{dJ}{da}\frac{da}{dz}\frac{dz}{dw} = \frac{dJ}{dz}\frac{dz}{dw} = x(a - y)

\frac{dJ}{db} = \frac{dJ}{da}\frac{da}{dz}\frac{dz}{db} = = \frac{dJ}{dz}\frac{dz}{db} = (a - y)

多样本逻辑回归

我们的训练样本有很多个,计算梯度的时候通常会取多个样本梯度的平均值.当然可以使用for循环来计算梯度,不过向量化的效率是for循环的近300倍.

X :表示m个样本,每个样本有n个特征,为(n,m)的矩阵

Y :表示m个样本的标记,为(1,m)的矩阵

w :线性方程的参数,每个特征对应一个参数,为(n,1)的向量

b :线性方程的偏置值,为常数.

Z = w^TX + b

A = sigmoid(Z)

J = - Y \log(A) - (1-Y ) \log(1-A)

反向传播:

\frac{dJ}{da} = -\frac{Y}{A} + \frac{1-Y}{1-A}

\frac{da}{dz} = A(1-A)

\frac{dJ}{dz} = \frac{dJ}{da}\frac{da}{dz} = A - Y

根据链式法则求参数的导数:

\frac{dJ}{dw} = \frac{dJ}{da}\frac{da}{dz}\frac{dz}{dw} = \frac{dJ}{dz}\frac{dz}{dw} = x\frac{dJ}{dz} = \frac{1}{m}X(A-Y)^T

\frac{dJ}{db} = \frac{dJ}{da}\frac{da}{dz}\frac{dz}{db} = = \frac{dJ}{dz}\frac{dz}{db} = \frac{dJ}{dz}= \frac{1}{m}sum(A-Y)

多样本逻辑回归只有x变为X,而参数与偏置,均与单样本相同.
最后求得的导数为使用各样本计算出的导数组成的矩阵,我们取平均值作为最终结果.

2layer神经网络

我们可以把逻辑回归多加一层:

z1 = w^TX + b

a1 = sigmoid(z1)

z2 = w^Ta1 + b

a2 = sigmoid(z2)

这样是两层的神经网络么?显然不是的,2层的神经网络不仅比逻辑回归多一层,而且每层有多个神经元.所以我们需要重新定义一下参数的形式.

我们可以把每层中的神经元的参数放到一个大的矩阵中,即:

W^{[1]} = \begin{bmatrix} w_1^{[1]T} \\ w_2^{[1]T} \\ w_3^{[1]T} \\ w_4^{[1]T} \end{bmatrix}

同样,把偏置也放到一个矩阵中:

B^{[1]} = \begin{bmatrix} b_1^{[1]} \\ b_2^{[1]} \\ b_3^{[1]} \\ b_4^{[1]} \end{bmatrix}

此时,我们可以一次性计算第1层所有的神经元:

Z^{[1]} = \begin{bmatrix} W_1^{[1]T} \\ W_2^{[1]T} \\ W_3^{[1]T} \\ W_4^{[1]T} \end{bmatrix}\begin{bmatrix} \mid & \mid & \mid & \mid \\ X^{(1)}& X^{(2)}& X^{(3)}& X^{(4)}\\ \mid & \mid & \mid & \mid \end{bmatrix} +\begin{bmatrix} b_1^{[1]}\\ b_2^{[1]}\\ b_3^{[1]}\\ b_4^{[1]}\end{bmatrix}
= \begin{bmatrix} W_1^{[1]T}X^{(1)} + z_1^{[1]} & ... & W_1^{[1]T}X^{(4)} + z_1^{[1]}\\ W_2^{[1]T}X^{(1)} + z_2^{[1]} & ... & W_2^{[1]T}X^{(4)} + z_2^{[1]}\\ W_3^{[1]T}X^{(1)} + z_3^{[1]} & ... & W_3^{[1]T}X^{(4)} + z_3^{[1]}\\ W_4^{[1]T}X^{(1)} + z_4^{[1]} & ... & W_4^{[1]T}X^{(4)} + z_4^{[1]} \end{bmatrix}

= \begin{bmatrix} z_1^{[1](1)} & ... & z_1^{[1](4)}\\ z_2^{[1](1)} & ... & z_2^{[1](4)}\\ z_3^{[1](1)} & ... & z_3^{[1](4)}\\ z_4^{[1](1)} & ... & z_4^{[1](4)} \end{bmatrix}

image

正向传播:

Z^{[1]} = W^{[1]}X +B^{[1]}

A^{[1]} = sigmoid(Z^{[1]})

Z^{[2]} = W^{[2]}A^{[1]} + B^{[2]}

A^{[2]} = sigmoid(Z^{[2]})

反向传播:
神经网络中的W,A,Y及b都可以理解为 n^{[l]} 个逻辑回归结果的罗列,所以逻辑回归的反向传播结果可以直接用到神经网络的反向传播.

\frac{dJ}{dA^{[2]}} = -\frac{Y}{A^{[2]}} + \frac{1-Y}{1-A^{[2]}}

\frac{dA^{[2]}}{dZ^{[2]}} = A^{[2]}(1-A^{[2]})

\frac{dJ}{dZ^{[2]}} = A^{[2]} - Y

\frac{dJ}{dZ^{[1]}} = \frac{dJ}{dA^{[2]}}\frac{dA^{[2]}}{dZ^{[2]}}\frac{dZ^{[2]}}{dA^{[1]}}\frac{dA^{[1]}}{dZ^{[1]}} = \frac{dJ}{dZ^{[2]}}W^{[2]T}g'(Z^{[1]})

根据链式法则:

\frac{dJ}{dW^{[2]}} = \frac{dJ}{dA^{[2]}}\frac{dA^{[2]}}{dZ^{[2]}}\frac{dZ^{[2]}}{dW^{[2]}} = \frac{dJ}{dZ^{[2]}}\frac{dZ^{[2]}}{dW^{[2]}}

\frac{dJ}{dB^{[2]}} = \frac{dJ}{dA^{[2]}}\frac{dA^{[2]}}{dZ^{[2]}}\frac{dZ^{[2]}}{dB^{[2]}} = \frac{dJ}{dZ^{[2]}}\frac{dZ^{[2]}}{dB^{[2]}}

\frac{dJ}{dW^{[1]}} = \frac{dJ}{dA^{[2]}}\frac{dA^{[2]}}{dZ^{[2]}}\frac{dZ^{[2]}}{dA^{[1]}}\frac{dA^{[1]}}{dZ^{[1]}}\frac{dZ^{[1]}}{dW^{[1]}} = \frac{dJ}{dZ^{[1]}}\frac{dZ^{[1]}}{dW^{[1]}}

\frac{dJ}{dB^{[1]}} = \frac{dJ}{dA^{[2]}}\frac{dA^{[2]}}{dZ^{[2]}}\frac{dZ^{[2]}}{dA^{[1]}}\frac{dA^{[1]}}{dZ^{[1]}}\frac{dZ^{[1]}}{dB^{[1]}} = = \frac{dJ}{dZ^{[1]}}\frac{dZ^{[1]}}{dB^{[1]}}

L层神经网络

有了2层神经网络的基础,我们来看一下L层的神经网络:

正向传播:

循环L次:

Z^{[l]} = W^{[l]}X +B^{[l]}

A^{[l]} = sigmoid(Z^{[l]})

反向传播:

\frac{dJ}{dZ^{[L]}} = A^{[L]} - Y

递推出第l层的导数:

\frac{dJ}{dZ^{[l]}} = \frac{dJ}{dA^{[l+1]}}\frac{dA^{[l+1]}}{dZ^{[l+1]}}\frac{dZ^{[l+1]}}{dA^{[l]}}\frac{dA^{[l]}}{dZ^{[l]}} = \frac{dJ}{dZ^{[l+1]}}W^{[l+1]T}g'(Z^{[l]})

\frac{dJ}{dW^{[l]}} = \frac{dJ}{dZ^{[l]}}\frac{dZ^{[l]}}{dW^{[l]}}

\frac{dJ}{dB^{[l]}} = \frac{dJ}{dZ^{[l]}}\frac{dZ^{[l]}}{dB^{[l]}}

随机初始化参数

梯度下降时参数更新的幅度是根据其对 J(W) 的偏导数决定的.而偏导数的大小与输入x相关.

在逻辑回归中,因为输入x不同,所以偏导数也是不同的,将 W 全部初始化为0是没有问题的.

但是在神经网络中,下一层不同神经元的输入x可能是上一次同一个神经元的输出,这就造成有些参数的偏导数总是相同的,无论迭代多少次,参数也总是相同,造成重复神经元,性能降低.

image

上图中,第二层神经元 x_{21} x_{22} 的输入为相同的值,如果 w 也初始化为相同的值,会造成 w 的偏导数也相同的情况.

所以为了避免上述情况发生, W 的初始值一定要为不同的值,我们可以使用随机数初始化.并且为了让学习更有效率,要保证 W 之和尽可能小,即 W 在区间 [-\epsilon,\epsilon] 内选取.

一个有效选取 \epsilon 的策略是以神经元个数为基础.即 \epsilon = \frac{\sqrt{6}}{S_{l} + S_{l+1}} ,其中 S_{l} 为该层神经元数目, S_{l+1} 为下一层神经元数目.


参考:
https://www.coursera.org/specializations/deep-learning

posted @ 2018-08-03 14:02:42
评论加载中...
发表评论