1
Lan truyền thẳng trong mạng Nơ-ron nhân tạo hoạt động như thế nào?
0
Quốc Thiện0 đã đăng:

Cảm ơn bạn đã gửi đề nghị giúp đỡ đến mình, thật sự thì câu hỏi của bạn không rõ ràng lắm, mạng nơ-ron nhân tạo ở đây có phải là mạng nơ-ron nhân tạo cơ bản chỉ gồm 3 lớp thôi hay các biến thể (nâng cấp cấp cao) của mạng nơ-ron nhân tạo, bởi vì môi trường thực tế luôn rất phức tạp, kiến thức mạng nơ-ron nhân tạo cơ bản là không đủ để tạo nên kết quả dự đoán tốt và tất nhiên mỗi biến thể của mạng nơ-ron nhân tạo sẽ có những kĩ thuật lan truyền thẳng khác nhau, bạn vui lòng xác nhận lại câu hỏi để mình có thể giúp bạn.

GrayScale Life 11.09.2018

Yes @GrayScaleLife, mình chỉ đang muốn hỏi kiến thức về mạng nơ-ron nhân tạo cơ bản 3 lớp (1 input - 1 hidden - 1 output) thôi, các bản nâng cấp của mạng nơ-ron nhân tạo hiện nay theo mình được biết thì mặc dù có chút khác nhưng hướng xử lý chung vẫn hoàn toàn dựa trên nền tảng mạng nơ-ron nhân tạo cơ bản đầu tiên có đúng không ạ? Và mình đang muốn hỏi kiến thức toán cơ bản của sự lan truyền thẳng trong mạng nơ-ron là gì?

Quốc Thiện 11.09.2018

Ok, mình đã hiểu ý bạn, giả sử bạn đã có kiến thức về mạng nơ-ron nhân tạo cơ bản và đã biết các khái niệm toán cơ bản khác như ma trận, véc-tơ, tích vô hướng véc-tơ và hàm số Sigmoid, bạn có thể xem câu trả lời của mình bên dưới.

Lưu ý là các ký hiệu về các đơn vị xử lý, trọng số,... trong mạng Nơ-ron nhân tạo có hơi loằn ngoằn nhưng nếu bạn đã làm quen qua rồi thì chả có gì khăn cả.

GrayScale Life 11.09.2018
thêm bình luận...
2
GrayScale Life90 đã đăng:

Lan truyền thẳng trong mạng Nơ-ron nhân tạo cũng không có gì đặc biệt ngoài sự kết hợp tuyến tính (hay tích vô hướng) của các giá trị input đầu vào với bộ trọng số tương ứng, và dĩ nhiên các phép tính này được thực hiện trên các ma trận và véc-tơ, đó cũng chính là lí do vì sao bạn nên biết một chút các khái niệm toán trước khi tìm hiểu mạng Nơ-ron nhân tạo.

Mạng nơ-ron nhân tạo cơ bản gồm có 3 lớp: đầu vào (input), lớp giữa (hidden) và lớp đầu ra (output), kết quả lan truyền từ trái sang phải hay từ input $\rightarrow$ hidden $\rightarrow$ output được gọi là lan truyền thẳng, còn ngược lại từ phải sang trái (hay từ output $\rightarrow$ hidden $\rightarrow$ input) được gọi là lan truyền ngược.

Bạn có thể dễ dàng hình dung sự lan truyền thẳng trong mạng nơ-ron nhân tạo 3 lớp cơ bản để tính kết quả đầu ra ở hình bên dưới,

Sự lan truyền thẳng trong mạng nơ-ron nhân tạo

Về nguyên lý hoạt động chung của lan truyền thẳng,

Từ Layer 1 sang Layer 2: tất cả giá trị đầu vào input (ký hiệu chung là $\mathbf{X}$) sẽ được kết hợp với tất cả các trọng số (ký hiệu chung là $\mathbf{W}$), kết quả sau đó được đưa qua 1 hàm gọi là hàm kích hoạt (thường sử dụng hàm Sigmoid và ký hiệu là $\phi()$), ta được tất cả kết quả đầu ra (ký hiệu chung là $\mathbf{A}$)

Từ Layer 2 sang Layer 3: tương tự như từ Layer 1 sang Layer 2 nhưng tất cả giá trị input lúc này là kết quả đầu ra của Layer 2.

Bây giờ tính kết quả lan truyền thẳng tại 1 nơ-ron duy nhất ví dụ $a^{(2)}_1$ chẳng hạn, tức kết quả ở neuron thứ $1$ của lớp thứ $2$ (lớp giữa) đúng không nào, ta có:

$$z^{(2)}_1 = w^{(1)}_{1,0}x_0 + w^{(1)}_{1,1}x_1 + w^{(1)}_{1,2}x_2$$

