吴恩达机器学习笔记——含一个隐藏层的神经网络

含一个隐藏层的神经网络

含一个隐藏层的神经网络构造如下图所示:
吴恩达机器学习笔记——含一个隐藏层的神经网络
其中记号用a上标的方括号 a [ n ] a^{[n]} a[n]代表是第n层的a,用下标表示是某一层下面的某一个神经元,如图中的 a 1 [ 2 ] a^{[2]}_1 a1[2]代表第二层的第一个神经元。

中间层,即隐藏层的大小是可以自己设定的,如图中设置了4个节点。

模型表达

同样以二分类模型为例:

  • 给出待判断的物体的n个特征 x 1 , x 2 , . . . x n x_1,x_2, ... x_n x1,x2,...xn
  • 给出待判断物体的类别:0或1

对于两层的神经网络,第一层的大小是可以自己规定的,这里我设第一层含有t个神经元,即 a 1 [ 1 ] , a 1 [ 1 ] , . . . , a t [ 1 ] a^{[1]}_1, a^{[1]}_1,...,a^{[1]}_t a1[1],a1[1],...,at[1]

训练模型

假设训练集有m组数据,每组数据有n个特征,属于两个类别中的其中一个。

前向传播

记第一层的输出为 A [ 1 ] A^{[1]} A[1],第二层的输出为 A [ 2 ] A^{[2]} A[2],由于第一层有t个神经元,所以 A [ 1 ] A^{[1]} A[1]是一个(t,m)的矩阵,而由于是二分类模型, A [ 2 ] A^{[2]} A[2]是一个(1,m)矩阵。

前向传播相对比较简单:

首先给出第一层的输出:

Z t ∗ m [ 1 ] = W t , n [ 1 ] X n ∗ m + b t , 1 [ 1 ] Z^{[1]}_{t*m}=W^{[1]}_{t,n}X_{n*m}+b^{[1]}_{t,1} Ztm[1]=Wt,n[1]Xnm+bt,1[1]

A t ∗ m [ 1 ] = t a n h ( Z [ 1 ] ) A^{[1]}_{t*m}=tanh(Z^{[1]}) Atm[1]=tanh(Z[1])

将第一层的输出作为第二层的输入,得到第二层的输出:

Z 1 ∗ m [ 2 ] = W 1 ∗ t [ 2 ] A t ∗ m [ 1 ] + b 1 ∗ 1 [ 2 ] Z^{[2]}_{1*m}=W^{[2]}_{1*t}A^{[1]}_{t*m}+b^{[2]}_{1*1} Z1m[2]=W1t[2]Atm[1]+b11[2]

A 1 ∗ m [ 2 ] = σ ( Z [ 2 ] ) A^{[2]}_{1*m}=\sigma (Z^{[2]}) A1m[2]=σ(Z[2])

各个矩阵的维度如上图所示,其中m为样本数,t为中间层的节点数,n为每个样本的属性的个数。

这里,在第一层的地方使用了新的**函数:

t a n h ( x ) = e x − e − x e x + e − x tanh(x)={{e^{x}-e^{-x}}\over {e^{x}+e^{-x}}} tanh(x)=ex+exexex

第二层的**函数和之前相同:

σ ( x ) = 1 1 + e − ( x ) \sigma(x)={1\over1+e^{-(x)}} σ(x)=1+e(x)1

代价函数

J = 1 m ∑ i = 1 m L ( a ( i ) , y ( i ) ) J = \frac{1}{m} \sum_{i=1}^m \mathcal{L}(a^{(i)}, y^{(i)}) J=m1i=1mL(a(i),y(i))

反向传播

反向传播同样是进行梯度下降,公式如下:

声明四个记号:

∂ J ∂ W [ 1 ] = d W 1 {\partial J\over \partial W^{[1]} } = dW1 W[1]J=dW1

∂ J ∂ W [ 2 ] = d W 2 {\partial J\over \partial W^{[2]} } = dW2 W[2]J=dW2

∂ J ∂ b [ 1 ] = d b 1 {\partial J\over \partial b^{[1]} } = db1 b[1]J=db1

∂ J ∂ b [ 2 ] = d b 2 {\partial J\over \partial b^{[2]} } = db2 b[2]J=db2

上面四个量都是和W 和 b维度想对应的矩阵,而不是标量。

可以得到:

W [ 1 ] = W [ 1 ] − λ d W [ 1 ] W^{[1]} = W^{[1]} - \lambda dW^{[1]} W[1]=W[1]λdW[1]

W [ 2 ] = W [ 2 ] − λ d W [ 2 ] W^{[2]} = W^{[2]} - \lambda dW^{[2]} W[2]=W[2]λdW[2]

