0%

深度学习-神经网络

深度学习-神经网络

神经网络概览

图中上标方括号[n] 表示层数

image-20201217181744490
image-20201217181744490

神经网络的表示

输入层、隐藏层、输出层

如图是一个两层神经网络(计算层数时不包括输入层),但输入层通常被称为第0层

image-20201217181909976
image-20201217181909976

以Logistic Regression为例,每个神经元代表两个步骤

image-20201217182506125
image-20201217182506125

多实例训练过程

\(for \ i=1 \ to \ m: \\ \ \ z^{[1](i)} = w^{[1]}x^{(i)}+b^{[1]} \\ \ \ a^{[1](i)}=\sigma(z^{[1](i)}) \\ \ \ z^{[2](i)}=w^{[2]}a^{[1](i)} + b^{[2]} \\ \ \ a^{[2](i)}=\sigma(z^{[2](i)})\)

向量化代替循环

\(X = \begin{bmatrix} \cdots \ \cdots \ \cdots \\ x^{(1)} \ \cdots \ x^{(m)} \\ \cdots \ \cdots \ \cdots \end{bmatrix} \\ Z^{[1]} = W^{[1]}X + b^{[1]} A^{[1]} = \sigma(Z^{[1]}) \\ Z^{[2]} = W^{[2]}A^{[1]}+b^{[2]} \\ A^{[2]} = \sigma(Z^{[2]}) \\ Z^{[1]} = \begin{bmatrix} \cdots \ \cdots \ \cdots \\ z^{[1](1)} \ z^{[1](2)} \ z^{[1](m)} \\ \cdots \ \cdots \ \cdots \end{bmatrix} \\ A^{[1]} = \begin{bmatrix} \cdots \ \cdots \ \cdots \\ a^{[1](1)} \ a^{[1](2)} \ a^{[1](m)} \\ \cdots \ \cdots \ \cdots \end{bmatrix} \\\)

激活函数(Activation function)

Sigmoid:

image-20201217205519238
image-20201217205519238

tanh:

image-20201217205603188
image-20201217205603188

ReLU:

image-20201217205718141
image-20201217205718141

如果是二分类问题,输出是0或1,可使用Sigmoid函数或tanh(常用)

如果不确定使用什么函数,通常使用ReLU(导数不会趋于0)

为什么需要非线性激活函数?

\(假设去掉非线性激活函数,使用线性激活函数(或恒等激活函数),则以最简单的y=x为例:\\ z^{[1]} = W^{[1]}x+b^{[1]} \\ a^{[1]} = z^{[1]} \\ a^{[2]} = W^{[2]}a^{[1]} + b^{[2]}\\ a^{[2]} = z^{[2]} \Rightarrow \\ a^{[2]} = W^{[2]}(W^{[1]}x+b^{[1]})+b^{[2]} \\ a^{[2]} =(W^{[2]}W^{[1]})x+(W^{[2]}b^{[1]}+b^{[2]} = W'x + b'\)

这样一来,神经网络的输出则仅仅是输入的线性变化,则无论有多少层,最终结果都是输入的线性变换结果,这样其实就和没有隐藏层的逻辑回归模型相同

如此,通常情况下,唯一可以使用线性激活函数的地方,就是输出层

梯度下降

\(正向传播:\\ Z^{[1]} = W^{[1]}X + b^{[1]} \\ A^{[1]} = g^{[1]}(Z^{[1]} \\ Z^{[2]} = W^{[2]}A^{[1]}+b^{[2]} \\ A^{[2]} = g^{[2]}(Z^{[2]}=\sigma(Z^{[2]})\) \(反向传播: \\ dZ^{[2]} = A^{[2]} - Y \\ dW^{[2]} = \frac{1}{m}dZ^{[2]}A^{[1]T} \\ db^{[2]} = \frac{1}{m}np.sum(dZ^{[2]},axis=1,keepdims=True) \\ dZ^{[1]} = W^{[2]T}dZ^{[2]}*g^{[1]'}(Z^{[1]}) \\ dW^{[1]} = \frac{1}{m}dZ^{[1]}X^T \\ db^{[1]} = \frac{1}{m}np.sum(dZ^{[1]},axis=1,keepdims=True)\)

随机初始化

如果将权重W和偏置都设为0,则会引起一些问题:

即无论使用什么样的样本进行训练,\(a^{[1]}_1=a^{[1]}_2\),同层隐藏神经元在进行完全相同的计算工作,并且也会影响作用在输出神经元上,并且在反向传播时,\(dz^{[1]}_1 = d^{[1]}_2\),这样无论训练多久,这几个神经元作用一样,并没有效果

随机初始化:

\(W^{[1]} = np.random.randn((2,2))*0.01 \\ b^{[1]}=np.zero((2,1))\)

为什么*0.01,不是100?

因为W初始化不能太大,否则会使tanh和sigmoid激活函数学习进度缓慢,导致无法实现预期功能