$$a^{(2)}_1 = \phi \left( z^{(2)}_1 \right)$$

Trong đó:

  • $x_0, x_1, x_2$ là các giá trị input đầu vào.
  • $w^{(1)}_{1,0}$ là trọng số giữa nơ-ron thứ $1$ của Layer $2$ và nơ-ron thứ $0$ của Layer $1$.
  • $w^{(1)}_{1,1}$ là trọng số giữa nơ-ron thứ $1$ của Layer $2$ và nơ-ron thứ $1$ của Layer $1$.
  • $w^{(1)}_{1,2}$ là trọng số giữa nơ-ron thứ $1$ của Layer $2$ và nơ-ron thứ $2$ của Layer $1$.
  • $z^{(2)}_1$ là kết quả sau khi tính tích vô hướng.
  • $\phi()$ là hàm kích hoạt của nơ-ron $a^{(2)}_1$
  • $a^{(2)}_1$ là kết quả sau khi qua hàm kích hoạt, là kết quả cuối cùng của nơ-ron thứ $1$ của lớp thứ $2$ (lớp giữa).

Công thức của hàm số Sigmoid với giá trị input $x$ như sau,

$$\phi(x) = \frac{1}{1 + e^{-x}}$$

Vậy,

$$\phi \left( z^{(2)}_1 \right) = \frac{1}{1 + e^{ -z^{(2) }_1}}$$

Ok, bạn chỉ mới tính kết quả lan truyền thẳng ở một đơn vị nơ-ron duy nhất $a^{(2)}_1$ mà thôi, bạn cần phải tính kết quả lan truyền thẳng của tất cả các nơ-ron (trừ lớp đầu vào) còn lại và tính tương tự như trên, hơi ngán ngẫm phải không nào, nhưng lý thuyết toán là vậy, khi lập trình (sử dụng Python) bạn chỉ cần 1 câu lệnh duy nhất.

Nếu để như trên thì sẽ rất khó nhìn, cho nên ta sử dụng ma trận và véc-tơ để biểu diễn cho dễ hơn, gọi:

  • $\mathbf{X}^{(1)}$ là véc-tơ chứa tất cả các giá trị đầu vào bao gồm $x_0, x_1, x_2, ...$
  • $\mathbf{W}^{(1)}$ là ma trận chứa tất cả các trọng số giữa Layer 1 và Layer 2 bao gồm $w^{(1)}_{1,0} | w^{(1)}_{1,1} | w^{(1)}_{1,2} | w^{(1)}_{2,0}$ ,...

Ta có kết quả lan truyền thẳng của toàn bộ nơ-ron ở Layer 2 là:

$$\mathbf{Z}^{(2)} = \mathbf{W}^{(1)} \mathbf{X}^{(1)} $$

$$\mathbf{A}^{(2)} = \phi \left( \mathbf{Z}^{(2)} \right)$$

Trong đó:

  • $\mathbf{X}^{(1)}$ là vector có [m + 1] x 1 chiều, với m là số lượng feature (các nơ-ron được tô màu đen trên hình) cộng với giá trị độ lệch bias (nơ-ron được tô màu xanh trên hình).
  • $\mathbf{W}^{(1)}$ là ma trận có h x [m + 1] chiều, với h là số lượng nơ-ron ở Layer 2 (trong ví dụ này chúng ta có 4 nơ-ron ở Layer 2).
  • $\mathbf{Z}^{(2)}$ là vector kết quả sau khi tính tích vô hướng, theo tính chất tích vô hướng, ma trận có h x [m + 1] chiều nhân với vector có [m + 1] x 1 chiều sẽ được vector kết quả có h x 1 chiều.
  • $\mathbf{A}^{(2)}$ là kết quả sau khi qua hàm kích hoạt, bởi vì hàm kích hoạt không làm ảnh hưởng gì đến số chiều của $\mathbf{Z}^{(2)}$ nên số chiều của $\mathbf{A}^{(2)}$ vẫn là h x 1, nhưng tại đây, để tiếp tục tới Layer 3, $\mathbf{A}^{(2)}$ phải cộng thêm giá trị độ lệch bias nên cuối cùng là véc-tơ [h + 1] x 1 chiều.

Mình xin nhắc lại là công thức toán có hơi rùm rà và phức tạp xíu nhưng khi bạn quen cách ký hiệu rồi thì không có gì là vấn đề, nếu bạn thể hiện công thức toán lan truyền thẳng ở Layer 2 bằng Python thì chỉ với 1 dòng code duy nhất.

# Giả sử ta đã có véc-tơ X_1 và trọng số W_1, hàm Sigmoid đã được định nghĩa sẵn có tên là sigmoid_activation(), tính giá trị A_2 bằng,
A_2 = sigmoid_activation(W_1.dot(X_1.T))