b [ 1 ] = b [ 1 ] − λ d b [ 1 ] b^{[1]} = b^{[1]} - \lambda db^{[1]} b[1]=b[1]λdb[1]

b [ 2 ] = b [ 2 ] − λ d b [ 2 ] b^{[2]} = b^{[2]} - \lambda db^{[2]} b[2]=b[2]λdb[2]

然后是求四个梯度,我们可以看到,第二层可以视为以 A [ 1 ] A^{[1]} A[1]为输入的logistics regression,所以根据前面的结论:

d W 1 ∗ t [ 2 ] = 1 m ( A − Y ) 1 ∗ m A m ∗ t [ 1 ] T dW^{[2]}_{1*t}=\frac{1}{m} (A-Y)_{1*m}A^{[1]T}_{m*t} dW1t[2]=m1(AY)1mAmt[1]T

d b [ 2 ] = 1 m ∑ j = 1 m ( a ( j ) − y ( j ) ) db^{[2]}=\frac{1}{m}\sum_{j=1}^{m}{(a^{(j)}-y^{(j)})} db[2]=m1j=1m(a(j)y(j))

求另外两个梯度略微麻烦,还是按照上次的推法,首先假设只有一组样本,即m=1,得到表达式后对多个m进行平均,为了防止和带n个样本的矩阵记号混淆,加一个括号上标(1):

此时整个网络的前向传播变成:

Z t ∗ 1 [ 1 ] ( 1 ) = W t ∗ n [ 1 ] X n ∗ 1 ( 1 ) + b t , 1 [ 1 ] Z^{[1](1)}_{t*1}=W^{[1]}_{t*n}X_{n*1}^{(1)}+b^{[1]}_{t,1} Zt1[1](1)=Wtn[1]Xn1(1)+bt,1[1]

A t ∗ 1 [ 1 ] ( 1 ) = t a n h ( Z [ 1 ] ( 1 ) ) A^{[1](1)}_{t*1}=tanh(Z^{[1](1)}) At1[1](1)=tanh(Z[1](1))

Z 1 ∗ 1 [ 2 ] ( 1 ) = W 1 ∗ t [ 2 ] A t ∗ 1 [ 1 ] ( 1 ) + b 1 ∗ 1 [ 2 ] Z^{[2](1)}_{1*1}=W^{[2]}_{1*t}A^{[1](1)}_{t*1}+b^{[2]}_{1*1} Z11[2](1)=W1t[2]At1[1](1)+b11[2]

A 1 ∗ 1 [ 2 ] ( 1 ) = σ ( Z [ 2 ] ( 1 ) ) A^{[2](1)}_{1*1}=\sigma (Z^{[2](1)}) A11[2](1)=σ(Z[2](1))

为了研究代价函数J对 W [ 1 ] W^{[1]} W[1]的导数,取出 W [ 1 ] W^{[1]} W[1]中的 W i , j [ 1 ] W^{[1]}_{i,j} Wi,j[1], 在矩阵运算中,与其有关的算式是(将矩阵运算展开):

W i , 1 [ 1 ] ∗ X 1 ( 1 ) + . . . + W i , j [ 1 ] ∗ X j ( 1 ) + . . . + W i , n [ 1 ] ∗ X n + b i [ 1 ] ( 1 ) = Z i [ 1 ] ( 1 ) W^{[1]}_{i,1} * X_1^{(1)}+...+W^{[1]}_{i,j} * X_j^{(1)} + ...+W^{[1]}_{i,n} * X_n+b^{[1](1)}_i = Z^{[1](1)}_i Wi,1[1]X1(1)+...+Wi,j[1]Xj(1)+...+Wi,n[1]Xn+bi[1](1)=Zi[1](1)

A i [ 1 ] ( 1 ) = t a n h ( Z i [ 1 ] ( 1 ) ) A^{[1](1)}_{i}=tanh(Z^{[1](1)}_i) Ai[1](1)=tanh(Zi[1](1))

W 1 [ 2 ] ∗ A 1 [ 1 ] ( 1 ) + . . . + W i [ 2 ] ∗ A i [ 1 ] ( 1 ) + . . . + W [ t ] ∗ A t [ 1 ] ( 1 ) = Z [ 2 ] ( 1 ) W^{[2]}_1 * A^{[1](1)}_1 + ... + W^{[2]}_i*A^{[1](1)}_i + ...+W^{[t]}*A^{[1](1)}_t = Z^{[2](1)} W1[2]A1[1](1)+...+Wi[2]Ai[1](1)+...+W[t]At[1](1)=Z[2](1)

