Giải thích chi tiết thuật toán Backpropagation

Written on April 12, 2019

Giới thiệu về thuật toán Backpropagation

Thuật toán Backpropagation là một phương pháp tính toán đạo hàm ngược (reverse of differentiation) được áp dụng trong mạng nơ-ron nhân tạo, giúp tính toán các đạo hàm cần thiết để tối ưu hóa các tham số trong mô hình.

Ý tưởng đầu tiên về thuật toán Backpropagation được đề xuất bởi Paul Werbos vào năm 1974 trong bài báo “Beyond Regression: New Tools for Prediction and Analysis in the Behavioral Sciences”. Tuy nhiên ý tưởng này chưa được biết đến rộng rãi cho đến khi nó được các tác giả David Rumelhart, Geoffrey Hinton và Ronald Williams phát triển và áp dụng vào mạng nơ-ron nhân tạo trong bài báo “Learning representations by back-propagating errors” vào năm 1986. Bài báo này đã giúp cho thuật toán Backpropagation trở thành một phương pháp quan trọng để huấn luyện các mô hình mạng nơ-ron nhân tạo.

Kể từ đó thì thuật toán Backpropagation đã được sử dụng rộng rãi trong các ứng dụng của machine learning và deep learning. Tuy nhiên thuật toán này cũng gặp phải một số hạn chế như độ chính xác kém và khả năng vượt qua các vấn đề như vanishing gradient hay exploding gradient. Do đó hiện nay có nhiều biến thể của thuật toán Backpropagation được phát triển để giải quyết những hạn chế này. Một số biến thể cải tiến của thuật toán Backpropagation tiêu biểu bao gồm:

  • Weight Decay: Kỹ thuật này giúp tránh overfitting bằng cách thêm một chi phí phạt vào hàm mất mát để giảm giá trị của các tham số trong mô hình. Điều này giúp giảm khả năng mô hình bị overfitting và cải thiện năng lực dự đoán của mô hình.
  • Batch Normalization: Đây là một kỹ thuật khác để giúp cho quá trình huấn luyện nhanh hơn và ổn định hơn bằng cách chuẩn hóa giá trị đầu vào cho mỗi layer trong mạng nơ-ron. Batch Normalization giúp giảm hiện tượng overfitting trong quá trình huấn luyện.
  • Adaptive Moment Estimation: Đây là một biến thể khác của thuật toán Backpropagation, kết hợp giữa momentum và adaptive learning rate để cải thiện tốc độ học của mô hình. Nó tự động điều chỉnh learning rate cho từng tham số và giúp tăng tốc quá trình huấn luyện.
  • Stochastic Gradient Descent with Momentum: Biến thể này kết hợp giữa thuật toán Backpropagation và momentum để giảm thiểu việc rơi vào các điểm cực tiểu cục bộ. Nó sử dụng một hệ số momentum để giảm độ dao động của gradient và giúp giữ cho quá trình huấn luyện ổn định hơn.
  • Nesterov Accelerated Gradient: Biến thể này cũng kết hợp giữa thuật toán Backpropagation và momentum, nhưng sử dụng hệ số momentum với phương pháp Nesterov. Nó giúp cải thiện tốc độ hội tụ và giảm thiểu sự dao động của gradient.

Ý tưởng của thuật toán Backpropagation

Thuật toán Backpropagation được sử dụng để tính toán đạo hàm của hàm mất mát theo các tham số trong mô hình machine learning khi áp dụng thuật toán gradient descent. Trong mô hình machine learning thì số lượng tham số có thể là rất lớn, đôi khi lên đến hàng triệu tham số. Tính toán đạo hàm của hàm mất mát theo từng tham số bằng cách sử dụng công thức tính đạo hàm bình thường có thể rất phức tạp và tốn kém về thời gian và chi phí tính toán. Thuật toán Backpropagation được thiết kế để tính toán đạo hàm của hàm mất mát theo từng tham số một cách hiệu quả hơn bằng cách sử dụng kỹ thuật lan truyền ngược (backward propagation) thông qua các lớp (layers) của mô hình. Quá trình tính toán đạo hàm này giúp thuật toán gradient descent điều chỉnh các tham số mô hình sao cho giá trị của hàm mất mát giảm dần theo thời gian, giúp tối ưu hóa hiệu suất huấn luyện cho mô hình.

