Hướng dẫn về mạng thần kinh nhân tạo với các ví dụ về TensorFlow ANN
Mạng thần kinh nhân tạo là gì?
An Mạng lưới thần kinh nhân tạo (ANN) là một hệ thống máy tính lấy cảm hứng từ mạng lưới thần kinh sinh học để tạo ra bộ não nhân tạo dựa trên tập hợp các đơn vị được kết nối gọi là nơ-ron nhân tạo. Nó được thiết kế để phân tích và xử lý thông tin như con người. Mạng nơ-ron nhân tạo có khả năng tự học để tạo ra kết quả tốt hơn khi có nhiều dữ liệu hơn.

Mạng thần kinh nhân tạo (ANN) bao gồm bốn đối tượng chính:
- Layers: tất cả việc học tập diễn ra trong các lớp. Có 3 lớp 1) Đầu vào 2) Ẩn và 3) Đầu ra
- Tính năng và nhãn: Dữ liệu đầu vào mạng (tính năng) và đầu ra từ mạng (nhãn)
- Thiếu chức năng: Số liệu được sử dụng để ước tính hiệu suất của giai đoạn máy học
- Trình tối ưu hóa: Cải thiện việc học bằng cách cập nhật kiến thức trên mạng
Mạng lưới thần kinh sẽ lấy dữ liệu đầu vào và đẩy chúng thành một tập hợp các lớp. Mạng cần đánh giá hiệu suất của nó bằng hàm mất mát. Hàm loss cung cấp cho mạng ý tưởng về con đường nó cần đi trước khi nắm vững kiến thức. Mạng cần nâng cao kiến thức của mình với sự trợ giúp của trình tối ưu hóa.
Nếu bạn nhìn vào hình trên, bạn sẽ hiểu cơ chế cơ bản.
Chương trình lấy một số giá trị đầu vào và đẩy chúng thành hai lớp được kết nối đầy đủ. Hãy tưởng tượng bạn có một bài toán, việc đầu tiên bạn làm là đọc chương tương ứng để giải bài toán. Bạn áp dụng kiến thức mới của mình để giải quyết vấn đề. Khả năng cao là bạn sẽ không đạt điểm cao. Điều này cũng tương tự đối với một mạng. Lần đầu tiên nó nhìn thấy dữ liệu và đưa ra dự đoán, nó sẽ không khớp hoàn toàn với dữ liệu thực tế.
Để nâng cao kiến thức của mình, mạng sử dụng trình tối ưu hóa. Theo cách tương tự của chúng tôi, một trình tối ưu hóa có thể được coi là việc đọc lại chương đó. Bạn có được những hiểu biết/bài học mới bằng cách đọc lại. Tương tự, mạng sử dụng trình tối ưu hóa, cập nhật kiến thức và kiểm tra kiến thức mới để kiểm tra xem nó còn cần học thêm bao nhiêu. Chương trình sẽ lặp lại bước này cho đến khi đạt được lỗi thấp nhất có thể.
Trong phép loại suy bài toán của chúng ta, điều đó có nghĩa là bạn đọc chương sách giáo khoa nhiều lần cho đến khi bạn hiểu thấu đáo nội dung khóa học. Ngay cả sau khi đọc nhiều lần, nếu bạn vẫn tiếp tục mắc lỗi, điều đó có nghĩa là bạn đã đạt đến năng lực kiến thức với tài liệu hiện tại. Bạn cần sử dụng sách giáo khoa khác hoặc kiểm tra phương pháp khác để cải thiện điểm số của mình. Đối với mạng nơ-ron, đó là quá trình tương tự. Nếu lỗi không phải là 100%, nhưng đường cong lại phẳng, điều đó có nghĩa là với kiến trúc hiện tại; nó không thể học được bất cứ điều gì khác. Mạng phải được tối ưu hóa tốt hơn để cải thiện kiến thức.
Mạng thần kinh Archikiến trúc
Mạng lưới thần kinh nhân tạo ArchiKiến trúc bao gồm các thành phần sau:
- Layers
- Chức năng kích hoạt
- Thiếu chức năng
- Trình tối ưu hóa
Layers
Một lớp là nơi tất cả việc học tập diễn ra. Bên trong một lớp có vô số trọng lượng (tế bào thần kinh). Một mạng lưới thần kinh điển hình thường được xử lý bởi các lớp được kết nối dày đặc (còn gọi là các lớp được kết nối đầy đủ). Nó có nghĩa là tất cả các đầu vào được kết nối với đầu ra.
Một mạng nơ-ron điển hình lấy một vectơ đầu vào và một đại lượng vô hướng chứa các nhãn. Cách thiết lập thoải mái nhất là phân loại nhị phân chỉ có hai lớp: 0 và 1.
Mạng lấy đầu vào, gửi nó đến tất cả các nút được kết nối và tính toán tín hiệu với kích hoạt chức năng.

