4.1. Perceptron đa tầng

Trong chương trước, chúng tôi đã giới thiệu hồi quy softmax (Section 3.4), cách lập trình giải thuật này từ đầu (Section 3.6), sử dụng nó trong gluon (Section 3.7), và huấn luyện các bộ phân loại để nhận diện 10 lớp quần áo khác nhau từ các bức ảnh có độ phân giải thấp. Cùng với đó, chúng ta đã học cách xử lý dữ liệu, ép buộc các giá trị đầu ra tạo thành một phân phối xác suất hợp lệ (thông qua hàm softmax), áp dụng một hàm mất mát phù hợp và cực tiểu hoá nó theo các tham số mô hình. Bây giờ, sau khi đã thành thạo các cơ chế nêu trên trong ngữ cảnh của những mô hình tuyến tính đơn giản, chúng ta có thể bắt đầu khám phá trọng tâm của cuốn sách này: lớp mô hình phong phú của các mạng nơ-ron sâu.

4.1.1. Các tầng ẩn

Để bắt đầu, hãy nhớ lại kiến trúc mô hình trong ví dụ của hồi quy softmax, được minh hoạ trong Fig. 4.1.1 bên dưới. Mô hình này ánh xạ trực tiếp các đầu vào của chúng ta sang các giá trị đầu ra thông qua một phép biến đổi tuyến tính duy nhất:

(4.1.1)\[\hat{\mathbf{o}} = \mathrm{softmax}(\mathbf{W} \mathbf{x} + \mathbf{b}).\]
../_images/singlelayer.svg

Fig. 4.1.1 Perceptron đơn tầng với 5 nút đầu ra.

Nếu các nhãn của chúng ta thật sự có mối quan hệ tuyến tính với dữ liệu đầu vào, thì cách tiếp cận này là đủ. Nhưng tính tuyến tính là một giả định chặt.

Ví dụ, tính tuyến tính ngụ ý về giả định yếu hơn của tính đơn điệu: tức giá trị đặc trưng tăng luôn dẫn đến việc đầu ra mô hình tăng (nếu trọng số tương ứng dương), hoặc đầu ra mô hình giảm (nếu trọng số tương ứng âm). Điều này đôi khi cũng hợp lý. Ví dụ, nếu chúng ta đang dự đoán liệu một người có trả được khoản vay hay không, chúng ta có thể suy diễn một cách hợp lý như sau: bỏ qua mọi yếu tố khác, ứng viên nào có thu nhập cao hơn sẽ có khả năng trả được nợ cao hơn so với những ứng viên khác có thu nhập thấp hơn. Dù có tính đơn điệu, mối quan hệ này khả năng cao là không liên quan tuyến tính tới xác suất trả nợ. Khả năng trả được nợ thường sẽ có mức tăng lớn hơn khi thu nhập tăng từ $0 lên $50k so với khi tăng từ $1M lên $1.05M. Một cách để giải quyết điều này là tiền xử lý dữ liệu để tính tuyến tính trở nên hợp lý hơn, ví dụ như sử dụng logarit của thu nhập để làm đặc trưng.

Lưu ý rằng chúng ta có thể dễ dàng đưa ra các ví dụ vi phạm tính đơn điệu. Ví dụ như, ta muốn dự đoán xác suất tử vong của một người dựa trên thân nhiệt. Đối với người có thân nhiệt trên 37°C (98.6°F), nhiệt độ càng cao gây ra nguy cơ tử vong càng cao. Tuy nhiên, với những người có thân nhiệt thấp hơn 37°C, khi gặp nhiệt độ cao hơn thì nguy cơ tử vong lại thấp hơn! Trong bài toán này, ta có thể giải quyết nó bằng một vài bước tiền xử lý thật khéo léo. Cụ thể, ta có thể sử dụng khoảng cách từ 37°C tới thân nhiệt làm đặc trưng.

Nhưng còn với bài toán phân loại hình ảnh chó mèo thì sao? Liệu việc tăng cường độ sáng của điểm ảnh tại vị trí (13, 17) sẽ luôn tăng (hoặc giảm) khả năng đó là hình một con chó? Sử dụng mô hình tuyến tính trong trường hợp này tương ứng với việc ngầm giả định rằng chỉ cần đánh giá độ sáng của từng pixel để phân biệt giữa mèo và chó . Cách tiếp cận này chắc chắn sẽ không chính xác khi các hình ảnh bị đảo ngược màu sắc.

