吴恩达机器学习笔记——含一个隐藏层的神经网络
含一个隐藏层的神经网络
含一个隐藏层的神经网络构造如下图所示:
其中记号用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} Zt∗m[1]=Wt,n[1]Xn∗m+bt,1[1]
A t ∗ m [ 1 ] = t a n h ( Z [ 1 ] ) A^{[1]}_{t*m}=tanh(Z^{[1]}) At∗m[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} Z1∗m[2]=W1∗t[2]At∗m[1]+b1∗1[2]
A 1 ∗ m [ 2 ] = σ ( Z [ 2 ] ) A^{[2]}_{1*m}=\sigma (Z^{[2]}) A1∗m[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+e−xex−e−x
第二层的**函数和之前相同:
σ ( 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=1∑mL(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} dW1∗t[2]=m1(A−Y)1∗mAm∗t[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=1∑m(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} Zt∗1[1](1)=Wt∗n[1]Xn∗1(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)}) At∗1[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} Z1∗1[2](1)=W1∗t[2]At∗1[1](1)+b1∗1[2]
A 1 ∗ 1 [ 2 ] ( 1 ) = σ ( Z [ 2 ] ( 1 ) ) A^{[2](1)}_{1*1}=\sigma (Z^{[2](1)}) A1∗1[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=1∑mL(a(i),y(i))=−ylogA[2](1)−(1−y)log(1−A[2](1))
从上面的公式可以得到(将 ∂ J / ∂ X 简 写 为 d X , X 可 以 换 成 其 他 变 量 \partial J / \partial X 简写为dX,X可以换成其他变量 ∂J/∂X简写为dX,X可以换成其他变量)(注意下列公式中,每个元素都是标量,而不是矩阵):
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]∗(1−Ai[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]∗(1−Ai[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]∗(1−Ai[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=1∑m(A[2](k)−Y(k))∗wi[2]∗(1−Ai[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=1∑m(A[2](k)−Y(k))∗wi[2]∗(1−Ai[1](k)2)
上面的公式都是对每一个元素进行求导,是否可以将其写为矩阵的形式,像之前的前向传播一样,用整体的矩阵这个符号来进行表达,而不是对每个元素分别表达,很显然这是可以的。
首先引入一个新的运算符号“ ⊙ \odot ⊙”, 定义 M ⊙ N M \odot N M⊙N为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} dZ1∗m[2]=A1∗m[2]−Y1∗m
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}) dZt∗m[1]=[Wt∗1[2]T∗(A1∗m[2]−Y1∗m)]⊙(1−At∗m[1]⊙At∗m[1])
其中 ( 1 − A t ∗ m [ 1 ] ⊙ A t ∗ m [ 1 ] ) (1-A^{[1]}_{t*m}\odot A^{[1]}_{t*m}) (1−At∗m[1]⊙At∗m[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]=m1dZt∗m[1]∗Xm∗nT
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=1∑mdZi,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} dW1∗t[2]=m1(A−Y)1∗mAm∗t[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=1∑m(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}) dZt∗m[1]=[Wt∗1[2]T∗(A1∗m[2]−Y1∗m)]⊙(1−At∗m[1]⊙At∗m[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]=m1dZt∗m[1]∗Xm∗nT
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=1∑mdZi,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]
总结
其中,增加网络的层数——从一层到两层,对于前向传播的形式变化不是很大,真正复杂的是反向传播的求梯度部分。在文章中,我将梯度的元素逐个分析,得出每个矩阵的元素的表达式,再写成矩阵的形式。
这样做有一个缺点,如何从求和式得出最终的矩阵形式比较困难,因此能否直接依照前向传播的矩阵形式进行求导?答案是可行的。可以参考这个知乎老哥的解答