Machine Learning vẫn còn là một thứ mới mẻ và khiến mình tò mò, cho nên hôm nay mình đã bắt đầu tham gia một khóa học về nó. Chuỗi các bài “Tôi học Machine Learning” là những ghi chú của mình, chứ không phải là bài hướng dẫn, vì vậy có thể có những sai sót chủ quan trong nội dung bài viết. Nếu các bạn thấy chỗ nào sai, cứ thoải mái góp ý, điều đó sẽ rất có ý nghĩa với mình.
Phần tiếp theo trong khóa học lập trình python này sẽ trình bày về thư viện toán học numpy. Đây là một thư viện hỗ trợ đắc lực cho tính toán ma trận. Để biết cụ thể numpy là cái gì chúng ta hãy cũng nhau tìm hiểu nhé.
khóa học lập trình python này được viết dành cho các bạn sử dụng python cho các bài toán machine learning. Do đó, ngoài hướng dẫn về học lập trình python ra bạn sẽ học được các kỹ thuật, cách sử dụng một số thư viện phục vụ cho khoa học máy tính.
Thư viện pandas python là gì? Nó có thể giúp bạn những gì và làm sao để sử dụng thư viện pandas này trong lập trình python. Hãy cùng tôi đi tìm câu trả lời cho các câu hỏi trên trong bài viết ngày hôm nay. Tôi tin rằng đây là một bài viết cực kỳ hữu ích. Nó chắc chắn sẽ đem lại cho các bạn nhiều kiến thức bổ ích và làm chủ được cách sử dụng thư viện này.
Thuật toán phân cụm dữ liệu có tên là k-means. Phần mở đầu mình sẽ giới thiệu về thuật toán phân cụm k-means. Tiếp đến mình sẽ trình bày tới ý tưởng giải quyết bài toán phân cụm với k-means. Và sau cùng sẽ là mình và các bạn sẽ cùng thực hiện code minh họa bài toán phân cụm trên không gian 2 chiều.
Thuật toán CNN đã cho thấy sự thành công trong một số bài toán phân loại văn bản. Trong [1], tác giả đã đưa ra một mô hình CNN đơn giản với việc điều chỉnh vài siêu tham số và sử dùng một pre-train word2vec. Cho thấy kết quả cực kỳ tốt. Giải pháp này đã giúp cải thiện kết quả của 4 trên tổng số 7 bài toán trong NLP.
Tuy nhiên, khi học cách áp dụng CNN vào word embeddings. Việc lần theo kích thước của các ma trận thường dễ gây nhầm lẫn và khó hiểu. Vì vậy, bài viết này sẽ giúp bạn hiểu cách CNN giải quyết bài toán phân loại văn bản. Mình sẽ tập trung vào lý giải sự thay đổi kích thước của các ma trận ở từng bước. Tôi sẽ sử dụng một mạng CNN với đầu vào là một câu văn có 7 từ, với số chiều của word embeddings là 5. Đơn giản chỉ là một ví dụ giúp bạn hiểu thôi. Và các ví dụ này được lấy từ [2].
Mô hình thuật toán CNN
Ảnh này được lấy từ [2], với các #hash-tags được thêm vào giúp các bạn dễ hình dung hơn. Tại mô hình Convolutional Neural Network này. Chúng tôi sử dụng 3 bộ lọc có các kích thước khác nhau: 2, 3, 4, và mỗi một kích thước, chúng tôi lại có 2 bộ lọc khác nhau. Các bộ lọc thực hiện nhân tích chập(convolution) lên ma trận của câu văn đầu vào và mỗi bộ lọc tạo ra một map lưu trữ các đặc trưng(features map). 6 map đặc trưng này từng map sẽ đi qua 1-max pooling – Tức là giá trị lớn nhất trong mỗi map đặc trưng sẽ được lưu lại.
Do vậy, một vector có 1 phần tử được tạo ra ở mỗi map đặc trưng. Sau đó, các giá trị này được nối lại với nhau tạo nên lớp áp chót ở trong hình. Và cuối cùng, kết quả này đi qua một hàm softmax và nhận được là một vector đặc trưng và dùng nó để dự đoán nhãn cho văn bản. Trong ví dụ này chúng tôi giả sử đây là bài toán phân loại văn bản chỉ có 2 lớp(binary classification) nên ở đây đầu ra chỉ có 2 trạng thái.
Giải thích các khái niệm
#sentence
Ví dụ trên sử dụng câu “I like this movie very much!”. Câu văn này có 6 từ và một dấu câu nữa. Dấu câu này ở đây sẽ được coi như là một từ. Như vậy là chúng ta có 7 từ tất cả. Ở đây tôi chọn số chiều của word vector là 5(tức là mỗi từ sẽ là một vector kích thước 1×5). Giả sử ta gọi d là số chiều của word vector. Như vậy kích thước ma trận của cả câu văn này là 7 x 5.
Giải thích thêm: Từ trong trường hợp này chính là một đặc trưng. Tùy bài toán mà người ta có coi dấu câu là đặc trưng hay không. Điều đó phụ thuộc vào việc nó có hữu dụng không. Tức là nếu lấy dấu câu thì có giúp tăng độ chính xác hay không. Do vậy, có nhiều trường hợp dấu câu sẽ bị loại bỏ.
#filters
Một tính chất mong muốn của thuật toán CNN bên xử lý ảnh là giữ được tính không gian 2 chiều theo góc quan sát của máy tính. Văn bản cũng có tính chất này như ảnh. Nhưng thay vì 2 chiều, văn bảnchỉ có một chiều và đó là các chuỗi từ liên tiếp. Ở ví dụ trên mỗi từ lại là một vector 5 chiều, do vậy ta cần cố định số chiều của bộ lọc cho phù hợp với số chiều của từ. Như vậy bộ lọc của chúng ta nên có kích thước (? x 5). Dấu ? thể hiện số từ(số hàng) mà chúng ta muốn lấy vào.
Ở bức hình trên, #filters là minh họa cho các bộ lọc. Đây không phải là bộ lọc để lọc bỏ các phần tử khỏi ma trận bị lọc. Điều này sẽ được giải thích kỹ hơn ở đoạn tiếp theo. Ở đây, tác giả sử dụng 6 bộ lọc, các bộ lọc được sử dụng có kích thước (2, 3, 4) từ.
#featuremaps
Trong đoạn này, chúng tôi sẽ từng bước giải thích cách bộ lọc nhân tích chập(convolutions / filtering). Tôi sẽ làm với vài số đầu tiên và sau đó bạn có thể dễ dàng hiểu và tự làm được.
Ảnh phía trên thực hiện việc tính toán cho bộ lọc có kích thước là 2(2 từ). Với giá trị đầu tiên, bộ lọc màu vàng kích thước 2 x 5 thực hiện nhân từng thành phần với 2 hàng đầu tiên của văn bản(I, like).
Nó thực hiện bằng cách:
0.51 = 0.6 x 0.2 + 0.5 x 0.1 + 0.2 x 0.2 + ... + 0.1 x 0.1.
Tiếp theo với giá trị thứ 2, bộ lọc màu vàng giữ nguyên nhưng lần này nhân tích chập với ma trận văn bản của 2 từ (like, this) theo cách tương tự:
0.53 = 0.8 x 0.2 + 0.9 x 0.1 + ... + 0.7 x 0.1.
Cứ như vậy, ma trận bộ lọc(màu vàng) sẽ lùi xuống một dòng cho đến khi hết ma trận văn bản. Như vậy ma trận kết quả sẽ có kích thước là (7-2 + 1 x 1) = (6 x 1).
Để bảo đảm giá trị của map đặc trưng, chúng ta cần sử dụng một activation function( vd. ReLU). Áp dụng ReLU vẫn cho chúng ta ma trận có kích thước là 6 x1.
#1max
Lưu ý rằng kích thước của map đặc trưng phụ thuộc vào ma trận văn bản và ma trận bộ lọc. Nói cách khác, map đặc trưng sẽ có kích thước thay đổi chứ không cố định. Để đưa ma trận đặc trưng này về kích thước như nhau. Hoặc trong nhiều trường hợp người ta chỉ muốn giữ lại các đặc trưng tiêu biểu. Chúng ta có thể sử dụng max-pooling để lấy ra các giá trị lớn nhất trong map đặc trưng. Điều này giúp giảm chiều dữ liệu, tăng tốc độ tính toán.
Trong ví dụ này, tôi sử dụng 1-max-pooling. Tức là lấy ra 1 giá trị lớn nhất trong từng map đặc trưng. Việc này giúp ta có ma trận output có cùng kích thước. Ở đây kích thước sau khi áp dụng #1max là (1×1). Như vậy, ta chỉ lấy 1 đặc trưng trội nhất ở tất cả các lớp cnn để phục vụ cho bài toán.
#concat1max
Sau khi áp dụng 1-max pooling, chúng ta đã có những vector có kích thước cố định là 1×1 của 6 thành phần(bằng số bộ lọc). Vector cố định kích thước này sau đó được đưa vào một hàm softmax(lớp fully-connected) để giải quyết việc phân loại.
Như vậy, #concat1max thực hiện việc kết hợp tất cả các đặc trưng ở bước trước lại. Đưa ra một vector đặc trưng cuối cùng để đưa vào fully-connected. Tôi xin không giải thích kỹ về fully-connnected trong bài này. Sau đó, thường chúng ta sẽ qua một lớp softmax để đưa output về xác suất các nhãn có tổng bằng 1.
Hơn nữa, các độ đo lỗi ở giai đoạn phân loại này sau đó sẽ được đưa lại vào các tham số đóng vai trò là một phần của quá trình học để cải thiện độ chính xác cho mô hình.
Kết luận
Bài viết này làm rõ cách hoạt động của thuật toán CNN trên mô hình word embeddings và tập trung vào kích thước của các ma trận ở mỗi bước.
MNIST là bộ dữ liệu là các con số viết tay từ 0 đến 9. Bộ dữ liệu này bao gồm 60.000 mẫu cho huấn luyện và 10.000 mẫu để kiểm thử. Các mẫu dữ liệu trong bộ MNIST đã được chuẩn hóa về kích thước: căn chỉnh chính giữa dữ liệu, và mỗi mẫu sẽ là một ảnh có kích thước(shape) 28×28 pixel có nhãn là giá trị số của nó(0 đến 9).
Xây dựng mô hình Linear regression sử dụng Tensorflow
Để các bạn dễ hình dung với bài toán, ta có thể xét bài toán thực tế như sau: Bạn có một tập dữ liệu thể hiện giá của căn hộ(y) và diện tích của căn hộ đó(x). Và công việc chúng ta cần làm là làm sao ta có thể dự đoán giá của một căn hộ bất kỳ khi biết diện tích của nó.
Tensorflow là một thư viện mã nguồn mở mạnh mẽ cho machine learning được phát triển bởi các nhà cứu của Google. Thư viên này có rất nhiều các hàm được xây dựng sẵn cho từng bài toán cho phép xây dựng nhiều mạng neural network khác nhau. Tensorflow cũng cho phép tính toán song song trên nhiều máy tính khác nhau, tất nhiên là cũng có thể trên nhiều CPU, GPU trong cùng một máy. Tensorflow cung cấp các api làm việc với Python, C++. Tại tutorial này, tôi sẽ sử dụng Python.
Học có giám sát là gì?
Học có giám sát (supervised learning) là một kỹ thuật của ngành học máy nhằm mục đích xây dựng một hàm f từ dữ tập dữ liệu huấn luyện (Training data). Dữ liệu huấn luyện bao gồm các cặp đối tượng đầu vào và đầu ra mong muốn. Đầu ra của hàm f có thể là một giá trị liên tục hoặc có thể là dự đoán một nhãn phân lớp cho một đối tượng đầu vào.
In any real world data science situation with Python, you’ll be about 10 minutes in when you’ll need to merge or join Pandas Dataframes together to form your analysis dataset. Merging and joining dataframes is a core process that any aspiring data analyst will need to master. This blog post addresses the process of merging datasets, that is, joining two datasets together based on common columns between them. Key topics covered here:
There are multiple ways to select and index rows and columns from PandasDataFrames. I find tutorials online focusing on advanced selections of row and column choices a little complex for my requirements.
I’ve recently started using Python’s excellent Pandas library as a data analysis tool, and, while finding the transition from R’s excellent data.table library frustrating at times, I’m finding my way around and finding most things work quite well.
If you’re developing in data science, and moving from excel-based analysis to the world of Python, scripting, and automated analysis, you’ll come across the incredibly popular data management library, “Pandas” in Python. Pandas development started in 2008 with main developer Wes McKinney and the library has become a standard for data analysis and management using Python. Pandas fluency is essential for any Python-based data professional, people interested in trying a Kaggle challenge, or anyone seeking to automate a data process.
CSV (comma-separated value) files are a common file format for transferring and storing data. The ability to read, manipulate, and write data to and from CSV files using Python is a key skill to master for any data scientist or business analysis. In this post, we’ll go over what CSV files are, how to read CSV files into Pandas DataFrames, and how to write DataFrames back to CSV files post analysis.