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

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

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

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

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

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

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

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

单样本逻辑回归

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

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

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(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}

正向传播:

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.png
上图中,第二层神经元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
评论加载中...

发表评论