12/08/2018, 16:41

Machine Learning thật thú vị (2): Tạo sách văn học và game Mario

Trong phần 1, chúng ta đã đề cập đến việc Học Máy đã sử dụng các thuật toán chung chung để tìm ra những điều thú vị về dữ liệu bạn có mà không cần phải viết những dòng mã cụ thể để giải quyết bài toán của bạn. Trong phần này, chúng ta sẽ dành thời gian tìm hiểu một thuật toán làm được những điều ...

Trong phần 1, chúng ta đã đề cập đến việc Học Máy đã sử dụng các thuật toán chung chung để tìm ra những điều thú vị về dữ liệu bạn có mà không cần phải viết những dòng mã cụ thể để giải quyết bài toán của bạn.

Trong phần này, chúng ta sẽ dành thời gian tìm hiểu một thuật toán làm được những điều rất thú vị - tạo nên một trò chơi thực sự giống như được tạo bởi con người. Chúng ta sẽ xây dựng một mạng nơron tự tạo văn bản từ tập văn bản khác hay thậm chí cả game Mario từ một tập hợp game có sẵn cho trước

Đưa ra những dự đoán thông minh hơn

Trong phần 1, chúng ta đã tạo một thuật toán đơn giản để dự đoán giá trị của một ngôi nhà dựa trên các đặc điểm của nó. Ví dụ về một ngôi nhà với những thông tin sau:

Số phòng ngủ Diện tích Khu đô thị Giá bán
3 2000 Royal City ???

Giống như phần 1, chúng ta viết một hàm lượng giá cơ bản sau:

def estimate_house_sales_price(num_of_bedrooms, sqft, neighborhood):
 price = 0
# a little pinch of this
 price += num_of_bedrooms * 0.123
# and a big pinch of that
 price += sqft * 0.41
# maybe a handful of this
 price += neighborhood * 0.57
return price

Chúng ta đã ước lượng giá trị của ngôi nhà dựa trên trọng số của các thuộc tính của ngôi nhà. Đồ thị sau sẽ biểu diễn chức năng này: Mạng nơ ron Tuy nhiên thuật toán này chỉ có thể hoạt động với những vấn đề đơn giản mà kết quả có mối quan hệ tuyến tính với dữ liệu đầu vào. Điều gì sẽ xảy ra nếu giá ngôi nhà thực sự không đơn giản như vậy. Ví dụ, khu vực lân cận có ảnh hưởng nhiều với những ngôi nhà có kích thước to hay nhà bé, nhưng lại không ảnh hưởng tới những ngôi nhà có kích thước trung bình. Làm thế nào chúng ta có thể nắm bắt được những loại chi tiết phức tạo trong mô hình của chúng ta.

Để thuật toán thông minh hơn, chúng ta có thể chạy thuật toán này nhiều lần với nhiều trọng số khác nhau: Thử tập mạng neron với trọng số khác nhau Giờ chúng ta có 4 giá trị ước lượng khác nhau. Chúng ta lại chạy lại thuật toán ban đầu cho 4 giá trị mới này để tìm trọng số cho những biến mới này và tạo ra kết quả cuối cùng. Kết quả ước lượng cuối cùng Kết quả cuối cùng này tổng hợp kết quả từ 4 mô hình khác nhau để giải quyết vấn đề. Mô hình nhiều lớp áp dụng thuật toán như này có thể giải quyết những bài toán khó hơn

Mạng nơron thần kinh là gì?

Kết nối toàn bộ quy trình trên ta có đồ thị kết hợp như sau: Mạng neron nhiều lớp

Đây chính là mạng nơron thần kinh!

Mỗi nơron sẽ chứa các giá trị đầu vào, áp dụng trọng số cho chúng và tính toán được kết quả đầu ra. Bằng cách kết nối nhiều tầng nơron với nhau, chúng ta có thể mô hình hóa các chức năng phức tạp.

Ý tưởng đơn giản trên có thể được diễn đạt lại theo cách sau:

  • Chúng ta tạo nên những hàm dự đoán đơn giản, thực hiện tính toán bằng cách nhân giá trị mỗi nơron với trọng số tương ứng của nó. Mỗi hàm đơn giản này được gọi là một tế bào thần kinh.
  • Kết nối nhiều tế bào thần kinh đơn giản lại với nhau, chúng ta xây đựng được một mạng thần kinh để mô hình hóa nhiều bài toán phức tạp mà một tế bào thần kinh không làm được.

Tư tưởng trên giống như bộ ghép hình LEGO. Chúng ta không thể tạo mô hình với chỉ 1 mảnh ghép, nhưng bằng cách kết hợp nhiều mảnh ghép với nhau, ta có thể tạo nên robot, máy bay, xe tăng...

Tự động tạo văn bản mới

Cung cấp bộ nhớ cho mạng thần kinh (NN)

