[Nhập môn Deep Learning] Huấn luyện một mạng thần kinh
Huấn luyện một mô hình học sâu đơn giản cùng các giải thích đi kèm. Không biết liệu Spiderum có thể nhúng MathJax vào để thêm nhiều blog có toán được không?
Xin cảm ơn các bạn đã bình luận và giới thiệu các đầu sách ở phần viết trước. Các quyển sách các bạn giới thiệu rất có ích cho việc thực sự hiểu sâu Deep Learning. Tuy nhiên, chuỗi bài viết này có mục tiêu là đưa các bạn muốn học Deep Learning tiếp cận với ngành. Nên bản thân người viết cân nhắc trình bày các nội dung với mục tiêu “nhập môn”. Dù sao thì, rất cảm ơn các bạn đã có lòng, nhờ đó mà tôi biết cộng đồng AI/Deep Learning trên Spiderum cũng không ít. Mong các bạn góp ý nhiều hơn trong các bài viết tiếp theo.
Chắc chắn có một số kiến thức mà tôi bỏ qua, cũng như nghĩ rằng là hiển nhiên hoặc dễ hiểu mà không giải thích. Mong độc giả đóng góp ý kiến. Ngoài ra, lỗi chính tả là khó tránh, xin lỗi người đọc.
Ở phần trước, chúng ta đã đi sơ qua một mô hình đơn giản nhất có thể gọi là Deep Learning, Multi-layer Perceptron. Trước khi đi xa hơn, tôi nghĩ tạo cho độc giả một cảm giác hứng thú để tiếp tục học là quan trọng. Bản thân tôi khi mới tiếp cận machine learning cũng rất mơ hồ vì quá nhiều lý thuyết toán nhưng lại thiếu hiểu biết trong quá trình chạy các chương trình huấn luyện mô hình. Vì thế, học chỉ đi đôi với rất ít hành, dẫn đến một chút nản. Do đó, tôi muốn giới thiệu cách huấn luyện một mô hình cùng các thuật ngữ thường dùng trong huấn luyện một mô hình học sâu ngay trong phần này. Song song, một số lý thuyết đơn giản sẽ được khái quát.
Learning Algorithm - Thuật toán học
Như đã đề cập ở phần trước, Deep Learning thực chất là một chương trình máy tính. Nhưng thay vì được lập trình cụ thể để thực hiện tác vụ cụ thể, chương trình Deep Learning lại được huấn luyện (train hay teach đều có thể dùng) để thực hiện tác vụ được yêu cầu. Việc này giống như huấn luyện một con chó đi lấy một chai bia ở trong tủ lạnh. Về cơ bản, là thử và sai. Con chó sẽ không biết làm công việc đó ngay từ đầu, nhưng tuỳ vào phương pháp huấn luyện mà con chó sẽ dần dần làm công việc đó đúng hơn. Có rất nhiều phương pháp cho việc huấn luyện chó cũng như cho huấn luyện một mô hình học sâu. Chung chung có thể kể đến như phạt khi làm sai (compensate - e.g.: SGD), hoặc thưởng khi làm đúng (reward - e.g.: Q-learning), hoặc cả hai (Deep Q-Learning), hoặc dạy con vật qua rất nhiều đời (thuần hoá - Genetics Algorithm), etc. Một cách tổng quát, có thể gọi chung chúng là learning algorithm. Ở trong rất nhiều thuật toán học đó, các thuật toán thường được dùng cho Deep Learning hiện đại thường là Gradient-based Learning Algorithm (Thuật toán học dựa trên gradient - kết quả của phép đạo hàm). Các thuật toán học khác vẫn thu hút được sự chú ý từ rất cộng đồng học thuật, song có thể nói Gradient-based Deep Learning có rất nhiều lợi thế trong cả học thuật cũng như công nghiệp ở hiện tại. Vì thế, để phù hợp với nội dung của chuỗi bài, giới thiệu một Gradient-based Learning là cần đủ.
Chú ý: từ đây, nếu không có đề cập gì thêm, khi tác giả đề cập đến huấn luyện một mô hình học sâu, thì tức là đang đề cập đến sử dụng phương pháp dựa trên gradient.
Gradient-based Learning
Neural Net vốn phổ biến, phát triển nhanh chóng nhờ thực nghiệm (hơn là lý thuyết), và rất mạnh một phần là nhờ vào khả năng tự điều chỉnh chính nó sau khi quét qua dữ liệu nhiều lần để đạt được mục tiêu đề ra khi học (objective). Cụ thể hơn, Neural net là parametric* model, tức là có tham số hay còn gọi là trọng số (weights, đề cập trong phần trước). Cái được gọi là tự điều chỉnh thực chất là việc cộng hoặc trừ một lượng không cố định vào mỗi trọng số rất nhiều lần (quá trình huấn luyện - training). Lượng biến thiên này được quyết định bởi kết quả của phép đạo hàm của một hàm số được gọi là hàm mất mát (loss function) hay còn gọi là hàm mục tiêu (objective function) với đầu vào chính là dữ liệu. Một cách toán học, cả quá trình huấn luyện mô hình thực chất là tối ưu hoá một bộ trọng số (mô hình) của một hàm số để có thể thực hiện tác vụ được chỉ định. Tuy nhiên, như thế nào là “tối ưu nhất có thể cho tác vụ được chỉ định” lại cần được định nghĩa một cách toán học, hoặc ít nhất là một cách mà máy tính hiểu được. Hãy bắt đầu từ “tác vụ được chỉ định”.
*có các mô hình AI là non-parametric
Định nghĩa bài toán
To ask the right question is aldready half the solution of the problem - Carl Jung
Hiểu rành mạch, sâu sắc các khía cạnh của bài toán cũng như các giới hạn về tính toán, dữ liệu là chìa khoá cho việc giải quyết chúng. Việc phân tích các vấn đề này yêu cầu nhiều kinh nghiệm, thời gian làm việc, cũng như hiểu biết về AI và dữ liệu. Lấy ví dụ như các bài toán liên quan đến điều chế thuốc chữa bệnh bằng mô hình học sâu [1], bản thân người tạo ra và huấn luyện mô hình học sâu ngoài các kiến thức về Deep Learning cũng cần có yêu cầu cao ở cả các vấn đề y tế liên quan. Các kiến thức đặc thù này có thể kể đến như: cấu trúc phân tử này có thể tồn tại hay không, hoặc đơn giản hơn là hình con chó khi xoay ngang xoay dọc thì vẫn là hình con chó. Các kiến thức này có cái tên chung là Inductive Bias. Inductive Bias rất quan trọng vì nó quyết định rất nhiều đến cách giải quyết bài toán nói chung và huấn luyện mô hình học sâu nói riêng. Như đã được phát biểu trong định lý không có bữa trưa miễn phí (No free lunch theorem), bài toán bất kì thì cần có các inductive bias đặc thù. Tóm lại, phát biểu bài toán rất quan trọng cho quá trình huấn luyện mô hình học sâu.
*Tuy nhiên, để đơn giản hoá, người viết sẽ chỉ tạm thời phát biểu các bài toán rất đơn giản theo kiểu: đầu vào, đầu ra, hàm số, etc. Mong người đọc nhớ vấn đề vừa nêu trên.
Về cơ bản, một mạng học sâu có thể biểu diễn rất đơn giản bằng công thức sau đây:
• 𝐱 ∈ 𝒳: đầu vào (e.g.: một bức ảnh, một âm thanh, một chuỗi giá của thị trường chứng khoán, etc.). 𝒳 là tập đầu vào.
• 𝐲 ∈ 𝒴: đầu ra (e.g.: dự đoán nhân vật trong bức ảnh, âm thanh được cải thiện chất lượng, dự đoán thị trường tăng hay giảm vào ngày mai, etc.). 𝒴 là tập đầu ra.
• 𝑓𝜃: hàm số có bộ trọng số là 𝜃 (theta). Cụ thể là mạng thần kinh với bộ trọng số theta. (Khi mới thiết lập thì bộ trọng số thường được đặt giá trị ngẫu nhiên. Sau khi huấn luyện, bộ trọng số mới thực sự có ích.)
Nói ngắn gọn, mạng thần kinh nhận đầu vào, tính toán với bộ trọng số và cho ra đầu ra. Rất đơn giản! (Think simple!)
Mục tiêu của quá trình huấn luyện
Mục tiêu của quá trình huấn luyện một mô hình học sâu chính là tìm ra bộ trọng số “tối ưu” cho bài toán được định nghĩa. Tối ưu tức là làm đúng, làm tốt, etc. tùy vào người định nghĩa cái tối ưu đó. Việc xác định/định nghĩa sự “tối ưu” này là chìa khóa làm nên thành công của rất nhiều mô hình học sâu. Bản thân chúng cũng rất đa dạng tùy theo mô hình/tác vụ mà quá trình huấn luyện hướng đến. Sự đa dạng này có thể kể đến như các hàm mục tiêu khác nhau của các mô hình lớn nổi tiếng: ChatGPT, MidJourney, StableDiffusion… Có thể nói, sau dữ liệu, kiến trúc mạng thần kinh, thì hàm mục tiêu có thể giữ vị trí quan trọng số 3. Lấy ví dụ, một mô hình đọc biển số xe trên đường cao tốc thì “tối ưu” là đọc đúng biển số xe nhiều nhất có thể từ đầu vào là hình ảnh chụp được từ camera trên đường cao. Nhưng nếu đọc biển số xe nói chung, thì chụp ở trong bãi đỗ xe chung cư cũng phải đọc đúng. Như thế, có thể thấy “tối ưu” phụ thuộc lớn vào bài toán. Và vì thế, sự “tối ưu” thường chỉ được đo đạc trên tập dữ liệu chỉ định (ký hiệu là 𝒟). Chú ý, tập dữ liệu này có giới hạn và cụ thể là tập con của tập 𝒳 × 𝒴, tức là tập các cặp (𝐱, 𝐲).*
Hãy ký hiệu hàm mục tiêu là L(·) (hay còn gọi là loss function, objective functions, criteria, etc.). Hàm này được định nghĩa để có thể trực tiếp, hoặc gián tiếp chỉ ra tính “tối ưu” của mô hình tại một số điểm cụ thể (minimum, maximum, etc.). Đến đây, câu đầu tiên của phần này có thể viết lại dưới dạng toán học như sau: mục tiêu của quá trình huấn luyện mô hình là tìm
*tạm thời người viết chỉ đề cập Supervised Learning (mong các bạn hiểu biết AI chưa phán xét vội)
Thuật toán học dựa trên đạo hàm
Hiện tại, chúng ta đã có mô hình, dữ liệu, bài toán, mục tiêu huấn luyện, việc tiếp theo là xác định phương pháp học. Lúc ban đầu, mô hình chúng ta có được thiết lập với trọng số ngẫu nhiên, tức là bản nó gần như vô dụng. Để thực hiện được tác vụ đặt ra, nó cần được cho xem xét các đầu vào, sử dụng trọng số sẵn có để thử thực hiện công việc được yêu cầu (feed forward). Sau khi thử thực hiện công việc, mô hình cho ra được một mẫu đầu ra. Mẫu này được so sánh với mục tiêu mong muốn (target/groundtruth) bằng hàm mục tiêu (objective loss). Bản thân hàm mục tiêu sẽ làm nhiệm vụ so sánh xem liệu mô hình làm việc tốt tới đâu sau đó gửi tín hiệu về cho mô hình để nó tự cải thiện chính mình.
Diễn giải cụ thể trên ví dụ về huấn luyện mô hình nhận diện chữ số viết tay qua hình ảnh. Sau khi thiết lập mô hình, bản thân nó sẽ được cho xem qua hình ảnh rồi thử đoán xem đó là số mấy. Hàm mục tiêu sẽ cho mô hình biết là nó đoán đúng hay sai. Dựa vào đó, mô hình chỉnh sửa chính nó (các trọng số) để dần dần đoán đúng hơn.
Một cách tóm lược nhất, quá trình huấn luyện mô hình là thử và sai và tự chỉnh sửa chính nó. Mọi người thường chỉ nhắc đến thử và sai mà quên mất sự quan trọng của việc tự chỉnh sửa (self adjust). Có rất nhiều phương pháp tự chỉnh sửa (học) như đã đề cập ở đầu chương. Trong số đó, các phương pháp sử dụng lan truyền ngược (gradient backpropagation) để tăng dần hoặc giảm dần đạo hàm (gradient ascent và gradient descent, theo thứ tự) thường được sử dụng nhất và vẫn còn là đề tài nghiên cứu sôi nổi trong giới cho đến hiện tại. Lý thuyết và ý tưởng một cách rõ ràng, rành mạch, và toán học có thể được tham khảo qua ba bài blog sau đây: Multi-layer Perceptron và Backpropagation [3], Bài 7: Gradient Descent (phần 1/2) [4], Bài 8: Gradient Descent (phần 2/2) [5]. Mong độc giả tham khảo kĩ từ 3 blog trên để nắm rõ 2 khái niệm quan trọng: Gradient Descent và Backpropagation. Một phần nữa là vì tôi không thể viết hay và rõ ràng như anh Hữu Tiệp. (Nhân đây, em xin được shoutout cho anh Tiệp!)
Một cách tóm tắt, ý tưởng của gradient descent sẽ dẫn chúng ta về môn vật lý lớp 12, toán học cũng được. Nếu cách bạn còn nhớ, gradient (kết quả của phép đạo hàm) phản ánh xu hướng của hàm số tại điểm cố định (đạo hàm thì phải nói rõ là đạo hàm tại đâu là vì thế). Xu hướng này bao gồm: hướng và lượng tăng mạnh nhất của hàm số tại điểm đó. Do vậy, việc chúng ta cần làm là cộng vào bộ trọng số một lượng trái dấu so với đạo hàm để đưa hàm số này đi được đến điểm local minima. Như tên gọi, gradient descent! Thay vì cộng lượng ngược dấu, nếu cộng thêm lượng cùng dấu thì sẽ tìm thấy điểm local maxima, khi đó thuật toán có tên là gradient ascent. Quá trình trên không chỉ xảy ra một lần, mà lặp đi lặp lại rất nhiều lần bằng cách thay đổi đầu vào cho mô hình là các mẫu có được trong bộ dữ liệu. Thực hiện cho đến khi lượng thay đổi trở lên rất nhỏ tức là mô hình đã hội tụ (convergence). Quá trình tìm điểm này có thể biểu diễn trực quan qua hình sau.
Chú ý rằng đạo hàm này không phải đạo hàm của mạng thần kinh mà là đạo hàm của hàm mục tiêu (objective function). Nhờ đó, điểm mà ta tìm thấy có nghĩa là điểm tối ưu cục bộ (tương đối tối ưu) cho tác vụ được yêu cầu vì hàm mục tiêu được thiết kế để chỉ ra tính khả năng của mô hình khi thực hiện công việc đó.
Từ đây cũng nhìn thấy nhược điểm chính của thuật toán này là không phải khi nào cũng tìm được điểm tối ưu toàn cục (global minima). Vì thế, trong thực tế, mọi người chỉ có thể khẳng định mô hình của mình đạt được local minima.
Càng viết càng thấy phải giới thiệu nhiều hơn. Nên tôi quyết định tạm dừng phần lý thuyết ở đây để thử làm một thực hành nho nhỏ.
Thử huấn luyện và làm quen với các thuật ngữ
Ở bài này, tôi sẽ chọn bài toán khá đơn giản: nhận diện số viết tay. Bắt đầu thiết lập cho việc thực hiện. Toàn bộ code có thể tham khảo ở đây, bạn đọc có thể chạy code trước rồi đọc các giải thích phía sau.
Dataset: MINIST [8] là bộ dataset gồm các số viết tay như hình trên và nhãn đi kèm (label) là các số tương ứng.
Bài toán:
- Input: Hình viết tay bất kì từ dataset
- Output: Số gì. Vì dụ, hình số 3 thì trả ra số 3. Nhưng thay vì dự đoán luôn đấy là số gì, chúng ta sẽ dự đoán xem hình đó có xác suất là bao nhiêu số 0, xác suất bao nhiêu là số 1, … , xác suất bao nhiêu là số 9. Có nhiều lý do để làm như thế, nhưng hẹn độc giả ở một bài viết khác.Một chút phân tích: Bài toán nghe có vẻ đơn giản nhưng đối với máy tính lại không hề đơn giản như thế. Chữ viết tay vốn rất đặc biết theo từng người và rất khó để miêu tả cho máy tính xem như thế nào là số gì. Ví dụ: mời ban đọc thử miêu tả số 2 một cách rõ ràng, rành mạch theo cách mà máy tính có thể hiểu được.
Hàm mục tiêu: Ở bài toán này, tôi sẽ chọn hàm mục tiêu là hàm Cross Entropy Loss* [8]. Các bạn có thể tìm hiểu thêm ở đây. Một cách dễ hiểu, hàm số này chỉ ra sự khác nhau giữa kết quả dự đoán của mô hình đối nhãn đúng của nó. Ví dụ, kết quả dự đoán của mô hình là [0.01, 0.02, 0.03, 0.04, 0.05, 0.06, 0.09, 0.1, 0.2, 0.7] tương ứng cho xác suất của số từ 0 tới 9, theo thứ tự. Tuy nhiên, nếu nhãn của hình ảnh chỉ ra hình ảnh là số 8 chẳng hạn, thì kết quả đúng sẽ phải là [0, 0, 0, 0, 0, 0, 0, 0, 1, 0]. (Xác suất BẰNG 1 TẠI SỐ 8!)
Mô hình: Vì mới giới thiệu multi-layer perceptron, tôi sẽ dùng một mô hình đơn giản gồm một layer perceptron với activation function là ReLU, tiếp theo là một phép biến đổi tuyến tính để biến
*Tôi sẽ trình bày về các hàm loss này ở bài viết khác.
Hãy code thôi!
Bước đầu tiên luôn là load các package cần thiết cùng với các chỉ định toàn cục cần thiết, đôi khi bắt gặp các hardcode ở các open-source nên cũng cần đọc kỹ.
Định nghĩa neural network theo kiến trúc đã giới thiệu ở trên. Cách viết code này sẽ phụ thuộc vào ngôn ngữ cũng như framework sử dụng mà sẽ có sự khác nhau giữa PyTorch, TensorFlow, Jax, etc.
Chỉ định các siêu tham số cho quá trình huấn luyện. Trong huấn luyện mô hình học sâu, siêu tham số thường chỉ đến các biến ảnh hưởng đến toàn cục quá trình huấn luyện hoặc kiến trúc. Đơn giản hơn, vì có một số người gọi trọng số của mô hình là tham số (parameter) nên để dễ thống nhất, các tham số không phải là trọng số thường được gọi là siêu tham số. Ở đây, người đọc chú ý đến 3 khái niệm:
batch size: như đã thảo luận từ đầu tới giờ, mô hình sẽ được cho xem qua (nhận đầu vào) các hình rất nhiều lần. Nhờ sự phát triển nhanh chóng của khả năng tính toán song song, cũng như dữ liệu lớn, mà ta có thể đồng thời cho mô hình xem nhiều hơn 1 ảnh (ở đây là 64 ảnh) một lúc. Tuy nhiên, bộ nhớ nào cũng có giới hạn, nên không thể cho xem cả dataset một lần. Chính vì thế nên con số này thường bị giới hạn bởi bộ nhớ máy tính, số càng lớn càng cần nhiều tài nguyên tính toán. (Viết đến đây, người viết thấy vui và biết ơn vì gần đây có những nỗ lực của chính phủ trong việc kéo chân NVIDIA đến Việt Nam cũng như tạo điều kiện phát triển điện hạt nhân để đáp ứng nhu cầu của ngành AI nói riêng và tổ quốc nói chung.)
epoch: Do chỉ có thể xem một số dữ liệu tại một thời điểm mà phải sau một số bước nhất định mô hình mới có thể xem qua tất cả các mẫu của bộ dữ liệu. Và mỗi lần hoàn thành một lần như vậy được coi là một epoch. Số lượng epoch thường được dùng để chỉ định số lần duyệt qua bộ dữ liệu (điểm dừng) của quá trình huấn luyện trong lập trình. Việc này chính là để thoản mãn phần “giá trị kì vọng” trong phương trình thứ 2 từ trên xuống.
learning rate: vui lòng tham khảo [4]
Tải bộ dữ liệu: Việc này thường khá phức tạp với các bộ dữ liệu hiện tại tuy nhiên nhờ có cộng đồng rất mạnh và ham thích chia sẻ mà chúng ta có thể tải bộ dữ liệu MNIST rất đơn giản như sau. Có ba điểm người đọc cần làm quen ở đoạn code này:
transform: Các phép biến đổi dữ liệu nhằm các mục đích chuẩn hoá đầu vào, hoặc làm xấu dữ liệu, chuyển đổi cách biểu diễn, etc. tuỳ thuộc vào inductive bias và mục tiêu của người thực hiện. Ví dụ, ở đây, inductive bias là hình dạng chữ viết sẽ không biến đổi nếu màu của bức hình được chuẩn hoá. Cụ thể, phép chuẩn hoá ở phần code này thứ nhất là biến data thành dạng dữ liệu làm việc được với torch (transforms.ToTensor()), sau đó là normalize nó (transforms.Normalize()). Phép chuẩn hoá này có tác dụng, sẽ được bàn đến sau.
dataset: Dữ liệu thường được chia thành ba phần: train, test, validate. Đôi khi, test và validate là một. Sự khác biệt như sau: tập train được dùng để huấn luyện dữ liệu; tập validate dùng để kiểm tra performance của mô hình trong quá trình huấn luyện (mô hình sẽ không học từ phần dữ liệu này); tập test dùng để kiểm tra performance của dữ liệu sau khi huấn luyện. Trong khi viết code, phần dataset thường sẽ định nghĩa cấu trúc của một mẫu dữ liệu: đầu vào, đầu ra, các phép biến đổi cần thiết, etc.). Theo kinh nghiệm của người viết, người đọc nên tập trung vào hai hàm __init()__ và get_item() của Dataset class của PyTorch, hoặc các hàm tương tự của cac framework hay ngôn ngữ khác.
DataLoader: Cấu trúc của các mẫu đã được định nghĩa ở Dataset, ở DataLoader sẽ chỉ định cách load dữ liệu lên để làm việc. Ở đây, khái niệm batch_size được sử dụng. Chính DataLoader sẽ làm công việc xếp chồng các dữ liệu lên nhau để mô hình có thể tính toán song song. Theo kinh nghiệm của người viết, người đọc nên quan tâm đến việc quản lý dữ liệu giữa VRAM, CPU RAM, Disk Memories và hiện thực cẩn thận hàm collate() của class này khi cần custom.
Khởi tạo mô hình (đã định nghĩa ở trên), chỉ định vị trí mô hình học là phần RAM nào. Phần này khá đơn giản khi chỉ dùng một bộ RAM, tuy nhiên khi scale lên sẽ rất rắc rối và cần nhiều nỗ lực hơn. Ví dụ, một người bạn của người viết từng chia sẻ họ đã từng làm việc với khoảng 1000 GPUs khi làm thực tập sinh cho Adobe. Con số này rất khủng nếu là OpenAI, hoặc big tech khác. Nên phần này, dù nhìn không quá phức tạp nhưng mong người đọc tự tìm hiểu thêm các kĩ thuật nếu đi theo hướng làm việc ở công nghiệp. Chú ý, ở đây SGD chính là Gradient Descent nhưng ở diễn biến khác. SGD giống với Gradient Descent nhưng làm việc trên nhiều dữ liệu cùng lúc (có thể hiểu đơn giản như vậy).
Phần huấn luyện mô hình đã được diễn tả một cách tóm tắt ở phần bàn luận phía trên. Ở đây, từng dòng code tôi đã comment rõ ràng công việc của nó tương ứng với các bước đã trình bày. Khái niệm mới xuất hiện là optimizer. Bản thân Optimizer quá phức tạp để viết trong vài dòng. Song, người đọc có thể hiểu rằng nhân vật này sẽ là người giám sát huấn luyện, lưu giữ gradient, điều chỉnh lượng thay đổi của từng trọng số của mô hình.
Sau khi huấn luyện hoàn tất (chạy xong 10 epoch), chúng ta hãy thử kiểm tra xem mô hình có thể trả lời đúng bao nhiêu phần trăm nhãn của các ảnh có trong tập test. Sau đây là đoạn code ngắn làm việc đó. Phần code người viết nhận thấy hơi quá với người mới tiếp cận lập trình. Nên đối với các độc giả đó, người viết xin giải thích ngắn gọn như sau: đoạn code này đếm số lần mô hình trả lời đúng trong tổng số lần nó phải đoán. Như vậy, với mô hình đơn giản sau khi train 10 epoch trên tập dữ liệu train gồm 60,000 ảnh. Thì nó có thể đoán chính xác đến 96.04% số ảnh trong tập test gồm 10,000 ảnh. Một lần nữa, 10,000 ảnh này chưa được mô hình nhìn thấy trong quá trình huấn luyện.
Sau đây là một vài số input và kết quả dữ đoán:
Kết chương
Như vậy, người viết đã tạm đi sơ lược một số lý thuyết trừu tượng về quá trình huấn luyện một mô hình học sâu. Hơn nữa, còn cùng độc giả trải qua quá trình huấn luyện một mô hình rất đơn giản để toán chữ số viết tay. Thật ra, người viết tạm chưa biết phải viết gì cho phần tiếp theo nên không thể viết một cái kết mở. Mong người đọc đóng góp ý tưởng nếu có thể. Ngoài ra, một lần nữa tôi lại muốn nhấn mạnh rằng: dữ liệu rất quan trọng. Sau đó mới kể đến mô hình và các kĩ thuật đi theo. Tuy nhiên, từng kỹ thuật sinh ra và được sử dụng rộng rãi có cái lý của nó. Tác giả hay đùa rằng ở hiện tại, các ông lớn công nghệ đang think big (quan tâm đến scaling, mô hình càng to càng tốt lên), thì những người làm nghiên cứu hoặc startup nên think different. Để nghĩ khác biệt, tác giả nghĩ việc hiểu rõ dữ liệu, thứ mình làm, và các kĩ thuật dù nhỏ nhất rất quan trọng.
References
[1] Anonymous (Under review of ICLR 2025), Unsupervised 2D Molecule Drug-likeness Prediction based on Knowledge Distillation. OpenReview
[2] Goldblum, M., Finzi, M.A., Rowan, K. & Wilson, A.G.. (2024). Position: The No Free Lunch Theorem, Kolmogorov Complexity, and the Role of Inductive Biases in Machine Learning. ICML 2024
[3] Vu Huu Tiep. Bài 14: Multi-layer Perceptron và Backpropagation. Blog Machine Learning Co ban
[4] Vu Huu Tiep. Bài 7: Gradient Descent (phần 1/2). Blog Machine Learning Co ban
[5] Vu Huu Tiep. Bài 8: Gradient Descent (phần 2/2). Blog Machine Learning Co ban
[6] Alexandru Malanca. Introduction to Artificial Neural Networks part two: Gradient Descent, Backpropagation, Supervised & Unsupervised learning. http://telefonicatech.uk/
[7] Y. Lecun, L. Bottou, Y. Bengio and P. Haffner, "Gradient-based learning applied to document recognition," in Proceedings of the IEEE, vol. 86, no. 11, pp. 2278-2324, Nov. 1998.
[8] Mao, Anqi, Mehryar Mohri, and Yutao Zhong. "Cross-entropy loss functions: Theoretical analysis and applications." International conference on Machine learning. PMLR, 2023.
Khoa học - Công nghệ
/khoa-hoc-cong-nghe
Bài viết nổi bật khác
- Hot nhất
- Mới nhất