Trong thuật toán Backpropagation, quy tắc chuỗi đạo hàm (chain rule) được áp dụng để tính toán đạo hàm của hàm mất mát đối với từng trọng số của mạng nơ-ron nhân tạo. Quy tắc này cho phép chúng ta tính toán gradient của hàm mất mát theo từng trọng số. Quy tắc chuỗi đạo hàm là một công cụ quan trọng trong tính toán đạo hàm của các hàm số phức tạp. Giả sử chúng ta có một hàm số \(f(x)\) có dạng hàm hợp:

\[\begin{align} f(x) = g(h(x)) \end{align}\]

Trong đó \(h(x)\) và \(g(x)\) là các hàm số có thể tính đạo hàm được. Theo quy tắc chuỗi đạo hàm, đạo hàm của \(f(x)\) theo \(x\) có thể tính được như sau:

\[\begin{align} \frac{df}{dx} = \frac{dg}{dh}\cdot\frac{dh}{dx} \end{align}\]

Tức là chúng ta tính đạo hàm của hàm \(g(x)\) theo hàm số trung gian \(h(x)\), và sau đó tính đạo hàm của \(h(x)\) theo \(x\). Quy tắc này có thể được áp dụng đệ qui nếu hàm số \(f(x)\) phức tạp hơn và có nhiều hàm số trung gian.

Khi áp dụng thuật toán Backpropagation trong huấn luyện mô hình mạng nơ-ron nhân tạo, chúng ta cần tính toán đạo hàm của hàm mất mát theo các trọng số của mạng. Hãy hình dung các lớp trong một mạng nơ-ron nhân tạo giống như một một hàm hợp có nhiều lớp hàm trung gian phức tạp bên trong. Do đó hàm mất mát cho mô hình mạng nơ-ron nhân tạo này cũng là một dạng hàm hợp phức tạp với nhiều lớp hàm trung gian tương tự. Để tính đạo hàm này, chúng ta sử dụng quy tắc chuỗi đạo hàm để tính toán đạo hàm của các hàm số trung gian trong quá trình lan truyền ngược từ đầu ra đến đầu vào của mạng. Việc tính toán gradient là rất quan trọng trong thuật toán Gradient Descent, được sử dụng để cập nhật trọng số của mạng nơ-ron nhân tạo trong quá trình huấn luyện. Khi tính toán gradient bằng thuật toán Backpropagation, quy tắc chuỗi đạo hàm được áp dụng liên tiếp cho mỗi lớp trong mạng nơ-ron nhân tạo, bắt đầu từ lớp cuối cùng đến lớp đầu tiên.

Thuật toán Backpropagation hoạt động bằng cách lan truyền giá trị gradient từ đầu ra của mô hình trở lại đầu vào để tính toán đạo hàm. Thuật toán Backpropagation được chia thành hai pha:

  • Pha feedforward (lan truyền tiến): Trong pha này, giá trị đầu vào được lan truyền qua mạng nơ-ron nhân tạo để tính toán giá trị đầu ra. Các giá trị đầu ra này được sử dụng để tính toán giá trị hàm mất mát và gradient của hàm mất mát theo giá trị đầu ra của mô hình.
  • Pha backpropagation (lan truyền ngược): Trong pha này, giá trị gradient tính được ở pha feedforward được lan truyền ngược lại từ đầu ra đến đầu vào của mô hình để tính toán gradient của hàm mất mát theo từng trọng số của mô hình. Quá trình lan truyền ngược được thực hiện bằng cách sử dụng quy tắc chuỗi đạo hàm và tính toán đạo hàm theo từng lớp của mô hình mạng nơ-ron nhân tạo.