Mạng thần kinh trên luôn luôn trả về kết quả giống nhau với những tập dữ liệu đầu vào giống nhau. Nó không có bộ nhớ. Trong thuật ngữ lập trình, đó là một thuật toán phi trạng thái.

Trong nhiều trường hợp (giống như ước lượng giá trị ngôi nhà), đó chính xác là điều bạn mong muốn. Nhưng một việc mà loại mô hình này không thể làm là đáp ứng với các mô hình dữ liệu theo thời gian.

Tưởng tượng tôi đưa cho bạn một bàn phím và yêu cầu bạn viết một câu chuyện. Nhưng trước khi bạn bắt đầu, tôi sẽ dự đoán ký tự đầu tiên bạn sẽ gõ. Tôi nên đoán đó là chữ gì?

Tôi có thể sử dụng kiến thức về tiếng Anh của mình để nâng cao tỉ lệ đoán đúng của tôi. Ví dụ, bạn có thể chọn gõ một ký tự thông dụng. Nếu tôi đã xem qua những câu chuyện bạn viết trước đó, tôi có thể dựa trên xác suất những từ bạn thường sử dụng đầu câu chuyện để thu hẹp tập kết quả dự đoán hơn, và xây dựng một mạng thần kinh để mô hình hóa khả năng bạn sẽ bắt đầu một lá thư với ký tự nào.

Mô hình của tôi có thể như sau: Mạng nơ ron hồi quy Nhưng giờ hãy làm vấn đề này khó khăn hơn. Làm sao để tôi có thể dự đoán ký tự tiếp theo bạn sẽ gõ tại bất kỳ thời điểm nào trong câu chuyện của bạn. Đây quả là một vấn đề thú vị hơn nhiều.

Thử lấy ví dụ về câu văn của Hemingway như sau:

Robert Cohn was once middleweight boxi

Ký tự nào sẽ xuất hiện tiếp theo?

Bạn có thể sẽ đoán chữ "n" - có vẻ như là chữ boxing. Chúng ta dự đoán điều này dựa trên từ ngữ trong câu và hiểu biết của chúng ta về ngôn ngữ trong tiếng Anh. Hơn nữa, từ middleweight cũng cung cấp thêm gợi ý là chúng ta đang nói về boxing.

Nói một cách khác, thật dễ để đoán ký tự tiếp theo nếu chúng ta biết chuỗi ký tự trước đó.

Recurrent Neural Network - mạng nơron hồi quy

Để giải quyết vấn đề này với mạng thần kinh, chúng ta cần đặt thêm trạng thái vào mô hình của chúng ta. Mỗi lần sử dụng mạng thần kinh, chúng ta có thể lưu trữ kết quả tính toán và tái sử dụng chúng vào những lần tiếp theo như là một dữ liệu đầu vào. Bằng cách đó, mô hình của chúng ta sẽ điều chỉnh dự đoán dựa trên những đầu vào gần đây.

Lưu giữ trạng thái trong nơ ron hồi quy Việc đặt thêm trạng thái vào trong mô hình của chúng ta không chỉ giúp dự đoán chữ cái đầu tiên khả thi nhất trong câu chuyện, mà còn có khả năng dự đoán chữ cái có khả năng xuất hiện tiếp theo dựa trên tất cả các chữ cái đã xuất hiện trước đó.

Đây là ý tưởng cơ bản về Recurrent Neural Network (RNN - mạng nơron hồi quy). Chúng ta cập nhật trạng thái mỗi khi chúng ta sử dụng mạng. Điều này cho phép mạng cập nhật các dự đoán dựa trên những trạng thái gần nhất. Mạng hồi quy thậm chí có thể mô hình hóa các khuôn mẫu theo thời gian, miễn là chúng ta cung cấp đủ bộ nhớ.

Vai trò của một ký tự?

Việc dự đoán ký tự tiếp theo trong một câu chuyện dài có vẻ như khá ít ứng dụng. Nhưng mục đích ở đây là gì? Một ứng dụng khá thú vị là tự động dự đoán các ký tự sẽ được gõ trên màn hình điện thoại. Gợi ý trong bàn phím query

Nhưng ý tưởng tuyệt vời ở đây là: Nếu, nếu chúng ta có thể tạo ra mô hình dự đoán từ ngữ tiếp theo liên tục, lặp đi lặp lại mãi mãi. Liệu chúng ta có thể tạo ra một câu chuyện hoàn chỉnh?

Viết ra một câu chuyện

Trước đó chúng ta đã bắt đầu với việc dự đoán một ký tự tiếp theo trong một câu văn của Hemingway. Bây giờ hãy thử sức để tạo nên một câu chuyện hoàn chỉnh theo phong cách Hemingway.

Để làm được điều này, chúng ta sẽ sử dụng cài đặt mạng nơron hồi quy được viết bởi Andrej Karpathy - một nhà nghiên cứu về Deep Learning ở Stanford.

Deep Learning

