吴恩达深度学习总结(2)

回顾 Logistic Regression

Logistic Regression

z = ω T x + b → a = σ ( z ) → L ( a , y ) z = \omega^Tx + b \to a=\sigma(z) \to \mathcal{L}(a,y) z=ωTx+ba=σ(z)L(a,y)

浅层神经网络(只有一层隐藏单元)

在本周的课程中,浅层神经网络的 W W W 均没有转置,也就是说,对于 m m m 个大小为 n x n_x nx 的输入样本, W W W 的大小为 m ∗ n x m*n_x mnx
浅层神经网络
神经网络的命名中,输入层的下一层作为神经网络的第一层,输出层作为神经网络的最后一层。图中每一个节点进行线性和非线性变换,即 z = ω T x + b z = \omega^Tx + b z=ωTx+b a = g ( z ) a = g(z) a=g(z) g ( x ) g(x) g(x) 为激活函数。
要理解课程最重要的是分清每个符号的代表的意思

网络中每个符号的含义

以每个输入样本为照片拉成的向量为例,输入样本的大小为 n x ∗ m n_x * m nxm n x = w ∗ h ∗ c h a n n e l s n_x = w*h*channels nx=whchannels
x i x_i xi:单个输入向量的 i i i 位置上的值

a [ j ] a^{[j]} a[j]: 第j层的输入值

a i [ j ] a^{[j]}_i ai[j]: 第 j j j 层的第 i i i个输入值

n [ i ] n^{[i]} n[i]:第 i i i 层输入向量的维度, n [ 0 ] = n x n^{[0]} = n_x n[0]=nx

x ( i ) x^{(i)} x(i):第 i i i 个输入的样本

所以该浅层神经网络的第一层计算过程可以表示为
z 1 [ 1 ] = ω 1 [ 1 ] T x ( i ) + b 1 [ 1 ] , a 1 [ 1 ] = g ( z 1 [ 1 ] ) z_1^{[1]} = \omega_1^{[1]T}x^{(i)} + b_1^{[1]}, a_1^{[1]} = g(z_1^{[1]}) z1[1]=ω1[1]Tx(i)+b1[1],a1[1]=g(z1[1])
z 2 [ 1 ] = ω 2 [ 1 ] T x ( i ) + b 2 [ 1 ] , a 2 [ 1 ] = g ( z 2 [ 1 ] ) z_2^{[1]} = \omega_2^{[1]T}x^{(i)} + b_2^{[1]}, a_2^{[1]} = g(z_2^{[1]}) z2[1]=ω2[1]Tx(i)+b2[1],a2[1]=g(z2[1])
z 3 [ 1 ] = ω 3 [ 1 ] T x ( i ) + b 3 [ 1 ] , a 3 [ 1 ] = g ( z 3 [ 1 ] ) z_3^{[1]} = \omega_3^{[1]T}x^{(i)} + b_3^{[1]}, a_3^{[1]} = g(z_3^{[1]}) z3[1]=ω3[1]Tx(i)+b3[1],a3[1]=g(z3[1])
z 4 [ 1 ] = ω 4 [ 1 ] T x ( i ) + b 4 [ 1 ] , a 4 [ 1 ] = g ( z 4 [ 1 ] ) z_4^{[1]} = \omega_4^{[1]T}x^{(i)} + b_4^{[1]}, a_4^{[1]} = g(z_4^{[1]}) z4[1]=ω4[1]Tx(i)+b4[1],a4[1]=g(z4[1])
整个网络的计算过程可表示为
Z [ 1 ] = W [ 1 ] A [ 0 ] + b [ 1 ] , A [ 0 ] ∈ ( n 0 ∗ m ) , W ∈ ( n 1 ∗ n 0 ) , b 1 ∈ ( n 1 , 1 ) Z^{[1]} = W^{[1]}A^{[0]} + b^{[1]},A^{[0]}\in (n_0*m), W\in(n_1*n_0),b_1\in(n_1,1) Z[1]=W[1]A[0]+b[1]A[0](n0m),W(n1n0),b1(n1,1)
A [ 1 ] = g ( Z [ 1 ] ) A^{[1]} = g(Z^{[1]}) A[1]=g(Z[1])
Z [ 2 ] = W [ 2 ] A [ 1 ] + b [ 2 ] , A [ 1 ] ∈ ( n 1 ∗ m ) , W ∈ ( n 2 ∗ n 1 ) , b 1 ∈ ( n 2 , 1 ) Z^{[2]}=W^{[2]}A^{[1]} + b^{[2]},A^{[1]}\in (n_1*m), W\in(n_2*n_1),b_1\in(n_2,1) Z[2]=W[2]A[1]+b[2]A[1](n1m),W(n2n1),b1(n2,1)
A [ 2 ] = g ( Z [ 2 ] ) A^{[2]}=g(Z^{[2]}) A[2]=g(Z[2])
W [ 1 ] W^{[1]} W[1] 的直观表示为
[ — — ω 1 [ 1 ] T — — — — ω 2 [ 1 ] T — — — — ω 3 [ 1 ] T — — ] \left[ \begin{matrix} —— & \omega^{[1]T}_1 & —— \\ —— & \omega^{[1]T}_2 & —— \\ —— & \omega^{[1]T}_3 & —— \end{matrix} \right] ω1[1]Tω2[1]Tω3[1]T

