Mạng thần kinh định kỳ cho danh sách email


Phan Nam Hải
2 năm trước
Hữu ích 4 Chia sẻ Viết bình luận 0
Đã xem 1619

Không lâu sau khi viết xong bài học của tôi học được từ việc xây dựng mạng lưới thần kinh Hello World , tôi nghĩ rằng tôi có thể chuyển từ một MLP đơn giản sang một mạng lưới thần kinh phức tạp hơn. Có lẽ nhờ bài đăng trên blog của Karpathy về hiệu quả vô lý của các mạng thần kinh tái phát mà tôi đã chọn để tiếp tục sử dụng RNNs.

Mặc dù thành thật mà nói, đây không phải là động lực duy nhất của tôi. Những người đọc bài viết của tôi sẽ biết rằng một trong những vấn đề tôi đã nghiên cứu rộng rãi trong vài tháng qua là danh sách gửi thư dự đoán bằng cách sử dụng dữ liệu từ MailChimp. Chúng là một loạt các bài đăng mà tôi đã trình bày:

  1. Làm thế nào để dự đoán Churn: Khi nào người nhận email không đăng ký?
  2. Làm thế nào để dự đoán khuấy đảo: Một mô hình có thể giúp bạn tiến xa như dữ liệu của bạn
  3. Dự đoán khuấy đảo email với NBD / Pareto
  4. Bài học rút ra từ việc xây dựng một mạng lưới thần kinh Hello World

Vì vậy, dự đoán khuấy đảo để phân tích chuỗi thời gian - và RNN đang làm rất tốt điều này.

Mạng thần kinh tái phát 

Tôi sẽ không đi sâu vào nhiều chi tiết kỹ thuật về RNN là gì và cách chúng hoạt động, vì có rất nhiều nguồn trên mạng giải thích chi tiết về chúng.

Tôi sẽ chỉ đề cập rằng tính năng phân biệt giữa RNN và các loại mạng thần kinh khác là chỉ RNN mới có vòng phản hồi. Điều đó có nghĩa là ở mỗi bước thời gian, một tế bào thần kinh tái phát nhận được đầu vào cũng như đầu ra của bước trước đó. Đó chính xác là lý do tại sao chúng phù hợp với dự đoán chuỗi thời gian.

Một sơ đồ đơn giản thể hiện chính xác quá trình này là như sau:

Do vòng phản hồi này, chúng ta có thể tuyên bố rằng các tế bào thần kinh tái phát có một số loại tế bào bộ nhớ và vì vậy khi đưa ra quyết định, chúng cũng có thể xem xét các trạng thái trước đó.

Một loại tế bào thần kinh cụ thể với các tế bào bộ nhớ được gọi là LSTM (bộ nhớ ngắn hạn dài). Không cần phải lo lắng nhiều về những gì họ đang làm hoặc cách họ làm việc. Chỉ cần nhớ rằng chúng là các tế bào thần kinh bình thường với một số thuộc tính bổ sung cho phép chúng hoạt động tốt hơn nữa.

Thu thập và chuyển đổi dữ liệu

Bước đầu tiên tôi phải thực hiện là thu thập dữ liệu và tiền xử lý.

Mặc dù việc thu thập dữ liệu không khó lắm, nhưng việc tìm ra cách nó phải được định dạng để được cung cấp trong RNN là phần đau đớn nhất của quy trình.

Như trong tất cả các bài viết trước, loại dữ liệu tôi chọn để làm việc trực tiếp đến từ các chiến dịch gửi thư được khởi chạy thông qua MailChimp. Tôi đã sử dụng Blendo, một công cụ tích hợp dữ liệu , để đồng bộ dữ liệu MailChimp với PostgreSQL trong vài phút, nhưng chỉ một tập hợp con của các bảng được cung cấp bởi dịch vụ được sử dụng liên quan đến các hành động mà người nhận thực hiện trong một tháng cụ thể. Đây là một mô hình dữ liệu mẫu của lược đồ MailChimp mà tôi có trong DB được tạo cho tôi.

Dựa trên điều này, đầu ra của tôi sẽ là dự đoán về việc ai sẽ thực hiện ít nhất một hành động trong tháng tới để những người không mở email hoặc nhấp vào liên kết sẽ được coi là có nguy cơ cao.

Điều gây phiền toái nhất cho tôi là thực tế là tôi muốn đầu vào của mình là một số lượng lớn chuỗi thời gian không tương thích, mỗi chuỗi tương ứng với một người nhận. Chà, một mối tương quan có thể thực sự tồn tại, nhưng trong mọi trường hợp, tôi không muốn coi chuỗi thời gian của người nhận là một tính năng để dự đoán hành vi của người nhận khác.

Sau rất nhiều lần thử nghiệm, nhiều thử nghiệm và thất bại như nhau, tôi đã kết thúc với định dạng sau. Mỗi cột của đầu vào của tôi đại diện cho một người nhận và mỗi hàng đại diện cho một tháng. Giá trị của mỗi tháng được đặt thành 1 khi một người dùng cụ thể đã mở email hoặc nhấp vào liên kết ít nhất một lần trong tháng này.

Một vấn đề khác mà tôi gặp phải là thực tế là độ dài của mỗi chuỗi thời gian không giống nhau, vì không phải tất cả người nhận đều được đăng ký trong cùng một tháng theo lịch. Tôi đã khắc phục điều này bằng cách đệm chuỗi thời gian ngắn hơn với số không.

