Neural Network Fundamental 4: Gradient descent, back propagation

I. Gradient descent

Giả sử ta muốn minimize J(w1,w2,...)J(w_1, w_2, ...). Nếu đây là 1 hàm sỗ phức tạp thì việc tìm 1 công thức tính w1,w2,...w_1, w_2, ... cho J min là không dễ dàng. Gradient descent là thuật toán bắt đầu từ 1 giá trị nào đó của w1,w2,...w_1, w_2, ... rồi đi từ từ từng bước một, mỗi bước lại update lại các parameter này và cuối cùng sẽ một giá trị mà J min. Câu hỏi đặt ra là với mỗi bước sẽ đi như nào. Để đơn giản, xét ví dụ JJ là hàm số 1 biến số J(w)J(w) Từ giá trị ww ban đầu (chấm bên phải ngoài cùng) ở mỗi bước ta update ww theo rule sau Repeat { w:=wαd(J(w))dww := w - \alpha\dfrac{d(J(w))}{dw} } Trong đó α\alphalearning rate quyết định ta bước mỗi bước ngắn hay dài d(J(w))dw\dfrac{d(J(w))}{dw} > 0 tức J tăng lên khi ta tăng w lên 1 khoảng rất nhỏ nên ta trừ ww đi 1 số dương là αd(J(w))dw\alpha\dfrac{d(J(w))}{dw}

d(J(w))dw\dfrac{d(J(w))}{dw} < 0 tức J tăng lên khi ta giảm w lên 1 khoảng rất nhỏ nên ta trừ ww đi 1 số âm là αd(J(w))dw\alpha\dfrac{d(J(w))}{dw} nghĩa là cộng thêm αd(J(w))dw\alpha\dfrac{d(J(w))}{dw} Khi w gần tới giá trị J min thì độ dốc của hàm số nhỏ đi do đó các bước ta đi cũng nhỏ đi

II. Gradient descent for Neural Network

Chúng ta hãy nhắc lại một chút ở bài trước, loss function cho tất cả m training example J(W[1],b[1],...)=1mi=1mL(y^i,yi)J(W^{[1]}, b^{[1]}, ...) = \frac{1}{m}\displaystyle\sum_{i=1}^mL(\hat y^{i}, y^{i}) Trong đó L(y^i,yi)L(\hat y^{i}, y^{i}) là loss function tính cho training example i Mục tiêu của chúng ta là tìm giá trị của W[1],b[1],...W^{[1]}, b^{[1]}, ... sao cho J nhỏ nhất. Thực hiện gradient descent mỗi bước ta tính partial derivative (đạo hàm riêng) của từng layer: W[l]W^{[l]}, b[l]b^{[l]} Repeat { dW[1]=dJdW[1]dW^{[1]} = \dfrac{dJ}{dW^{[1]}}, db[1]=dJdb[1]db^{[1]} = \dfrac{dJ}{db^{[1]}}, ... $W^{[1]} = W^{[1]} - \alpha,dW^{[1]} $ $b^{[1]} = b^{[1]} - \alpha,db^{[1]} $ ... } dW[1]dW^{[1]} là ma trận có cùng chiều với W[1]W^{[1]} chứa đạo hàm riêng của từng phần tử trong WW với JJ db[1]db^{[1]} là vector có cùng chiều với b[1]b^{[1]} chứa đạo hàm riêng của từng phần tử trong b[1]b^{[1]} với JJ Nếu tập hợp tất cả các parameter W[1],b[1],...W^{[1]}, b^{[1]}, ... thành 1 vector D. Kiến thức trong giải tich nhiều biến số cho ta biết là vector gradient của D cho ta hướng mà hàm số tăng nhanh nhất. Nên nếu ta muốn chiều mà hàm số đang giảm, ta update các parameter đó bằng cách trừ đi learning rate ×\times partial derivative

III. Backward propagation

Ta nhắc lại một chút, forward propagation thực hiện việc tính toán input layer \rightarrow hidden layer \rightarrow nếu như đã biết trước W[l],b[l],...W^{[l]}, b^{[l]}, ... của mỗi layer for l = 1..L z[l]=W[l]a[l1]+b[l]z^{[l]} = W^{[l]}a^{[l - 1]} + b^{[l]}
a[l]=g(z[l])a^{[l]} = g(z^{[l]}) Thuật toán gradient descent cần tính dW[l]dW^{[l]}db[l]db^{[l]} ở mỗi lớp để có thể update W[1],b[1],...W^{[1]}, b^{[1]}, .... Backward propagation theo đúng tên gọi của nó đi từ output layer \rightarrow hiddenlayer \rightarrow input layer, và dựa vào các giá trị của z[l]z^{[l]}a[l]a^{[l]} đã tính toán ở mỗi lớp trong forward propagation mà tính được dW[l]dW^{[l]}db[1]db^{[1]} Dưới đây tôi sẽ trình bày công thức tính, phần chứng minh sẽ để ở bài kế tiếp

Back propagation cho 1 training example

Đạo hàm của zz ở lớp cuối cùng dz[L]=y^ydz^{[L]} = \hat y - y Với mỗi lớp l dz[l]=da[l]g[l](z[l])dz^{[l]} = da^{[l]} * g^{[l]'}(z^{[l]}) (nhân từng phần từ của 2 vector với nhau, nếu l = L thì ta dùng công thức ở trên) $dW^{[l]} = dz^{[l]} a^{[l - 1]T} $ Trong đó z[l]z^{[l]}a[l1]a^{[l - 1]} đã biết từ forward propagation db[l]=dz[l]db^{[l]} = dz^{[l]} da[l1]=W[l]Tdz[l]da^{[l-1]} = W^{[l]T} dz^{[l]} Biết được da[l1]da^{[l-1]} ta và các giá trị z,a,Wz, a, W của lớp đó (forward propagation) ta lại tính được dz[l1]dz^{[l-1]}, dW[l1]dW^{[l-1]}, db[l1]db^{[l-1]}

Back propagation cho m training example

Đạo hàm của ZZ ở lớp cuối cùng (Z là ma trận mà các cột là các neural của 1 lớp của mỗi training example) dZ[L]=Y^YdZ^{[L]} = \hat Y - Y Với mỗi lớp l dZ[l]=dA[l]g[l[(Z[l])dZ^{[l]} = dA^{[l]} * g^{[l['}(Z^{[l]}) (nhân từng phần tử của 2 ma trận với nhau, nếu l = L thì ta dùng công thức ở trên) dW[l]=1mdZ[l]A[l1]TdW^{[l]} = \dfrac{1}{m}dZ^{[l]} A^{[l - 1]T} db[l]=db^{[l]} = tổng các cột của vector dZ[l]dZ^{[l]} dA[l1]=W[l]TdZ[l]dA^{[l-1]} = W^{[l]T} dZ^{[l]} Biết được dA[l1]dA^{[l-1]} ta và các giá trị Z,A,WZ, A, W của lớp đó (forward propagation) ta lại tính được dZ[l1]dZ^{[l-1]}, dW[l1]dW^{[l-1]}, db[l1]db^{[l-1]}

Tham khảo

  • Coursera deep learning
  • Hugo Larochelle Neural Network