激活函数的选择

可选函数

S i g m o i d : a = 1 1 + e − z Sigmoid: a = \frac{1}{1+e^{-z}} Sigmoid:a=1+ez1
T a n h : a = e z − e − z e z + e − z Tanh: a = \frac{e^{z} - e^{-z}}{e^{z}+e{-z}} Tanh:a=ez+ezezez
R e L U : a = max ⁡ ( 0 , z ) ReLU: a=\max(0,z) ReLU:a=max(0,z)
l e a k y    R e L U : a = max ⁡ ( 0.01 z , z ) leaky\;ReLU: a=\max(0.01z, z) leakyReLU:a=max(0.01z,z)

激活函数的选择

s i g m o i d sigmoid sigmoid 函数在二分类具有很好的表现性能;除了该场景 t a n h tanh tanh 函数几乎在其他所有场合比 s i g m o i d sigmoid sigmoid 函数有更好的表现性能; s i g m o i d sigmoid sigmoid t a n h tanh tanh 通常只在输出层使用,其余层的激活函数通常选择 R e L U ReLU ReLU,因为 s i g m o i d sigmoid sigmoid t a n h tanh tanh z z z 较大或者较小时的梯度较小,使用梯度下降法速率变化较慢,而 R e L U ReLU ReLU 在大多数 z z z 空间内的激活函数的导数比0大很多,从而使梯度下降很快,当 z &lt; 0 z &lt; 0 z<0 时,尽管梯度为0,但只要隐藏单元足够多就可以保证训练的速率; l e a k y &ThickSpace; R e L U leaky\;ReLU leakyReLU 的表现性能略优于 R e L U ReLU ReLU,但没有很广泛的应用

使用非线性激活函数

如果使用线性激活函数,多个隐藏层的激活函数经线性变换后可以变为一个式子,多个隐藏层没有意义,因此只能使用非线性激活函数

神经网络的梯度下降