Tuy nhiên, ta bỏ qua sự phi lý của tuyến tính ở đây, so với các ví dụ trước, rõ ràng là ta không thể giải quyết bài toán này với vài bước tiền xử lý chỉnh sửa đơn giản. Bởi vì ý nghĩa của các điểm ảnh phụ thuộc một cách phức tạp vào bối cảnh xung quanh nó (các giá trị xung quanh của điểm ảnh). Có thể vẫn tồn tại một cách biểu diễn dữ liệu nào đó nắm bắt được sự tương tác giữa các đặc trưng liên quan (và quan trọng nhất là phù hợp với mô hình tuyến tính), ta đơn giản là không biết làm thế nào để tính toán nó một cách thủ công. Với các mạng nơ-ron sâu, ta sử dụng dữ liệu đã quan sát được để đồng thời học cách biểu diễn (thông qua các tầng ẩn) và học một bộ dự đoán tuyến tính hoạt động dựa trên biểu diễn đó.

4.1.1.1. Kết hợp các Tầng ẩn

Ta có thể vượt qua những hạn chế của mô hình tuyến tính và làm việc với một lớp hàm tổng quát hơn bằng cách thêm vào một hoặc nhiều tầng ẩn. Cách dễ nhất để làm điều này là xếp chồng nhiều tầng kết nối đầy đủ lên nhau. Giá trị đầu ra của mỗi tầng được đưa làm giá trị đầu vào cho tầng bên trên, cho đến khi ta tạo được một đầu ra. Ta có thể xem \(L-1\) tầng đầu tiên như các tầng học biểu diễn dữ liệu và tầng cuối cùng là bộ dự đoán tuyến tính. Kiến trúc này thường được gọi là perceptron đa tầng (multilayer percention), hay được viết tắt là MLP. Dưới đây, ta mô tả sơ đồ MLP (Fig. 4.1.2).

../_images/mlp.svg

Fig. 4.1.2 Perceptron đa tầng với các tầng ẩn. Ví dụ này chứa một tầng ẩn với 5 nút ẩn.

Perceptron đa tầng này có 4 đầu vào, 3 đầu ra và tầng ẩn của nó chứa 5 nút ẩn. Vì tầng đầu vào không cần bất kỳ tính toán nào, do đó đối với mạng này để tạo đầu ra đòi hỏi phải lập trình các phép tính cho hai tầng còn lại (tầng ẩn và tầng đầu ra). Lưu ý, tất cả tầng này đều kết nối đầy đủ. Mỗi đầu vào đều ảnh hưởng đến mọi nơ-ron trong tầng ẩn và mỗi nơ-ron này lại ảnh hưởng đến mọi nơ-ron trong tầng đầu ra.

4.1.1.2. Từ Tuyến tính đến Phi tuyến

Về mặt hình thức, chúng ta tính toán mỗi tầng trong MLP một-tầng-ẩn này như sau:

(4.1.2)\[\begin{split}\begin{aligned} \mathbf{h} & = \mathbf{W}_1 \mathbf{x} + \mathbf{b}_1, \\ \mathbf{o} & = \mathbf{W}_2 \mathbf{h} + \mathbf{b}_2, \\ \hat{\mathbf{y}} & = \mathrm{softmax}(\mathbf{o}). \end{aligned}\end{split}\]

Chú ý rằng sau khi thêm tầng này vào, mô hình lập tức yêu cầu chúng ta phải theo dõi và cập nhật thêm hai tập tham số. Vậy thì đổi lại ta sẽ nhận được gì? Bạn có thể bất ngờ khi phát hiện ra rằng—trong mô hình định nghĩa bên trên—chúng ta chẳng thu được lợi ích gì từ những rắc rối thêm vào! Lý do rất đơn giản. Các nút ẩn bên trên được định nghĩa bởi một hàm tuyến tính của các đầu vào, và các đầu ra (tiền Softmax) chỉ là một hàm tuyến tính của các nút ẩn. Một hàm tuyến tính của một hàm tuyến tính bản thân nó cũng chính là một hàm tuyến tính. Hơn nữa, mô hình tuyến tính của chúng ta vốn dĩ đã có khả năng biểu diễn bất kỳ hàm tuyến tính nào rồi.

Ta có thể thấy sự tương đồng về mặt hình thức bằng cách chứng minh rằng với mọi giá trị của các trọng số, ta đều có thể loại bỏ tầng ẩn và tạo ra một mô hình đơn-tầng với các tham số