A [ 2 ] ( 1 ) = σ ( Z [ 2 ] ( 1 ) ) A^{[2](1)} = \sigma (Z^{[2](1)}) A[2](1)=σ(Z[2](1))

J = 1 m ∑ i = 1 m L ( a ( i ) , y ( i ) ) = − y log ⁡ A [ 2 ] ( 1 ) − ( 1 − y ) log ⁡ ( 1 − A [ 2 ] ( 1 ) ) J = \frac{1}{m} \sum_{i=1}^m \mathcal{L}(a^{(i)}, y^{(i)}) = - y \log A^{[2](1)} - (1-y ) \log(1-A^{[2](1)} ) J=m1i=1mL(a(i),y(i))=ylogA[2](1)(1y)log(1A[2](1))

从上面的公式可以得到(将 ∂ J / ∂ X 简 写 为 d X , X 可 以 换 成 其 他 变 量 \partial J / \partial X 简写为dX,X可以换成其他变量 J/XdXX)(注意下列公式中,每个元素都是标量,而不是矩阵):

d Z [ 2 ] ( 1 ) = A [ 2 ] ( 1 ) − Y dZ^{[2](1)} = A^{[2](1)}-Y dZ[2](1)=A[2](1)Y

d A i [ 1 ] ( 1 ) = ( A [ 2 ] ( 1 ) − Y ) ∗ w i [ 2 ] dA^{[1](1)}_i = (A^{[2](1)}-Y)*w^{[2]}_i dAi[1](1)=(A[2](1)Y)wi[2]

d Z i [ 1 ] ( 1 ) = ( A [ 2 ] ( 1 ) − Y ) ∗ w i [ 2 ] ∗ ( 1 − A i [ 1 ] ( 1 ) 2 ) dZ^{[1](1)}_i = (A^{[2](1)}-Y)*w^{[2]}_i*(1-A_i^{[1](1)2}) dZi[1](1)=(A[2](1)Y)wi[2](1Ai[1](1)2)

d W i , j [ 1 ] ( 1 ) = ( A [ 2 ] ( 1 ) − Y ) ∗ w i [ 2 ] ∗ ( 1 − A i [ 1 ] ( 1 ) 2 ) ∗ X j dW^{[1](1)}_{i,j} = (A^{[2](1)}-Y)*w^{[2]}_i*(1-A_i^{[1](1)2})*X_j dWi,j[1](1)=(A[2](1)Y)wi[2](1Ai[1](1)2)Xj

d b i [ 1 ] ( 1 ) = ( A [ 2 ] ( 1 ) − Y ) ∗ w i [ 2 ] ∗ ( 1 − A i [ 1 ] ( 1 ) 2 ) db^{[1](1)}_i = (A^{[2](1)}-Y)*w^{[2]}_i*(1-A_i^{[1](1)2}) dbi[1](1)=(A[2](1)Y)wi[2](1Ai[1](1)2)

引入m个样本后,梯度改变为以下的形式:

d W i , j [ 1 ] = 1 m ∑ k = 1 m ( A [ 2 ] ( k ) − Y ( k ) ) ∗ w i [ 2 ] ∗ ( 1 − A i [ 1 ] ( k ) 2 ) ∗ X j ( k ) dW^{[1]}_{i,j} = {1\over m} \sum_{k=1}^{m}{(A^{[2](k)}-Y^{(k)})*w^{[2]}_i*(1-A_i^{[1](k)2})*X_j^{(k)}} dWi,j[1]=m1k=1m(A[2](k)Y(k))wi[2](1Ai[1](k)2)Xj(k)

d b i , 1 [ 1 ] = 1 m ∑ k = 1 m ( A [ 2 ] ( k ) − Y ( k ) ) ∗ w i [ 2 ] ∗ ( 1 − A i [ 1 ] ( k ) 2 ) db^{[1]}_{i,1} = {1\over m} \sum_{k=1}^{m}{(A^{[2](k)}-Y^{(k)})*w^{[2]}_i*(1-A_i^{[1](k)2})} dbi,1[1]=m1k=1m(A[2](k)Y(k))wi[2](1Ai[1](k)2)

上面的公式都是对每一个元素进行求导,是否可以将其写为矩阵的形式,像之前的前向传播一样,用整体的矩阵这个符号来进行表达,而不是对每个元素分别表达,很显然这是可以的。

首先引入一个新的运算符号“ ⊙ \odot ”, 定义 M ⊙ N M \odot N MN为M,N矩阵的对应元素相乘,要求:M N矩阵的维度(形状)相同。

矩阵化各个量,为了方便阅读,用下标标注出各个矩阵的维度:

d Z 1 ∗ m [ 2 ] = A 1 ∗ m [ 2 ] − Y 1 ∗ m dZ^{[2]}_{1*m} = A^{[2]}_{1*m}-Y_{1*m} dZ1m[2]=A1m[2]Y1m

d Z t ∗ m [ 1 ] = [ W t ∗ 1 [ 2 ] T ∗ ( A 1 ∗ m [ 2 ] − Y 1 ∗ m ) ] ⊙ ( 1 − A t ∗ m [ 1 ] ⊙ A t ∗ m [ 1 ] ) dZ^{[1]}_{t*m} = [W^{[2]T}_{t*1}*(A^{[2]}_{1*m}-Y_{1*m})] \odot(1-A^{[1]}_{t*m}\odot A^{[1]}_{t*m}) dZtm[1]=[Wt1[2]T(A1m[2]Y1m)](1Atm[1]Atm[1])

其中 ( 1 − A t ∗ m [ 1 ] ⊙ A t ∗ m [ 1 ] ) (1-A^{[1]}_{t*m}\odot A^{[1]}_{t*m}) (1Atm[1]Atm[1])中的数字“1”代表一个全1的矩阵。

d W t , n [ 1 ] = 1 m d Z t ∗ m [ 1 ] ∗ X m ∗ n T dW^{[1]}_{t,n} = {1 \over m}dZ^{[1]}_{t*m} * X^T_{m*n} dWt,n[1]=m1dZtm[1]XmnT

d b i , 1 [ 1 ] = ∑ j = 1 m d Z i , j [ 1 ] db^{[1]}_{i,1} = \sum_{j=1}^m{dZ^{[1]}_{i,j}} dbi,1[1]=j=1mdZi,j[1]

反向传播梯度公式

d W 1 ∗ t [ 2 ] = 1 m ( A − Y ) 1 ∗ m A m ∗ t [ 1 ] T dW^{[2]}_{1*t}=\frac{1}{m} (A-Y)_{1*m}A^{[1]T}_{m*t} dW1t[2]=m1(AY)1mAmt[1]T

d b [ 2 ] = 1 m ∑ j = 1 m ( a ( j ) − y ( j ) ) db^{[2]}=\frac{1}{m}\sum_{j=1}^{m}{(a^{(j)}-y^{(j)})} db[2]=m1j=1m(a(j)y(j))

d Z t ∗ m [ 1 ] = [ W t ∗ 1 [ 2 ] T ∗ ( A 1 ∗ m [ 2 ] − Y 1 ∗ m ) ] ⊙ ( 1 − A t ∗ m [ 1 ] ⊙ A t ∗ m [ 1 ] ) dZ^{[1]}_{t*m} = [W^{[2]T}_{t*1}*(A^{[2]}_{1*m}-Y_{1*m})] \odot(1-A^{[1]}_{t*m}\odot A^{[1]}_{t*m}) dZtm[1]=[Wt1[2]T(A1m[2]Y1m)](1Atm[1]Atm[1])

d W t ∗ n [ 1 ] = 1 m d Z t ∗ m [ 1 ] ∗ X m ∗ n T dW^{[1]}_{t*n} = {1 \over m}dZ^{[1]}_{t*m} * X^T_{m*n} dWtn[1]=m1dZtm[1]XmnT

d b i , 1 [ 1 ] = 1 m ∑ j = 1 m d Z i , j [ 1 ] db^{[1]}_{i,1} = {1 \over m}\sum_{j=1}^m{dZ^{[1]}_{i,j}} dbi,1[1]=m1j=1mdZi,j[1]

反向传播更新公式

W [ 1 ] = W [ 1 ] − λ d W [ 1 ] W^{[1]} = W^{[1]} - \lambda dW^{[1]} W[1]=W[1]λdW[1]

W [ 2 ] = W [ 2 ] − λ d W [ 2 ] W^{[2]} = W^{[2]} - \lambda dW^{[2]} W[2]=W[2]λdW[2]

b [ 1 ] = b [ 1 ] − λ d b [ 1 ] b^{[1]} = b^{[1]} - \lambda db^{[1]} b[1]=b[1]λdb[1]

b [ 2 ] = b [ 2 ] − λ d b [ 2 ] b^{[2]} = b^{[2]} - \lambda db^{[2]} b[2]=b[2]λdb[2]

总结

其中,增加网络的层数——从一层到两层,对于前向传播的形式变化不是很大,真正复杂的是反向传播的求梯度部分。在文章中,我将梯度的元素逐个分析,得出每个矩阵的元素的表达式,再写成矩阵的形式。

这样做有一个缺点,如何从求和式得出最终的矩阵形式比较困难,因此能否直接依照前向传播的矩阵形式进行求导?答案是可行的。可以参考这个知乎老哥的解答