Quá trình lan truyền ngược được thực hiện như sau:

  • Tính toán gradient của hàm mất mát theo giá trị đầu ra của mô hình.
  • Lan truyền ngược giá trị gradient này từ đầu ra đến đầu vào của mô hình bằng cách sử dụng quy tắc chuỗi để tính toán giá trị gradient của hàm mất mát theo từng lớp của mô hình mạng nơ-ron nhân tạo.
  • Sử dụng giá trị gradient tính được ở bước trước để cập nhật các trọng số của mô hình bằng thuật toán gradient descent.

Giả sử chúng ta có một mạng neuron đơn giản với hai lớp lần lượt là lớp đầu vào (input layer) với hai neuron và lớp đầu ra (output layer) với một neuron. Hàm hàm chi phí (cost function) được sử dụng là hàm tổng bình phương sai số (sum of squared errors) được tính bởi công thức:

\[\begin{align} J(w,b) = \frac{1}{2} \sum_{i=1}^{m} (y_i - \hat{y_i})^2 \end{align}\]

Trong đó \(w\) và \(b\) lần lượt là ma trận trọng số và vector bias của mạng, \(m\) là số lượng điểm dữ liệu, \(y_i\) là giá trị thực tế của điểm dữ liệu thứ $i$ và \(\hat{y_i}\) là giá trị dự đoán của mạng với điểm dữ liệu thứ \(i\).

Công thức tính toán giá trị đầu ra tại neuron thứ \(i\) của lớp ẩn là:

\[\begin{align} z_i = \sum_{j=1}^{n} w_{ij}x_j + b_i \end{align}\]

\[\begin{align} a_i = \sigma(z_i) \end{align}\]

Trong đó:

  • \(n\) là số lượng neuron trong lớp đầu vào
  • \(w_{ij}\) là trọng số kết nối giữa neuron thứ \(i\) của lớp ẩn và neuron thứ \(j\) của lớp đầu vào
  • \(x_j\) là giá trị đầu vào tại neuron thứ \(j\) của lớp đầu vào
  • \(b_i\) là giá trị bias của neuron thứ \(i\) trong lớp ẩn
  • \(\sigma(z_i)\) là hàm kích hoạt (ví dụ như hàm sigmoid, hàm tanh, hàm ReLU,…) tại neuron thứ \(i\) của lớp ẩn

Công thức tính toán giá trị đầu ra tại neuron của lớp đầu ra là:

\[\begin{align} y_{hat} = \sum_{i=1}^{2} w_{i}a_i + b \end{align}\]

\[\begin{align} L(y, y_{hat}) = \frac{1}{2}(y - y_{hat})^2 \end{align}\]

Trong đó:

  • \(w_i\) là trọng số kết nối giữa neuron thứ $i$ của lớp đầu ra và neuron thứ \(j\) của lớp ẩn
  • \(b\) là giá trị bias của neuron trong lớp đầu ra
  • \(y\) là giá trị đầu ra thực tế
  • \(y_{hat}\) là giá trị đầu ra dự đoán
  • \(L\) là hàm mất mát (loss function), trong ví dụ trên sử dụng hàm tổng bình phương.

Trong ví dụ đã cho, hàm \(L(y, y_{hat})\) là hàm mất mát, được sử dụng để đánh giá độ chính xác của mô hình. Hàm này tính toán sai số dự đoán giữa giá trị dự đoán \(y_{hat}\) và giá trị thực tế \(y\) cho từng điểm dữ liệu trong tập huấn luyện. Trong ví dụ này, hàm mất mát là hàm tổng bình phương sai số (sum of squared error) được tính như sau:

\[\begin{align} L(y, y_{hat}) = \frac{1}{2} \sum_{i=1}^{m}(y_{i}-y_{hat,i})^2 \end{align}\]