\(\mathbf{W} = \mathbf{W}_2 \mathbf{W}_1\)\(\mathbf{b} = \mathbf{W}_2 \mathbf{b}_1 + \mathbf{b}_2\).

(4.1.3)\[\mathbf{o} = \mathbf{W}_2 \mathbf{h} + \mathbf{b}_2 = \mathbf{W}_2 (\mathbf{W}_1 \mathbf{x} + \mathbf{b}_1) + \mathbf{b}_2 = (\mathbf{W}_2 \mathbf{W}_1) \mathbf{x} + (\mathbf{W}_2 \mathbf{b}_1 + \mathbf{b}_2) = \mathbf{W} \mathbf{x} + \mathbf{b}.\]

Để hiện thực được tiềm năng của các kiến trúc đa tầng, chúng ta cần một thành phần quan trọng nữa—một hàm kích hoạt phi tuyến theo từng phần tử \(\sigma\) để áp dụng lên từng nút ẩn (theo sau phép biến đổi tuyến tính). Hiện nay, lựa chọn phổ biến nhất cho tính phi tuyến là đơn vị tuyến tính chỉnh lưu (ReLU) \(\mathrm{max}(x, 0)\). Nhìn chung, với việc sử dụng các hàm kích hoạt này, chúng ta sẽ không thể biến MLP thành một mô hình tuyến tính được nữa.

(4.1.4)\[\begin{split}\begin{aligned} \mathbf{h} & = \sigma(\mathbf{W}_1 \mathbf{x} + \mathbf{b}_1), \\ \mathbf{o} & = \mathbf{W}_2 \mathbf{h} + \mathbf{b}_2, \\ \hat{\mathbf{y}} & = \mathrm{softmax}(\mathbf{o}). \end{aligned}\end{split}\]

Để xây dựng các MLP tổng quan hơn, chúng ta có thể tiếp tục chồng thêm các tầng ẩn, ví dụ, \(\mathbf{h}_1 = \sigma(\mathbf{W}_1 \mathbf{x} + \mathbf{b}_1)\)\(\mathbf{h}_2 = \sigma(\mathbf{W}_2 \mathbf{h}_1 + \mathbf{b}_2)\), kế tiếp nhau, tạo ra các mô hình có khả năng biểu diễn càng cao (giả sử chiều rộng cố định).

Các MLP có thể biểu diễn được những tương tác phức tạp giữa các đầu vào thông qua các nơ-ron ẩn, các nơ-ron ẩn này phụ thuộc vào giá trị của mỗi đầu vào. Chúng ta có thể dễ dàng thiết kế các nút ẩn để thực hiện bất kỳ tính toán nào, ví dụ, các phép tính logic cơ bản trên một cặp đầu vào. Ngoài ra, với một số hàm kích hoạt cụ thể, các MLP được biết đến rộng rãi như là các bộ xấp xỉ vạn năng. Thậm chí với một mạng chỉ có một tầng ẩn, nếu có đủ số nút (có thể nhiều một cách vô lý) và một tập các trọng số thích hợp, chúng ta có thể mô phỏng bất kỳ một hàm nào. Thật ra thì việc học được hàm đó mới là phần khó khăn. Bạn có thể tưởng tượng mạng nơ-ron của mình có nét giống với ngôn ngữ lập trình C. Ngôn ngữ này giống như bất kỳ ngôn ngữ hiện đại nào khác, có khả năng biểu diễn bất kỳ chương trình tính toán nào. Tuy nhiên việc tạo ra một chương trình đáp ứng được các các chỉ tiêu kỹ thuật mới là phần việc khó khăn.

Hơn nữa, chỉ vì một mạng đơn-tầng có thể học bất kỳ hàm nào không có nghĩa rằng bạn nên cố gắng giải quyết tất cả các vấn đề của mình bằng các mạng đơn-tầng. Thực tế, chúng ta có thể ước lượng các hàm một cách gọn gàng hơn rất nhiều bằng cách sử dụng mạng sâu hơn (thay vì rộng hơn). Chúng ta sẽ đề cập đến những lập luận chặt chẽ hơn trong các chương tiếp theo, nhưng trước tiên hãy lập trình một MLP. Trong ví dụ này, chúng ta lập trình một MLP với hai tầng ẩn và một tầng đầu ra.

4.1.1.3. Vector hoá và Minibatch

Giống như trước, chúng ta dùng ma trận \(\mathbf{X}\) để ký hiệu một minibatch các giá trị đầu vào. Các phép tính toán dẫn đến các giá trị đầu ra từ một MLP với hai tầng ẩn khi đó có thể được biểu diễn như sau:

(4.1.5)\[\begin{split}\begin{aligned} \mathbf{H}_1 & = \sigma(\mathbf{W}_1 \mathbf{X} + \mathbf{b}_1), \\ \mathbf{H}_2 & = \sigma(\mathbf{W}_2 \mathbf{H}_1 + \mathbf{b}_2), \\ \mathbf{O} & = \mathrm{softmax}(\mathbf{W}_3 \mathbf{H}_2 + \mathbf{b}_3). \end{aligned}\end{split}\]

Bằng việc lạm dụng ký hiệu một chút, chúng ta định nghĩa hàm phi tuyến \(\sigma\) là một phép toán áp dụng theo từng hàng, tức lần lượt từng điểm dữ liệu một. Cần chú ý rằng ta cũng sử dụng quy ước này cho hàm softmax để ký hiệu toán tử tính theo từng hàng. Thông thường, như trong mục này, các hàm kích hoạt không chỉ đơn thuần được áp dụng vào tầng ẩn theo từng hàng mà còn theo từng phần tử. Điều đó có nghĩa là sau khi tính toán xong phần tuyến tính của tầng, chúng ta có thể tính giá trị kích hoạt của từng nút mà không cần đến giá trị của các nút còn lại. Điều này cũng đúng đối với hầu hết các hàm kích hoạt (toán tử chuẩn hoá theo batch được giới thiệu trong Section 7.5 là một trường hợp ngoại lệ của quy tắc này).

%matplotlib inline
from d2l import mxnet as d2l
from mxnet import autograd, np, npx
npx.set_np()

4.1.2. Các hàm Kích hoạt

Các hàm kích hoạt quyết định một nơ-ron có được kích hoạt hay không bằng cách tính tổng có trọng số và cộng thêm hệ số điều chỉnh vào nó. Chúng là các toán tử khả vi và hầu hết đều biến đổi các tín hiệu đầu vào thành các tín hiệu đầu ra theo một cách phi tuyến tính. Bởi vì các hàm kích hoạt rất quan trọng trong học sâu, hãy cùng tìm hiểu sơ lược một số hàm kích hoạt thông dụng.

4.1.2.1. Hàm ReLU

Như đã đề cập trước đó, đơn vị tuyến tính chỉnh lưu (ReLU) là sự lựa chọn phổ biến nhất do tính đơn giản khi lập trình và hiệu quả trong nhiều tác vụ dự đoán. ReLU là một phép biến đổi phi tuyến đơn giản. Cho trước một phần tử \(z\), ta định nghĩa hàm ReLU là giá trị lớn nhất giữa chính phần tử đó và 0.

(4.1.6)\[\mathrm{ReLU}(z) = \max(z, 0).\]

Nói một cách dễ hiểu hơn, hàm ReLU chỉ giữ lại các phần tử có giá trị dương và loại bỏ tất cả các phần tử có giá trị âm (đặt kích hoạt tương ứng là 0). Để có một cái nhìn khái quát, ta có thể vẽ đồ thị hàm số. Bởi vì ReLU được sử dụng rất phổ biến, ndarray đã hỗ trợ sẵn một toán tử relu. Như bạn thấy trong hình, hàm kích hoạt là một hàm tuyến tính từng đoạn.

x = np.arange(-8.0, 8.0, 0.1)
x.attach_grad()
with autograd.record():
    y = npx.relu(x)
d2l.set_figsize((4, 2.5))
d2l.plot(x, y, 'x', 'relu(x)')
../_images/output_mlp_vn_df2062_3_0.svg

Khi đầu vào mang giá trị âm thì đạo hàm của hàm ReLu bằng 0 và khi đầu vào mang giá trị dương thì đạo hàm của hàm ReLu bằng 1. Lưu ý rằng, hàm ReLU không khả vi tại 0. Trong thường hợp này, ta mặc định lấy đạo hàm trái (left-hand-side – LHS) và nói rằng đạo hàm của hàm ReLU tại 0 thì bằng 0. Chỗ này có thể du di được vì đầu vào thông thường không có giá trị chính xác bằng không. Có một ngạn ngữ xưa nói rằng, nếu ta quan tâm nhiều đến điều kiện biên thì có lẽ ta chỉ đang làm toán (thuần túy), chứ không phải đang làm kỹ thuật. Và trong trường hợp này, ngạn ngữ đó đúng. Đồ thị đạo hàm của hàm ReLU như hình dưới.