最后一层激活函数为 s i g m o i d sigmoid sigmoid 函数
d Z [ 2 ] = A [ 2 ] − Y dZ^{[2]}=A^{[2]}-Y dZ[2]=A[2]Y
d W [ 2 ] = 1 m d Z [ 2 ] A [ 1 ] T dW^{[2]}=\frac{1}{m}dZ^{[2]}A^{[1]T} dW[2]=m1dZ[2]A[1]T
d b [ 2 ] = 1 m n p . s u m ( d Z [ 2 ] , a x i s = 1 , k e e p d i m s = T r u e ) db^{[2]}=\frac{1}{m}np.sum(dZ^{[2]},axis = 1, keepdims = True) db[2]=m1np.sum(dZ[2],axis=1,keepdims=True)
d Z [ 1 ] = W [ 2 ] T d Z [ 2 ] ∗ g [ 1 ] ′ ( Z [ 1 ] ) dZ^{[1]}=W^{[2]T}dZ^{[2]}*g^{[1]&#x27;}(Z^{[1]}) dZ[1]=W[2]TdZ[2]g[1](Z[1])
d W [ 1 ] = 1 m d Z [ 1 ] X T dW^{[1]}=\frac{1}{m}dZ^{[1]}X^T dW[1]=m1dZ[1]XT
d b [ 1 ] = 1 m n p . s u m ( d Z [ 1 ] , a x i s = 1 , k e e p d i m s = T r u e ) db^{[1]}=\frac{1}{m}np.sum(dZ^{[1]}, axis=1, keepdims=True) db[1]=m1np.sum(dZ[1],axis=1,keepdims=True)
注意 d Z [ 1 ] dZ^{[1]} dZ[1] 的求解是两个矩阵对应位置相乘,使用 n p . s u m ( ) np.sum() np.sum() 时注意 k e e p d i m s keepdims keepdims 保证矩阵加法不会使矩阵维度减少,避免不必要的错误

梯度下降详解

n [ i ] n^{[i]} n[i] 为每一个层的节点个数
L ( A [ 2 ] , y ) = 1 m ∑ i = 1 m J ( A [ 2 ] , y ) , L ∈ ( 1 ∗ 1 ) \mathcal{L}(A^{[2]},y) = \frac{1}{m}\sum_{i=1}^{m}J(A^{[2]},y),\mathcal{L} \in(1*1) L(A[2],y)=m1i=1mJ(A[2],y)L(11)
J ( A [ 2 ] , y ) = − ( y log ⁡ A [ 2 ] + ( 1 − y ) log ⁡ ( 1 − A [ 2 ] ) ) , J ∈ ( 1 ∗ m ) J(A^{[2]},y)=-(y\log A^{[2]}+(1-y)\log(1-A^{[2]})), J \in (1*m) J(A[2],y)=(ylogA[2]+(1y)log(1A[2]))J(1m)
d A [ 2 ] = − ( y A [ 2 ] − 1 − y 1 − A [ 2 ] ) , d A [ 2 ] ∈ ( 1 ∗ m ) dA^{[2]}=-(\frac{y}{A^{[2]}}-\frac{1-y}{1-A^{[2]}}),dA^{[2]} \in (1*m) dA[2]=(A[2]y1A[2]1y)dA[2](1m)
d Z [ 2 ] = ( A [ 2 ] ∗ ( 1 − A [ 2 ] ) d A [ 2 ] = A [ 2 ] − Y , d Z [ 2 ] ∈ ( 1 ∗ m ) dZ^{[2]}=(A^{[2]}*(1-A^{[2]})dA^{[2]}=A^{[2]}-Y,dZ^{[2]} \in (1*m) dZ[2]=(A[2](1A[2])dA[2]=A[2]YdZ[2](1m)
d W [ 2 ] = 1 m d Z [ 2 ] A [ 1 ] T , d W [ 2 ] ∈ ( 1 ∗ n [ 1 ] ) 这 里 乘 1 m 是 因 为 通 过 m 个 样 本 的 求 和 求 得 d W [ 2 ] dW^{[2]} = \frac{1}{m}dZ^{[2]}A^{[1]T} ,dW^{[2]} \in (1*n^{[1]})这里乘 \frac{1}{m} 是因为通过 m 个样本的求和求得dW^{[2]} dW[2]=m1dZ[2]A[1]TdW[2](1n[1])m1mdW[2]
d b [ 2 ] = 1 m n p . s u m ( d Z [ 2 ] , a x i s = 1 , k e e p d i m s = T r u e ) , d b [ 2 ] ∈ ( 1 ∗ 1 ) db^{[2]}=\frac{1}{m}np.sum(dZ^{[2]}, axis =1, keepdims=True),db^{[2]} \in (1*1) db[2]=m1np.sum(dZ[2],axis=1,keepdims=True)db[2](11)
d Z [ 1 ] = W [ 2 ] T d Z [ 2 ] ∗ g [ 1 ] ′ ( Z [ 1 ] ) , d Z [ 1 ] ∈ ( n [ 1 ] ∗ m ) , 根 据 维 度 对 比 , 这 两 个 矩 阵 只 能 点 乘 dZ^{[1]} = W^{[2]T}dZ^{[2]}*g^{[1]&#x27;}(Z^{[1]}),dZ^{[1]} \in(n^{[1]}*m),根据维度对比,这两个矩阵只能点乘 dZ[1]=W[2]TdZ[2]g[1](Z[1])dZ[1](n[1]m)
d W [ 1 ] = 1 m d Z [ 1 ] X T , d W [ 1 ] ∈ ( n [ 1 ] , n [ 0 ] dW^{[1]} = \frac{1}{m}dZ^{[1]}X^T,dW^{[1]} \in(n^{[1]},n^{[0]} dW[1]=m1dZ[1]XTdW[1](n[1]n[0]
d b [ 1 ] = 1 m n p . s u m ( d Z [ 1 ] , a x i s = 1 , k e e p d i m s = T r u e ) , d b ∈ ( n [ 1 ] , 1 ) db^{[1]} = \frac{1}{m}np.sum(dZ^{[1]}, axis =1, keepdims = True),db \in(n^{[1]},1) db[1]=m1np.sum(dZ[1],axis=1,keepdims=True)db(n[1],1)
对矩阵求导,最好是根据输出矩阵的维度确定矩阵转置和相乘的位置

初始化

对logistic来说,可以将 ω \omega ω 初始化为0;但对于浅层神经网络而言,如果将 W W W 初始为0,那么两个节点完全对称,节点计算一样的函数,在迭代之后的计算仍然相同;也就是说无论如何迭代计算两个节点的权重都相同。
在实际应用时用 n p . r a n d o m . r a n d n ( ( ) ) ∗ 0.01 np.random.randn(())*0.01 np.random.randn(())0.01 初始化 ,选择乘0.01是为了使 W W W 变小,那么激活函数就不会落在函数平缓的地方,加快迭代速率。当训练浅层网络时,0.01满足要求,对于深层网络则需要选择其他的数值。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值