Trong đó, \(y_{i}\) là giá trị thực tế của điểm dữ liệu thứ \(i\), \(y_{hat,i}\) là giá trị dự đoán của điểm dữ liệu thứ \(i\), \(m\) là số lượng điểm dữ liệu trong tập huấn luyện.

Hàm \(J(w,b)\) là hàm chi phí (cost function), là một hàm số mà mục đích là tối thiểu hoá hàm mất mát \(L(y, y_{hat})\) bằng cách tìm kiếm bộ trọng số \(w\) và bias \(b\) phù hợp nhất. Hàm chi phí có thể được tính như sau:

\[\begin{align} J(w,b) = \frac{1}{m} \sum_{i=1}^{m} L(y^{(i)}, y_{hat}^{(i)}) \end{align}\]

Trong đó, \(y^{(i)}\) là giá trị thực tế của điểm dữ liệu thứ \(i\), \(y_{hat}^{(i)}\) là giá trị dự đoán của điểm dữ liệu thứ \(i\), \(m\) là số lượng điểm dữ liệu trong tập huấn luyện.

Vì vậy, để tối thiểu hoá hàm chi phí \(J(w,b)\), ta cần tìm bộ trọng số \(w\) và bias \(b\) sao cho hàm mất mát \(L(y, y_{hat})\) đạt giá trị nhỏ nhất. Khi sử dụng thuật toán gradient descent, ta tính đạo hàm của hàm chi phí \(J(w,b)\) để cập nhật giá trị của các tham số \(w\) và \(b\) sao cho giá trị của hàm chi phí giảm dần theo từng bước lặp.

Để tính toán đạo hàm của hàm mất mát theo các tham số \(w\) và \(b\), chúng ta sử dụng thuật toán Backpropagation như sau:

Bước 1: Pha Feedforward: Tính toán giá trị đầu ra của mạng

Đầu tiên, chúng ta thực hiện phép tính feedforward để tính toán giá trị đầu ra của mạng với mỗi điểm dữ liệu. Với mỗi điểm dữ liệu thứ \(i\), chúng ta tính toán các giá trị tại các neuron của mạng như sau:

\[\begin{align} z_1^{(i)} = w_{11} x_1^{(i)} + w_{21} x_2^{(i)} + b_1\\ a_1^{(i)} = g(z_1^{(i)})\\ z_2^{(i)} = w_{12} x_1^{(i)} + w_{22} x_2^{(i)} + b_2\\ \hat{y_i} = a_2^{(i)} = g(z_2^{(i)})\\ \end{align}\]

Trong đó \(x_1^{(i)}\) và \(x_2^{(i)}\) lần lượt là giá trị đầu vào thứ nhất và thứ hai của điểm dữ liệu thứ \(i\), \(g(z)\) là hàm kích hoạt (activation function), ở đây chúng ta sử dụng hàm sigmoid:

\[\begin{align} g(z) = \frac{1}{1 + e^{-z}} \end{align}\]

Bước 2: Tính toán độ lỗi

Sau khi tính toán được giá trị đầu ra của mạng \(\hat{y_i}\) với điểm dữ liệu thứ \(i\), chúng ta tính toán độ lỗi của mạng với điểm dữ liệu đó bằng cách tính sai số giữa giá trị dự đoán và giá trị thực tế:

\[\begin{align} error_i = y_i - \hat{y_i} \end{align}\]

Bước 3: Pha Backpropagation: Tính toán đạo hàm tại lớp đầu ra

Chúng ta cần tính đạo hàm của hàm mất mát \(E\) theo các trọng số \(w_{ij}\) tại lớp đầu ra \(l=3\). Trong trường hợp này, hàm mất mát được định nghĩa là hàm tổng bình phương sai số giữa giá trị dự đoán và giá trị thực tế:

\[\begin{align} E = \frac{1}{2} \sum_{i=1}^{n_{l+1}} (y_i - \hat{y_i})^2 \end{align}\]

