Cài đặt Neural Network với Python

Neural Network
Neural Network

Trong bài viết này, tôi sẽ hướng dẫn mọi người cài đặt mô hình mạng nơ-ron đơn giản với ngôn ngữ lập trình Python. Tôi giả định mọi người đã biết sơ qua các khái niệm cơ bản về giải tích cũng như machine learning (thế nào là classification, regularization, tại sao sử dụng gradient descent để tối thiểu hóa độ lỗi, …).

Việc cài đặt lại Neural Network từ đầu sẽ giúp cho chúng ta hiểu được mô hình này hoạt động như thế nào. Từ đó, ta có thể mở rộng ra các mô hình tiên tiến hơn như Deep learning trong các bài viết sắp tới. Ngoài ra, khi áp dụng vào các dự án thực tế, ta có thể sử dụng các thư viện như Theano hay PyBrain để tăng tốc độ xử lý cũng như tiết kiệm thời gian cài đặt.

Notebooks: ann.

Advertisement

Một suy nghĩ 25 thoughts on “Cài đặt Neural Network với Python

  1. Có hai loại gradient descent, một loại với fixed learning rate được gọi là batch gradient descent, loại còn lại có learning rate thay đổi theo quá trình huấn luyện được gọi là SGD (stochastic gradient descent) hay minibatch gradient descent.

    Em thấy đoạn này hình như có vấn đề vì em tưởng learning rate nó là do mình gán, chứ liên quan gì đến gradient descent ạ

    Thích

    1. Gradient descent thuật toán có tham số alpha do mình tự gán để điều chỉnh trực tiếp tốc độ hội tụ của hàm tối ưu độ lỗi. Qua thực nghiệm, ta sẽ biết được tham số alpha nào thích hợp nhất đối với tập dữ liệu huấn luyện hiện tại của mình.
      Em có thể tham khảo thêm bài viết này: http://sebastianraschka.com/faq/docs/closed-form-vs-gd.html

      Thích

    2. Cảm ơn anh Hồng về blog rất hữu ích.
      Chào bạn anhnamxtanh 🙂 mình thấy bạn đã hiểu sai về khái niệm BGD và SGD rồi.
      – Đầu tiên, khái niệm Batch Gradient Descent tức là mỗi bước bạn sẽ tính vector gradient dựa vào toàn bộ tập dữ liệu bạn có. Còn stochastic gradient descent là một kĩ thuật mà mỗi bước đi bạn không phải dựa vào toàn bộ tập mà bạn chỉ dựa vào một phần thôi. Người ta gọi là stochastic vì nó có tính nhiễu loạn trong đó (nhiễu loạn ở đây chỉ giá trị hàm chi phí không phải luôn giảm mà có thể tăng, có thể giảm, tuy nhiên nhìn chung là nó sẽ giảm sau khi lặp qua nhiều bước). Tất nhiên ở đây vector gradient chỉ giảm khi trong khoảng xấp xỉ của khai triển Taylor lúc xấp xỉ đạo hàm.
      -> Ý mình muốn nói là việc learning rate thay đổi không phải ý để nói về khái niệm BGD và SGD.

      – Còn việc chọn learning rate thì có một số lưu ý như sau:
      + Learning rate sẽ làm ảnh hưởng đến giá trị chi phí như thế nào: Quá lớn thì sao? (giá trị hàm chi phí sẽ lên xuống không theo qui luật) Quá nhỏ thì sao? (có thể vài năm hoặc vài chục năm mới đạt được kết quả hội tụ).
      + Tại sao learning rate có thể thay đổi: Một rule of thumb trong việc chọn máy học hiệu quả như const/(số lần lặp)

      Thích

      1. Em đã comment “vì em tưởng learning rate nó là do mình gán, chứ liên quan gì đến gradient descent ạ”

        và anh cmt “Ý mình muốn nói là việc learning rate thay đổi không phải ý để nói về khái niệm BGD và SGD.” cũng gần như nhau mà

        Thích

        1. À thành thật xin lỗi bạn. Mình tưởng câu: “Có hai loại gradient descent, một loại với fixed learning rate được gọi là batch gradient descent, loại còn lại có learning rate thay đổi theo quá trình huấn luyện được gọi là SGD (stochastic gradient descent) hay minibatch gradient descent. ” là bạn nói. Tại mình chưa đọc hết bài viết. Nhìn lên mới thấy câu này trong bài viết của anh ấy :). Mình xin xác nhận là bạn đã hiểu đúng.
          Anh @ongxuanhong có lẽ đã hiểu nhầm khái niệm rồi 🙂

          Thích

  2. Anh cho em hỏi, tham số “pred_func” truyền vào của hàm “plot_decision_boundary()” ở ví dụ Logistic Regression anh dùng là gì vậy ạ? Em không tìm thấy đoạn anh gọi hàm này ra. Em cảm ơn ạ!

    Thích

      1. Dạ, xin lỗi anh, tại em vẫn chưa hiểu. Lệnh ở mục chạy thực nghiệm là dành cho Neural Network chứ không phải cho Logistic Regression ạ. Em thử chạy rồi nhưng không được.

        Thích

        1. Dành cho bạn nào mới tìm hiểu và có thắc mắc giống mình. Thêm đoạn code gọi hàm này sẽ chạy được:
          # Train the logistic rgeression classifier
          clf = sklearn.linear_model.LogisticRegressionCV()
          clf.fit(X, y)

          # Plot the decision boundary
          plot_decision_boundary(lambda x: clf.predict(x))
          plt.title(“Logistic Regression”)

          Thích

    1. Nếu tập dữ liệu của bạn là khả phân (separateble – xem thêm VC dimension) thì bạn không cần hidden layer nào, thậm chí các thuật toán khác cũng có thể thực hiện công việc phân lớp rất tốt.
      Thông thường để bắt đầu, bạn có thể chọn số hidden layer là 1, số lượng node là trung bình giữa input và output, nghĩa là n_hidden_node = |n_feature_input – k_feature_output|/2. Sau đó, tăng dần lên hoặc giảm xuống để theo dõi kết quả.
      Hoặc bạn có thể sử dụng công thức sau:
      N_h = N_s/ (alpha * (N_i + N_o).
      N_i = số node input
      N_o = số node output
      N_s = số lượng mẫu training
      alpha = hằng số bias (thường chọn từ 2 – 10)
      Nguyên lý ở chỗ, số lượng node càng ít thì mô hình dễ bị underfitting, ngược lại sẽ bị overfitting và dữ liệu train của bạn không đủ để fitting kiến trúc này.
      Ngoài ra, bạn có thể áp dụng nhiều phương pháp khác để tối ưu hoá mô hình: thử nghiệm các activate function khác nhau, dropout các node một cách ngẫu nhiên ở mỗi vòng lặp, hoặc kĩ thuật pruning neural network,…

      Thích

  3. Cám ơn bài viết hữu ích của anh.
    Cho em hỏi nếu số input node của em tăng là 4 và output node là 3 thì code có thay đổi gì khác ngoài việc khai báo số lượng mảng không?

    Thích

      1. Nếu mình muốn làm hệ thống dự đoán khi nào mua/bán/hold stock dựa vào dữ liệu input là low price, high price, volume thì có dùng cách trên được ko anh?

        Thích

        1. được em, tuy nhiên với chỉ 4 feature thì anh nghĩ là quá nhỏ để NN có thể predict chính xác. Em cần nhiều feature hơn ngoài low/high/volume có thể là moving average 10/12/26, score from news, financial balancing, fibonacci, etc.

          Thích

            1. em có thể search từ khoá “deep leanring + stock prediction” ở google hoac google scholar. hoặc tham khảo một số link bên dưới nhé.
              https://scholar.google.com.vn/scholar?hl=en&as_sdt=0%2C5&q=deep+learning+%2B+stock+prediction&btnG=

              View at Medium.com

              View at Medium.com

              ngoài ra, em có thể tham khảo thêm Markov chain Monte Carlo simulation
              https://blog.stata.com/2016/11/15/introduction-to-bayesian-statistics-part-2-mcmc-and-the-metropolis-hastings-algorithm/

              Thích

Trả lời

Điền thông tin vào ô dưới đây hoặc nhấn vào một biểu tượng để đăng nhập:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Đăng xuất /  Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Đăng xuất /  Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Đăng xuất /  Thay đổi )

Connecting to %s