Hình trên thể hiện ý tưởng này. Lớp đầu tiên là các giá trị đầu vào cho lớp thứ hai, gọi là lớp ẩn, nhận đầu vào có trọng số từ lớp trước
- Nút đầu tiên là các giá trị đầu vào
- Tế bào thần kinh được phân tách thành phần đầu vào và hàm kích hoạt. Phần bên trái nhận tất cả đầu vào từ lớp trước. Phần bên phải là tổng số đầu vào được chuyển vào hàm kích hoạt.
- Giá trị đầu ra được tính toán từ các lớp ẩn và được sử dụng để đưa ra dự đoán. Để phân loại, nó bằng số lượng lớp. Đối với hồi quy, chỉ có một giá trị được dự đoán.
Chức năng kích hoạt
Hàm kích hoạt của một nút xác định đầu ra cho một tập hợp đầu vào. Bạn cần một hàm kích hoạt để cho phép mạng học mẫu phi tuyến tính. Hàm kích hoạt phổ biến là Relu, Đơn vị tuyến tính chỉnh lưu. Hàm cung cấp số 0 cho tất cả các giá trị âm.
Các chức năng kích hoạt khác là:
- Tuyến tính từng phần
- sigmoid
- Tánh
- Relu rò rỉ
Quyết định quan trọng cần đưa ra khi xây dựng mạng lưới thần kinh là:
- Mạng nơ-ron có bao nhiêu lớp
- Có bao nhiêu đơn vị ẩn cho mỗi lớp
Mạng nơ-ron với nhiều lớp và đơn vị ẩn có thể học được cách biểu diễn dữ liệu phức tạp, nhưng điều này làm cho quá trình tính toán của mạng rất tốn kém.
Thiếu chức năng
Sau khi đã xác định các lớp ẩn và hàm kích hoạt, bạn cần chỉ định hàm mất và trình tối ưu hóa.
Để phân loại nhị phân, thông thường người ta sử dụng hàm mất entropy chéo nhị phân. Trong hồi quy tuyến tính, bạn sử dụng sai số bình phương trung bình.
Hàm mất mát là một số liệu quan trọng để ước tính hiệu suất của trình tối ưu hóa. Trong quá trình đào tạo, số liệu này sẽ được giảm thiểu. Bạn cần phải lựa chọn số lượng này một cách cẩn thận tùy thuộc vào loại vấn đề bạn đang giải quyết.
Trình tối ưu hóa
Hàm mất mát là thước đo hiệu suất của mô hình. Trình tối ưu hóa sẽ giúp cải thiện trọng số của mạng để giảm tổn thất. Có nhiều trình tối ưu hóa khác nhau, nhưng phổ biến nhất là Giảm dần độ dốc ngẫu nhiên.
Các trình tối ưu hóa thông thường là:
- Momentum tối ưu hóa,
- Độ dốc tăng tốc của Nesterov,
- AdaGrad,
- Tối ưu hóa Adam
Hạn chế của mạng lưới thần kinh
Sau đây là những hạn chế của Mạng nơ-ron:
trang bị quá mức
Một vấn đề phổ biến với mạng nơ-ron phức tạp là khó khăn trong việc khái quát hóa dữ liệu chưa từng thấy. Một mạng nơ-ron với nhiều trọng số có thể xác định các chi tiết cụ thể trong tập huấn luyện rất tốt nhưng thường dẫn đến quá khớp. Nếu dữ liệu không cân bằng trong các nhóm (tức là không đủ dữ liệu có sẵn trong một số nhóm), mạng sẽ học rất tốt trong quá trình đào tạo nhưng sẽ không có khả năng khái quát hóa mẫu như vậy thành dữ liệu chưa từng thấy trước đây.
Có sự đánh đổi trong học máy giữa tối ưu hóa và khái quát hóa.
Tối ưu hóa một mô hình đòi hỏi phải tìm ra các tham số tốt nhất để giảm thiểu việc mất tập huấn luyện.
Tuy nhiên, việc khái quát hóa cho biết mô hình hoạt động như thế nào đối với dữ liệu không nhìn thấy được.
Để ngăn mô hình nắm bắt các chi tiết cụ thể hoặc các mẫu không mong muốn của dữ liệu đào tạo, bạn có thể sử dụng các kỹ thuật khác nhau. Phương pháp tốt nhất là có một tập dữ liệu cân bằng với lượng dữ liệu đủ. Nghệ thuật giảm quá mức được gọi là chính quy. Hãy xem xét một số kỹ thuật thông thường.
Kích thước mạng
Một mạng nơ-ron có quá nhiều lớp và đơn vị ẩn được biết là rất phức tạp. Một cách đơn giản để giảm độ phức tạp của mô hình là giảm kích thước của nó. Không có phương pháp hay nhất nào để xác định số lượng lớp. Bạn cần bắt đầu với một lượng lớp nhỏ và tăng kích thước của nó cho đến khi bạn thấy mô hình quá phù hợp.
Điều chỉnh cân nặng
Một kỹ thuật tiêu chuẩn để ngăn chặn việc trang bị quá mức là thêm các ràng buộc vào trọng số của mạng. Ràng buộc buộc kích thước của mạng chỉ nhận các giá trị nhỏ. Ràng buộc được thêm vào hàm mất của lỗi. Có hai loại chính quy hóa:
L1: Lasso: Chi phí tỷ lệ thuận với giá trị tuyệt đối của hệ số trọng số
L2: Ridge: Chi phí tỷ lệ thuận với bình phương giá trị của các hệ số trọng số
Rơi ra ngoài
Bỏ học là một kỹ thuật kỳ quặc nhưng hữu ích. Mạng bị bỏ học có nghĩa là một số trọng số sẽ được đặt ngẫu nhiên về 0.1. Hãy tưởng tượng bạn có một mảng có trọng số [1.7, 0.7, 0.9, -0.1]. Nếu mạng nơron có dropout, nó sẽ trở thành [0, 0, 0.9, -0] với phân phối ngẫu nhiên 0.2. Tham số kiểm soát dropout là tỷ lệ dropout. Tỷ lệ xác định có bao nhiêu trọng số được đặt thành số 0.5. Có tỷ lệ từ XNUMX đến XNUMX là phổ biến.
Ví dụ về Mạng thần kinh trong TensorFlow
Hãy cùng xem một ví dụ về Mạng nơ-ron nhân tạo trong hành động về cách mạng nơ-ron hoạt động cho một bài toán phân loại thông thường. Có hai đầu vào, x1 và x2 với giá trị ngẫu nhiên. Đầu ra là một lớp nhị phân. Mục tiêu là phân loại nhãn dựa trên hai tính năng. Để thực hiện nhiệm vụ này, kiến trúc mạng nơ-ron được định nghĩa như sau:
- Hai lớp ẩn
- Lớp đầu tiên có bốn nơ-ron được kết nối đầy đủ
- Lớp thứ hai có hai nơ-ron được kết nối đầy đủ
- Hàm kích hoạt là Relu
- Thêm Chính quy L2 với tỷ lệ học tập là 0.003
Mạng sẽ tối ưu hóa trọng số trong 180 kỷ nguyên với kích thước lô là 10. Trong video ví dụ ANN bên dưới, bạn có thể thấy trọng số phát triển như thế nào và mạng cải thiện ánh xạ phân loại như thế nào.
Trước hết, mạng gán các giá trị ngẫu nhiên cho tất cả các trọng số.
- Với các trọng số ngẫu nhiên, tức là không tối ưu hóa, tổn thất đầu ra là 0.453. Hình ảnh bên dưới thể hiện mạng lưới với nhiều màu sắc khác nhau.
- Nói chung, màu cam thể hiện giá trị âm trong khi màu xanh lam thể hiện giá trị dương.
- Các điểm dữ liệu có cùng cách biểu diễn; màu xanh lam là nhãn dương và màu cam là nhãn âm.
Bên trong lớp ẩn thứ hai, các đường được tô màu theo dấu của trọng số. Các đường màu cam gán trọng số âm và đường màu xanh gán trọng số dương
Như bạn có thể thấy, trong ánh xạ đầu ra, mạng đang mắc khá nhiều lỗi. Hãy xem mạng hoạt động như thế nào sau khi tối ưu hóa.
Hình ảnh ví dụ ANN bên dưới mô tả kết quả của mạng được tối ưu hóa. Trước hết, bạn nhận thấy mạng đã học thành công cách phân loại điểm dữ liệu. Bạn có thể nhìn thấy từ hình ảnh trước đó; trọng số ban đầu là -0.43 trong khi sau khi tối ưu hóa, kết quả là -0.95.
Ý tưởng này có thể được khái quát hóa cho các mạng có nhiều lớp và nơ-ron ẩn hơn. Bạn có thể chơi xung quanh trong liên kết này.
Cách đào tạo mạng lưới thần kinh với TensorFlow
Dưới đây là quy trình từng bước về cách huấn luyện mạng thần kinh với TensorFlow ANN bằng cách sử dụng công cụ ước tính DNNClassifier của API.
Chúng tôi sẽ sử dụng bộ dữ liệu MNIST để huấn luyện mạng nơ-ron đầu tiên của bạn. Huấn luyện mạng nơron với TensorFlow không phức tạp lắm. Bước tiền xử lý trông giống hệt như trong các hướng dẫn trước. Bạn sẽ tiến hành như sau:
- Bước 1: Nhập dữ liệu
- Bước 2: Chuyển đổi dữ liệu
- Bước 3: Xây dựng tensor
- Bước 4: Xây dựng mô hình
- Bước 5: Huấn luyện và đánh giá mô hình
- Bước 6: Cải thiện mô hình
Bước 1) Nhập dữ liệu
Trước hết, bạn cần nhập thư viện cần thiết. Bạn có thể nhập tập dữ liệu MNIST bằng cách sử dụng scikit learn như trong ví dụ về Mạng thần kinh TensorFlow bên dưới.
Tập dữ liệu MNIST là tập dữ liệu thường được sử dụng để kiểm tra các kỹ thuật hoặc thuật toán mới. Tập dữ liệu này là tập hợp hình ảnh 28×28 pixel với một chữ số viết tay từ 0 đến 9. Hiện tại, sai số thấp nhất trong bài kiểm tra là 0.27% với một ủy ban gồm 7 mạng nơ ron tích chập.
import numpy as np import tensorflow as tf np.random.seed(1337)
Các bạn có thể tải scikit learn tạm thời tại địa chỉ này. Sao chép và dán tập dữ liệu vào một thư mục thuận tiện. Để nhập dữ liệu vào python, bạn có thể sử dụng Fetch_mldata từ scikit learn. Dán đường dẫn tệp bên trong Fetch_mldata để tìm nạp dữ liệu.
from sklearn.datasets import fetch_mldata mnist = fetch_mldata(' /Users/Thomas/Dropbox/Learning/Upwork/tuto_TF/data/mldata/MNIST original') print(mnist.data.shape) print(mnist.target.shape)
Sau đó, bạn nhập dữ liệu và lấy hình dạng của cả hai tập dữ liệu.
from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(mnist.data, mnist.target, test_size=0.2, random_state=42) y_train = y_train.astype(int) y_test = y_test.astype(int) batch_size =len(X_train) print(X_train.shape, y_train.shape,y_test.shape )
Bước 2) Chuyển đổi dữ liệu
Trong hướng dẫn trước, bạn đã biết rằng bạn cần chuyển đổi dữ liệu để hạn chế ảnh hưởng của các giá trị ngoại lệ. Trong hướng dẫn về Mạng thần kinh này, bạn sẽ chuyển đổi dữ liệu bằng cách sử dụng bộ chia tỷ lệ tối thiểu-tối đa. Công thức là:
(X-min_x)/(max_x - min_x)
Scikit học đã có chức năng cho việc đó: MinMaxScaler()
## resclae from sklearn.preprocessing import MinMaxScaler scaler = MinMaxScaler() # Train X_train_scaled = scaler.fit_transform(X_train.astype(np.float64)) # test X_test_scaled = scaler.fit_transform(X_test.astype(np.float64))
Bước 3) Xây dựng tensor
Bây giờ bạn đã quen với cách tạo tensor trong Tensorflow. Bạn có thể chuyển đổi tập tàu thành cột số.
feature_columns = [tf.feature_column.numeric_column('x', shape=X_train_scaled.shape[1:])]
Bước 4) Xây dựng mô hình
Kiến trúc của mạng nơ-ron bao gồm 2 lớp ẩn với 300 đơn vị cho lớp đầu tiên và 100 đơn vị cho lớp thứ hai. Chúng tôi sử dụng các giá trị này dựa trên kinh nghiệm của riêng mình. Bạn có thể điều chỉnh các giá trị này và xem chúng ảnh hưởng đến độ chính xác của mạng như thế nào.
Để xây dựng mô hình, bạn sử dụng công cụ ước tính DNNClassifier. Bạn có thể thêm số lớp vào đối số feature_columns. Bạn cần đặt số lớp là 10 vì có mười lớp trong tập huấn luyện. Bạn đã quen với cú pháp của đối tượng ước tính. Các cột tính năng đối số, số lượng lớp và model_dir hoàn toàn giống như trong hướng dẫn trước. Đối số mới Hidden_unit kiểm soát số lớp và số lượng nút kết nối với mạng thần kinh. Trong mã bên dưới, có hai lớp ẩn với lớp đầu tiên kết nối 300 nút và lớp thứ hai có 100 nút.
Để xây dựng trình ước tính, hãy sử dụng tf.estimator.DNNClassifier với các tham số sau:
- feature_columns: Xác định các cột sẽ sử dụng trong mạng
- Hidden_units: Xác định số lượng nơ-ron ẩn
- n_classes: Xác định số lớp cần dự đoán
- model_dir: Xác định đường dẫn của TensorBoard
estimator = tf.estimator.DNNClassifier( feature_columns=feature_columns, hidden_units=[300, 100], n_classes=10, model_dir = '/train/DNN')
Bước 5) Huấn luyện và đánh giá mô hình
Bạn có thể sử dụng phương pháp numpy để huấn luyện mô hình và đánh giá nó
# Train the estimator train_input = tf.estimator.inputs.numpy_input_fn( x={"x": X_train_scaled}, y=y_train, batch_size=50, shuffle=False, num_epochs=None) estimator.train(input_fn = train_input,steps=1000) eval_input = tf.estimator.inputs.numpy_input_fn( x={"x": X_test_scaled}, y=y_test, shuffle=False, batch_size=X_test_scaled.shape[0], num_epochs=1) estimator.evaluate(eval_input,steps=None)
Đầu ra:
{'accuracy': 0.9637143, 'average_loss': 0.12014342, 'loss': 1682.0079, 'global_step': 1000}
Kiến trúc hiện tại mang lại độ chính xác cho bộ đánh giá là 96 phần trăm.
Bước 6) Cải thiện mô hình
Bạn có thể cố gắng cải thiện mô hình bằng cách thêm các tham số chính quy.
Chúng ta sẽ sử dụng trình tối ưu hóa Adam với tỷ lệ bỏ qua là 0.3, L1 của X và L2 của y. Trong Mạng nơ-ron TensorFlow, bạn có thể điều khiển trình tối ưu hóa bằng cách sử dụng chuỗi đối tượng theo sau là tên của trình tối ưu hóa. TensorFlow là API tích hợp cho trình tối ưu hóa Proximal AdaGrad.
Để thêm chính quy hóa vào mạng nơ-ron sâu, bạn có thể sử dụng tf.train.ProximalAdagradOptimizer với tham số sau
- Tỷ lệ học tập: learning_rate
- Chính quy hóa L1: l1_regularization_ Strength
- Chính quy hóa L2: l2_regularization_ Strength
estimator_imp = tf.estimator.DNNClassifier( feature_columns=feature_columns, hidden_units=[300, 100], dropout=0.3, n_classes = 10, optimizer=tf.train.ProximalAdagradOptimizer( learning_rate=0.01, l1_regularization_strength=0.01, l2_regularization_strength=0.01 ), model_dir = '/train/DNN1') estimator_imp.train(input_fn = train_input,steps=1000) estimator_imp.evaluate(eval_input,steps=None)
Đầu ra:
{'accuracy': 0.95057142, 'average_loss': 0.17318928, 'loss': 2424.6499, 'global_step': 2000}
Các giá trị được chọn để giảm độ khớp quá mức không cải thiện độ chính xác của mô hình. Mô hình đầu tiên của bạn có độ chính xác là 96% trong khi mô hình có bộ điều chỉnh L2 có độ chính xác là 95%. Bạn có thể thử với các giá trị khác nhau và xem nó ảnh hưởng như thế nào đến độ chính xác.
Tổng kết
Trong hướng dẫn này, bạn học cách xây dựng mạng lưới thần kinh. Một mạng lưới thần kinh yêu cầu:
- Số lớp ẩn
- Số nút được kết nối đầy đủ
- Chức năng kích hoạt
- Trình tối ưu hóa
- Số lớp
Trong TensorFlow ANN, bạn có thể huấn luyện mạng nơ-ron cho bài toán phân loại bằng:
- tf.estimator.DNNClassifier
Người ước tính yêu cầu chỉ định:
- feature_columns=feature_columns,
- Hidden_units=[300, 100]
- n_classes=10
- model_dir
Bạn có thể cải thiện mô hình bằng cách sử dụng các trình tối ưu hóa khác nhau. Trong hướng dẫn này, bạn đã học cách sử dụng trình tối ưu hóa Adam Grad với tốc độ học tập và thêm một điều khiển để ngăn chặn việc trang bị quá mức.