Trong đó \(n_{l+1}\) là số nút tại lớp đầu ra và \(\hat{y_i}\) là giá trị đầu ra dự đoán của nút thứ \(i\) tại lớp đầu ra.

Do \(\hat{y_i}\) phụ thuộc vào giá trị của các nút tại lớp trước đó, chúng ta cần tính toán đạo hàm riêng của hàm mất mát \(E\) theo từng giá trị đầu ra \(\hat{y_i}\) tại lớp đầu ra. Tức là:

\[\begin{align} \frac{\partial E}{\partial \hat{y_i}} = y_i - \hat{y_i} \end{align}\]

Sau khi tính được đạo hàm riêng này, chúng ta có thể sử dụng quy tắc chuỗi đạo hàm để tính đạo hàm của hàm mất mát \(E\) theo các trọng số \(w_{ij}\) tại lớp đầu ra.

Bước 4: Tính toán đạo hàm tại lớp ẩn cuối cùng

Đạo hàm tại lớp ẩn cuối cùng được tính bằng cách sử dụng quy tắc chuỗi đạo hàm:

\[\begin{align} \frac{\partial L}{\partial z_2} = \frac{\partial L}{\partial \hat{y}} \cdot \frac{\partial \hat{y}}{\partial z_2} \end{align}\]

Trong đó:

\[\begin{align} \frac{\partial \hat{y}}{\partial z_2} = f'(z_2) = f(z_2) \cdot (1 - f(z_2)) \end{align}\]

Với \(f\) là hàm kích hoạt của lớp ẩn, trong trường hợp này là hàm sigmoid:

\[\begin{align} f(z) = \frac{1}{1 + e^{-z}} \end{align}\]

Do đó:

\[\begin{align} \frac{\partial \hat{y}}{\partial z_2} = f(z_2) \cdot (1 - f(z_2)) = 0.731 \cdot (1 - 0.731) = 0.196 \end{align}\]

Ta có:

\[\begin{align} \frac{\partial L}{\partial z_2} = \frac{\partial L}{\partial \hat{y}} \cdot \frac{\partial \hat{y}}{\partial z_2} = (1.32 - 1.0) \cdot 0.196 = 0.062 \end{align}\]

Bước 5: Tính toán đạo hàm tại các lớp ẩn khác nhau

Đạo hàm tại các lớp ẩn khác nhau được tính bằng cách sử dụng quy tắc chuỗi đạo hàm:

\[\begin{align} \frac{\partial L}{\partial z_i} = \frac{\partial L}{\partial z_{i+1}} \cdot \frac{\partial z_{i+1}}{\partial z_i} \end{align}\]

Trong trường hợp này, chúng ta có thể tính toán đạo hàm tại lớp ẩn đầu tiên:

\[\begin{align} \frac{\partial L}{\partial z_1} = \frac{\partial L}{\partial z_2} \cdot \frac{\partial z_2}{\partial z_1} = \frac{\partial L}{\partial z_2} \cdot \frac{\partial (w_2 f(z_1) + b_2)}{\partial z_1} = \frac{\partial L}{\partial z_2} \cdot w_2 f'(z_1) \end{align}\]

Với \(f\) là hàm kích hoạt của lớp ẩn đầu tiên, trong trường hợp này là hàm sigmoid:

\[\begin{align} f(z) = \frac{1}{1 + e^{-z}} \end{align}\]

Do đó:

\[\begin{align} f'(z) = f(z) \cdot (1 - f(z)) \end{align}\]

Và:

\[\begin{align} \frac{\partial L}{\partial z_1} = \frac{\partial L}{\partial z_2} \cdot w_2 f'(z_1) = 0.062 \cdot 0.14 \cdot 0.253 = 0.0022 \end{align}\]

Bước 6: Tính đạo hàm của hàm mất mát theo trọng số \(w_3\):

\[\begin{align} \frac{\partial L}{\partial w_3} = \frac{\partial L}{\partial \hat{y}_1} \cdot \frac{\partial \hat{y}_1}{\partial z_1} \cdot \frac{\partial z_1}{\partial w_3} = 2(\hat{y}_1 - y) \cdot f'(z_1) \cdot x_1 = 2(\hat{y}_1 - y) \cdot f'(z_1) \cdot a_0 \end{align}\]

Bước 7: Tính đạo hàm của hàm mất mát theo trọng số \(w_4\):

\[\begin{align} \frac{\partial L}{\partial w_4} = \frac{\partial L}{\partial \hat{y}_1} \cdot \frac{\partial \hat{y}_1}{\partial z_1} \cdot \frac{\partial z_1}{\partial w_4} = 2(\hat{y}_1 - y) \cdot f'(z_1) \cdot x_2 = 2(\hat{y}_1 - y) \cdot f'(z_1) \cdot a_1 \end{align}\]

Bước 8: Tính đạo hàm của hàm mất mát theo trọng số \(w_5\):

\[\begin{align} \frac{\partial L}{\partial w_5} = \frac{\partial L}{\partial \hat{y}_2} \cdot \frac{\partial \hat{y}_2}{\partial z_2} \cdot \frac{\partial z_2}{\partial w_5} = 2(\hat{y}_2 - y) \cdot f'(z_2) \cdot x_1 = 2(\hat{y}_2 - y) \cdot f'(z_2) \cdot a_0 \end{align}\]

Bước 9: Tính đạo hàm của hàm mất mát theo trọng số \(w_6\):

\[\begin{align} \frac{\partial L}{\partial w_6} = \frac{\partial L}{\partial \hat{y}_2} \cdot \frac{\partial \hat{y}_2}{\partial z_2} \cdot \frac{\partial z_2}{\partial w_6} = 2(\hat{y}_2 - y) \cdot f'(z_2) \cdot x_2 = 2(\hat{y}_2 - y) \cdot f'(z_2) \cdot a_1 \end{align}\]

Bước 10: Cập nhật các trọng số theo hướng ngược lại gradient:

\[\begin{align} w_3 \leftarrow w_3 - \eta \frac{\partial L}{\partial w_3}\\ w_4 \leftarrow w_4 - \eta \frac{\partial L}{\partial w_4}\\ w_5 \leftarrow w_5 - \eta \frac{\partial L}{\partial w_5}\\ \end{align}\]

Tính toán đạo hàm của hàm mất mát theo trọng số tại lớp ẩn thứ 1:

\[\begin{align} \frac{\partial L}{\partial w^{(1)}} = \frac{\partial L}{\partial y} \cdot \frac{\partial y}{\partial h^{(2)}} \cdot \frac{\partial h^{(2)}}{\partial a^{(2)}} \cdot \frac{\partial a^{(2)}}{\partial h^{(1)}} \cdot \frac{\partial h^{(1)}}{\partial a^{(1)}} \cdot \frac{\partial a^{(1)}}{\partial w^{(1)}} \end{align}\]
  • Tính \(\frac{\partial L}{\partial y}\) từ bước 9: \(\frac{\partial L}{\partial y} = 2(y - \hat{y}) = 2(-1.14 - 0.85) = -3.98\)
  • Tính \(\frac{\partial y}{\partial h^{(2)}}\) từ bước 8: \(\frac{\partial y}{\partial h^{(2)}} = w^{(2)} = 0.6\)
  • Tính \(\frac{\partial h^{(2)}}{\partial a^{(2)}}\) từ bước 7: \(\frac{\partial h^{(2)}}{\partial a^{(2)}} = \sigma'(a^{(2)}) = \sigma(a^{(2)})\cdot(1-\sigma(a^{(2)})) = 0.75\cdot(1-0.75) = 0.1875\)
  • Tính \(\frac{\partial a^{(2)}}{\partial h^{(1)}}\) từ bước 6: \(\frac{\partial a^{(2)}}{\partial h^{(1)}} = w^{(3)} = -0.5\)
  • Tính \(\frac{\partial h^{(1)}}{\partial a^{(1)}}\) từ bước 5: \(\frac{\partial h^{(1)}}{\partial a^{(1)}} = \sigma'(a^{(1)}) = \sigma(a^{(1)})\cdot(1-\sigma(a^{(1)})) = 0.66\cdot(1-0.66) = 0.2244\)
  • Tính \(\frac{\partial a^{(1)}}{\partial w^{(1)}}\) từ bước 4: \(\frac{\partial a^{(1)}}{\partial w^{(1)}} = x = 0.2\)

Kết hợp các giá trị đã tính được ta có:

\[\begin{align} \frac{\partial L}{\partial w^{(1)}} = -3.98 \cdot 0.6 \cdot 0.1875 \cdot (-0.5) \cdot 0.2244 \cdot 0.2 = 0.0084 \end{align}\]

Chúng ta đã tính được đạo hàm của hàm mất mát theo trọng số \(w_{ij}^{(1)}\) tại lớp ẩn thứ nhất, được ký hiệu là \(\frac{\partial L}{\partial w_{ij}^{(1)}}\). Tiếp theo, ta cần cập nhật giá trị của trọng số này bằng cách sử dụng thuật toán gradient descent. Cụ thể, ta thực hiện như sau:

Cập nhật trọng số \(w_{ij}^{(1)}\) theo công thức sau:

\[\begin{align} w_{ij}^{(1)} \leftarrow w_{ij}^{(1)} - \alpha \frac{\partial L}{\partial w_{ij}^{(1)}} \end{align}\]

Trong đó, \(\alpha\) là learning rate, là một siêu tham số được đặt trước và quyết định tốc độ học của mô hình.

Cập nhật trọng số \(b_i^{(1)}\) tại node thứ \(i\) của lớp ẩn thứ nhất tương tự như trọng số \(w_{ij}^{(1)}\):

\[\begin{align} b_i^{(1)} \leftarrow b_i^{(1)} - \alpha \frac{\partial L}{\partial b_i^{(1)}} \end{align}\]

Trong đó, \(\frac{\partial L}{\partial b_i^{(1)}}\) được tính bằng công thức:

\[\begin{align} \frac{\partial L}{\partial b_i^{(1)}} = \frac{\partial L}{\partial z_i^{(1)}} \frac{\partial z_i^{(1)}}{\partial b_i^{(1)}} = \delta_i^{(1)} \end{align}\]

Với \(\delta_i^{(1)}\) là độ lỗi của node thứ $i$ trong lớp ẩn thứ nhất, được tính bằng công thức:

\[\begin{align} \delta_i^{(1)} = \sum_{k=1}^{n^{(2)}} \delta_k^{(2)} w_{ik}^{(2)} g'(z_i^{(1)}) \end{align}\]

Trong đó, \(n^{(2)}\) là số node tại lớp đầu ra, \(w_{ik}^{(2)}\) là trọng số kết nối từ node thứ \(i\) tại lớp ẩn thứ nhất đến node thứ \(k\) tại lớp đầu ra, \(g'(z_i^{(1)})\) là đạo hàm của hàm kích hoạt tại node thứ \(i\) trong lớp ẩn thứ nhất và được tính bằng công thức:

\[\begin{align} g'(z_i^{(1)}) = \frac{\partial g(z_i^{(1)})}{\partial z_i^{(1)}} = g(z_i^{(1)})(1 - g(z_i^{(1)})) \end{align}\]

Các bước trên sẽ được lặp lại cho tất cả các trọng số và bias trong mạng nơ-ron để tiến hành huấn luyện mô hình.

Với thuật toán Backpropagation thì việc tính toán gradient của hàm mất mát theo từng trọng số trong mô hình mạng nơ-ron nhân tạo trở nên dễ dàng và hiệu quả hơn, giúp cho việc huấn luyện mô hình trở nên nhanh chóng và chính xác hơn.

Tài liệu tham khảo

Written by Nguyen Truong Long