Chương này đề cập đến các khái niệm về Mạng nơ-ron liên quan đến CNTK.
Như chúng ta biết, một số lớp nơ-ron được sử dụng để tạo ra mạng lưới thần kinh. Tuy nhiên, câu hỏi đặt ra là trong CNTK làm thế nào chúng ta có thể mô hình hóa các lớp của NN? Nó có thể được thực hiện với sự trợ giúp của các hàm lớp được xác định trong mô-đun lớp.
Chức năng lớp
Trên thực tế, trong CNTK, làm việc với các lớp mang lại cảm giác lập trình chức năng riêng biệt. Hàm lớp trông giống như một hàm thông thường và nó tạo ra một hàm toán học với một tập hợp các tham số được xác định trước. Hãy xem cách chúng ta có thể tạo loại lớp cơ bản nhất, Dày đặc, với sự trợ giúp của chức năng lớp.
Ví dụ
Với sự trợ giúp của các bước cơ bản sau, chúng ta có thể tạo loại lớp cơ bản nhất –
Bước 1 − Đầu tiên, chúng ta cần nhập hàm Lớp dày đặc từ gói CNTK của lớp. from cntk.layers import Dense
Bước 2 − Tiếp theo từ gói gốc CNTK, chúng ta cần nhập hàm input_variable. from cntk import input_variable
Bước 3 − Bây giờ, chúng ta cần tạo một biến đầu vào mới bằng hàm input_variable. Chúng tôi cũng cần cung cấp kích thước của nó. feature = input_variable(100)
Bước 4 − Cuối cùng, chúng ta sẽ tạo một lớp mới bằng cách sử dụng hàm Dense cùng với việc cung cấp số lượng nơ-ron mà chúng ta muốn. layer = Dense(40)(feature)
Bây giờ, chúng ta có thể gọi hàm lớp Dense đã được định cấu hình để kết nối lớp Dense với đầu vào.
Ví dụ triển khai hoàn chỉnh
from cntk.layers import Densefrom cntk import input_variablefeature= input_variable(100)layer = Dense(40)(feature)
Tùy chỉnh các lớp
Như chúng ta đã thấy, CNTK cung cấp cho chúng ta một bộ giá trị mặc định khá tốt để xây dựng NN. Dựa trên chức năng kích hoạt và các cài đặt khác mà chúng tôi chọn, hành vi cũng như hiệu suất của NN là khác nhau. Đây là một thuật toán xuất phát rất hữu ích khác. Đó là lý do nên hiểu rõ những gì chúng ta có thể định cấu hình.
Các bước để định cấu hình một lớp dày đặc
Mỗi lớp trong NN có các tùy chọn cấu hình riêng và khi nói về Lớp dày đặc, chúng ta có các cài đặt quan trọng sau để xác định:
- shape − Đúng như tên gọi, nó xác định hình dạng đầu ra của lớp và xác định thêm số lượng nơ-ron trong lớp đó.
- kích hoạt − Nó xác định chức năng kích hoạt của lớp đó, do đó nó có thể biến đổi dữ liệu đầu vào.
- init − Nó xác định chức năng khởi tạo của lớp đó. Nó sẽ khởi tạo các tham số của lớp khi chúng ta bắt đầu huấn luyện NN.
Hãy xem các bước mà chúng ta có thể định cấu hình lớp Dày đặc −
Bước1 − Đầu tiên, chúng ta cần nhập hàm lớp Dense từ gói của các lớp CNTK. from cntk.layers import Dense
Bước 2 − Tiếp theo từ gói hoạt động CNTK, chúng ta cần nhập toán tử sigmoid. Nó sẽ được sử dụng để định cấu hình làm chức năng kích hoạt. from cntk.ops import sigmoid
Bước3 − Bây giờ, từ gói khởi tạo, chúng ta cần nhập trình khởi tạo glorot_uniform. from cntk.initializer import glorot_uniform
Bước4 − Cuối cùng, chúng ta sẽ tạo một lớp mới bằng cách sử dụng hàm Dense cùng với việc cung cấp số lượng nơ-ron làm đối số đầu tiên. Ngoài ra, hãy cung cấp toán tử sigmoid làm hàm kích hoạt và cho lớp.init làm hàm glorot_uniform layer = Dense(50, activation = sigmoid, init = glorot_uniform)Ví dụ triển khai hoàn chỉnh
from cntk.layers import Dense
from cntk.ops import sigmoid
from cntk.initializer import glorot_uniform
layer = Dense(50, activation = sigmoid, init = glorot_uniform)
Tối ưu hóa các thông số
Cho đến bây giờ, chúng ta đã biết cách tạo cấu trúc của NN và cách định cấu hình các cài đặt khác nhau. Ở đây, chúng ta sẽ xem cách chúng ta có thể tối ưu hóa các tham số của NN. Với sự trợ giúp của sự kết hợp của hai thành phần là người học và người đào tạo, chúng ta có thể tối ưu hóa các tham số của NN.
thành phần huấn luyện viên
Thành phần đầu tiên được sử dụng để tối ưu hóa các tham số của NN là thành phần trainer. Về cơ bản nó thực hiện quá trình lan truyền ngược. Nếu chúng ta nói về hoạt động của nó, thì nó sẽ chuyển dữ liệu qua NN để có được dự đoán.
Sau đó, nó sử dụng một thành phần khác gọi là bộ học để lấy các giá trị mới cho các tham số trong NN. Sau khi nhận được các giá trị mới, nó sẽ áp dụng các giá trị mới này và lặp lại quy trình cho đến khi đáp ứng tiêu chí thoát.
thành phần người học
Thành phần thứ hai được sử dụng để tối ưu hóa các tham số của NN là thành phần người học, về cơ bản chịu trách nhiệm thực hiện thuật toán giảm độ dốc .
Người học được đưa vào thư viện CNTK
Sau đây là danh sách một số người học thú vị có trong thư viện CNTK –
- Giảm độ dốc ngẫu nhiên (SGD) − Trình học này biểu thị quá trình giảm độ dốc ngẫu nhiên cơ bản mà không có bất kỳ tính năng bổ sung nào.
- Momentum Stochastic gradient Descent (MomentumSGD) − Với SGD, người học này áp dụng động lượng để khắc phục vấn đề cực đại cục bộ.
- RMSProp − Người học này, để kiểm soát tốc độ giảm dần, sử dụng tốc độ học giảm dần.
- Adam − Người học này, để giảm tốc độ đi xuống theo thời gian, sử dụng động lượng giảm dần.
Adagrad − Người học này, đối với các tính năng xảy ra thường xuyên cũng như không thường xuyên, sử dụng các tốc độ học tập khác nhau.
CNTK – Tạo mạng lưới thần kinh đầu tiên
Chương này sẽ trình bày chi tiết về việc tạo mạng nơ-ron trong CNTK.
Xây dựng cấu trúc mạng
Để áp dụng các khái niệm CNTK để xây dựng NN đầu tiên của chúng tôi, chúng tôi sẽ sử dụng NN để phân loại các loài hoa diên vĩ dựa trên các đặc tính vật lý về chiều rộng và chiều dài đài hoa cũng như chiều rộng và chiều dài cánh hoa. Tập dữ liệu mà chúng tôi sẽ sử dụng tập dữ liệu iris mô tả các tính chất vật lý của các loại hoa iris khác nhau –
- Sepal length
- Sepal width
- Petal length
- Petal width
- Class i.e. iris setosa or iris versicolor or iris virginica
Ở đây, chúng ta sẽ xây dựng một NN thông thường được gọi là NN chuyển tiếp. Chúng ta hãy xem các bước triển khai để xây dựng cấu trúc của NN –
Bước 1 − Đầu tiên, chúng ta sẽ nhập các thành phần cần thiết như loại lớp, hàm kích hoạt và hàm cho phép chúng ta xác định biến đầu vào cho NN của mình, từ Thư viện CNTK.
from cntk import default_options, input_variable
from cntk.layers import Dense, Sequential
from cntk.ops import log_softmax, relu
Bước 2 − Sau đó, chúng ta sẽ tạo mô hình của mình bằng hàm tuần tự. Sau khi tạo, chúng tôi sẽ cung cấp cho nó các lớp mà chúng tôi muốn. Ở đây, chúng ta sẽ tạo hai lớp riêng biệt trong NN của mình; một có bốn nơ-ron và một có ba nơ-ron. model = Sequential([Dense(4, activation=relu), Dense(3, activation=log_sogtmax)])
Bước 3 − Cuối cùng, để biên dịch NN, chúng tôi sẽ liên kết mạng với biến đầu vào. Nó có một lớp đầu vào với bốn nơ-ron và một lớp đầu ra với ba nơ-ron. feature= input_variable(4)z = model(feature)
Áp dụng chức năng kích hoạt
Có rất nhiều chức năng kích hoạt để bạn lựa chọn và việc chọn đúng chức năng kích hoạt chắc chắn sẽ tạo ra sự khác biệt lớn đối với việc mô hình học sâu của chúng ta sẽ hoạt động tốt như thế nào.
Ở lớp đầu ra
Việc chọn hàm kích hoạt ở lớp đầu ra sẽ phụ thuộc vào loại vấn đề mà chúng ta sẽ giải quyết bằng mô hình của mình.
- Đối với bài toán hồi quy, chúng ta nên sử dụng hàm kích hoạt tuyến tính trên lớp đầu ra.
- Đối với bài toán phân loại nhị phân, chúng ta nên sử dụng hàm kích hoạt sigmoid trên lớp đầu ra.
- Đối với bài toán phân loại nhiều lớp, chúng ta nên sử dụng hàm kích hoạt softmax trên lớp đầu ra.
- Ở đây, chúng ta sẽ xây dựng một mô hình để dự đoán một trong ba lớp. Điều đó có nghĩa là chúng ta cần sử dụng chức năng kích hoạt softmax ở lớp đầu ra.
Ở lớp ẩn
Việc chọn chức năng kích hoạt ở lớp ẩn yêu cầu một số thử nghiệm để theo dõi hiệu suất nhằm xem chức năng kích hoạt nào hoạt động tốt.
- Trong một bài toán phân loại, chúng ta cần dự đoán xác suất một mẫu thuộc về một lớp cụ thể. Đó là lý do tại sao chúng ta cần một hàm kích hoạt mang lại cho chúng ta các giá trị xác suất. Để đạt được mục tiêu này, chức năng kích hoạt sigmoid có thể giúp chúng tôi.
- Một trong những vấn đề chính liên quan đến hàm sigmoid là vấn đề biến mất độ dốc. Để khắc phục vấn đề như vậy, chúng ta có thể sử dụng Hàm kích hoạt ReLU để chuyển tất cả các giá trị âm về 0 và hoạt động như một bộ lọc chuyển tiếp cho các giá trị dương.
Chọn một hàm mất mát
Sau khi có cấu trúc cho mô hình NN, chúng ta phải tối ưu hóa nó. Để tối ưu hóa, chúng ta cần một hàm mất mát. Không giống như các hàm kích hoạt, chúng tôi có rất ít hàm mất mát để lựa chọn. Tuy nhiên, việc chọn hàm mất mát sẽ phụ thuộc vào loại vấn đề mà chúng ta sẽ giải quyết bằng mô hình của mình.
Ví dụ, trong một bài toán phân loại, chúng ta nên sử dụng hàm mất mát có thể đo lường sự khác biệt giữa lớp được dự đoán và lớp thực tế.
mất chức năng
Đối với vấn đề phân loại, chúng ta sẽ giải quyết bằng mô hình NN của mình, entropy chéo phân loại hàm mất mát là ứng cử viên sáng giá nhất. Trong CNTK, nó được triển khai dưới dạng cross_entropy_with_softmax có thể được nhập từ cntk.losses, như sau− label= input_variable(3)loss = cross_entropy_with_softmax(z, label)
Số liệu
Với việc áp dụng cấu trúc cho mô hình NN và hàm mất mát, chúng tôi có tất cả các thành phần để bắt đầu tạo công thức tối ưu hóa mô hình học sâu của mình. Tuy nhiên, trước khi đi sâu vào vấn đề này, chúng ta nên tìm hiểu về các số liệu. cntk.metrics
CNTK có gói có tên cntk.metrics từ đó chúng tôi có thể nhập các số liệu mà chúng tôi sẽ sử dụng. Khi xây dựng mô hình phân loại, chúng tôi sẽ sử dụng ma trận classification_error để tạo ra một số từ 0 đến 1. Số từ 0 đến 1 biểu thị tỷ lệ phần trăm mẫu được dự đoán chính xác −
Trước tiên, chúng ta cần nhập số liệu từ gói cntk.metrics − from cntk.metrics import classification_errorerror_rate = classification_error(z, label)Hàm trên thực sự cần đầu ra của NN và nhãn dự kiến làm đầu vào.
Xem thêm : CNTK – Huấn luyện mạng lưới thần kinh