Neural Network Fundamental 5: Back Propagation Proof

Bài trước tôi đã trình bày các công thức của back propagation trong bài này tôi sẽ chứng minh các công thức đó

I. Proof dz[L]=y^yd\mathbf{z}^{[L]} = \hat \mathbf{y} - \mathbf{y}

Trước hết ta chứng minh cho trường hợp chỉ 1 training example. Ta sẽ tính đạo hàm riêng đối với zc[L]z^{[L]}_c (phần từ thứ c của output z, sau khi áp dụng hàm softmax) của hàm loss là logf(x)y-logf(x)_y (đọc thêm ở bài 3, phân biệt y viết thường và y\mathbf{y} viết đậm: y là số thứ tự của phần tử mà vector y\mathbf{y} có giá trị là 1). Trông các bước có vẻ phức tạp nhưng nếu theo dõi từng bước một bạn sẽ thấy cũng khá dễ hiểu và đẹp.

logf(x)yzc[L]=log(softmax(z[L])y)zc[L]\dfrac{\partial-logf(x)_y}{\partial z^{[L]}_c} = \dfrac{\partial -log(softmax(z^{[L]})_y)}{\partial z^{[L]}_c}

=log(ezy[L]iezi[L])zc[L]\qquad\qquad \qquad=\dfrac{\partial -log(\dfrac{e^{z^{[L]}_y}}{\sum_i{e^{z^{[L]}_i}}})}{\partial z^{[L]}_c}

=iezi[L]ezy[L]ezy[L]iezi[L]zc[L]\qquad\qquad \qquad= -\dfrac{\sum_i{e^{z^{[L]}_i}}}{e^{z^{[L]}_y}} \dfrac{\partial \dfrac{e^{z^{[L]}_y}}{\sum_i{e^{z^{[L]}_i}}}}{\partial z^{[L]}_c}

Đến đây để tính đạo hàm riêng của ezy[L]iezi[L]zc[L]\dfrac{\partial \dfrac{e^{z^{[L]}_y}}{\sum_i{e^{z^{[L]}_i}}}}{\partial z^{[L]}_c} ta áp dụng quy tắc tìm đạo hàm riêng của g(x)h(x)\dfrac{g(x)}{h(x)}

g(x)h(x)x=g(x)x1h(x)g(x)h2(x)h(x)x\qquad\qquad\qquad\qquad\dfrac{\partial\dfrac{g(x)}{h(x)}}{\partial x}=\dfrac{\partial g(x)}{\partial x} \dfrac{1}{h(x)} - \dfrac{g(x)}{h^2(x)}\dfrac{\partial h(x)}{\partial x}

Nên ta có

logf(x)yzc[L]=iezi[L]ezy[L](ezy[L]zc[L]1iezi[L]ezy[L]iezi[L]iezi[L]iezi[L]zc[L])\dfrac{\partial-logf(x)_y}{\partial z^{[L]}_c} = -\dfrac{\sum_i{e^{z^{[L]}_i}}}{e^{z^{[L]}_y}} (\dfrac{\partial e^{z^{[L]}_y}}{\partial z^{[L]}_c }\dfrac{1}{\sum_i{e^{z^{[L]}_i}}} - \dfrac{e^{z^{[L]}_y}}{\sum_i{e^{z^{[L]}_i}} \sum_i{e^{z^{[L]}_i}}} \dfrac{\partial \sum_i{e^{z^{[L]}_i}}}{\partial z^{[L]}_c})

