Tôi đã từng học Machine Learning trong vòng 2 tháng và tôi tin bạn cũng có thể làm được.
Lộ trình sẽ giúp bạn nắm chắc công nghệ này từ cơ bản đến nâng cao, xây dựng Machine Learning model từ python thuần cho đến các thư viện cao cấp như TensorFlow hay Keras. Đi sâu phân tích bản chất vấn đề là giá trị cốt lõi của khóa học này.
P/S: Hãy để lại 1 star để team có động lực xuất bản các phần tiếp theo và cũng đừng quên chia sẻ tới bạn bè của bạn.
Mình sẽ là một trong các teacher của lớp VietAI offline tại Hanoi diễn ra giữa tháng 11. Nếu bạn quan tâm có thể đăng ký qua đây.
- 1. Kiến thức toán học cần thiết
- 2. Kỹ năng lập trình Python
- 3. Thư viện Numpy và TensorFlow
- 4. Bài toán hồi quy (Regression)
- 5. Bài toán phân loại (Classification)
- 6. Xây dựng mô hình Decision Trees và Random Forests
- 7. Xây dựng mạng Neural Network
- 8. Xây dựng mạng Convolutional Neural Network (CNN)
- 9. Xây dựng mạng Recurrent Neural Network (RNN)
- 10. Triển khai (Deploy) Machine Learning Model trên Production
- 11. Machine Learning trên trình duyệt và TensorFlowJS
-
a. Đại số tuyến tính
Nếu các bạn có nhiều thời gian và sự kiên trì thì có thể học toàn bộ khóa này MIT 18.06 Linear Algebra, Spring 2005 . Nhưng đối với bản thân tôi có những phần trong khóa này đến bây giờ tôi vẫn chưa dùng đến. Vì thế nếu bạn không có nhiều thời gian, muốn tăng nhanh tốc độ thì có thể học theo từng phần tôi nhấn mạnh ở phía dưới đây.
- Scalar/Vector
- Giới thiệu vector/scalar và các thành phần của chúng: Vector basics - Khan Academy
- Thực hành với Numpy
- Ma trận (Matrix)
- Giới thiệu về ma trận: Introduction to matrices - Khan Academy
- Thực hành với Numpy
- Chuyển vị ma trận
- Cách chuyển vị ma trận và những vấn đề liên quan: Transpose of a matrix - Khan Academy
- Thực hành với Numpy
- Norm Vector
- Norm L1/L2: Vector Norms
- Thực hành với Numpy
- Tensor
- Giới thiệu về Tensor: Tensors for Beginners 0: Tensor Definition
- Các phép toán với ma trận
- Phép cộng ma trận
- Phương pháp cộng/trừ ma trận: Matrix addition and subtraction | Matrices | Precalculus | Khan Academy
- Thực hành với Numpy
- Phép nhân ma trận
- Các phương pháp nhân ma trận: Lec 3 | MIT 18.06 Linear Algebra, Spring 2005
- Thực hành với Numpy
- Tích Hadamard/Element-Wise
- Phương pháp tính tích Element-Wise: Element-Wise Multiplication and Division of Matrices
- Phép cộng ma trận
- Ma trận đơn vị
- Miêu tả ma trận đơn vị: Identity matrix | Matrices | Precalculus | Khan Academy
- Ma trận nghịch đảo
- Phương pháp tính ma trận nghịch đảo: Lec 3 | MIT 18.06 Linear Algebra, Spring 2005
- Scalar/Vector
-
b. Đạo hàm
-
Đây là series kinh điển để nhắc lại kiến thức đạo hàm của bạn. Essence of calculus - 3Blue1Brown
-
Anh Tiệp có một bài rất đầy đủ về đạo hàm ở đây: Machine Learning cơ bản - Phần Toán. Hãy thực hành tính toán phần 3.5, tôi đảm bảo bạn sẽ nắm chắc được đạo hàm trên vector và ma trận.
-
Ngoài phần cơ bản quan trọng thì việc nắm thuần thục Chain Rule và Production Rule là rất quan trọng đặc biệt là dành cho thuật toán Backpropagation trong Deep Learing. Bạn hãy xem kỹ video này: Visualizing the chain rule and product rule | Essence of calculus, chapter 4
-
-
c. Lý thuyết xác suất
- Các khái niệm cơ bản
- Những khái niệm cơ bản: Basic theoretical probability
- Xác suất sử dụng không gian mẫu: Probability using sample spaces
- Tiên đề xác suất: Axioms of Probability
- Các loại xác suất
- Xác suất có điều kiện:
- Giới thiệu: Dependent probability introduction | Probability and Statistics | Khan Academy
- Các ví dụ liên quan: Dependent probability example | Probability and Statistics | Khan Academy
- Công thức Bayes: CRITICAL THINKING - Fundamentals: Bayes' Theorem
- Xác suất độc lập: Compound probability of independent events | Probability and Statistics | Khan Academy
- Xác suất có điều kiện:
- Biến ngẫu nhiên và phân phối xác suất: Biến ngẫu nhiên và phân phối xác suất
- Các khái niệm cơ bản
Python là ngôn ngữ được dùng nhiều nhất để làm Machine Learning vì tính đơn giản gọn nhẹ của nó. Nhưng để đưa vào Production thì tôi nghĩ Javascript cũng là một lựa chọn không tồi. Tôi sẽ chia sẻ về Machine Learning với Javascript trong các phần tiếp theo.
-
a. Cài đặt Python và các thư viện cần thiết:
-
b. Tính chất đặc điểm
Python là ngôn ngữ thông dịch có:
- Điểm mạnh:
- Dễ viết/ Dễ đọc
- Quy trình phát triển phần mềm nhanh vì dòng lệnh được thông dịch thành mã máy và thực thi ngay lập tức
- Có nhiều thư viện mạnh để tính toán cũng như làm Machine Learning như Numpy, Sympy, Scipy, Matplotlib, Pandas, TensorFlow, Keras, vv.
- Điểm yếu:
- Mang đầy đủ điểm yếu của các ngôn ngữ thông dịch như tốc độ chậm, tiềm tàng lỗi trong quá trình thông dịch, source code dễ dàng bị dịch ngược.
- Ngôn ngữ có tính linh hoạt cao nên thiếu tính chặt chẽ.
- Điểm mạnh:
-
c. Các hàm dựng sẵn và kiểu dữ liệu trên Python
-
Các kiểu dữ liệu trong Python
Phần này được thiết kế dựa trên khóa Data Structures & Algorithms in Python - Udacity nhưng tôi sẽ đi sâu hơn vào các ví dụ thực tế hơn là chỉ dừng lại ở lý thuyết. Bên cạnh đó tôi sẽ giúp các bạn nắm rõ một số Data Structure quan trọng trong Machine Learning như Graph và Tree.
- Integer, Float và Boolean
- String
- List-Based Collection
- Dictionary
- Set
- Graph
-
d. Vòng lặp
-
e. Hàm
-
a. Numpy
-
Giới thiệu về NumPy
- Trang chủ của NumPy
- NumPy là viết tắt của "Numerical Python", là một thư viện chuyên để xử lý, tính toán vector, ma trận.
- NumPy thường được sử dụng cùng SciPy và Matplotlib để thay thế cho MatLab vô cùng đắt đỏ.
- Được viết bằng Python và C nên tốc độ thực thi tốt.
-
Các APIs
-
-
b. TensorFlow
TensorFlow là một thư viện mã nguồn mở dùng để training/inference machine learning model có thể sử dụng cho cả nghiên cứu và sản phẩm. TensorFlow được ghép bởi 2 từ Tensor và Flow. Tensor đại diện cho giá trị các biến, Flow là dòng chảy. TensorFlow mang hàm ý là dòng chảy các giá trị trong Graph. Và trái tim của TensorFlow chính là Computational Graph.
-
Computational Graphs
Computational Graph tương tự một Graph thông thường gồm nhiều đỉnh và các cạnh. Nó dùng để biểu diễn các phép tính toán dựa trên ngôn ngữ của Graph.
-
Đỉnh (Node) đại diện cho biến đầu vào, phép tính toán
-
Các cạnh (Edge) đại điện cho dữ liệu truyền bên trong Graph
-
-
Khởi tạo Graph trên TensorFlow
Một chú ý quan trọng khi sử dụng TensorFlow: Chúng ta phải khởi tạo đầy đủ Graph trước khi đổ giá trị của các node(Tensor) vào trong Graph. Điều này sẽ làm bạn đôi khi không quen lúc mới bắt đầu.
-
tf.Graph
Hầu hết các ứng dụng TensorFlow (TF) đều được khởi chạy bằng việc tạo ra Computation Graph như đã nhắc ở bên trên. Trong quá trình này, TF sẽ tạo ra đối tượng.
Xem kỹ thêm về TensorFlow Graph tại đây
- Gọi hàm
tf.constant(42.0)
sẽ tạo ra một đối tượngtf.Operation
và thêm nó vào Graph đồng thời trả về một đối tượngtf.Tensor
mang giá trị42.0
. - Gọi hàm
tf.matmul(x, y)
sẽ tạo ra một đối tượngtf.Operation
và thêm nó vào Graph đồng thời trả về một đối tượngtf.Tensor
mang giá trị tích của phép nhân này. - Gọi hàm
tf.train.Optimizer.minimize
sẽ thêm các phương thức và tensors vào Graph để phục vụ cho việc tính đạo hàm riêng và trả về một đối tượngtf.Operation
mà khi chạy Graph sẽ thực hiện việc tính đạo hàm riêng trên các biến cho trước.
- Gọi hàm
-
Phép cộng
-
Hidden Layer của một Neural network
Giải thích các phép tính toán trên Graph này:
-
MatMul <-> Wx: Nhân vô hướng 2 ma trận
-
Add <-> Wx + b: Cộng ma trận
-
ReLU hàm phi tuyến. Bạn chỉ cần hiểu đơn giản về hàm này: Hàm này sẽ trả về giá trị của chính đầu vào nếu đầu vào lớn hơn 0 và trả về 0 nếu đầu vào nhỏ hơn 0. Bạn có thể hiểu rõ tính chất của hàm này thông qua đồ thị của nó:
-
-
-
[Quan trọng] Tại sao cần phải sử dụng Computational Graph?
Như đã đề cập ở bên trên, Computational Graph hay Dataflow Graph dùng để biểu diễn các phép tính toán. Bạn sẽ phải tạo Graph trước rồi sử dụng TensorFlow Session để chạy các phần của Graph này.
Dataflow là mô hình lập trình (programming model) chuyên dùng cho tính toán song song. Xem thêm tại đây. Ở trong Graph, các đỉnh (nodes) đại diện cho các phép tính, và các cạnh (edges) đại diện cho dữ liệu đầu vào và đầu ra của các phép tính trên.
Một số ưu điểm của Dataflow mà TensorFlow (TF) có thể tận dụng được:
-
Tính toán song song (Parallelism): Bằng việc chia tách các phép tính toán độc lập, TF có khả năng lựa chọn thực hiện song song các phép tính cụ thể.
-
Thực thi phân tán (Distributed Execution): TF có khả năng chia nhỏ ứng dụng của bạn cho nhiều CPU, TPU, GPU khác nhau trên nhiều máy khác nhau.
-
Biên dịch (Compliation): XLA của TF có thể dùng graph để generate ra code chạy nhanh hơn thông thường.
-
Tính di động (Portability): Graph là ngôn ngữ biểu diễn độc lập (language-independent representation) với model của bạn. Bạn có thể build một Graph bằng Python, save model, store lại bằng C++.
-
-
-
a. Mô hình Hồi quy tuyến tính (Linear Regression Model)
-
Trước khi nhắc đến những công thức toán học dài dòng tôi muốn mô phỏng một bài toán đơn giản cho bạn dễ hình dung trước.
Một hôm đẹp trời, tôi sử dụng ứng dụng Grab để đặt 1 chuyến đi từ nhà tôi đến Bờ Hồ Hoàn Kiếm dài 5km nhưng xui thay ứng dụng này mất khả năng tính toán thành tiền và bác xe ôm đen đủi không thể biết được số tiền chính xác mà tôi cần phải trả.
May mắn thay, tôi vẫn còn truy cập được vào lịch sử các chuyến đi của mình như bảng bên dưới, liệu rằng dựa trên những thông tin này tôi có thể tính được số tiền mà tôi cần trả cho 5km ngày hôm nay?
Số Km (Km) Số tiền cần trả (1000 VND) 2 13 7 35 9 41 3 19 10 45 6 28 1 10 8 55 Giả sử Số KM tôi đi và số tiền cần trả Grab phụ thuộc tuyến tính vào nhau, tức là số KM tăng thì số tiền cần trả Grab tăng hoặc số KM giảm thì số tiền cần trả Grab giảm, tôi có thể tìm ra được 1 hàm biểu thị được mối quan hệ giữa 2 đại lượng này không? Câu trả lời là Có.
Tại sao lại cần tìm ra hàm đó? Vì nếu tìm ra được nó, việc tôi cần làm chỉ thay số KM tôi đi ngày hôm nay vào hàm và tìm ra được số tiền tôi cần trả.
Tôi đặt: - X là số Km tôi đi - Y là số tiền cần trả Grab
Hàm cần tìm sẽ có dạng Y= aX + b. Bài toán quy về: Với X và Y cho trước trên bảng trên, tìm 2 tham số a và b.
Biểu thị data bằng đồ thị
Bài toán của chúng ta là phải đi tìm hàm F thể hiện được mối quan hệ giữa Y và X có dạng Y= aX + b. Chú ý X và Y đều là ma trận/vector.
-
Định nghĩa
Trong thống kê, hồi quy tuyến tính là một phương pháp dùng để mô hình hóa mối quan hệ giữa một đại lượng vô hướng với một hoặc nhiều biến độc lập.
Các dạng của mô hình hồi quy tuyến tính:
Công thức tổng quát:
-
Mô phỏng thực tế
-
-
b. Hàm mất mát (Loss Function)
- Định nghĩa
Hàm mất mát trả về một số không âm thể hiện mức độ chênh lệch giữa giá trị mà model của chúng ta dự đoán và giá trị thực tế.
- Mô phỏng thực tế
-
c. Thuật toán tối ưu Loss Function (Optimization Algorithms)
- Normal Equation
- Công thức toán học
- Điểm mạnh
- Điểm yếu
- Gradient Descent
- Công thức toán học
- Điểm mạnh
- Điểm yếu
- Normal Equation
-
d. Bài toán thực tế
- Bài toán đo lường Hiệu quả sản xuất
- Vấn đề
- Giải quyết bằng mô hình Hồi quy tuyến tính
- Bài toán đo lường Hiệu quả sản xuất
-
a. Mô hình Hồi quy Logistic (Logistic Regression Model)
- Định nghĩa
- Mô phỏng thực tế
-
b. Phân loại 2 lớp (Binary Classification)
- Định nghĩa
- Hàm phi tuyến sigmoid
- Hàm mất mát (Loss Function)
- Thuật toán Gradient Descent
-
c. Phân loại nhiều lớp (Multiclass Classification)
- Định nghĩa
- Hàm mất mát (Loss Function)
- Thuật toán Gradient Descent
-
d. Hiện tượng Overfitting và một số cách khắc phục
-
e. Đánh giá mô hình
-
a. Mô hình Cây quyết định (Decision Trees)
- Định nghĩa
- Mô phỏng thực tế
-
b. Các thuật toán
- ID3
- C4.5
- C5.0
- CART
-
c. Triển khai thuật toán CART
- Câu hỏi (Question)
-
d. Bài toán phân loại ô tô
- Vấn đề
- Giải quyết bằng mô hình Cây quyết định
-
e. Mô hình Random Forests
- Định nghĩa
-
a. Neural Network
- Định nghĩa
- Mô phỏng thực tế
-
b. Hàm kích hoạt phi tuyến
- Sigmoid
- Tanh
- ReLU
-
c. Thuật toán lan truyền ngược (backpropagation)
- Ôn lại đạo hàm hàm hợp (Chain Rule)
- Công thức
- Mô phỏng thực tế
-
d. Thuật toán tối ưu Loss Function (Optimization Algorithms)
- Thuật toán Gradient Descent
-
e. Một số vấn đề khi huấn luyện Neural Network
Nếu bạn chưa có kiến thức về thị giác máy tính (Computer Vision) thì bạn nên đọc thêm về loạt bài viết tại đây.
Một slide mình đã từng chia sẻ tại sự kiện Google Cloud Next MienTrung 2018.
-
a. Convolutional Neural Network
-
Định nghĩa
Convolutional Neural Networks tương đồng với mạng Neural Networks thông thường, bao gồm nhiều neuron với mục đích học được các tham số (weights và biases). Mạng này có:
- Đầu vào: Những bức ảnh dưới dạng Pixel
- Đầu ra: Các lớp cần phân loại
Ví dụ tôi muốn làm bài toán phân loại chó mèo, thì đầu vào của tôi là rất nhiều ảnh chó mèo và lớp đầu ra có 2 neuron đại diện tương ứng cho chó và mèo.
-
Mô phỏng thực tế
-
Ứng dụng thực tế
Ảnh từ cs231, analyticsvidhya, iospress, quora, slideshare
-
Quá trình mạng nhận diện một ảnh (Inference)
- Bước 1: Ảnh sẽ được chuyển về dưới dạng ma trận các pixel
- Bước 2: Ma trận của ảnh khi đi qua các lớp ẩn (hidden layer) sẽ được trích xuất đặc trưng cũng như biến đối phi tuyến thành ma trận kích thước nhỏ hơn nhưng chứa đựng nhiều đặc trưng của bức ảnh hơn.
- Bước 3: Sau khi ma trận của ảnh được biến đổi, nó được đưa qua lớp cuối cùng là một layer 2 neuron, mỗi neuron này sẽ đại diện cho xác suất ảnh đưa vào là chó hoặc mèo.
-
-
b. Tại sao lại cần dùng Convolutional Neural Network?
-
Nhược điểm của mạng kết nối đầy đủ (Fully Connected Network)
- Dễ bị Overfit do lượng tham số cần học quá lớn và data quá nhỏ
- Mạng không phân loại được cùng một đối tượng nhưng ở vị trí khác nhau trong ảnh
-
Ưu điểm của mạng CNN
- Lượng tham số ít hơn nhiều so với mạng kết nối đầy đủ. Các lớp tích chập (CONV), các lớp Pooling giúp trích xuất đặc trưng của ảnh khiến ma trận ảnh đi qua mỗi lớp nhỏ dần đi, vì thế lượng tham số cần học cũng giảm theo.
- Có tính kháng dịch chuyển. Vì loại đi những dữ liệu thừa có ảnh hưởng đến vị trí của đối tượng nên mạng nhận diện chính xác một đối tượng nằm ở các vị trí khác nhau trong một ảnh.
-
-
c. Các mạng CNN thông dụng
- VGG 16
- ResNet
- GoogleNet
-
d. Bộ lọc
Vector/ Ma trận trượt trên ma trận khác để trích xuất các dữ liệu đặc trưng, loại bỏ những dữ liệu không cần thiết.
Bộ lọc có rất nhiều tên khác nhau:
- Kernel
- Filter
- Window
- Mask
- Filter Mask
-
e. Phép tích chập (Convolution)
-
Công thức
Mô phỏng công thức:
Hàm f(m) đại diện là ô vuông màu xanh và Hàm g(n-m) đại diện cho ô vuông màu đỏ. Tích chập (f*g)[n] thể hiện mức độ giao hoán của hai hàm f(m) và g(n-m) tại ví trí n.
- Tại vị trí n mà 2 hàm giao hoán mạnh nhất, tức là 2 ô vuông trùng nhau thì giá trị tích chập là lớn nhất
- Tại vị trí n mà 2 hàm không giao hoán, tức là 2 ô vuông không trùng nhau thì giá trị tích chập là bằng 0
- Giá trị tích chập tăng dần tỉ lệ thuận với mức độ giao hoán của 2 hàm
Sử dụng tích chập, ta có thể trích xuất tính chất từ ma trận của ảnh dựa trên những ma trận nhỏ (filter) cho sẵn.
-
Tích chập 1D rời rạc
Tích chập 1D là một vector (filter) trượt trên một ma trận, qua mỗi bước trả về tích vô hướng của filter với giá trị của ma trận mà filter trượt lên trên.
-
Tích chập 2D rời rạc
Tích chập 2D là một ma trận 2 chiều (filter) trượt trên một ma trận khác, qua mỗi bước trả về tích vô hướng của filter với giá trị của ma trận mà filter trượt lên trên.
Ảnh từ machinelearninguru
Hai cặp filter mỗi cặp 3 filter trượt lần lượt trên một bức ảnh 3 channels.
- Loại tích chập
Giá trị ma trận của bộ lọc quyết định đầu ra của phép tích chập.
- Bộ lọc Sobel X lọc ra tính chất đặc trưng theo chiều dọc
- Bộ loc Sobel Y lọc ra tính chất đặc trưng theo chiều ngang.
-
-
f. Pooling
-
g. Các hàm kích hoạt
- Sigmoid
- Tanh
- ReLU
-
h. Cấu trúc mạng
Ảnh từ cs231 - Stanford
Các thành phần của một CNN
- Các lớp Convolution (Convolution Layer)
- Các hàm kích hoạt (Activation Function)
- Các lớp pooling
- Các lớp fully-connected
-
i. Công thức tính toán đầu ra ở các lớp
a. Language Models
b. Recurrent Neural Network (RNN)
- Giới thiệu RNN
- Cấu trúc mạng RNN
- Gate Recurrent Unit (GRU)
- Long Short-Term Memory (LSTM)
b. Vấn đề thường gặp và cách giải quyết
- Vanishing
- Expoding Gradient Descent
a. Triển khai Tensorflow phân tán (Distributed TensorFlow)
b. TensorFlow với AWS S3
c. TensorFlow Serving
- Giới thiệu
- Kiến trúc
- Cài đặt
- Restful API
- Xây dựng TensorFlow ModelServer
- Triển khai Inception Model với TensorFlow và Kubernetes
Phần này được mô phỏng chủ yếu trên bài nói của tôi tại Google I/O Extended Hanoi 2018. Slide và code của bài nói này nằm tại đây.
- a. Lịch sử TensorFlowJS
- b. Các API chính của TensorFlowJS
- c. Xây dựng mô hình Hồi quy tuyến tính
- d. Xây dựng mạng Convolutional Neural Network(CNN)
- e. MobileNet
- f. Transfer Learning