Deep Learning là một trong những mảng phát triển nhất của Machine Learning. Có thể hiểu đơn giản Deep Learning là mạng nơron đa lớp có cấu trúc đặc biệt.
Recurrent Neural Network - RNN (mạng nơron hồi quy), Convolutional Neural Network- CNN (mạng tích chập) hay Deep Convolutional Generative Adversarial Networks - DCGANs (mạng đối kháng sinh mẫu tích chập đa lớp) đều là các thuật toán trong Deep Learning
Ở mạng nơron đa lớp thường, giá trị đầu ra của lớp này là đầu vào của lớp tiếp theo, và các lần chạy mạng với các giá trị truyền vào độc lập với nhau. Ở mạng RNN, mạng nơron ở mỗi lần chạy được lưu trạng thái, và sử dụng ở lần chạy tiếp theo. Ở mạng CNN, các đặc trưng của giá trị truyền vào được trích lọc bằng chuỗi phương pháp như tích chập, giảm mẫu, kết nối mạng trước khi phân nhóm.

Chúng ta sẽ tạo nên một mô hình từ một văn bản hoàn thiện "The Sun Also Rise" - 362.239 ký tự, sử dụng 84 ký tự khác nhau (bao gồm cả dấu chấm câu, chữ hoa, chữ thường, ...). Tập dữ liệu này vẫn nhỏ khi so sánh với các dứng dụng thực tế điển hình. Để tạo ra một mô hình thực sự tốt theo phong cách của Hemingway, sẽ tốt hơn nếu chúng ta có lượng dữ liệu gấp vài lần như trên. Nhưng từng đó cũng khá ổn cho ví dụ chúng ta đang tiến hành.

Khi chúng ta mới bắt đầu huấn luyện RNN, nó dự đoán các ký tự không tốt. Dưới đây là những gì nó tạo ra sau 100 vòng huấn luyện.

hjCTCnhoofeoxelif edElobe negnk e iohehasenoldndAmdaI ayio pe e h’e btentmuhgehi bcgdltt. gey heho grpiahe. Ddelnss.eelaishaner” cot AAfhB ht ltny ehbih a”on bhnte ectrsnae abeahngy amo k ns aeo?cdse nh a taei.rairrhelardr er deffijha

Bạn có thể thấy RNN nhận ra rằng một vài từ có khoảng trống, và mới chỉ được như vậy thôi.

Sau 1000 vòng lặp huấn luyện, kết quả thu được trông rất hứa hẹn:

hing soor ither. And the caraos, and the crowebel for figttier and ale the room of me? Streat was not to him Bill-stook of the momansbed mig out ust on the bull, out here. I been soms inick stalling that aid. “Hon’t me and acrained on .Hw’s don’t you for the roed,” In’s pair.” “Alough marith him.”

Mô hình đã bắt đầu xác định được các khuôn mẫu của một cấu trúc câu cơ bản. Các dấu chấm câu đã được tạo ra, thậm chí cả những trích dẫn. Tuy nhiên, nhiều từ vẫn còn chưa có nghĩa.

Nhưng sau vài nghìn lần huấn luyện lặp lại, kết quả thu được thực sự rất tốt:

He went over to the gate of the café. It was like a country bed. “Do you know it’s been me.” “Damned us,” Bill said. “I was dangerous,” I said. “You were she did it and think I would a fine cape you,” I said. “I can’t look strange in the cab.” “You know I was this is though,” Brett said. “It’s a fights no matter?” “It makes to do it.” “You make it?” “Sit down,” I said. “I wish I wasn’t do a little with the man.” “You found it.” “I don’t know.” “You see, I’m sorry of chatches,” Bill said. “You think it’s a friend off back and make you really drunk.”

Ở thời điểm này, thuật toán đã tìm ra cấu trúc những mẫu hội thoại ngắn của Hemingway. Một vài câu thậm chí còn có ý nghĩa

Thử so sánh với một đoạn văn thực tế trong cuốn sách:

There were a few people inside at the bar, and outside, alone, sat Harvey Stone. He had a pile of saucers in front of him, and he needed a shave. “Sit down,” said Harvey, “I’ve been looking for you.” “What’s the matter?” “Nothing. Just looking for you.” “Been out to the races?” “No. Not since Sunday.” “What do you hear from the States?” “Nothing. Absolutely nothing.” “What’s the matter?”

Thậm chí, chỉ bằng việc nhìn vào từng ký tự một, thuật toán đã có thể tạo ra các câu khá ổn. Đây là một điều hết sức tuyệt vời.

Và chúng ta cũng không cần phải tạo ra một văn bản ngay từ ký tự đầu tiên. Chúng ta có thể cung cấp cho thuật toán một vài chữ cái đầu tiên và để chúng tự hoàn thiện phần tiếp theo.

Hãy thử tạo nên một bìa sách từ thuật toán trên dựa trên cuốn sách chính cuốn sách của Hemingway và các ký tự ban đầu là: "Er", "He" và "The S": Kết quả không tồi phải không!             </div>
            
            <div class=

0