=iezi[L]ezy[L](1(c=y)ezc[L]1iezi[L]ezy[L]iezi[L]iezi[L]ezc[L]\qquad\qquad \qquad=-\dfrac{\sum_i{e^{z^{[L]}_i}}}{e^{z^{[L]}_y}} (1_{(c = y)}e^{z^{[L]}_c}\dfrac{1}{\sum_i{e^{z^{[L]}_i}}} - \dfrac{e^{z^{[L]}_y}}{\sum_i{e^{z^{[L]}_i}} \sum_i{e^{z^{[L]}_i}}} e^{z^{[L]}_c} 1(c=y)\qquad\mathbb1_{(c = y)} là hàm indicator trả về 1 nếu c == y và trả về 0 nếu y \ne c

=iezi[L]ezy[L](1(c=y)ezc[L]iezi[L]ezy[L]iezi[L]ezc[L]iezi[L]\qquad\qquad \qquad=-\dfrac{\sum_i{e^{z^{[L]}_i}}}{e^{z^{[L]}_y}} (1_{(c = y)}\dfrac{e^{z^{[L]}_c}}{\sum_i{e^{z^{[L]}_i}}} - \dfrac{e^{z^{[L]}_y}}{\sum_i{e^{z^{[L]}_i}}} \dfrac{e^{z^{[L]}_c}}{\sum_i{e^{z^{[L]}_i}}}

=1softmax(z[L])y(1(c=y)softmax(z[L])csoftmax(z[L])ysoftmax(z[L])c)\qquad\qquad \qquad=-\dfrac{1}{softmax(z^{[L]})_y} (1_{(c = y)}softmax(z^{[L]})_c - softmax(z^{[L]})_ysoftmax(z^{[L]})_c)

=(1(c=y)softmax(z[L])c)\qquad\qquad \qquad= -(1_{(c = y)} - softmax(z^{[L]})_c)

=(1(c=y)y^c)\qquad\qquad \qquad= -(1_{(c = y)} - \hat y_c)

=y^c1(c=y)\qquad\qquad \qquad= \hat y_c - 1_{(c = y)}

Do đó nếu đạo hàm riêng cả vector z[L]z^{[L]} thì

logf(x)yz[L]=y^y\dfrac{\partial-logf(x)_y}{\partial \mathbf{z^{[L]}}} = \mathbf{\hat y} - \mathbf{y} \qquad hay dz[L]=y^y\qquad d\mathbf{z}^{[L]} = \hat \mathbf{y} - \mathbf{y}


II. Proof da[l1]=W[l]Tdz[l]d\mathbf a^{[l-1]} = W^{[l]T} d\mathbf z^{[l]}

Giả sử ta đã tính được đạo hàm riêng của z\mathbf z ở lớp thứ ll làm sao ta có thể tính tiếp đạo hàm riêng a\mathbf a ở lớp l1l - 1? Ta nhắc lại phần tử thứ i của z[l]\mathbf z^{[l]} được tính từ a[l1]\mathbf a^{[l - 1]} như sau

zi[l]=jWi,j[l]aj[l1]+bi[l]\mathbf z^{[l]}_i = \sum_j{W^{[l]}_{i,j}} \mathbf a^{[l - 1]}_j + \mathbf b^{[l]}_i \qquad (Tích vector của row thứ i của matrix W[l]W^{[l]} và vector a[l1]+\mathbf a^{[l - 1]} + phần tử thứ i của vector bias b[l]b^{[l]})

\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad(Trong ảnh thay x bằng a)

Ta thấy mỗi phần từ aj[l1]\mathbf a^{[l - 1]}_j đều đóng vai trò vào việc tính toán từng phần tử zi[l]\mathbf z^{[l]}_i mà ta biết hàm loss function là hàm số của z[l]\mathbf z^{[l]}, đã biết được đạo hàm riêng của z[l]\mathbf z^{[l]}, điều đó gợi ý ta sử dụng chain rule

Chain rule Nếu hàm số f(a)f(a) là hàm số của các hàm số gi(a)g_i(a) thì f(a)a=if(a)gi(a)gi(a)a\dfrac{\partial f(a)}{\partial a} = \sum_i{\dfrac{\partial f(a)}{\partial g_i(a)}\dfrac{\partial g_i(a)}{\partial a}}

Dùng chain rule ta set f(a)f(a) là loss function logf(x)y-logf(x)_y, gi(a)g_i(a)zi[l]\mathbf z^{[l]}_i còn a là ac[l1]\mathbf a^{[l - 1]}_c, ta tính đạo hàm riêng đối với phần tử thứ c của a[l1]\mathbf a^{[l - 1]}

logf(x)yac[l1]=ilogf(x)yzi[l]zi[l]ac[l1](1)\dfrac{\partial-logf(x)_y}{\partial \mathbf a^{[l - 1]}_c} = \sum_i{\dfrac{\partial-logf(x)_y}{\partial \mathbf z^{[l]}_i} \dfrac{\partial \mathbf z^{[l]}_i}{\partial \mathbf a^{[l - 1]}_c}} \qquad (1)

Do zi[l]=jWi,j[l]aj[l1]+bi[l]\mathbf z^{[l]}_i = \sum_j{W^{[l]}_{i,j}} \mathbf a^{[l - 1]}_j + b^{[l]}_i nên zi[l]ac[l1]=Wi,c[l]\dfrac{\partial \mathbf z^{[l]}_i}{\partial \mathbf a^{[l - 1]}_c} = W^{[l]}_{i, c} thay vào (1)(1)

logf(x)yac[l1]=ilogf(x)yzi[l]Wi,c[l]\dfrac{\partial-logf(x)_y}{\partial \mathbf a^{[l - 1]}_c} = \sum_i{\dfrac{\partial-logf(x)_y}{\partial \mathbf z^{[l]}_i} W^{[l]}_{i, c}} =\qquad\qquad\qquad= Tích của vector dz[l]d\mathbf z^{[l]} và cột thứ i của matrix W[l]W^{[l]}

Do đó nếu đạo hàm riêng cả vector a[l1]\mathbf a^{[l - 1]} thì

logf(x)ya[l1]=W[l]Tlogf(x)yz[l]\dfrac{\partial-logf(x)_y}{\partial \mathbf a^{[l - 1]}} = W^{[l]T} \dfrac{\partial-logf(x)_y}{\partial \mathbf z^{[l]}}\qquad hay da[l1]=W[l]Tdz[l]\qquad d\mathbf a^{[l-1]} = W^{[l]T} d\mathbf z^{[l]}


III. Proof $dW^{[l]} = d\mathbf z^{[l]} \mathbf a^{[l - 1]T} $

Như đã nói ở phần trên, công thức liên hệ giữa lớp l1l - 1 và lớp ll

zi[l]=jWi,j[l]aj[l1]+bi[l]\mathbf z^{[l]}_i = \sum_j{W^{[l]}_{i,j}} \mathbf a^{[l - 1]}_j + \mathbf b^{[l]}_i \qquad

Để ý thấy Wi,j[l]W^{[l]}_{i,j} chỉ đóng góp cho biểu thức của zi[l]\mathbf z^{[l]}_i mà không xuất hiện trong các phẩn tử khác của z[l]\mathbf z^{[l]}, ta áp dụng chain rule để tính đạo hàm riêng của cost function đối với Wi,j[l]W^{[l]}_{i,j}

$\dfrac{\partial-logf(x)y}{\partial W^{[l]}{i,j}} = \dfrac{\partial-logf(x)_y}{\partial \mathbf z^{[l]}_i} \dfrac{\partial \mathbf z^{[l]}i}{\partial W^{[l]}{i,j}} $

=logf(x)yzi[l]aj[l1]\qquad\qquad\qquad = \dfrac{\partial-logf(x)_y}{\partial \mathbf z^{[l]}_i} \mathbf a^{[l - 1]}_j

Do đó nếu đạo hàm riêng cả matrix W[l]W^{[l]} thì

logf(x)yW[l]=logf(x)yz[l]a[l1]T\dfrac{\partial-logf(x)_y}{\partial W^{[l]}} = \dfrac{\partial-logf(x)_y}{\partial \mathbf z^{[l]}}\mathbf a^{[l - 1]T}\qquad hay dW[l]=dz[l]a[l1]T\qquad dW^{[l]} = d\mathbf z^{[l]} \mathbf a^{[l - 1]T} \qquad (Phần tử thứ i, j của W[l]W^{[l]}Wi,j[l]W^{[l]}_{i,j} bằng phần tử thứ i của dz[l]d\mathbf z^{[l]} nhân với phần tử thứ j của a[l1]\mathbf a^{[l - 1]})


IV. Proof db[l]=dz[l]d\mathbf b^{[l]} = d\mathbf z^{[l]}

Nhắc lại công thức liên hệ giữa lớp l1l - 1 và lớp ll

zi[l]=jWi,j[l]aj[l1]+bi[l]\mathbf z^{[l]}_i = \sum_j{W^{[l]}_{i,j}} \mathbf a^{[l - 1]}_j + \mathbf b^{[l]}_i \qquad

bi[l]b^{[l]}_i chỉ đóng góp cho biểu thức của zi[l]z^{[l]}_i mà không xuất hiện trong các phẩn tử khác của z[l]\mathbf z^{[l]}, ta áp dụng chain rule để tính đạo hàm riêng của cost function đối với phần tử thứ i của b[l]\mathbf b^{[l]}

$\dfrac{\partial-logf(x)_y}{\partial \mathbf b^{[l]}_i} = \dfrac{\partial-logf(x)_y}{\partial \mathbf z^{[l]}_i} \dfrac{\partial \mathbf z^{[l]}_i}{\partial\mathbf b^{[l]}_i} $

=logf(x)yzi[l]×1\qquad\qquad\qquad = \dfrac{\partial-logf(x)_y}{\partial \mathbf z^{[l]}_i} \times 1

Do đó nếu đạo hàm riêng cả vector b[l]\mathbf b^{[l]} thì

logf(x)yb[l]=logf(x)yz[l]\dfrac{\partial-logf(x)_y}{\partial\mathbf b^{[l]}} = \dfrac{\partial-logf(x)_y}{\partial \mathbf z^{[l]}}\qquad hay db[l]=dz[l]d\mathbf b^{[l]} = d\mathbf z^{[l]}


V Proof dz[l]=da[l]g[l](z[l])d\mathbf z^{[l]} = d\mathbf a^{[l]} * g^{[l]'}(\mathbf z^{[l]})

Trong lớp ll công thức liên hệ giữa zi[l]\mathbf z^{[l]}_iai[l]\mathbf a^{[l]}_i

ai[l]=g[l](zi[l])\mathbf a^{[l]}_i = g^{[l]}(\mathbf z^{[l]}_i)\qquad trong đó g[l]()g^{[l]}() là hàm activation của lớp ll

Áp dụng chain rule ta có

logf(x)yzi[l]=logf(x)yai[l]ai[l]zi[l]\dfrac{\partial-logf(x)_y}{\partial \mathbf z^{[l]}_i} = \dfrac{\partial-logf(x)_y}{\partial \mathbf a^{[l]}_i} \dfrac{\partial \mathbf a^{[l]}_i}{\partial \mathbf z^{[l]}_i}

=logf(x)yai[l]g[l](zi[l])zi[l]\qquad\qquad\qquad = \dfrac{\partial-logf(x)_y}{\partial \mathbf a^{[l]}_i}\dfrac{\partial g^{[l]}(\mathbf z^{[l]}_i)}{\partial \mathbf z^{[l]}_i} Tức là đạo hàm riêng đối với phần tử thứ i của z[l]\mathbf z^{[l]} bằng đạo hàm riêng đối với phần tử thứ i của a[l]\mathbf a^{[l]} nhân với đạo hàm riêng của hàm activation đối với phần tử thứ i của z[l]\mathbf z^{[l]}

Do đó nếu đạo hàm riêng cả vector z[l]\mathbf z^{[l]} thì

logf(x)yz[l]=logf(x)ya[l](elementwise)g[l](z[l])z[l]\dfrac{\partial-logf(x)_y}{\partial \mathbf z^{[l]}} = \dfrac{\partial-logf(x)_y}{\partial \mathbf a^{[l]}} * (elementwise)\dfrac{\partial g^{[l]}(\mathbf z^{[l]})}{\partial \mathbf z^{[l]}}\qquad hay dz[l]=da[l]g[l](z[l])\qquad d\mathbf z^{[l]} = d\mathbf a^{[l]} * g^{[l]'}(\mathbf z^{[l]}) (nhân 2 phần từ tương ứng của 2 vector da[l]d\mathbf a^{[l]}g[l](z[l])g^{[l]'}(\mathbf z^{[l]}) với nhau để ra vector dz[l]d\mathbf z^{[l]})


Tham khảo

  • Coursera deep learning
  • Hugo Larochelle Neural Network