Như vậy là đã xong ở giai đoạn tính kết quả lan truyền thẳng từ Layer 1 sang Layer 2, từ Layer 2 sang Layer 3 thì hoàn toàn tương tự như những gì mình đã trình bày ở trên, chỉ khác ở chỗ các ký hiệu một chút, và mình ghi lại công thức ở dạng ma trận véc-tơ tổng quát luôn,

$$\mathbf{Z}^{(3)} = \mathbf{W}^{(2)} \mathbf{A}^{(2)} $$

$$\mathbf{A}^{(3)} = \phi \left( \mathbf{Z}^{(3)} \right)$$

Vậy $\mathbf{A}^{(3)}$ là kết quả cuối cùng của thuật toán lan truyền thẳng trong mạng nơ-ron nhân tạo 3 lớp cơ bản, nếu một mạng nơ-ron cấp cao bao gồm 100 lớp thì sao, hoàn toàn tương tự như trên, kết quả của Layer trước là giá trị đầu vào của Layer sau, không cần lo lắng, bạn chỉ cần lập trình còn lại để máy tính lo.

Have fun with Machine Learning <3.

đã bổ sung 5.8 năm trước bởi

Rất cảm ơn câu trả lời của bạn, mình có một vài câu hỏi thắc mắc, tại sao ở biểu thức tính kết quả lan truyền thẳng tại nơ-ron $a^{(2)}_1$, biểu thức $z^{(2)}_1$ chỉ có 3 thành phần tham gia mà không phải là bất kỳ n thành phần nào vậy?

Quốc Thiện 11.09.2018

Bởi vì mình đang lấy hình ảnh của một mạng nơ-ron 3 lớp cơ bản làm ví dụ cụ thể, trong đó:

  • Lớp input đầu tiên có tổng cộng 3 nơ-ron.
  • Lớp giữa có tổng cộng 4 nơ-ron.
  • Lớp output có tổng cộng 2 nơ-ron.

Nhìn vào các đường liên kết giữa các nơ-ron bạn có thể thấy nơ-ron thứ 1 ở lớp thứ 2 (tức là $a^{(2)}_1$) được 3 nơ-ron đầu tiên tham gia đóng góp "công sức" vào, cho nên ở biểu thức $z^{(2)}_1$ có 3 thành phần cộng lại, tất nhiên thực tế thì nó là n thành phần phụ thuộc vào số chiều (số feature m) của mỗi mẫu dữ liệu của bạn.

Mình cũng đã tổng quát hóa lên là m chiều bằng các ký hiệu ma trận véc-tơ và đã giải thích số chiều của phép tính sẽ thay đổi như thế nào khi bạn thực hiện các phép toán giữa chúng.

GrayScale Life 11.09.2018

Ở câu lệnh minh họa A_2 = sigmoid_activation(W_1.dot(X_1.T)), mình đã hiểu hàm sigmoid_activation() và hàm dot(), còn .T là gì vậy bạn? Tại sao không phải là W.dot(X_1) mà là W_1.dot(X_1.T)?

Quốc Thiện 11.09.2018

T (transpose) là một hàm của thư viện numpy trong Python dùng để chuyển vị ma trận hoặc véc-tơ, giả sử ta có véc-tơ $\mathbf{A}$,

$$\mathbf{A} = [1 \quad 2 \quad 3]$$

$\mathbf{A}$ chuyển vị hay $\mathbf{A}^{\mathbf{T}}$ sẽ bằng,

$$ \mathbf{A}^{\mathbf{T}} = \left[ \begin{matrix} 1 \\ 2 \\ 3 \end{matrix} \right] $$

Quay trở lại câu hỏi của bạn, nó phụ thuộc vào cách bạn tổ chức dữ liệu của véc-tơ $\mathbf{X}$ và ma trận $\mathbf{W}$ ra sao mà có thể hoặc không cần sử dụng .T, khi đụng tới lập trình bạn sẽ gặp trường hợp sau,

Cho véc-tơ X có [1 x 3] chiều, ma trận W có [4 x 3] chiều, nếu để như vậy bạn sẽ không thể áp dụng được phép tính tích vô hướng (tại sao không thể thì nó là kiến thức toán cơ bản), bạn phải chuyển vị X thành [3 x 1] chiều, sau đó lấy ma trận W nhân tích vô hướng với X thì ok bởi vì [4 x 3].dot([3 x 1]) được kết quả [4 x 1] chiều.

GrayScale Life 11.09.2018
thêm bình luận...
Bạn đang thắc mắc? Ghi câu hỏi của bạn và đăng ở chế độ cộng đồng (?)