y.backward()
d2l.plot(x, x.grad, 'x', 'grad of relu')
../_images/output_mlp_vn_df2062_5_0.svg

Lưu ý rằng, có nhiều biến thể của hàm ReLU, bao gồm ReLU được tham số hóa (pReLU) của He et al., 2015. Phiên bản này thêm một thành phần tuyến tính vào ReLU, do đó một số thông tin vẫn được giữ lại ngay cả khi đối số là âm.

(4.1.7)\[\mathrm{pReLU}(x) = \max(0, x) + \alpha \min(0, x).\]

Ta sử dụng hàm ReLU bởi vì đạo hàm của nó khá đơn giản: hoặc là chúng biến mất hoặc là chúng cho đối số đi qua. Điều này làm cho việc tối ưu trở nên tốt hơn và giảm thiểu được nhược điểm tiêu biến gradient đã từng gây khó khăn trong các phiên bản trước của mạng nơ-ron (sẽ được đề cập lại sau này).

4.1.2.2. Hàm Sigmoid

Hàm sigmoid biến đổi các giá trị đầu vào có miền giá trị thuộc \(\mathbb{R}\) thành các giá trị đầu ra nằm trong khoảng \((0, 1)\). Vì vậy, hàm sigmoid thường được gọi là hàm ép: nó ép một giá trị đầu vào bất kỳ nằm trong khoảng (\(-\infty\), \(\infty\)) thành một giá trị đầu ra nằm trong khoảng (0, 1).

(4.1.8)\[\mathrm{sigmoid}(x) = \frac{1}{1 + \exp(-x)}.\]

Các nơ-ron sinh học mà có thể ở một trong hai trạng thái kích hoạt hoặc không kích hoạt, là một chủ đề mô hình hoá rất được quan tâm từ những nghiên cứu đầu tiên về mạng nơ-ron. Vì vậy mà những người tiên phong trong lĩnh vực này, bao gồm McCullochPitts, những người phát minh ra nơ-ron nhân tạo, đã tập trung nghiên cứu về các đơn vị ngưỡng. Một kích hoạt ngưỡng có giá trị là \(0\) khi đầu vào của nó ở dưới mức ngưỡng và giá trị là \(1\) khi đầu vào vượt mức ngưỡng đó.

Khi phương pháp học dựa trên gradient trở nên phổ biến, hàm sigmoid là một lựa chọn tất yếu của đơn vị ngưỡng bởi tính liên tục và khả vi của nó. Hàm sigmoid vẫn là hàm kích hoạt được sử dụng rộng rãi ở các đơn vị đầu ra, khi ta muốn biểu diễn kết quả đầu ra như là các xác suất của bài toán phân loại nhị phân (bạn có thể xem sigmoid như một trường hợp đặc biệt của softmax). Tuy nhiên, trong các tầng ẩn, hàm sigmoid hầu hết bị thay thế bằng hàm ReLU vì nó đơn giản hơn và giúp cho việc huấn luyện trở nên dễ dàng hơn. Trong chương “Mạng nơ-ron hồi tiếp” (Section 8.4), chúng tôi sẽ mô tả các mô hình sử dụng đơn vị sigmoid để kiểm soát luồng thông tin theo thời gian.

Dưới đây, ta vẽ đồ thị hàm sigmoid. Cần chú ý rằng, khi đầu vào có giá trị gần bằng 0, hàm sigmoid tiến tới một phép biến đổi tuyến tính.

with autograd.record():
    y = npx.sigmoid(x)
d2l.plot(x, y, 'x', 'sigmoid(x)')
../_images/output_mlp_vn_df2062_7_0.svg

Đạo hàm của hàm sigmoid được tính bởi phương trình sau:

(4.1.9)\[\frac{d}{dx} \mathrm{sigmoid}(x) = \frac{\exp(-x)}{(1 + \exp(-x))^2} = \mathrm{sigmoid}(x)\left(1-\mathrm{sigmoid}(x)\right).\]

Đồ thị đạo hàm của hàm sigmoid được vẽ ở dưới. Chú ý rằng khi đầu vào là 0, đạo hàm của hàm sigmoid đạt giá trị lớn nhất là 0.25. Khi đầu vào phân kỳ từ 0 theo một trong hai hướng, đạo hàm sẽ tiến tới 0.

y.backward()
d2l.plot(x, x.grad, 'x', 'grad of sigmoid')
../_images/output_mlp_vn_df2062_9_0.svg

4.1.2.3. Hàm “Tanh”