Nhưng bạn sẽ có sẵn bao nhiêu tháng? Ba năm? Số năm? Mười? Thậm chí mười năm chỉ là 120 tháng, tức là 120 điểm dữ liệu. Nghiên cứu dữ liệu ở cấp độ chi tiết hơn - ví dụ: ngày - dường như là một lựa chọn tốt hơn.

Ngay cả sau đó, dữ liệu sạch mà tôi có theo ý của tôi được bảo hiểm khoảng 2,5 năm, dẫn đến ít hơn 150 điểm dữ liệu.

Mặc dù đào tạo một RNN với rất ít dữ liệu dường như là một nhiệm vụ bất khả thi, tôi đã thử. Đây là kết quả.

Xây dựng mạng lưới

Để xây dựng RNN, Keras là lựa chọn của tôi vì nó rất dễ sử dụng và đơn giản. Tôi đã xây dựng một ngăn xếp tuyến tính gồm ba lớp, bao gồm:

  1. LSTM : Lớp lặp lại chính của mạng được xây dựng. Tham khảo tại đây  để biết thêm thông tin.
  2. Mật độ : Một lớp kết nối dày đặc thường xuyên. Tham khảo tại đây  để biết thêm thông tin.
  3. Kích hoạt : Chỉ định chức năng kích hoạt sẽ được áp dụng cho đầu ra. Tôi đã chọn nó là tuyến tính, có lẽ là đơn giản nhất và dường như cư xử khá tốt.

Số lượng tế bào thần kinh đầu vào được đặt thành 1.349. Kích thước của tập dữ liệu và tế bào thần kinh trên mỗi lớp ẩn là 300.

Đào tạo và Đánh giá

Trước khi chuyển sang đào tạo thực tế, tôi đã phải chia dữ liệu thành "đào tạo" và "kiểm tra". Trong đánh giá hiệu suất của mô hình, đây là một bước quan trọng không thể bỏ qua ngay cả khi tập dữ liệu quá nhỏ.

Hàm mất mát được chọn là lỗi bình phương trung bình, nhằm mục đích giảm thiểu mức trung bình của bình phương của các lỗi trong quá trình lan truyền ngược. Thông tin thêm về các chức năng mất có sẵn có thể được tìm thấy trong tài liệu Keras .

Sau khi đào tạo mô hình cho 15 epoch, các biểu đồ sau đã được tạo cho tập dữ liệu xe lửa và tập dữ liệu thử nghiệm.

Tin tốt là sự mất mát của tập huấn giảm dần khi thời đại trôi qua. Tin xấu là không may, trên tập dữ liệu thử nghiệm, sự mất mát không theo một tiến trình giảm dần mà thay vào đó là những thăng trầm của nó.

Hành vi này được mong đợi và nó chỉ ra rằng mạng không thực sự học. Thay vào đó, nó "ghi nhớ" các điểm đào tạo và không thể khái quát hóa trên dữ liệu mới chưa thấy. Đây là hậu quả của việc không đủ lượng dữ liệu tôi có sẵn cho vấn đề này. Với một lượng dữ liệu lớn hơn, mạng có thể có thể khái quát hóa và tạo ra các dự đoán tốt hơn trên tập dữ liệu thử nghiệm.

Về mặt sáng sủa, theo trực giác của tôi và không phải là một lời giải thích siêu khoa học nào đó, thực tế là mạng dường như quá phù hợp với dữ liệu đào tạo như mong đợi chỉ ra rằng mã ít nhiều lành mạnh và có thể được sử dụng với một vài sửa đổi trong một số khác vấn đề tương tự.

Phần kết luận

Trong bài đăng này, tôi đã cố gắng đối phó với một nhiệm vụ dự đoán hỗn loạn, mắc lỗi và học hỏi từ chúng. Tôi cũng đã có cơ hội chơi (trầy xước bề mặt) với các mạng thần kinh tái phát, một kỹ thuật có giá trị to lớn đối với các hệ thống thông minh và cách chúng hoạt động.

Từ kết quả, dường như lượng dữ liệu có sẵn là không đủ và vì vậy để tiến lên phía trước, một đề xuất sẽ là làm giàu dữ liệu . Dữ liệu từ MailChimp có thể được kết hợp với dữ liệu hành vi từ các nguồn khác như Μixpanel và Ιntercom. Bằng cách này, chuỗi thời gian sẽ được mở rộng bằng cách bao gồm nhiều điểm dữ liệu hơn cho mỗi người dùng để mô hình đó sẽ hoạt động ngày càng tốt hơn và cuối cùng dự đoán khuấy đảo.

Nhưng một lần nữa, thành công không được đảm bảo, vì đào tạo mạng lưới thần kinh thực sự đòi hỏi một lượng lớn dữ liệu.

Trong mọi trường hợp, tôi sẽ khuyến khích bạn lấy mã, có sẵn trên GitHub và cố gắng thực hiện nó trên dữ liệu của riêng bạn. Tôi rất thích nghe ý kiến ​​của bạn về cách người mẫu thực hiện các nhiệm vụ khác nhau, vì vậy hãy chia sẻ kinh nghiệm của bạn trong các bình luận!

Hữu ích 4 Chia sẻ Viết bình luận 0
Đã xem 1619