Học sâu Python - Hướng dẫn nhanh
Học có cấu trúc sâu hay học theo thứ bậc hay nói ngắn gọn là học sâu là một phần của dòng phương pháp học máy, bản thân chúng là một tập con của lĩnh vực Trí tuệ nhân tạo rộng lớn hơn.
Học sâu là một lớp thuật toán máy học sử dụng một số lớp đơn vị xử lý phi tuyến để trích xuất và chuyển đổi tính năng. Mỗi lớp kế tiếp sử dụng đầu ra từ lớp trước đó làm đầu vào.
Mạng thần kinh sâu, mạng tín ngưỡng sâu và mạng thần kinh lặp lại đã được áp dụng cho các lĩnh vực như thị giác máy tính, nhận dạng giọng nói, xử lý ngôn ngữ tự nhiên, nhận dạng âm thanh, lọc mạng xã hội, dịch máy và tin sinh học nơi chúng tạo ra kết quả tương đương và trong một số trường hợp tốt hơn các chuyên gia con người có.
Mạng và thuật toán học sâu -
dựa trên việc học tập không có giám sát của nhiều cấp độ của các tính năng hoặc các đại diện của dữ liệu. Các tính năng cấp cao hơn được lấy từ các tính năng cấp thấp hơn để tạo thành biểu diễn phân cấp.
sử dụng một số hình thức giảm độ dốc để đào tạo.
Trong chương này, chúng ta sẽ tìm hiểu về môi trường được thiết lập cho Python Deep Learning. Chúng ta phải cài đặt phần mềm sau để tạo các thuật toán học sâu.
- Python 2.7+
- Scipy với Numpy
- Matplotlib
- Theano
- Keras
- TensorFlow
Chúng tôi khuyên bạn nên cài đặt Python, NumPy, SciPy và Matplotlib thông qua bản phân phối Anaconda. Nó đi kèm với tất cả các gói đó.
Chúng tôi cần đảm bảo rằng các loại phần mềm khác nhau được cài đặt đúng cách.
Chúng ta hãy vào chương trình dòng lệnh của mình và nhập lệnh sau:
$ python
Python 3.6.3 |Anaconda custom (32-bit)| (default, Oct 13 2017, 14:21:34)
[GCC 7.2.0] on linux
Tiếp theo, chúng tôi có thể nhập các thư viện được yêu cầu và in các phiên bản của chúng -
import numpy
print numpy.__version__
Đầu ra
1.14.2
Cài đặt Theano, TensorFlow và Keras
Trước khi bắt đầu cài đặt các gói - Theano, TensorFlow và Keras, chúng tôi cần xác nhận xem pipđược cài đặt. Hệ thống quản lý gói trong Anaconda được gọi là pip.
Để xác nhận việc cài đặt pip, hãy nhập nội dung sau vào dòng lệnh:
$ pip
Khi quá trình cài đặt pip được xác nhận, chúng ta có thể cài đặt TensorFlow và Keras bằng cách thực hiện lệnh sau:
$pip install theano $pip install tensorflow
$pip install keras
Xác nhận việc cài đặt Theano bằng cách thực hiện dòng mã sau:
$python –c “import theano: print (theano.__version__)”
Đầu ra
1.0.1
Xác nhận cài đặt Tensorflow bằng cách thực hiện dòng mã sau:
$python –c “import tensorflow: print tensorflow.__version__”
Đầu ra
1.7.0
Xác nhận cài đặt Keras bằng cách thực hiện dòng mã sau:
$python –c “import keras: print keras.__version__”
Using TensorFlow backend
Đầu ra
2.1.5
Trí tuệ nhân tạo (AI) là bất kỳ mã, thuật toán hoặc kỹ thuật nào cho phép máy tính bắt chước hành vi nhận thức hoặc trí thông minh của con người. Học máy (ML) là một tập hợp con của AI sử dụng các phương pháp thống kê để cho phép máy móc học hỏi và cải thiện theo kinh nghiệm. Học sâu là một tập hợp con của Học máy, giúp tính toán các mạng nơ-ron nhiều lớp khả thi. Học máy được coi là học nông trong khi Học sâu được coi là học phân cấp với trừu tượng.
Học máy liên quan đến một loạt các khái niệm. Các khái niệm được liệt kê dưới đây -
- supervised
- unsupervised
- học tăng cường
- hồi quy tuyến tính
- hàm chi phí
- overfitting
- under-fitting
- siêu tham số, v.v.
Trong học tập có giám sát, chúng ta học cách dự đoán các giá trị từ dữ liệu được gắn nhãn. Một kỹ thuật ML giúp ích ở đây là phân loại, trong đó các giá trị đích là các giá trị rời rạc; ví dụ, mèo và chó. Một kỹ thuật khác trong học máy có thể hữu ích là hồi quy. Hồi quy hoạt động trên các giá trị mục tiêu. Các giá trị mục tiêu là các giá trị liên tục; ví dụ, dữ liệu thị trường chứng khoán có thể được phân tích bằng Regression.
Trong học tập không có giám sát, chúng tôi đưa ra các suy luận từ dữ liệu đầu vào không được gắn nhãn hoặc cấu trúc. Nếu chúng ta có một triệu hồ sơ y tế và chúng ta phải hiểu rõ về nó, tìm ra cấu trúc cơ bản, những điểm bất thường hoặc phát hiện những bất thường, chúng ta sử dụng kỹ thuật phân cụm để chia dữ liệu thành các cụm rộng.
Tập dữ liệu được chia thành tập huấn luyện, tập thử nghiệm, tập xác nhận, v.v.
Một bước đột phá vào năm 2012 đã đưa khái niệm Học sâu trở nên nổi bật. Một thuật toán đã phân loại thành công 1 triệu hình ảnh thành 1000 loại bằng cách sử dụng 2 GPU và các công nghệ mới nhất như Dữ liệu lớn.
Liên quan đến Học sâu và Học máy truyền thống
Một trong những thách thức lớn gặp phải trong các mô hình học máy truyền thống là một quá trình được gọi là trích xuất tính năng. Lập trình viên cần phải cụ thể và cho máy tính biết các tính năng cần chú ý. Những tính năng này sẽ giúp đưa ra quyết định.
Nhập dữ liệu thô vào thuật toán hiếm khi hoạt động, vì vậy trích xuất tính năng là một phần quan trọng của quy trình học máy truyền thống.
Điều này đặt ra trách nhiệm rất lớn cho người lập trình và hiệu quả của thuật toán phụ thuộc rất nhiều vào khả năng sáng tạo của người lập trình. Đối với các vấn đề phức tạp như nhận dạng đối tượng hoặc nhận dạng chữ viết tay, đây là một vấn đề rất lớn.
Học sâu, với khả năng tìm hiểu nhiều lớp biểu diễn, là một trong số ít các phương pháp giúp chúng ta khai thác tính năng tự động. Các lớp thấp hơn có thể được coi là thực hiện trích xuất tính năng tự động, yêu cầu ít hoặc không cần hướng dẫn của người lập trình.
Mạng nơ ron nhân tạo, hay gọi tắt là mạng nơ ron không phải là một ý tưởng mới. Nó đã được khoảng 80 năm.
Mãi cho đến năm 2011, khi Deep Neural Networks trở nên phổ biến với việc sử dụng các kỹ thuật mới, tính sẵn có của bộ dữ liệu khổng lồ và máy tính mạnh mẽ.
Một mạng lưới thần kinh bắt chước một tế bào thần kinh, có các đuôi gai, một hạt nhân, sợi trục và sợi trục tận cùng.
Đối với một mạng, chúng ta cần hai tế bào thần kinh. Những tế bào thần kinh này truyền thông tin qua khớp thần kinh giữa các đuôi gai của một sợi trục này và sợi trục tận cùng của một sợi trục thần kinh khác.
Một mô hình có thể xảy ra của một tế bào thần kinh nhân tạo trông như thế này -
Mạng nơ-ron sẽ giống như hình dưới đây:
Các vòng tròn là các nơ-ron hoặc các nút, với các chức năng của chúng trên dữ liệu và các đường / cạnh kết nối chúng là trọng số / thông tin được truyền đi.
Mỗi cột là một lớp. Lớp đầu tiên của dữ liệu của bạn là lớp đầu vào. Sau đó, tất cả các lớp giữa lớp đầu vào và lớp đầu ra là các lớp ẩn.
Nếu bạn có một hoặc một vài lớp ẩn, thì bạn có một mạng nơron nông. Nếu bạn có nhiều lớp ẩn, thì bạn có một mạng lưới thần kinh sâu.
Trong mô hình này, bạn có dữ liệu đầu vào, bạn cân nó và chuyển nó qua hàm trong nơ-ron được gọi là hàm ngưỡng hoặc hàm kích hoạt.
Về cơ bản, nó là tổng của tất cả các giá trị sau khi so sánh nó với một giá trị nhất định. Nếu bạn kích hoạt một tín hiệu, thì kết quả là (1) hết, hoặc không có gì được bắn ra, thì (0). Điều đó sau đó được tính trọng số và được chuyển đến nơ-ron tiếp theo, và cùng một loại chức năng được chạy.
Chúng ta có thể có một hàm sigmoid (s-shape) làm hàm kích hoạt.
Đối với các trọng số, chúng chỉ là ngẫu nhiên bắt đầu và chúng là duy nhất cho mỗi đầu vào vào nút / nơ-ron.
Trong "nguồn cấp dữ liệu chuyển tiếp" điển hình, loại mạng nơ-ron cơ bản nhất, bạn có thông tin của mình được truyền thẳng qua mạng bạn đã tạo và bạn so sánh kết quả với những gì bạn hy vọng đầu ra sẽ sử dụng dữ liệu mẫu của mình.
Từ đây, bạn cần điều chỉnh trọng lượng để giúp bạn có được đầu ra phù hợp với sản lượng mong muốn.
Hành động gửi dữ liệu trực tiếp qua mạng nơron được gọi là feed forward neural network.
Dữ liệu của chúng tôi đi từ đầu vào, đến các lớp, theo thứ tự, sau đó đến đầu ra.
Khi chúng ta quay ngược lại và bắt đầu điều chỉnh trọng lượng để giảm thiểu tổn thất / chi phí, điều này được gọi là back propagation.
Đây là optimization problem. Với mạng nơ-ron, trong thực tế, chúng ta phải xử lý hàng trăm nghìn biến, hoặc hàng triệu, hoặc nhiều hơn.
Giải pháp đầu tiên là sử dụng gradient descent ngẫu nhiên làm phương pháp tối ưu hóa. Bây giờ, có các tùy chọn như AdaGrad, Adam Optimizer, v.v. Dù bằng cách nào, đây là một hoạt động tính toán lớn. Đó là lý do tại sao Mạng thần kinh hầu như bị bỏ lại trên giá trong hơn nửa thế kỷ. Chỉ rất gần đây, chúng tôi thậm chí còn có sức mạnh và kiến trúc trong máy của mình để xem xét thực hiện các hoạt động này và các tập dữ liệu có kích thước phù hợp để khớp.
Đối với các nhiệm vụ phân loại đơn giản, mạng nơ ron có hiệu suất tương đối gần với các thuật toán đơn giản khác như K Nearest Neighbors. Tiện ích thực sự của mạng nơ-ron được thực hiện khi chúng ta có dữ liệu lớn hơn nhiều và các câu hỏi phức tạp hơn nhiều, cả hai đều vượt trội hơn các mô hình học máy khác.
Mạng nơron sâu (DNN) là một ANN có nhiều lớp ẩn giữa các lớp đầu vào và đầu ra. Tương tự như các ANN nông, các DNN có thể mô hình hóa các mối quan hệ phi tuyến tính phức tạp.
Mục đích chính của mạng nơ-ron là nhận một tập hợp các đầu vào, thực hiện các phép tính phức tạp dần trên chúng và đưa ra đầu ra để giải quyết các vấn đề trong thế giới thực như phân loại. Chúng tôi hạn chế bản thân để cung cấp các mạng nơ-ron chuyển tiếp.
Chúng ta có đầu vào, đầu ra và luồng dữ liệu tuần tự trong một mạng sâu.
Mạng nơ ron được sử dụng rộng rãi trong các vấn đề học tập có giám sát và học tập củng cố. Các mạng này dựa trên một tập hợp các lớp được kết nối với nhau.
Trong học sâu, số lượng các lớp ẩn, chủ yếu là phi tuyến tính, có thể lớn; nói khoảng 1000 lớp.
Các mô hình DL tạo ra kết quả tốt hơn nhiều so với mạng ML bình thường.
Chúng tôi chủ yếu sử dụng phương pháp giảm dần độ dốc để tối ưu hóa mạng và giảm thiểu hàm mất mát.
Chúng ta có thể sử dụng Imagenet, một kho lưu trữ hàng triệu hình ảnh kỹ thuật số để phân loại một tập dữ liệu thành các loại như mèo và chó. Lưới DL ngày càng được sử dụng nhiều hơn cho các hình ảnh động ngoài những hình ảnh tĩnh và để phân tích chuỗi thời gian và văn bản.
Đào tạo tập dữ liệu là một phần quan trọng của mô hình Học sâu. Ngoài ra, Backpropagation là thuật toán chính trong đào tạo các mô hình DL.
DL đề cập đến việc đào tạo các mạng nơron lớn với các phép biến đổi đầu ra đầu vào phức tạp.
Một ví dụ về DL là ánh xạ một bức ảnh với tên của (những) người trong ảnh như họ làm trên mạng xã hội và mô tả bức ảnh bằng một cụm từ là một ứng dụng gần đây khác của DL.
Mạng nơron là các hàm có các đầu vào như x1, x2, x3… được chuyển đổi thành các đầu ra như z1, z2, z3, v.v. trong hai (mạng nông) hoặc một số hoạt động trung gian còn được gọi là lớp (mạng sâu).
Trọng số và độ lệch thay đổi theo từng lớp. 'w' và 'v' là trọng số hoặc khớp thần kinh của các lớp của mạng nơ-ron.
Trường hợp sử dụng tốt nhất của học sâu là vấn đề học có giám sát. Ở đây, chúng ta có một bộ dữ liệu đầu vào lớn với một bộ đầu ra mong muốn.
Ở đây chúng tôi áp dụng thuật toán lan truyền ngược để có được dự đoán đầu ra chính xác.
Bộ dữ liệu cơ bản nhất của học sâu là MNIST, một bộ dữ liệu gồm các chữ số viết tay.
Chúng tôi có thể đào tạo sâu về Mạng nơron hợp pháp với Keras để phân loại hình ảnh của các chữ số viết tay từ tập dữ liệu này.
Việc kích hoạt hoặc kích hoạt bộ phân loại mạng thần kinh tạo ra điểm số. Ví dụ, để phân loại bệnh nhân là bệnh tật và khỏe mạnh, chúng tôi xem xét các thông số như chiều cao, cân nặng và nhiệt độ cơ thể, huyết áp, v.v.
Điểm cao có nghĩa là bệnh nhân bị ốm và điểm thấp có nghĩa là anh ta khỏe mạnh.
Mỗi nút trong đầu ra và các lớp ẩn đều có các bộ phân loại riêng. Lớp đầu vào nhận đầu vào và chuyển điểm của nó cho lớp ẩn tiếp theo để kích hoạt thêm và điều này tiếp tục cho đến khi đạt được đầu ra.
Tiến trình này từ đầu vào đến đầu ra từ trái sang phải theo hướng thuận được gọi là forward propagation.
Đường dẫn phân bổ tín dụng (CAP) trong mạng nơ-ron là một chuỗi các phép biến đổi bắt đầu từ đầu vào đến đầu ra. CAP xây dựng các kết nối nhân quả có thể xảy ra giữa đầu vào và đầu ra.
Độ sâu CAP cho một mạng nơ ron chuyển tiếp nguồn cấp dữ liệu nhất định hoặc độ sâu CAP là số lớp ẩn cộng với một khi lớp đầu ra được bao gồm. Đối với các mạng nơ-ron tuần hoàn, trong đó tín hiệu có thể truyền qua một lớp nhiều lần, độ sâu CAP có thể là vô hạn.
Deep Nets và Shallow Nets
Không có ngưỡng độ sâu rõ ràng phân chia học nông và học sâu; nhưng hầu hết đều đồng ý rằng đối với học sâu có nhiều lớp phi tuyến tính, CAP phải lớn hơn hai.
Nút cơ bản trong mạng nơron là một nhận thức bắt chước một nơron trong mạng nơron sinh học. Sau đó, chúng tôi có Nhận thức nhiều lớp hoặc MLP. Mỗi tập hợp đầu vào được sửa đổi bởi một tập hợp các trọng số và độ lệch; mỗi cạnh có một trọng số duy nhất và mỗi nút có một độ lệch duy nhất.
Dự đoán accuracy của một mạng thần kinh phụ thuộc vào weights and biases.
Quá trình cải thiện độ chính xác của mạng nơ-ron được gọi là training. Sản lượng từ lưới chống đỡ phía trước được so sánh với giá trị được biết là chính xác.
Các cost function or the loss function là hiệu giữa sản lượng được tạo ra và sản lượng thực tế.
Mục đích của việc đào tạo là làm cho chi phí đào tạo càng nhỏ càng tốt trên hàng triệu ví dụ đào tạo. Để làm điều này, mạng sẽ điều chỉnh trọng số và độ chệch cho đến khi dự đoán khớp với kết quả chính xác.
Một khi được huấn luyện tốt, mạng lưới thần kinh có khả năng đưa ra dự đoán chính xác mọi lúc.
Khi mô hình trở nên phức tạp và bạn muốn máy tính của mình nhận ra chúng, bạn phải sử dụng mạng nơ-ron. Trong các tình huống mô hình phức tạp như vậy, mạng nơ-ron hoạt động tốt hơn các thuật toán cạnh tranh khác.
Hiện đã có những GPU có thể đào tạo chúng nhanh hơn bao giờ hết. Mạng nơ-ron sâu đã cách mạng hóa lĩnh vực AI
Máy tính đã được chứng minh là tốt trong việc thực hiện các phép tính lặp đi lặp lại và làm theo các hướng dẫn chi tiết nhưng lại không tốt trong việc nhận dạng các mẫu phức tạp.
Nếu có vấn đề về nhận dạng các mẫu đơn giản, thì máy vectơ hỗ trợ (svm) hoặc bộ phân loại hồi quy logistic có thể thực hiện tốt công việc, nhưng do sự phức tạp của các mẫu đơn giản, không có cách nào khác ngoài việc sử dụng mạng nơ-ron sâu.
Do đó, đối với các mẫu phức tạp như khuôn mặt người, các mạng nơ-ron nông sẽ thất bại và không còn cách nào khác ngoài việc sử dụng mạng nơ-ron sâu với nhiều lớp hơn. Lưới sâu có thể thực hiện công việc của chúng bằng cách chia nhỏ các mẫu phức tạp thành các mẫu đơn giản hơn. Ví dụ, mặt người; adeep net sẽ sử dụng các cạnh để phát hiện các bộ phận như môi, mũi, mắt, tai, v.v. và sau đó kết hợp chúng lại với nhau để tạo thành một khuôn mặt người
Độ chính xác của dự đoán đúng đã trở nên chính xác đến mức gần đây tại Thử thách nhận dạng khuôn mẫu của Google, một mạng lưới sâu sắc đã đánh bại một con người.
Ý tưởng về một mạng lưới các perceptron nhiều lớp đã có từ lâu; trong lĩnh vực này, các lưới sâu bắt chước não người. Nhưng một nhược điểm của điều này là chúng mất nhiều thời gian để đào tạo, một hạn chế về phần cứng
Tuy nhiên, các GPU hiệu suất cao gần đây đã có thể đào tạo các lưới sâu như vậy trong vòng một tuần; trong khi cpus nhanh có thể mất vài tuần hoặc có lẽ vài tháng để làm được điều tương tự.
Chọn một mạng lưới sâu
Làm thế nào để chọn một lưới sâu? Chúng tôi phải quyết định xem chúng tôi có đang xây dựng một bộ phân loại hay chúng tôi đang cố gắng tìm các mẫu trong dữ liệu và nếu chúng tôi sẽ sử dụng phương pháp học không giám sát. Để trích xuất các mẫu từ một tập hợp dữ liệu không được gắn nhãn, chúng tôi sử dụng máy Boltzman bị hạn chế hoặc bộ mã hóa tự động.
Hãy xem xét các điểm sau khi chọn lưới sâu:
Để xử lý văn bản, phân tích tình cảm, phân tích cú pháp và nhận dạng thực thể tên, chúng tôi sử dụng mạng tenxơ nơron thuần đệ quy hoặc đệ quy hoặc RNTN;
Đối với bất kỳ mô hình ngôn ngữ nào hoạt động ở cấp độ ký tự, chúng tôi sử dụng mạng lặp lại.
Để nhận dạng hình ảnh, chúng tôi sử dụng mạng tín ngưỡng sâu DBN hoặc mạng tích hợp.
Để nhận dạng đối tượng, chúng tôi sử dụng RNTN hoặc một mạng tích hợp.
Để nhận dạng giọng nói, chúng tôi sử dụng mạng lặp lại.
Nói chung, mạng niềm tin sâu và perceptron nhiều lớp với các đơn vị tuyến tính được chỉnh lưu hoặc RELU đều là những lựa chọn tốt để phân loại.
Đối với phân tích chuỗi thời gian, chúng tôi luôn khuyến nghị sử dụng mạng định kỳ.
Lưới thần kinh đã tồn tại hơn 50 năm; nhưng chỉ bây giờ họ đã trở nên nổi bật. Lý do là họ khó đào tạo; khi chúng ta cố gắng huấn luyện chúng bằng một phương pháp được gọi là truyền ngược, chúng ta gặp phải một vấn đề được gọi là gradient biến mất hoặc bùng nổ. Khi điều đó xảy ra, việc huấn luyện sẽ mất nhiều thời gian hơn và độ chính xác cần phải lùi lại. Khi đào tạo một tập dữ liệu, chúng tôi liên tục tính toán hàm chi phí, là sự khác biệt giữa sản lượng dự đoán và sản lượng thực tế từ một tập hợp dữ liệu đào tạo được gắn nhãn. thu được. Quá trình đào tạo sử dụng một gradient, là tốc độ mà chi phí sẽ thay đổi liên quan đến sự thay đổi của các giá trị trọng lượng hoặc độ chệch.
Mạng Boltzman bị hạn chế hoặc Trình mã tự động - RBN
Vào năm 2006, một bước đột phá đã đạt được trong việc giải quyết vấn đề về độ dốc biến mất. Geoff Hinton đã nghĩ ra một chiến lược mới dẫn đến sự phát triển củaRestricted Boltzman Machine - RBM, lưới hai lớp nông.
Lớp đầu tiên là visible lớp và lớp thứ hai là hiddenlớp. Mỗi nút trong lớp hiển thị được kết nối với mọi nút trong lớp ẩn. Mạng được gọi là bị hạn chế vì không có hai lớp nào trong cùng một lớp được phép chia sẻ kết nối.
Mã tự động là mạng mã hóa dữ liệu đầu vào dưới dạng vectơ. Chúng tạo ra một biểu diễn ẩn hoặc được nén của dữ liệu thô. Các vectơ rất hữu ích trong việc giảm kích thước; vector nén dữ liệu thô thành một số kích thước cơ bản nhỏ hơn. Bộ mã tự động được ghép nối với bộ giải mã, cho phép xây dựng lại dữ liệu đầu vào dựa trên biểu diễn ẩn của nó.
RBM là tương đương toán học của một trình dịch hai chiều. Chuyển tiếp nhận đầu vào và chuyển chúng thành một tập hợp số mã hóa đầu vào. Trong khi đó, một đường chuyền ngược sẽ lấy bộ số này và chuyển chúng trở lại thành các đầu vào được tái tạo. Lưới được đào tạo bài bản sẽ thực hiện việc chống lưng với độ chính xác cao.
Trong cả hai bước, trọng số và độ lệch có vai trò quan trọng; chúng giúp RBM giải mã mối quan hệ qua lại giữa các đầu vào và quyết định đầu vào nào là cần thiết trong việc phát hiện các mẫu. Thông qua chuyển tiếp và chuyển tiếp, RBM được huấn luyện để xây dựng lại đầu vào với các trọng số và độ lệch khác nhau cho đến khi đầu vào và kết cấu ở đó gần nhau nhất có thể. Một khía cạnh thú vị của RBM là dữ liệu không cần phải được dán nhãn. Điều này hóa ra lại rất quan trọng đối với các tập dữ liệu trong thế giới thực như ảnh, video, giọng nói và dữ liệu cảm biến, tất cả đều có xu hướng không được gắn nhãn. Thay vì con người gắn nhãn dữ liệu theo cách thủ công, RBM tự động sắp xếp thông qua dữ liệu; bằng cách điều chỉnh đúng trọng số và độ lệch, RBM có thể trích xuất các tính năng quan trọng và cấu trúc lại đầu vào. RBM là một phần của họ lưới thần kinh trích xuất tính năng, được thiết kế để nhận ra các mẫu vốn có trong dữ liệu. Chúng còn được gọi là bộ mã hóa tự động vì chúng phải mã hóa cấu trúc của chính chúng.
Mạng niềm tin sâu sắc - DBNs
Mạng lưới niềm tin sâu sắc (DBN) được hình thành bằng cách kết hợp các RBM và giới thiệu một phương pháp đào tạo thông minh. Chúng tôi có một mô hình mới cuối cùng giải quyết được vấn đề về độ dốc biến mất. Geoff Hinton đã phát minh ra RBM và Deep Belief Nets để thay thế cho việc truyền ngược.
DBN có cấu trúc tương tự như MLP (Multi-layer perceptron), nhưng rất khác khi được huấn luyện. đó là việc đào tạo cho phép các DBN vượt trội hơn các đối tác nông của chúng
Một DBN có thể được hình dung như một chồng RBM trong đó lớp ẩn của một RBM là lớp có thể nhìn thấy của RBM phía trên nó. RBM đầu tiên được đào tạo để xây dựng lại đầu vào của nó một cách chính xác nhất có thể.
Lớp ẩn của RBM đầu tiên được lấy làm lớp nhìn thấy của RBM thứ hai và RBM thứ hai được huấn luyện bằng cách sử dụng các đầu ra từ RBM đầu tiên. Quá trình này được lặp lại cho đến khi mọi lớp trong mạng được đào tạo.
Trong một DBN, mỗi RBM học toàn bộ đầu vào. DBN hoạt động trên toàn cầu bằng cách tinh chỉnh toàn bộ đầu vào liên tiếp khi mô hình từ từ cải thiện giống như một ống kính máy ảnh từ từ lấy nét một bức ảnh. Một chồng RBM hoạt động tốt hơn một RBM đơn lẻ vì MLP perceptron nhiều lớp hoạt động tốt hơn perceptron đơn lẻ.
Ở giai đoạn này, RBM đã phát hiện ra các mẫu vốn có trong dữ liệu nhưng không có bất kỳ tên hoặc nhãn nào. Để kết thúc quá trình đào tạo DBN, chúng tôi phải giới thiệu các nhãn cho các mẫu và tinh chỉnh mạng bằng cách học có giám sát.
Chúng tôi cần một tập hợp rất nhỏ các mẫu được gắn nhãn để các tính năng và mẫu có thể được liên kết với tên. Tập hợp dữ liệu có nhãn nhỏ này được sử dụng để đào tạo. Tập hợp dữ liệu được gắn nhãn này có thể rất nhỏ khi so sánh với tập dữ liệu gốc.
Trọng số và độ chệch được thay đổi một chút, dẫn đến sự thay đổi nhỏ trong nhận thức của mạng lưới về các mẫu và thường tổng độ chính xác tăng lên một chút.
Quá trình đào tạo cũng có thể được hoàn thành trong một khoảng thời gian hợp lý bằng cách sử dụng GPU cho kết quả rất chính xác so với lưới nông và chúng tôi cũng thấy một giải pháp để làm biến mất vấn đề gradient.
Mạng đối thủ chung - GAN
Mạng lưới đối thủ tạo ra là mạng lưới thần kinh sâu bao gồm hai lưới, đấu một với nhau, do đó có tên "đối thủ".
GAN đã được giới thiệu trong một bài báo do các nhà nghiên cứu tại Đại học Montreal xuất bản vào năm 2014. Chuyên gia AI của Facebook Yann LeCun, đề cập đến GAN, được gọi là đào tạo đối thủ là “ý tưởng thú vị nhất trong 10 năm qua trong ML.”
Tiềm năng của GAN là rất lớn, vì quá trình quét mạng học cách bắt chước bất kỳ sự phân phối dữ liệu nào. GAN có thể được dạy để tạo ra các thế giới song song tương tự như thế giới của chúng ta trong bất kỳ lĩnh vực nào: hình ảnh, âm nhạc, lời nói, văn xuôi. Theo một cách nào đó, họ là những nghệ sĩ robot, và sản lượng của họ khá ấn tượng.
Trong GAN, một mạng nơron, được gọi là trình tạo, tạo ra các cá thể dữ liệu mới, trong khi mạng kia, bộ phân biệt, đánh giá chúng về tính xác thực.
Giả sử chúng tôi đang cố gắng tạo ra các chữ số viết tay giống như những chữ số được tìm thấy trong tập dữ liệu MNIST, được lấy từ thế giới thực. Công việc của bộ phân biệt, khi được hiển thị một thể hiện từ tập dữ liệu MNIST thực, là công nhận chúng là xác thực.
Bây giờ hãy xem xét các bước sau của GAN -
Mạng máy phát nhận đầu vào dưới dạng các số ngẫu nhiên và trả về một hình ảnh.
Hình ảnh được tạo này được cung cấp làm đầu vào cho mạng phân biệt cùng với một luồng hình ảnh được lấy từ tập dữ liệu thực tế.
Bộ phân biệt lấy cả hình ảnh thật và giả và trả về xác suất, một số từ 0 đến 1, với 1 đại diện cho dự đoán về tính xác thực và 0 đại diện cho giả mạo.
Vì vậy, bạn có một vòng phản hồi kép -
Bộ phân biệt nằm trong một vòng phản hồi với sự thật cơ bản của hình ảnh mà chúng ta biết.
Bộ tạo trong một vòng phản hồi với bộ phân biệt.
Mạng thần kinh tái diễn - RNN
RNNMạng nơ-ron chắc chắn trong đó dữ liệu có thể chảy theo bất kỳ hướng nào. Các mạng này được sử dụng cho các ứng dụng như lập mô hình ngôn ngữ hoặc Xử lý ngôn ngữ tự nhiên (NLP).
Khái niệm cơ bản về RNN là sử dụng thông tin tuần tự. Trong một mạng nơron thông thường, người ta cho rằng tất cả các đầu vào và đầu ra là độc lập với nhau. Nếu chúng ta muốn dự đoán từ tiếp theo trong một câu, chúng ta phải biết những từ nào đến trước nó.
Các RNN được gọi là tuần hoàn vì chúng lặp lại cùng một tác vụ cho mọi phần tử của một chuỗi, với đầu ra dựa trên các tính toán trước đó. Do đó, RNN có thể nói là có một “bộ nhớ” ghi lại thông tin về những gì đã được tính toán trước đó. Về lý thuyết, các RNN có thể sử dụng thông tin theo chuỗi rất dài, nhưng trên thực tế, chúng chỉ có thể nhìn lại một vài bước.
Mạng bộ nhớ ngắn hạn dài (LSTM) là RNN được sử dụng phổ biến nhất.
Cùng với Mạng nơ ron phức hợp, RNN đã được sử dụng như một phần của mô hình để tạo mô tả cho hình ảnh không có nhãn. Nó là khá tuyệt vời như thế nào điều này có vẻ hoạt động tốt.
Mạng Neural Sâu Convolutional - CNNs
Nếu chúng ta tăng số lượng lớp trong mạng nơ-ron để làm cho nó sâu hơn, nó sẽ làm tăng độ phức tạp của mạng và cho phép chúng ta mô hình hóa các chức năng phức tạp hơn. Tuy nhiên, số lượng trọng số và độ lệch sẽ tăng lên theo cấp số nhân. Trên thực tế, việc học những vấn đề khó khăn như vậy có thể trở nên bất khả thi đối với các mạng nơ-ron thông thường. Điều này dẫn đến một giải pháp, đó là các mạng nơ-ron tích tụ.
CNN được sử dụng rộng rãi trong thị giác máy tính; cũng đã được áp dụng trong mô hình âm thanh để nhận dạng giọng nói tự động.
Ý tưởng đằng sau mạng nơ-ron tích tụ là ý tưởng về một "bộ lọc chuyển động" đi qua hình ảnh. Bộ lọc di chuyển, hoặc tích chập, áp dụng cho một vùng lân cận nhất định của các nút, ví dụ có thể là pixel, trong đó bộ lọc được áp dụng là 0,5 x giá trị nút -
Nhà nghiên cứu nổi tiếng Yann LeCun đã đi tiên phong trong các mạng nơ-ron phức hợp. Facebook là phần mềm nhận dạng khuôn mặt sử dụng các mạng này. CNN đã trở thành giải pháp cho các dự án thị giác máy. Có nhiều lớp đối với một mạng phức hợp. Trong thử thách Imagenet, một cỗ máy đã có thể đánh bại con người khi nhận dạng vật thể vào năm 2015.
Nói tóm lại, Mạng nơ-ron hợp pháp (CNN) là mạng nơ-ron nhiều lớp. Các lớp đôi khi lên đến 17 hoặc nhiều hơn và giả sử dữ liệu đầu vào là hình ảnh.
CNN giảm đáng kể số lượng các thông số cần được điều chỉnh. Vì vậy, CNN xử lý hiệu quả độ lớn của hình ảnh thô.
Trong chương này, chúng ta sẽ xem xét các nguyên tắc cơ bản của Học sâu Python.
Mô hình / thuật toán học sâu
Bây giờ chúng ta hãy tìm hiểu về các mô hình / thuật toán học sâu khác nhau.
Một số mô hình phổ biến trong học sâu như sau:
- Mạng nơ-ron hợp hiến
- Mạng nơron lặp lại
- Mạng lưới niềm tin sâu sắc
- Mạng lưới đối thủ chung
- Bộ mã hóa tự động, v.v.
Các đầu vào và đầu ra được biểu diễn dưới dạng vectơ hoặc tenxơ. Ví dụ, một mạng nơ-ron có thể có các đầu vào trong đó các giá trị RGB pixel riêng lẻ trong một hình ảnh được biểu diễn dưới dạng vectơ.
Các lớp tế bào thần kinh nằm giữa lớp đầu vào và lớp đầu ra được gọi là lớp ẩn. Đây là nơi mà hầu hết công việc xảy ra khi mạng lưới thần kinh cố gắng giải quyết các vấn đề. Xem xét kỹ hơn các lớp ẩn có thể tiết lộ rất nhiều về các tính năng mà mạng đã học được để trích xuất từ dữ liệu.
Các kiến trúc khác nhau của mạng nơ-ron được hình thành bằng cách chọn nơ-ron nào để kết nối với các nơ-ron khác trong lớp tiếp theo.
Mã giả để tính toán đầu ra
Sau đây là mã giả để tính toán đầu ra của Forward-propagating Neural Network -
- # node []: = mảng các nút được sắp xếp theo cấu trúc liên kết
- # Cạnh từ a đến b nghĩa là a nằm bên trái b
- # Nếu Mạng thần kinh có đầu vào R và đầu ra S,
- # thì R nút đầu tiên là nút đầu vào và nút S cuối cùng là nút đầu ra.
- # đến [x]: = nút được kết nối với nút x
- # weight [x]: = trọng số của các cạnh đến x
Đối với mỗi nơron x, từ trái sang phải -
- nếu x <= R: không làm gì # nó là một nút đầu vào
- đầu vào [x] = [đầu ra [i] cho tôi trong [x]]
- weighted_sum = dot_product (weights [x], input [x])
- output [x] = Kích hoạt_ chức năng (weighted_sum)
Bây giờ chúng ta sẽ học cách đào tạo một mạng nơ-ron. Chúng ta cũng sẽ tìm hiểu thuật toán lan truyền ngược và truyền ngược trong Python Deep Learning.
Chúng ta phải tìm các giá trị tối ưu của trọng số của mạng nơ-ron để có được đầu ra mong muốn. Để đào tạo một mạng nơron, chúng tôi sử dụng phương pháp giảm dần gradient lặp đi lặp lại. Chúng tôi bắt đầu ban đầu với việc khởi tạo ngẫu nhiên các trọng số. Sau khi khởi tạo ngẫu nhiên, chúng tôi đưa ra dự đoán trên một số tập hợp con của dữ liệu với quá trình truyền chuyển tiếp, tính hàm chi phí tương ứng C và cập nhật mỗi trọng số w một lượng tỷ lệ với dC / dw, tức là, đạo hàm của các hàm chi phí wrt the cân nặng. Hằng số tỷ lệ được gọi là tỷ lệ học tập.
Các gradient có thể được tính toán một cách hiệu quả bằng cách sử dụng thuật toán lan truyền ngược. Quan sát quan trọng của sự lan truyền ngược hoặc hỗ trợ lùi là do quy luật chuỗi phân biệt, gradient tại mỗi nơron trong mạng nơron có thể được tính toán bằng cách sử dụng gradient tại các nơron, nó có các cạnh đi ra. Do đó, chúng tôi tính toán gradient ngược lại, tức là, đầu tiên tính toán gradient của lớp đầu ra, sau đó là lớp ẩn trên cùng, tiếp theo là lớp ẩn trước, v.v., kết thúc ở lớp đầu vào.
Thuật toán lan truyền ngược được thực hiện chủ yếu bằng cách sử dụng ý tưởng của một đồ thị tính toán, trong đó mỗi nơ-ron được mở rộng thành nhiều nút trong đồ thị tính toán và thực hiện một phép toán đơn giản như cộng, nhân. Đồ thị tính toán không có bất kỳ trọng số nào trên các cạnh; tất cả các trọng số được gán cho các nút, vì vậy các trọng số trở thành các nút riêng của chúng. Thuật toán lan truyền ngược sau đó được chạy trên đồ thị tính toán. Sau khi tính toán hoàn tất, chỉ cần cập nhật các gradient của các nút trọng số. Phần còn lại của gradient có thể được loại bỏ.
Kỹ thuật tối ưu hóa Gradient Descent
Một chức năng tối ưu hóa thường được sử dụng để điều chỉnh trọng số theo lỗi mà chúng gây ra được gọi là “gradient descent”.
Gradient là một tên gọi khác của độ dốc và độ dốc, trên đồ thị xy, biểu thị cách hai biến số có liên quan với nhau: sự gia tăng khi chạy, sự thay đổi về khoảng cách so với sự thay đổi của thời gian, v.v. Trong trường hợp này, độ dốc là tỷ lệ giữa sai số của mạng và một trọng số duy nhất; tức là, sai số thay đổi như thế nào khi trọng lượng thay đổi.
Nói một cách chính xác hơn, chúng tôi muốn tìm trọng lượng nào tạo ra ít lỗi nhất. Chúng tôi muốn tìm trọng số thể hiện chính xác các tín hiệu có trong dữ liệu đầu vào và chuyển chúng sang một phân loại chính xác.
Khi mạng nơ-ron học hỏi, nó từ từ điều chỉnh nhiều trọng số để chúng có thể ánh xạ tín hiệu thành ý nghĩa một cách chính xác. Tỷ lệ giữa Lỗi mạng và mỗi trọng số đó là một đạo hàm, dE / dw tính toán mức độ mà một thay đổi nhỏ trong trọng số gây ra một thay đổi nhỏ trong lỗi.
Mỗi trọng số chỉ là một yếu tố trong mạng lưới sâu bao gồm nhiều biến đổi; tín hiệu của trọng lượng truyền qua các lần kích hoạt và tính tổng qua một số lớp, vì vậy chúng tôi sử dụng quy tắc chuỗi của phép tính để hoạt động trở lại thông qua các kích hoạt và kết quả mạng. Điều này dẫn chúng ta đến trọng số được đề cập và mối quan hệ của nó với sai số tổng thể.
Với hai biến, lỗi và trọng số, được điều chỉnh bởi một biến thứ ba, activation, qua đó trọng lượng được chuyển qua. Trước tiên, chúng ta có thể tính toán cách một thay đổi về trọng lượng ảnh hưởng đến sự thay đổi trong lỗi bằng cách tính toán cách một thay đổi trong kích hoạt ảnh hưởng đến thay đổi trong Lỗi và cách thay đổi trọng lượng ảnh hưởng đến thay đổi trong kích hoạt.
Ý tưởng cơ bản trong học sâu không gì khác ngoài điều đó: điều chỉnh trọng lượng của mô hình để đáp ứng với lỗi mà nó tạo ra, cho đến khi bạn không thể giảm lỗi nữa.
Deep net đào chậm nếu giá trị gradient nhỏ và nhanh nếu giá trị cao. Mọi sai sót trong đào tạo đều dẫn đến kết quả đầu ra không chính xác. Quá trình huấn luyện lưới từ đầu ra trở lại đầu vào được gọi là lan truyền ngược hoặc hỗ trợ ngược. Chúng tôi biết rằng quá trình lan truyền chuyển tiếp bắt đầu với đầu vào và hoạt động về phía trước. Back prop thực hiện tính toán ngược / ngược lại gradient từ phải sang trái.
Mỗi khi chúng tôi tính toán một gradient, chúng tôi sử dụng tất cả các gradient trước đó cho đến thời điểm đó.
Chúng ta hãy bắt đầu tại một nút trong lớp đầu ra. Cạnh sử dụng gradient tại nút đó. Khi chúng ta quay trở lại các lớp ẩn, nó trở nên phức tạp hơn. Tích của hai số từ 0 đến 1 cho bạn một số nhỏ hơn. Giá trị gradient tiếp tục nhỏ hơn và kết quả là việc hỗ trợ trở lại mất rất nhiều thời gian để đào tạo và độ chính xác bị ảnh hưởng.
Những thách thức trong thuật toán học sâu
Có những thách thức nhất định đối với cả mạng nơ-ron nông và mạng nơ-ron sâu, như trang bị quá mức và thời gian tính toán. DNN bị ảnh hưởng bởi việc trang bị quá nhiều vì việc sử dụng các lớp trừu tượng được bổ sung cho phép chúng mô hình hóa các phần phụ thuộc hiếm gặp trong dữ liệu huấn luyện.
Regularizationcác phương pháp như bỏ học, dừng sớm, tăng dữ liệu, học chuyển giao được áp dụng trong quá trình đào tạo để chống lại việc trang bị quá nhiều. Bỏ quy định hóa ngẫu nhiên bỏ qua các đơn vị từ các lớp ẩn trong quá trình đào tạo, giúp tránh các phụ thuộc hiếm gặp. Các DNN xem xét một số tham số huấn luyện như kích thước, tức là số lớp và số lượng đơn vị trên mỗi lớp, tốc độ học và trọng số ban đầu. Việc tìm kiếm các tham số tối ưu không phải lúc nào cũng thực tế do chi phí cao về thời gian và tài nguyên tính toán. Một số thủ thuật như chia lô có thể tăng tốc độ tính toán. Sức mạnh xử lý lớn của GPU đã giúp ích đáng kể cho quá trình đào tạo, vì ma trận và các phép tính vectơ cần thiết được thực thi tốt trên GPU.
Rơi ra ngoài
Bỏ học là một kỹ thuật chính quy hóa phổ biến cho mạng nơ-ron. Mạng nơron sâu đặc biệt dễ bị trang bị quá mức.
Bây giờ chúng ta hãy xem bỏ học là gì và nó hoạt động như thế nào.
Theo lời của Geoffrey Hinton, một trong những người tiên phong của Học sâu, 'Nếu bạn có một mạng lưới thần kinh sâu và nó không quá phù hợp, có lẽ bạn nên sử dụng một mạng lưới lớn hơn và sử dụng tính năng bỏ học'.
Dropout là một kỹ thuật trong đó trong mỗi lần lặp lại quá trình giảm độ dốc, chúng tôi thả một tập hợp các nút được chọn ngẫu nhiên. Điều này có nghĩa là chúng tôi bỏ qua một số nút ngẫu nhiên như thể chúng không tồn tại.
Mỗi nơ-ron được giữ với xác suất q và được thả ngẫu nhiên với xác suất 1-q. Giá trị q có thể khác nhau đối với mỗi lớp trong mạng nơron. Giá trị 0,5 cho các lớp ẩn và 0 cho lớp đầu vào hoạt động tốt trên nhiều tác vụ.
Trong quá trình đánh giá và dự đoán, không có học sinh bỏ học nào được sử dụng. Đầu ra của mỗi nơ-ron được nhân với q để đầu vào của lớp tiếp theo có cùng giá trị mong đợi.
Ý tưởng đằng sau Dropout là như sau - Trong một mạng lưới thần kinh không có sự chính quy của việc bỏ học, các tế bào thần kinh phát triển sự đồng phụ thuộc lẫn nhau dẫn đến quá mức.
Thủ thuật triển khai
Dropout được thực hiện trong các thư viện như TensorFlow và Pytorch bằng cách giữ đầu ra của các nơ-ron được chọn ngẫu nhiên là 0. Nghĩa là, mặc dù nơ-ron tồn tại, đầu ra của nó bị ghi đè là 0.
Dừng sớm
Chúng tôi đào tạo mạng nơron bằng cách sử dụng một thuật toán lặp lại được gọi là gradient descent.
Ý tưởng đằng sau việc dừng xe sớm là trực quan; chúng tôi ngừng đào tạo khi lỗi bắt đầu tăng lên. Ở đây, do lỗi, chúng tôi có nghĩa là lỗi được đo trên dữ liệu xác thực, là một phần của dữ liệu huấn luyện được sử dụng để điều chỉnh các siêu tham số. Trong trường hợp này, siêu tham số là tiêu chí dừng.
Tăng cường dữ liệu
Quá trình chúng tôi tăng lượng dữ liệu chúng tôi có hoặc tăng cường nó bằng cách sử dụng dữ liệu hiện có và áp dụng một số phép biến đổi trên đó. Các phép biến đổi chính xác được sử dụng phụ thuộc vào nhiệm vụ mà chúng ta dự định đạt được. Hơn nữa, các phép biến đổi giúp mạng thần kinh phụ thuộc vào kiến trúc của nó.
Ví dụ, trong nhiều tác vụ thị giác máy tính như phân loại đối tượng, một kỹ thuật tăng dữ liệu hiệu quả là thêm các điểm dữ liệu mới được cắt hoặc phiên bản dịch của dữ liệu gốc.
Khi máy tính chấp nhận một hình ảnh làm đầu vào, nó sẽ nhận một mảng giá trị pixel. Giả sử rằng toàn bộ hình ảnh được dịch chuyển sang trái 15 pixel. Chúng tôi áp dụng nhiều thay đổi khác nhau theo các hướng khác nhau, dẫn đến một tập dữ liệu tăng cường gấp nhiều lần kích thước của tập dữ liệu gốc.
Chuyển giao học tập
Quá trình lấy một mô hình được đào tạo trước và “tinh chỉnh” mô hình bằng tập dữ liệu của riêng chúng tôi được gọi là học chuyển giao. Có một số cách để thực hiện việc này. Một số cách được mô tả dưới đây:
Chúng tôi đào tạo mô hình được đào tạo trước trên một tập dữ liệu lớn. Sau đó, chúng tôi loại bỏ lớp cuối cùng của mạng và thay thế bằng một lớp mới có trọng số ngẫu nhiên.
Sau đó, chúng tôi đóng băng trọng số của tất cả các lớp khác và đào tạo mạng bình thường. Ở đây, việc đóng băng các lớp sẽ không thay đổi trọng lượng trong quá trình giảm độ dốc hoặc tối ưu hóa.
Khái niệm đằng sau điều này là mô hình được đào tạo trước sẽ hoạt động như một trình trích xuất tính năng và chỉ lớp cuối cùng sẽ được đào tạo về tác vụ hiện tại.
Backpropagation được thực hiện trong các khuôn khổ học sâu như Tensorflow, Torch, Theano, v.v., bằng cách sử dụng đồ thị tính toán. Quan trọng hơn, hiểu được sự lan truyền ngược trên đồ thị tính toán kết hợp một số thuật toán khác nhau và các biến thể của nó như backprop theo thời gian và backprop với trọng số được chia sẻ. Một khi mọi thứ được chuyển đổi thành một đồ thị tính toán, chúng vẫn là một thuật toán giống nhau - chỉ là sự lan truyền ngược lại trên đồ thị tính toán.
Đồ thị tính toán là gì
Đồ thị tính toán được định nghĩa là đồ thị có hướng trong đó các nút tương ứng với các phép toán. Đồ thị tính toán là một cách thể hiện và đánh giá một biểu thức toán học.
Ví dụ, đây là một phương trình toán học đơn giản -
$$p = x+y$$
Ta có thể vẽ đồ thị tính toán của phương trình trên như sau.
Đồ thị tính toán trên có một nút cộng (nút có dấu "+") với hai biến đầu vào x và y và một đầu ra q.
Hãy để chúng tôi lấy một ví dụ khác, phức tạp hơn một chút. Ta có phương trình sau.
$$g = \left (x+y \right ) \ast z $$
Phương trình trên được biểu diễn bằng đồ thị tính toán sau.
Đồ thị tính toán và sự lan truyền ngược
Đồ thị tính toán và lan truyền ngược, cả hai đều là những khái niệm cốt lõi quan trọng trong học sâu để đào tạo mạng nơ-ron.
Chuyển tiếp qua
Chuyển tiếp là thủ tục đánh giá giá trị của biểu thức toán học được biểu diễn bằng đồ thị tính toán. Thực hiện chuyển tiếp nghĩa là chúng ta đang chuyển giá trị từ các biến theo hướng thuận từ bên trái (đầu vào) sang bên phải nơi có đầu ra.
Chúng ta hãy xem xét một ví dụ bằng cách đưa ra một số giá trị cho tất cả các đầu vào. Giả sử, các giá trị sau được cung cấp cho tất cả các đầu vào.
$$x=1, y=3, z=−3$$
Bằng cách cung cấp các giá trị này cho các đầu vào, chúng ta có thể thực hiện chuyển tiếp và nhận các giá trị sau cho các đầu ra trên mỗi nút.
Đầu tiên, chúng ta sử dụng giá trị của x = 1 và y = 3, để có p = 4.
Sau đó, chúng ta sử dụng p = 4 và z = -3 để có g = -12. Chúng tôi đi từ trái sang phải, chuyển tiếp.
Mục tiêu của Backward Pass
Trong chuyển ngược lại, mục đích của chúng tôi là tính toán độ dốc cho mỗi đầu vào đối với đầu ra cuối cùng. Những gradient này rất cần thiết để đào tạo mạng nơ-ron bằng cách sử dụng gradient descent.
Ví dụ, chúng tôi mong muốn các gradient sau đây.
Gradient mong muốn
$$\frac{\partial x}{\partial f}, \frac{\partial y}{\partial f}, \frac{\partial z}{\partial f}$$
Chuyển ngược (backpropagation)
Chúng tôi bắt đầu chuyển ngược lại bằng cách tìm đạo hàm của đầu ra cuối cùng đối với đầu ra cuối cùng (chính nó!). Do đó, nó sẽ dẫn đến việc lấy ra danh tính và giá trị bằng một.
$$\frac{\partial g}{\partial g} = 1$$
Biểu đồ tính toán của chúng tôi bây giờ trông như hình dưới đây -
Tiếp theo, chúng ta sẽ thực hiện lùi lại thông qua thao tác "*". Chúng tôi sẽ tính toán các gradient tại p và z. Vì g = p * z, chúng ta biết rằng -
$$\frac{\partial g}{\partial z} = p$$
$$\frac{\partial g}{\partial p} = z$$
Chúng ta đã biết các giá trị của z và p từ chuyển tiếp. Do đó, chúng tôi nhận được -
$$\frac{\partial g}{\partial z} = p = 4$$
và
$$\frac{\partial g}{\partial p} = z = -3$$
Chúng tôi muốn tính toán các gradient tại x và y -
$$\frac{\partial g}{\partial x}, \frac{\partial g}{\partial y}$$
Tuy nhiên, chúng tôi muốn làm điều này một cách hiệu quả (mặc dù x và g chỉ cách nhau hai bước trong biểu đồ này, hãy tưởng tượng chúng thực sự cách xa nhau). Để tính toán các giá trị này một cách hiệu quả, chúng tôi sẽ sử dụng quy tắc chuỗi khác biệt. Từ quy tắc chuỗi, chúng tôi có -
$$\frac{\partial g}{\partial x}=\frac{\partial g}{\partial p}\ast \frac{\partial p}{\partial x}$$
$$\frac{\partial g}{\partial y}=\frac{\partial g}{\partial p}\ast \frac{\partial p}{\partial y}$$
Nhưng chúng ta đã biết dg / dp = -3, dp / dx và dp / dy rất dễ dàng vì p phụ thuộc trực tiếp vào x và y. Chúng tôi có -
$$p=x+y\Rightarrow \frac{\partial x}{\partial p} = 1, \frac{\partial y}{\partial p} = 1$$
Do đó, chúng tôi nhận được -
$$\frac{\partial g} {\partial f} = \frac{\partial g} {\partial p}\ast \frac{\partial p} {\partial x} = \left ( -3 \right ).1 = -3$$
Ngoài ra, đối với đầu vào y -
$$\frac{\partial g} {\partial y} = \frac{\partial g} {\partial p}\ast \frac{\partial p} {\partial y} = \left ( -3 \right ).1 = -3$$
Lý do chính để làm điều này ngược lại là khi chúng ta phải tính toán gradient tại x, chúng ta chỉ sử dụng các giá trị đã được tính toán và dq / dx (đạo hàm của đầu ra nút đối với đầu vào của cùng một nút). Chúng tôi đã sử dụng thông tin địa phương để tính giá trị toàn cầu.
Các bước đào tạo mạng nơ-ron
Làm theo các bước sau để đào tạo mạng nơ-ron -
Đối với điểm dữ liệu x trong tập dữ liệu, chúng tôi chuyển tiếp với x là đầu vào và tính toán chi phí c là đầu ra.
Chúng tôi thực hiện chuyển lùi bắt đầu từ c, và tính toán độ dốc cho tất cả các nút trong biểu đồ. Điều này bao gồm các nút đại diện cho trọng số mạng nơ-ron.
Sau đó, chúng tôi cập nhật trọng số bằng cách thực hiện W = W - tỷ lệ học tập * gradient.
Chúng tôi lặp lại quá trình này cho đến khi đáp ứng các tiêu chí dừng.
Học sâu đã tạo ra kết quả tốt cho một số ứng dụng như thị giác máy tính, dịch ngôn ngữ, chú thích hình ảnh, phiên âm âm thanh, sinh học phân tử, nhận dạng giọng nói, xử lý ngôn ngữ tự nhiên, ô tô tự lái, phát hiện khối u não, dịch giọng nói thời gian thực, âm nhạc thành phần, chơi trò chơi tự động, v.v.
Học sâu là bước tiến lớn tiếp theo sau máy học với cách triển khai tiên tiến hơn. Hiện tại, nó đang hướng tới việc trở thành một tiêu chuẩn công nghiệp mang lại một hứa hẹn mạnh mẽ về việc trở thành một người thay đổi cuộc chơi khi xử lý dữ liệu thô phi cấu trúc.
Học sâu hiện là một trong những nhà cung cấp giải pháp tốt nhất cho nhiều vấn đề trong thế giới thực. Các nhà phát triển đang xây dựng các chương trình AI mà thay vì sử dụng các quy tắc đã đưa ra trước đó, hãy học từ các ví dụ để giải quyết các nhiệm vụ phức tạp. Với việc học sâu đang được nhiều nhà khoa học dữ liệu sử dụng, các mạng nơ-ron sâu hơn đang mang lại kết quả chính xác hơn bao giờ hết.
Ý tưởng là phát triển mạng nơ ron sâu bằng cách tăng số lượng lớp đào tạo cho mỗi mạng; máy tìm hiểu thêm về dữ liệu cho đến khi dữ liệu chính xác nhất có thể. Các nhà phát triển có thể sử dụng các kỹ thuật học sâu để triển khai các nhiệm vụ học máy phức tạp và đào tạo mạng AI để có mức độ nhận biết tri giác cao.
Học sâu tìm thấy sự phổ biến của nó trong Thị giác máy tính. Ở đây một trong những nhiệm vụ đạt được là phân loại hình ảnh trong đó các hình ảnh đầu vào nhất định được phân loại thành mèo, chó, v.v. hoặc thành một lớp hoặc nhãn mô tả hình ảnh tốt nhất. Là con người, chúng ta học cách thực hiện nhiệm vụ này rất sớm trong cuộc sống và có những kỹ năng nhanh chóng nhận ra các mẫu, khái quát hóa từ kiến thức trước đây và thích ứng với các môi trường hình ảnh khác nhau.
Trong chương này, chúng ta sẽ liên hệ học sâu với các thư viện và khuôn khổ khác nhau.
Học sâu và Theano
Nếu chúng ta muốn bắt đầu viết mã một mạng nơron sâu, tốt hơn hết chúng ta nên có ý tưởng về cách hoạt động của các framework khác nhau như Theano, TensorFlow, Keras, PyTorch, v.v.
Theano là thư viện python cung cấp một bộ chức năng để xây dựng mạng lưới sâu đào tạo nhanh chóng trên máy của chúng tôi.
Theano được phát triển tại Đại học Montreal, Canada dưới sự lãnh đạo của Yoshua Bengio, một người tiên phong trong lĩnh vực mạng lưới chuyên sâu.
Theano cho phép chúng tôi xác định và đánh giá các biểu thức toán học với các vectơ và ma trận là các dãy số hình chữ nhật.
Về mặt kỹ thuật, cả mạng nơron và dữ liệu đầu vào đều có thể được biểu diễn dưới dạng ma trận và tất cả các hoạt động mạng tiêu chuẩn có thể được định nghĩa lại thành các phép toán ma trận. Điều này rất quan trọng vì máy tính có thể thực hiện các phép toán ma trận rất nhanh.
Chúng tôi có thể xử lý song song nhiều giá trị ma trận và nếu chúng tôi xây dựng một mạng thần kinh với cấu trúc cơ bản này, chúng tôi có thể sử dụng một máy duy nhất có GPU để đào tạo các lưới lớn trong một khoảng thời gian hợp lý.
Tuy nhiên, nếu chúng ta sử dụng Theano, chúng ta phải xây dựng mạng lưới sâu từ mặt đất. Thư viện không cung cấp đầy đủ chức năng để tạo một loại mạng sâu cụ thể.
Thay vào đó, chúng tôi phải viết mã mọi khía cạnh của mạng lưới sâu như mô hình, các lớp, kích hoạt, phương pháp đào tạo và bất kỳ phương pháp đặc biệt nào để ngừng trang bị quá mức.
Tuy nhiên, tin tốt là Theano cho phép xây dựng việc triển khai của chúng tôi trên một loạt các chức năng được vector hóa, cung cấp cho chúng tôi một giải pháp được tối ưu hóa cao.
Có nhiều thư viện khác mở rộng chức năng của Theano. TensorFlow và Keras có thể được sử dụng với Theano làm phụ trợ.
Học sâu với TensorFlow
Googles TensorFlow là một thư viện python. Thư viện này là một lựa chọn tuyệt vời để xây dựng các ứng dụng học sâu cấp thương mại.
TensorFlow phát triển từ một thư viện DistBelief V2 khác, một phần của Dự án Google Brain. Thư viện này nhằm mục đích mở rộng tính di động của học máy để các mô hình nghiên cứu có thể được áp dụng cho các ứng dụng cấp thương mại.
Giống như thư viện Theano, TensorFlow dựa trên đồ thị tính toán trong đó một nút biểu thị dữ liệu liên tục hoặc hoạt động toán học và các cạnh biểu thị luồng dữ liệu giữa các nút, là một mảng hoặc tensor đa chiều; do đó có tên là TensorFlow
Đầu ra từ một hoạt động hoặc một tập hợp các hoạt động được đưa vào làm đầu vào cho hoạt động tiếp theo.
Mặc dù TensorFlow được thiết kế cho các mạng nơ-ron, nhưng nó hoạt động tốt cho các mạng khác nơi tính toán có thể được mô hình hóa dưới dạng biểu đồ luồng dữ liệu.
TensorFlow cũng sử dụng một số tính năng từ Theano như loại bỏ biểu thức chung và biểu thức phụ, tự động phân biệt, các biến được chia sẻ và biểu tượng.
Các loại lưới sâu khác nhau có thể được xây dựng bằng cách sử dụng TensorFlow như lưới chập, Mã tự động, RNTN, RNN, RBM, DBM / MLP, v.v.
Tuy nhiên, không có hỗ trợ cho cấu hình siêu tham số trong TensorFlow, đối với chức năng này, chúng ta có thể sử dụng Keras.
Học sâu và Keras
Keras là một thư viện Python mạnh mẽ, dễ sử dụng để phát triển và đánh giá các mô hình học sâu.
Nó có thiết kế tối giản cho phép chúng ta xây dựng từng lớp một; đào tạo nó và chạy nó.
Nó bao bọc các thư viện tính toán số hiệu quả Theano và TensorFlow và cho phép chúng tôi xác định và đào tạo các mô hình mạng nơ-ron trong một vài dòng mã ngắn.
Nó là một API mạng thần kinh cấp cao, giúp tận dụng rộng rãi học sâu và trí tuệ nhân tạo. Nó chạy trên một số thư viện cấp thấp hơn bao gồm TensorFlow, Theano, v.v. Mã Keras có tính di động; chúng ta có thể triển khai mạng nơ-ron trong Keras bằng cách sử dụng Theano hoặc TensorFlow làm mặt sau mà không có bất kỳ thay đổi nào về mã.
Trong quá trình triển khai Deep learning này, mục tiêu của chúng tôi là dự đoán mức độ tiêu thụ hoặc xáo trộn dữ liệu của khách hàng cho một ngân hàng nhất định - những khách hàng có khả năng rời bỏ dịch vụ ngân hàng này. Tập dữ liệu được sử dụng tương đối nhỏ và chứa 10000 hàng với 14 cột. Chúng tôi đang sử dụng phân phối Anaconda và các khuôn khổ như Theano, TensorFlow và Keras. Keras được xây dựng dựa trên Tensorflow và Theano hoạt động như các phần mềm phụ trợ của nó.
# Artificial Neural Network
# Installing Theano
pip install --upgrade theano
# Installing Tensorflow
pip install –upgrade tensorflow
# Installing Keras
pip install --upgrade keras
Bước 1: Xử lý trước dữ liệu
In[]:
# Importing the libraries
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
# Importing the database
dataset = pd.read_csv('Churn_Modelling.csv')
Bước 2
Chúng tôi tạo ma trận các tính năng của tập dữ liệu và biến mục tiêu, là cột 14, được gắn nhãn là “Đã thoát”.
Giao diện ban đầu của dữ liệu như hình dưới đây:
In[]:
X = dataset.iloc[:, 3:13].values
Y = dataset.iloc[:, 13].values
X
Đầu ra
Bước 3
Y
Đầu ra
array([1, 0, 1, ..., 1, 1, 0], dtype = int64)
Bước 4
Chúng tôi làm cho phân tích đơn giản hơn bằng cách mã hóa các biến chuỗi. Chúng tôi đang sử dụng chức năng ScikitLearn 'LabelEncoder' để tự động mã hóa các nhãn khác nhau trong các cột có giá trị từ 0 đến n_classes-1.
from sklearn.preprocessing import LabelEncoder, OneHotEncoder
labelencoder_X_1 = LabelEncoder()
X[:,1] = labelencoder_X_1.fit_transform(X[:,1])
labelencoder_X_2 = LabelEncoder()
X[:, 2] = labelencoder_X_2.fit_transform(X[:, 2])
X
Đầu ra
Trong kết quả trên, tên quốc gia được thay thế bằng 0, 1 và 2; trong khi nam và nữ được thay thế bằng 0 và 1.
Bước 5
Labelling Encoded Data
Chúng tôi sử dụng cùng một ScikitLearn thư viện và một chức năng khác được gọi là OneHotEncoder để chỉ chuyển số cột tạo ra một biến giả.
onehotencoder = OneHotEncoder(categorical features = [1])
X = onehotencoder.fit_transform(X).toarray()
X = X[:, 1:]
X
Bây giờ, 2 cột đầu tiên đại diện cho quốc gia và cột thứ 4 đại diện cho giới tính.
Đầu ra
Chúng tôi luôn chia dữ liệu của mình thành phần đào tạo và phần kiểm tra; chúng tôi đào tạo mô hình của mình trên dữ liệu đào tạo và sau đó chúng tôi kiểm tra độ chính xác của mô hình trên dữ liệu thử nghiệm giúp đánh giá hiệu quả của mô hình.
Bước 6
Chúng tôi đang sử dụng ScikitLearn's train_test_splitchức năng chia dữ liệu của chúng tôi thành tập huấn luyện và tập kiểm tra. Chúng tôi giữ tỷ lệ phân chia giữa chuyến tàu và bài kiểm tra là 80:20.
#Splitting the dataset into the Training set and the Test Set
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2)
Một số biến có giá trị hàng nghìn trong khi một số biến có giá trị hàng chục hoặc đơn vị. Chúng tôi chia tỷ lệ dữ liệu để chúng mang tính đại diện hơn.
Bước 7
Trong mã này, chúng tôi đang điều chỉnh và chuyển đổi dữ liệu đào tạo bằng cách sử dụng StandardScalerchức năng. Chúng tôi chuẩn hóa quy mô của mình để chúng tôi sử dụng cùng một phương pháp phù hợp để chuyển đổi / chia tỷ lệ dữ liệu thử nghiệm.
# Feature Scaling
fromsklearn.preprocessing import StandardScaler
sc = StandardScaler()
X_train = sc.fit_transform(X_train)
X_test = sc.transform(X_test)
Đầu ra
Dữ liệu hiện đã được chia tỷ lệ thích hợp. Cuối cùng, chúng tôi đã hoàn tất việc xử lý trước dữ liệu của mình. Bây giờ, chúng ta sẽ bắt đầu với mô hình của mình.
Bước 8
Chúng tôi nhập các Mô-đun cần thiết tại đây. Chúng ta cần mô-đun Tuần tự để khởi tạo mạng nơ-ron và mô-đun dày đặc để thêm các lớp ẩn.
# Importing the Keras libraries and packages
import keras
from keras.models import Sequential
from keras.layers import Dense
Bước 9
Chúng tôi sẽ đặt tên cho mô hình là Bộ phân loại vì mục đích của chúng tôi là phân loại thời gian nghỉ của khách hàng. Sau đó, chúng tôi sử dụng mô-đun Tuần tự để khởi tạo.
#Initializing Neural Network
classifier = Sequential()
Bước 10
Chúng tôi thêm từng lớp ẩn một bằng cách sử dụng hàm dày đặc. Trong đoạn mã dưới đây, chúng ta sẽ thấy nhiều đối số.
Tham số đầu tiên của chúng tôi là output_dim. Nó là số lượng các nút mà chúng tôi thêm vào lớp này.initlà sự khởi tạo của Stochastic Gradient Decent. Trong mạng Neural, chúng tôi gán trọng số cho mỗi nút. Khi khởi tạo, trọng số phải gần bằng 0 và chúng tôi khởi tạo ngẫu nhiên các trọng số bằng cách sử dụng hàm thống nhất. Cácinput_dimchỉ cần tham số cho lớp đầu tiên, vì mô hình không biết số lượng các biến đầu vào của chúng ta. Ở đây tổng số biến đầu vào là 11. Trong lớp thứ hai, mô hình tự động biết số lượng biến đầu vào từ lớp ẩn đầu tiên.
Thực thi dòng mã sau để thêm lớp đầu vào và lớp ẩn đầu tiên -
classifier.add(Dense(units = 6, kernel_initializer = 'uniform',
activation = 'relu', input_dim = 11))
Thực thi dòng mã sau để thêm lớp ẩn thứ hai:
classifier.add(Dense(units = 6, kernel_initializer = 'uniform',
activation = 'relu'))
Thực thi dòng mã sau để thêm lớp đầu ra -
classifier.add(Dense(units = 1, kernel_initializer = 'uniform',
activation = 'sigmoid'))
Bước 11
Compiling the ANN
Chúng tôi đã thêm nhiều lớp vào trình phân loại của mình cho đến bây giờ. Bây giờ chúng tôi sẽ biên dịch chúng bằng cách sử dụngcompilephương pháp. Các đối số được thêm vào trong điều khiển biên dịch cuối cùng sẽ hoàn thành mạng nơ-ron. Vì vậy, chúng ta cần cẩn thận trong bước này.
Đây là một giải thích ngắn gọn về các đối số.
Đối số đầu tiên là OptimizerĐây là một thuật toán dùng để tìm tập trọng số tối ưu. Thuật toán này được gọi làStochastic Gradient Descent (SGD). Ở đây chúng tôi đang sử dụng một trong số nhiều loại, được gọi là 'Trình tối ưu hóa Adam'. SGD phụ thuộc vào tổn thất, vì vậy tham số thứ hai của chúng ta là tổn thất. Nếu biến phụ thuộc của chúng ta là nhị phân, chúng ta sử dụng hàm mất logarit được gọi là‘binary_crossentropy’và nếu biến phụ thuộc của chúng tôi có nhiều hơn hai danh mục ở đầu ra, thì chúng tôi sử dụng ‘categorical_crossentropy’. Chúng tôi muốn cải thiện hiệu suất của mạng nơ-ron của mình dựa trênaccuracy, vì vậy chúng tôi thêm metrics như độ chính xác.
# Compiling Neural Network
classifier.compile(optimizer = 'adam', loss = 'binary_crossentropy', metrics = ['accuracy'])
Bước 12
Một số mã cần được thực hiện trong bước này.
Lắp ANN vào Bộ đào tạo
Bây giờ chúng tôi đào tạo mô hình của chúng tôi trên dữ liệu đào tạo. Chúng tôi sử dụngfitphương pháp để phù hợp với mô hình của chúng tôi. Chúng tôi cũng tối ưu hóa trọng số để cải thiện hiệu quả của mô hình. Đối với điều này, chúng tôi phải cập nhật các trọng số.Batch size là số lần quan sát mà sau đó chúng tôi cập nhật trọng số. Epochlà tổng số lần lặp. Các giá trị của kích thước lô và kỷ nguyên được chọn bằng phương pháp thử và sai.
classifier.fit(X_train, y_train, batch_size = 10, epochs = 50)
Đưa ra dự đoán và đánh giá mô hình
# Predicting the Test set results
y_pred = classifier.predict(X_test)
y_pred = (y_pred > 0.5)
Dự đoán một quan sát mới
# Predicting a single new observation
"""Our goal is to predict if the customer with the following data will leave the bank:
Geography: Spain
Credit Score: 500
Gender: Female
Age: 40
Tenure: 3
Balance: 50000
Number of Products: 2
Has Credit Card: Yes
Is Active Member: Yes
Bước 13
Predicting the test set result
Kết quả dự đoán sẽ cho bạn xác suất khách hàng rời bỏ công ty. Chúng tôi sẽ chuyển đổi xác suất đó thành nhị phân 0 và 1.
# Predicting the Test set results
y_pred = classifier.predict(X_test)
y_pred = (y_pred > 0.5)
new_prediction = classifier.predict(sc.transform
(np.array([[0.0, 0, 500, 1, 40, 3, 50000, 2, 1, 1, 40000]])))
new_prediction = (new_prediction > 0.5)
Bước 14
Đây là bước cuối cùng mà chúng tôi đánh giá hiệu suất mô hình của mình. Chúng tôi đã có kết quả ban đầu và do đó chúng tôi có thể xây dựng ma trận nhầm lẫn để kiểm tra độ chính xác của mô hình của chúng tôi.
Making the Confusion Matrix
from sklearn.metrics import confusion_matrix
cm = confusion_matrix(y_test, y_pred)
print (cm)
Đầu ra
loss: 0.3384 acc: 0.8605
[ [1541 54]
[230 175] ]
Từ ma trận nhầm lẫn, Độ chính xác của mô hình của chúng tôi có thể được tính như sau:
Accuracy = 1541+175/2000=0.858
We achieved 85.8% accuracy, cái nào tốt.
Thuật toán lan truyền chuyển tiếp
Trong phần này, chúng ta sẽ học cách viết mã để truyền tiến (dự đoán) cho một mạng nơ-ron đơn giản -
Mỗi điểm dữ liệu là một khách hàng. Đầu vào đầu tiên là họ có bao nhiêu tài khoản và đầu vào thứ hai là họ có bao nhiêu con. Mô hình sẽ dự đoán người dùng thực hiện bao nhiêu giao dịch trong năm tới.
Dữ liệu đầu vào được tải trước dưới dạng dữ liệu đầu vào và các trọng số nằm trong một từ điển được gọi là trọng số. Mảng trọng số của nút đầu tiên trong lớp ẩn có trọng số ['node_0'] và đối với nút thứ hai trong lớp ẩn có trọng số tương ứng là ['node_1'].
Các trọng lượng cấp vào nút đầu ra có sẵn trong các trọng số.
Chức năng kích hoạt tuyến tính chỉnh lưu
Một "chức năng kích hoạt" là một chức năng hoạt động tại mỗi nút. Nó chuyển đổi đầu vào của nút thành một số đầu ra.
Chức năng kích hoạt tuyến tính được chỉnh lưu (được gọi là ReLU ) được sử dụng rộng rãi trong các mạng hiệu suất rất cao. Hàm này nhận một số duy nhất làm đầu vào, trả về 0 nếu đầu vào là số âm và đầu vào làm đầu ra nếu đầu vào là số dương.
Đây là một số ví dụ -
- relu (4) = 4
- relu (-2) = 0
Chúng tôi điền vào định nghĩa của hàm relu ()−
- Chúng tôi sử dụng hàm max () để tính toán giá trị cho đầu ra của relu ().
- Chúng tôi áp dụng hàm relu () cho node_0_input để tính toán node_0_output.
- Chúng tôi áp dụng hàm relu () cho node_1_input để tính toán node_1_output.
import numpy as np
input_data = np.array([-1, 2])
weights = {
'node_0': np.array([3, 3]),
'node_1': np.array([1, 5]),
'output': np.array([2, -1])
}
node_0_input = (input_data * weights['node_0']).sum()
node_0_output = np.tanh(node_0_input)
node_1_input = (input_data * weights['node_1']).sum()
node_1_output = np.tanh(node_1_input)
hidden_layer_output = np.array(node_0_output, node_1_output)
output =(hidden_layer_output * weights['output']).sum()
print(output)
def relu(input):
'''Define your relu activation function here'''
# Calculate the value for the output of the relu function: output
output = max(input,0)
# Return the value just calculated
return(output)
# Calculate node 0 value: node_0_output
node_0_input = (input_data * weights['node_0']).sum()
node_0_output = relu(node_0_input)
# Calculate node 1 value: node_1_output
node_1_input = (input_data * weights['node_1']).sum()
node_1_output = relu(node_1_input)
# Put node values into array: hidden_layer_outputs
hidden_layer_outputs = np.array([node_0_output, node_1_output])
# Calculate model output (do not apply relu)
odel_output = (hidden_layer_outputs * weights['output']).sum()
print(model_output)# Print model output
Đầu ra
0.9950547536867305
-3
Áp dụng mạng cho nhiều Quan sát / hàng dữ liệu
Trong phần này, chúng ta sẽ tìm hiểu cách định nghĩa một hàm được gọi là dự đoán_with_network (). Hàm này sẽ tạo ra các dự đoán cho nhiều quan sát dữ liệu, được lấy từ mạng ở trên được lấy làm dữ liệu đầu vào. Các trọng số cho trong mạng trên đang được sử dụng. Định nghĩa hàm relu () cũng đang được sử dụng.
Hãy để chúng tôi định nghĩa một hàm được gọi là dự đoán_with_network () chấp nhận hai đối số - input_data_row và weights - và trả về một dự đoán từ mạng làm đầu ra.
Chúng tôi tính toán các giá trị đầu vào và đầu ra cho mỗi nút, lưu trữ chúng dưới dạng: node_0_input, node_0_output, node_1_input và node_1_output.
Để tính toán giá trị đầu vào của một nút, chúng ta nhân các mảng có liên quan với nhau và tính tổng của chúng.
Để tính toán giá trị đầu ra của một nút, chúng ta áp dụng hàm relu () cho giá trị đầu vào của nút. Chúng tôi sử dụng 'vòng lặp for' để lặp qua input_data -
Chúng tôi cũng sử dụng dự đoán_with_network () của mình để tạo dự đoán cho từng hàng của dữ liệu đầu vào - input_data_row. Chúng tôi cũng thêm mỗi dự đoán vào kết quả.
# Define predict_with_network()
def predict_with_network(input_data_row, weights):
# Calculate node 0 value
node_0_input = (input_data_row * weights['node_0']).sum()
node_0_output = relu(node_0_input)
# Calculate node 1 value
node_1_input = (input_data_row * weights['node_1']).sum()
node_1_output = relu(node_1_input)
# Put node values into array: hidden_layer_outputs
hidden_layer_outputs = np.array([node_0_output, node_1_output])
# Calculate model output
input_to_final_layer = (hidden_layer_outputs*weights['output']).sum()
model_output = relu(input_to_final_layer)
# Return model output
return(model_output)
# Create empty list to store prediction results
results = []
for input_data_row in input_data:
# Append prediction to results
results.append(predict_with_network(input_data_row, weights))
print(results)# Print results
Đầu ra
[0, 12]
Ở đây chúng ta đã sử dụng hàm relu trong đó relu (26) = 26 và relu (-13) = 0, v.v.
Mạng nơ-ron nhiều lớp sâu
Ở đây chúng tôi đang viết mã để thực hiện truyền chuyển tiếp cho mạng nơ-ron có hai lớp ẩn. Mỗi lớp ẩn có hai nút. Dữ liệu đầu vào đã được tải trước dưới dạnginput_data. Các nút trong lớp ẩn đầu tiên được gọi là nút_0_0 và nút_0_1.
Trọng số của chúng được tải trước dưới dạng trọng số ['node_0_0'] và trọng số ['node_0_1'] tương ứng.
Các nút trong lớp ẩn thứ hai được gọi là node_1_0 and node_1_1. Trọng lượng của chúng được tải trước dưới dạngweights['node_1_0'] và weights['node_1_1'] tương ứng.
Sau đó, chúng tôi tạo đầu ra mô hình từ các nút ẩn bằng cách sử dụng các trọng số được tải trước như weights['output'].
Chúng tôi tính toán node_0_0_input bằng cách sử dụng các trọng số của nó ['node_0_0'] và input_data đã cho. Sau đó, áp dụng hàm relu () để lấy node_0_0_output.
Chúng ta làm tương tự như trên đối với node_0_1_input để lấy node_0_1_output.
Chúng tôi tính toán node_1_0_input bằng cách sử dụng các trọng số của nó ['node_1_0'] và kết quả đầu ra từ lớp ẩn đầu tiên - hidden_0_outputs. Sau đó, chúng tôi áp dụng hàm relu () để lấy node_1_0_output.
Chúng ta làm tương tự như trên đối với node_1_1_input để lấy node_1_1_output.
Chúng tôi tính toán model_output bằng cách sử dụng weights ['output'] và các kết quả đầu ra từ mảng hidden_1_outputs của lớp ẩn thứ hai. Chúng tôi không áp dụng hàm relu () cho đầu ra này.
import numpy as np
input_data = np.array([3, 5])
weights = {
'node_0_0': np.array([2, 4]),
'node_0_1': np.array([4, -5]),
'node_1_0': np.array([-1, 1]),
'node_1_1': np.array([2, 2]),
'output': np.array([2, 7])
}
def predict_with_network(input_data):
# Calculate node 0 in the first hidden layer
node_0_0_input = (input_data * weights['node_0_0']).sum()
node_0_0_output = relu(node_0_0_input)
# Calculate node 1 in the first hidden layer
node_0_1_input = (input_data*weights['node_0_1']).sum()
node_0_1_output = relu(node_0_1_input)
# Put node values into array: hidden_0_outputs
hidden_0_outputs = np.array([node_0_0_output, node_0_1_output])
# Calculate node 0 in the second hidden layer
node_1_0_input = (hidden_0_outputs*weights['node_1_0']).sum()
node_1_0_output = relu(node_1_0_input)
# Calculate node 1 in the second hidden layer
node_1_1_input = (hidden_0_outputs*weights['node_1_1']).sum()
node_1_1_output = relu(node_1_1_input)
# Put node values into array: hidden_1_outputs
hidden_1_outputs = np.array([node_1_0_output, node_1_1_output])
# Calculate model output: model_output
model_output = (hidden_1_outputs*weights['output']).sum()
# Return model_output
return(model_output)
output = predict_with_network(input_data)
print(output)
Đầu ra
364