Tương tự như hàm sigmoid, hàm tanh (Hyperbolic Tangent) cũng ép các biến đầu vào và biến đổi chúng thành các phần tử nằm trong khoảng -1 và 1:

(4.1.10)\[\text{tanh}(x) = \frac{1 - \exp(-2x)}{1 + \exp(-2x)}.\]

Chúng ta sẽ vẽ hàm tanh như sau. Chú ý rằng nếu đầu vào có giá trị gần bằng 0, hàm tanh sẽ tiến đến một phép biến đổi tuyến tính. Mặc dù hình dạng của hàm tanh trông khá giống hàm sigmoid, hàm tanh lại thể hiện tính đối xứng tâm qua gốc của hệ trục tọa độ.

with autograd.record():
    y = np.tanh(x)
d2l.plot(x, y, 'x', 'tanh(x)')
../_images/output_mlp_vn_df2062_11_0.svg

Đạo hàm của hàm Tanh là:

(4.1.11)\[\frac{d}{dx} \mathrm{tanh}(x) = 1 - \mathrm{tanh}^2(x).\]

Đạo hàm của hàm tanh được vẽ như sau. Khi đầu vào có giá trị gần bằng 0, đạo hàm của hàm tanh tiến tới giá trị lớn nhất là 1. Tương tự như hàm sigmoid, khi đầu vào phân kỳ từ 0 theo bất kỳ hướng nào, đạo hàm của hàm tanh sẽ tiến đến 0.

y.backward()
d2l.plot(x, x.grad, 'x', 'grad of tanh')
../_images/output_mlp_vn_df2062_13_0.svg

Tóm lại, bây giờ chúng ta đã biết cách kết hợp các hàm phi tuyến để xây dựng các kiến trúc mạng nơ-ron đa tầng mạnh mẽ. Một lưu ý bên lề đó là, kiến thức của bạn bây giờ cung cấp cho bạn cách sử dụng một bộ công cụ tương đương với của một người có chuyên môn về học sâu vào những năm 1990. Xét theo một khía cạnh nào đó, bạn còn có lợi thế hơn bất kỳ ai làm việc trong những năm 1990, bởi vì bạn có thể tận dụng triệt để các framework học sâu nguồn mở để xây dựng các mô hình một cách nhanh chóng, chỉ với một vài dòng mã. Trước đây, việc huấn luyện các mạng nơ-ron đòi hỏi các nhà nghiên cứu phải viết đến hàng ngàn dòng mã C và Fortran.

4.1.3. Tóm tắt

  • Perceptron đa tầng sẽ thêm một hoặc nhiều tầng ẩn được kết nối đầy đủ giữa các tầng đầu ra và các tầng đầu vào nhằm biến đổi đầu ra của tầng ẩn thông qua hàm kích hoạt.
  • Các hàm kích hoạt thường được sử dụng bao gồm hàm ReLU, hàm sigmoid, và hàm tanh.

4.1.4. Bài tập

  1. Tính đạo hàm của hàm kích hoạt tanh và pReLU.
  2. Chứng minh rằng một perceptron đa tầng chỉ sử dụng ReLU (hoặc pReLU) sẽ tạo thành một hàm tuyến tính từng đoạn liên tục.
  3. Chứng minh rằng \(\mathrm{tanh}(x) + 1 = 2 \mathrm{sigmoid}(2x)\).
  4. Giả sử ta có một perceptron đa tầng mà không có tính phi tuyến giữa các tầng. Cụ thể là, giả sử ta có chiều của đầu vào \(d\), chiều đầu ra \(d\) và tầng ẩn có chiều \(d/2\). Chứng minh rằng mạng này có ít khả năng biểu diễn hơn một perceptron đơn tầng.
  5. Giả sử ta có một hàm phi tuyến tính áp dụng cho từng minibatch mỗi lúc. Việc này sẽ dẫn đến vấn đề gì?

4.1.5. Thảo luận

4.1.6. Những người thực hiện

Bản dịch trong trang này được thực hiện bởi:

  • Đoàn Võ Duy Thanh
  • Đinh Minh Tân
  • Phạm Minh Đức
  • Vũ Hữu Tiệp
  • Nguyễn Lê Quang Nhật
  • Nguyễn Minh Thư
  • Nguyễn Duy Du
  • Phạm Hồng Vinh
  • Lê Cao Thăng
  • Lý Phi Long
  • Lê Khắc Hồng Phúc
  • Lâm Ngọc Tâm
  • Bùi Nhật Quân