1. Tổng quan
Trong phòng thí nghiệm này, bạn sẽ tìm hiểu cách tập hợp lớp tích chập thành một mô hình mạng nơron có thể nhận dạng hoa. Lần này, bạn sẽ tự xây dựng mô hình từ đầu và sử dụng sức mạnh của TPU để huấn luyện mô hình đó chỉ trong vài giây cũng như lặp lại thiết kế của mô hình.
Phòng thí nghiệm này đưa ra những nội dung giải thích lý thuyết cần thiết về mạng nơron tích chập và là xuất phát điểm phù hợp để các nhà phát triển tìm hiểu về công nghệ học sâu.
Phòng thí nghiệm này là Phần 3 của loạt video "Keras on TPU". Bạn có thể thực hiện các bước theo thứ tự sau hoặc độc lập với nhau.
- Quy trình dữ liệu tốc độ TPU: tf.data.Dataset và TFRecords
- Mô hình Keras đầu tiên của bạn, với tính năng học chuyển đổi
- [This LAB] Mạng nơron tích chập, với Keras và TPU
- Convnet hiện đại, Exchangenet, Xception, với Keras và TPU
Kiến thức bạn sẽ học được
- Xây dựng thuật toán phân loại hình ảnh tích chập bằng mô hình Keras Tuần tự.
- Cách huấn luyện mô hình Keras trên TPU
- Để tinh chỉnh mô hình của bạn bằng một lựa chọn tốt về các lớp tích chập.
Phản hồi
Nếu bạn thấy có gì đó không ổn trong lớp học lập trình này, vui lòng cho chúng tôi biết. Bạn có thể cung cấp ý kiến phản hồi thông qua các vấn đề trên GitHub [ feedback link].
2. Bắt đầu nhanh với Google Colaboratory
Lớp học này sử dụng Google Colaboratory và bạn không cần thiết lập gì cả. Colaboratory là một nền tảng sổ tay trực tuyến dành cho mục đích giáo dục. Trang web này cung cấp các khoá đào tạo miễn phí về CPU, GPU và TPU.
Bạn có thể mở sổ tay mẫu này và chạy qua một vài ô để làm quen với Colaboratory.
Chọn phần phụ trợ TPU
Trong trình đơn Colab, hãy chọn Thời gian chạy > Thay đổi loại thời gian chạy rồi chọn TPU. Trong lớp học lập trình này, bạn sẽ sử dụng một TPU (Bộ xử lý cảm biến) mạnh mẽ được hỗ trợ để huấn luyện có tăng tốc phần cứng. Kết nối với môi trường thời gian chạy sẽ tự động diễn ra trong lần thực thi đầu tiên, hoặc bạn có thể sử dụng nút "Kết nối" ở góc trên bên phải.
Thực thi trên sổ tay
Thực thi từng ô bằng cách nhấp vào một ô và sử dụng tổ hợp phím Shift-ENTER. Bạn cũng có thể chạy toàn bộ sổ tay bằng cách chọn Thời gian chạy > Chạy tất cả
Mục lục
Tất cả sổ tay đều có mục lục. Bạn có thể mở trình đơn này bằng mũi tên màu đen ở bên trái.
Các ô bị ẩn
Một số ô sẽ chỉ hiển thị tiêu đề. Đây là một tính năng của sổ tay dành riêng cho Colab. Bạn có thể nhấp đúp vào các tệp này để xem mã bên trong, nhưng thường thì mã này không thú vị lắm. Thường là các hàm hỗ trợ hoặc trực quan hoá. Bạn vẫn cần chạy các ô này để xác định các hàm bên trong.
Xác thực
Colab có thể truy cập vào bộ chứa riêng tư của bạn trong Google Cloud Storage, miễn là bạn xác thực bằng một tài khoản được uỷ quyền. Đoạn mã trên sẽ kích hoạt quá trình xác thực.
3. [THÔNG TIN] Đơn vị xử lý Tensor là gì?
Tóm tắt
Mã để huấn luyện một mô hình trên TPU trong Keras (và quay lại sử dụng GPU hoặc CPU nếu không có TPU):
try: # detect TPUs
tpu = tf.distribute.cluster_resolver.TPUClusterResolver.connect()
strategy = tf.distribute.TPUStrategy(tpu)
except ValueError: # detect GPUs
strategy = tf.distribute.MirroredStrategy() # for CPU/GPU or multi-GPU machines
# use TPUStrategy scope to define model
with strategy.scope():
model = tf.keras.Sequential( ... )
model.compile( ... )
# train model normally on a tf.data.Dataset
model.fit(training_dataset, epochs=EPOCHS, steps_per_epoch=...)
Hôm nay, chúng ta sẽ sử dụng TPU để xây dựng và tối ưu hoá một thuật toán phân loại hoa ở tốc độ tương tác (vài phút cho mỗi lần chạy huấn luyện).
Tại sao nên dùng TPU?
Các GPU hiện đại được sắp xếp dựa trên các "lõi" có thể lập trình được, một cấu trúc rất linh hoạt cho phép chúng xử lý nhiều tác vụ như kết xuất 3D, học sâu, mô phỏng vật lý, v.v. Mặt khác, TPU sẽ ghép nối một bộ xử lý vectơ cổ điển với đơn vị nhân ma trận chuyên dụng và vượt trội ở bất kỳ nhiệm vụ nào mà các phép nhân ma trận lớn chiếm ưu thế, chẳng hạn như mạng nơron.
Hình minh hoạ: một lớp mạng nơron dày đặc dưới dạng phép nhân ma trận, với một loạt 8 hình ảnh được xử lý thông qua mạng nơron cùng một lúc. Vui lòng thực hiện phép nhân một dòng x cột để xác minh rằng hàm này thực sự đang tính tổng tất cả giá trị pixel của một hình ảnh có trọng số. Các lớp tích chập cũng có thể được biểu diễn dưới dạng phép nhân ma trận mặc dù quy trình này phức tạp hơn một chút ( phần giải thích ở đây, trong phần 1).
Phần cứng
MXU và VPU
Lõi TPU v2 được tạo thành từ Đơn vị nhân ma trận (MXU) chạy phép nhân ma trận và Bộ xử lý vectơ (VPU) cho tất cả các tác vụ khác như kích hoạt, mềm tối đa, v.v. VPU xử lý các phép tính float32 và int32. Mặt khác, MXU hoạt động ở định dạng dấu phẩy động 16-32 bit có độ chính xác kết hợp.
Dấu phẩy động có độ chính xác kết hợp và bfloat16
MXU tính các phép nhân ma trận bằng cách sử dụng đầu vào bfloat16 và đầu ra float32. Việc tích luỹ trung gian được thực hiện với độ chính xác float32.
Quá trình huấn luyện mạng nơron thường có khả năng chống lại nhiễu do độ chính xác của dấu phẩy động bị giảm. Có những trường hợp mà nhiễu thậm chí còn giúp trình tối ưu hoá hội tụ. Độ chính xác dấu phẩy động 16 bit thường được dùng để tăng tốc tính toán, nhưng định dạng float16 và float32 có phạm vi rất khác nhau. Việc giảm độ chính xác từ float32 xuống float16 thường dẫn đến hiện tượng tràn qua và chạy dưới luồng. Có các giải pháp nhưng thường phải làm thêm việc để float16 hoạt động.
Đó là lý do Google giới thiệu định dạng bfloat16 trong TPU. bfloat16 là một float32 bị cắt bớt với số mũ và phạm vi giống hệt với float32. Điều này thêm vào thực tế là các phép nhân ma trận tính toán của TPU với độ chính xác hỗn hợp với đầu vào bfloat16 nhưng đầu ra float32, có nghĩa là thường không cần thay đổi mã để hưởng lợi từ mức tăng hiệu suất khi độ chính xác giảm.
Mảng tâm thu
MXU triển khai các phép nhân ma trận trong phần cứng bằng cách sử dụng kiến trúc được gọi là "mảng tâm thu", trong đó các phần tử dữ liệu chuyển qua một mảng các đơn vị tính toán phần cứng. (Trong y học, "tâm thu" đề cập đến các cơn co thắt tim và dòng máu, ở đây là dòng dữ liệu.)
Phần tử cơ bản của phép nhân ma trận là tích vô hướng giữa một dòng của một ma trận và một cột của ma trận kia (xem hình minh hoạ ở đầu phần này). Đối với phép nhân ma trận Y=X*W, một phần tử của kết quả sẽ là:
Y[2,0] = X[2,0]*W[0,0] + X[2,1]*W[1,0] + X[2,2]*W[2,0] + ... + X[2,n]*W[n,0]
Trên GPU, người ta sẽ lập trình tích vô hướng này vào "lõi" GPU, sau đó thực thi tích vô hướng này trên nhiều "lõi" song song để cố gắng tính toán mọi giá trị của ma trận thu được cùng một lúc. Nếu ma trận thu được có kích thước 128x128, thì bạn cần có 128x128=16K "lõi", điều này thường không thể thực hiện được. Các GPU lớn nhất có khoảng 4.000 lõi. Mặt khác, TPU sử dụng phần cứng tối thiểu cho các đơn vị điện toán trong MXU: chỉ có bfloat16 x bfloat16 => float32
bộ tích luỹ nhân, không có gì khác. Chúng nhỏ đến mức một TPU có thể triển khai 16K trong số đó ở MXU 128x128 và xử lý phép nhân ma trận này trong một lần.
Hình minh hoạ: mảng tâm thu MXU. Các phần tử điện toán là các giá trị tích luỹ nhân. Các giá trị của một ma trận được tải vào mảng (các dấu chấm màu đỏ). Các giá trị của ma trận khác sẽ chảy qua mảng (các chấm màu xám). Các đường dọc sẽ truyền giá trị lên trên. Các đường ngang truyền tổng một phần. Người dùng sẽ được thực hành để xác minh rằng khi dữ liệu chảy qua mảng, bạn sẽ nhận được kết quả của phép nhân ma trận ở bên phải.
Ngoài ra, trong khi các tích vô hướng được tính trong một MXU, các tổng trung gian chỉ trao đổi qua lại giữa các đơn vị điện toán liền kề. Chúng không cần được lưu trữ và truy xuất vào/từ bộ nhớ hoặc thậm chí không cần tệp đăng ký. Kết quả cuối cùng là kiến trúc mảng tâm thu TPU có lợi thế đáng kể về mật độ và năng lượng, đồng thời có lợi thế về tốc độ không nhỏ so với GPU khi tính toán các phép nhân ma trận.
TPU đám mây
Khi yêu cầu một "Cloud TPU v2" trên Google Cloud Platform, bạn sẽ nhận được một máy ảo (VM) có bảng TPU gắn PCI. Bảng TPU có 4 khối TPU lõi kép. Mỗi lõi TPU có một VU (Bộ xử lý vectơ) và một Đơn vị nhân matriX (MatriX nhân) 128x128. Sau đó, "Cloud TPU" này thường được kết nối thông qua mạng với máy ảo đã yêu cầu. Vì vậy, toàn bộ hình ảnh sẽ có dạng như sau:
Hình minh hoạ: máy ảo của bạn có trình tăng tốc "Cloud TPU" được gắn mạng. Bản thân "Cloud TPU" được tạo thành từ một máy ảo có một bo mạch TPU gắn PCI với 4 chip TPU lõi kép trên đó.
Nhóm TPU
Trong các trung tâm dữ liệu của Google, TPU được kết nối với một mạng kết nối điện toán hiệu suất cao (HPC) có thể khiến chúng xuất hiện dưới dạng một bộ tăng tốc rất lớn. Google gọi các cụm này là pod và chúng có thể bao gồm tối đa 512 lõi TPU v2 hoặc 2048 lõi TPU v3.
Hình minh hoạ: một nhóm TPU phiên bản 3. Các bo mạch và giá đỡ TPU được kết nối thông qua kết nối HPC.
Trong quá trình huấn luyện, các độ dốc được trao đổi giữa các nhân TPU bằng thuật toán tất cả đều giảm ( giải thích rõ về thuật toán tất cả đều giảm tại đây). Mô hình đang được huấn luyện có thể tận dụng phần cứng bằng cách huấn luyện trên các lô lớn.
Hình minh hoạ: đồng bộ hoá độ dốc trong quá trình huấn luyện bằng thuật toán giảm tất cả trên mạng HPC lưới 2-D của Google TPU.
Phần mềm
Đào tạo theo lô lớn
Kích thước lô lý tưởng cho TPU là 128 mục dữ liệu trên mỗi lõi TPU, nhưng phần cứng đã có thể hiển thị khả năng sử dụng tốt từ 8 mục dữ liệu trên mỗi lõi TPU. Hãy nhớ rằng một Cloud TPU có 8 lõi.
Trong lớp học lập trình này, chúng ta sẽ sử dụng API Keras. Trong Keras, lô bạn chỉ định là kích thước lô toàn cục cho toàn bộ TPU. Các lô của bạn sẽ tự động được chia thành 8 và chạy trên 8 lõi của TPU.
Để biết thêm các mẹo về hiệu suất, hãy xem Hướng dẫn về hiệu suất của TPU. Đối với kích thước lô rất lớn, có thể bạn cần đặc biệt chú ý trong một số mô hình. Hãy xem bài viết LARSOptimizer để biết thêm thông tin chi tiết.
Nâng cao: XLA
Chương trình Tensorflow xác định biểu đồ tính toán. TPU không trực tiếp chạy mã Python mà chạy biểu đồ tính toán do chương trình Tensorflow của bạn xác định. Trong phần nội dung, một trình biên dịch có tên XLA (trình biên dịch Đại số tuyến tính tăng tốc) sẽ chuyển đổi biểu đồ Tensorflow của các nút tính toán thành mã máy TPU. Trình biên dịch này cũng thực hiện nhiều hoạt động tối ưu hoá nâng cao cho mã và bố cục bộ nhớ của bạn. Quá trình biên dịch diễn ra tự động khi công việc được gửi đến TPU. Bạn không cần phải đưa XLA vào chuỗi bản dựng của mình một cách rõ ràng.
Hình minh hoạ: để chạy trên TPU, trước tiên, đồ thị tính toán do chương trình Tensorflow xác định sẽ được dịch sang biểu diễn XLA (trình biên dịch đại số tuyến tính tăng tốc), sau đó được XLA biên dịch thành mã máy TPU.
Sử dụng TPU trong Keras
TPU được hỗ trợ thông qua API Keras kể từ Tensorflow 2.1. Tính năng hỗ trợ của Keras hoạt động trên các nhóm TPU và TPU. Dưới đây là ví dụ hoạt động trên TPU, (các) GPU và CPU:
try: # detect TPUs
tpu = tf.distribute.cluster_resolver.TPUClusterResolver.connect()
strategy = tf.distribute.TPUStrategy(tpu)
except ValueError: # detect GPUs
strategy = tf.distribute.MirroredStrategy() # for CPU/GPU or multi-GPU machines
# use TPUStrategy scope to define model
with strategy.scope():
model = tf.keras.Sequential( ... )
model.compile( ... )
# train model normally on a tf.data.Dataset
model.fit(training_dataset, epochs=EPOCHS, steps_per_epoch=...)
Trong đoạn mã này:
TPUClusterResolver().connect()
tìm thấy TPU trên mạng. API này hoạt động mà không cần tham số trên hầu hết hệ thống của Google Cloud (công việc của Nền tảng AI, Colaboratory, Kubeflow, máy ảo học sâu được tạo thông qua tiện ích "ctpu up"). Các hệ thống này biết vị trí của TPU nhờ biến môi trường TPU_NAME. Nếu bạn tạo một TPU theo cách thủ công, hãy đặt môi trường TPU_NAME trên máy ảo mà bạn đang sử dụng hoặc gọiTPUClusterResolver
với các tham số rõ ràng:TPUClusterResolver(tp_uname, zone, project)
TPUStrategy
là bộ phận triển khai quá trình phân phối và thuật toán đồng bộ hoá độ dốc "all-reduce".- Chiến lược được áp dụng thông qua một phạm vi. Mô hình phải được xác định trong phạm vi chiến lược().
- Hàm
tpu_model.fit
cần một đối tượng tf.data.Dataset làm dữ liệu đầu vào để huấn luyện TPU.
Các thao tác thường gặp khi chuyển TPU
- Mặc dù có nhiều cách để tải dữ liệu trong mô hình Tensorflow, nhưng đối với TPU, bạn bắt buộc phải sử dụng API
tf.data.Dataset
. - TPU rất nhanh và việc nhập dữ liệu thường trở thành điểm tắc nghẽn khi chạy trên chúng. Bạn có thể sử dụng các công cụ để phát hiện điểm tắc nghẽn dữ liệu và các mẹo khác về hiệu suất trong Hướng dẫn về hiệu suất của TPU.
- Các số int8 hoặc int16 được coi là int32. TPU không có phần cứng số nguyên hoạt động dưới 32 bit.
- Một số thao tác Tensorflow không được hỗ trợ. Xem danh sách tại đây. Tin vui là giới hạn này chỉ áp dụng cho mã huấn luyện, tức là truyền tiến và lùi thông qua mô hình của bạn. Bạn vẫn có thể sử dụng tất cả các thao tác Tensorflow trong quy trình nhập dữ liệu vì quy trình này sẽ được thực thi trên CPU.
tf.py_func
không được hỗ trợ trên TPU.
4. [INFO] Thuật toán phân loại mạng nơron 101
Tóm tắt
Nếu đã biết tất cả các thuật ngữ được in đậm trong đoạn tiếp theo, bạn có thể chuyển sang bài tập tiếp theo. Nếu bạn mới bắt đầu tìm hiểu về học sâu, vui lòng đọc tiếp.
Đối với các mô hình được xây dựng dưới dạng một trình tự các lớp, Keras cung cấp API tuần tự. Ví dụ: một trình phân loại hình ảnh sử dụng ba lớp dày đặc có thể được viết trong Keras như sau:
model = tf.keras.Sequential([
tf.keras.layers.Flatten(input_shape=[192, 192, 3]),
tf.keras.layers.Dense(500, activation="relu"),
tf.keras.layers.Dense(50, activation="relu"),
tf.keras.layers.Dense(5, activation='softmax') # classifying into 5 classes
])
# this configures the training of the model. Keras calls it "compiling" the model.
model.compile(
optimizer='adam',
loss= 'categorical_crossentropy',
metrics=['accuracy']) # % of correct answers
# train the model
model.fit(dataset, ... )
Mạng nơron dày đặc
Đây là mạng nơron đơn giản nhất để phân loại hình ảnh. Nó được tạo thành từ các "nơ-ron" được sắp xếp theo lớp. Lớp đầu tiên xử lý dữ liệu đầu vào và đưa dữ liệu đầu ra vào các lớp khác. Lớp này được gọi là "mật" vì mỗi tế bào thần kinh được kết nối với tất cả các tế bào thần kinh trong lớp trước.
Bạn có thể đưa hình ảnh vào một mạng như vậy bằng cách làm phẳng các giá trị RGB của tất cả các điểm ảnh thành một vectơ dài và sử dụng vectơ đó làm dữ liệu đầu vào. Đây không phải là kỹ thuật tốt nhất để nhận dạng hình ảnh nhưng chúng tôi sẽ cải thiện kỹ thuật này sau.
Nơron, hoạt động, RELU
Một "neuron" (tế bào thần kinh) tính toán tổng trọng số của tất cả các đầu vào, thêm một giá trị gọi là "độ lệch" và đưa kết quả vào thông qua một "hàm kích hoạt". Ban đầu, trọng số và độ chệch không được xác định. Các giá trị này sẽ được khởi tạo ngẫu nhiên và "học" bằng cách huấn luyện mạng nơron trên nhiều dữ liệu đã biết.
Hàm kích hoạt phổ biến nhất có tên là RELU cho Đơn vị tuyến tính đã chỉnh sửa. Đây là một hàm rất đơn giản như bạn có thể thấy trên biểu đồ ở trên.
Kích hoạt Softmax
Mạng lưới ở trên kết thúc bằng một lớp 5 tế bào thần kinh vì chúng ta đang phân loại hoa thành 5 loại (hoa hồng, hoa tulip, bồ công anh, hoa cúc, hoa hướng dương). Nơ-ron trong lớp trung gian được kích hoạt bằng hàm kích hoạt RELU cổ điển. Tuy nhiên, trong lớp cuối cùng, chúng ta muốn tính toán các số từ 0 đến 1 thể hiện xác suất hoa này là hoa hồng, hoa tulip, v.v. Để làm được điều này, chúng tôi sẽ sử dụng chức năng kích hoạt có tên là "softmax".
Bạn có thể áp dụng hàm softmax cho một vectơ bằng cách lấy hàm mũ của mỗi phần tử rồi chuẩn hoá vectơ, thường là bằng cách sử dụng chuẩn L1 (tổng các giá trị tuyệt đối) để các giá trị cộng lại bằng 1 và có thể được diễn giải là xác suất.
Hệ số hao tổn entropy chéo
Giờ đây, mạng nơron của chúng ta đã tạo ra các dự đoán từ hình ảnh đầu vào, chúng ta cần đo lường độ chính xác của các dự đoán đó, tức là khoảng cách giữa những gì mạng nơron cho chúng ta biết và câu trả lời chính xác, thường được gọi là "nhãn". Hãy nhớ rằng chúng ta có nhãn chính xác cho tất cả hình ảnh trong tập dữ liệu.
Bất kỳ khoảng cách nào cũng sẽ hoạt động, nhưng đối với các vấn đề phân loại, "khoảng cách entropy chéo" được gọi là hiệu quả nhất. Chúng ta sẽ gọi hàm này là lỗi hoặc hàm "mất mát":
Phương pháp giảm độ dốc
"Huấn luyện" mạng nơron thực sự có nghĩa là sử dụng hình ảnh và nhãn huấn luyện để điều chỉnh trọng số và độ chệch nhằm giảm thiểu hàm mất mát entropy chéo. Sau đây là cách hoạt động của tính năng này.
Entropy chéo là một hàm của trọng số, độ chệch, pixel của hình ảnh huấn luyện và lớp đã biết của hình ảnh đó.
Nếu tính toán đạo hàm riêng của entropy chéo tương ứng với tất cả các trọng số và tất cả các độ lệch, chúng ta sẽ thu được một "độ dốc", được tính toán cho một hình ảnh, nhãn và giá trị hiện tại của các trọng số và độ lệch. Hãy nhớ rằng chúng ta có thể có hàng triệu trọng số và độ lệch, vì vậy, việc tính toán độ dốc có vẻ như là một công việc rất lớn. May mắn thay, Tensorflow sẽ giúp chúng ta làm việc này. Thuộc tính toán học của dải chuyển màu là nó trỏ "lên trên". Vì chúng ta muốn đi đến nơi có entropy chéo thấp, nên chúng ta sẽ đi theo hướng ngược lại. Chúng ta cập nhật trọng số và độ lệch bằng một phần của độ dốc. Sau đó, chúng ta làm tương tự nhiều lần bằng cách sử dụng các lô hình ảnh và nhãn huấn luyện tiếp theo trong một vòng lặp huấn luyện. Hy vọng rằng giá trị này hội tụ đến một nơi mà giá trị chéo entropy là tối thiểu, mặc dù không có gì đảm bảo rằng giá trị tối thiểu này là duy nhất.
Nhóm nhỏ và động lượng
Bạn có thể tính toán độ dốc của mình chỉ trên một hình ảnh ví dụ và cập nhật ngay lập tức trọng số và độ chệch, nhưng làm như vậy trên một loạt, ví dụ 128 hình ảnh sẽ tạo ra một độ dốc thể hiện tốt hơn các hạn chế do các hình ảnh mẫu khác nhau áp đặt và do đó có khả năng hội tụ về phía giải pháp nhanh hơn. Kích thước của lô nhỏ là một tham số có thể điều chỉnh.
Kỹ thuật này đôi khi được gọi là "giảm độ dốc ngẫu nhiên" có một lợi ích khác và thực tế hơn: làm việc với các lô cũng có nghĩa là làm việc với các ma trận lớn hơn và các phương pháp này thường dễ tối ưu hoá trên GPU và TPU hơn.
Tuy nhiên, quá trình hội tụ vẫn có thể hơi hỗn loạn và thậm chí có thể dừng lại nếu vectơ độ dốc toàn là số 0. Điều đó có nghĩa là chúng ta đã tìm thấy giá trị tối thiểu không? Không phải lúc nào cũng vậy. Thành phần chuyển màu có thể bằng 0 ở giá trị tối thiểu hoặc tối đa. Với một vectơ độ dốc có hàng triệu phần tử, nếu tất cả các phần tử đều bằng 0, thì xác suất để mỗi phần tử bằng 0 tương ứng với một giá trị tối thiểu và không có phần tử nào tương ứng với một giá trị tối đa là khá nhỏ. Trong một không gian có nhiều chiều, các điểm yên khá phổ biến và chúng tôi không muốn dừng lại ở đó.
Hình minh hoạ: điểm yên ngựa. Độ dốc là 0 nhưng không phải là giá trị nhỏ nhất theo mọi hướng. (Thông tin ghi công hình ảnh Wikimedia: Tác giả Nicoguaro – Tác phẩm riêng, CC BY 3.0)
Giải pháp là thêm một số động lực vào thuật toán tối ưu hoá để thuật toán này có thể vượt qua các điểm yên ngựa mà không dừng lại.
Bảng thuật ngữ
Lô hoặc lô nhỏ: quá trình huấn luyện luôn được thực hiện trên các lô dữ liệu và nhãn huấn luyện. Làm như vậy sẽ giúp thuật toán hội tụ. Tham số "lô" thường là tham số đầu tiên của tensor dữ liệu. Ví dụ: tensor có hình dạng [100, 192, 192, 3] chứa 100 hình ảnh có kích thước 192x192 pixel với ba giá trị mỗi pixel (RGB).
tổn thất entropy chéo: một hàm tổn thất đặc biệt thường được dùng trong các thuật toán phân loại.
lớp dày đặc: một lớp tế bào thần kinh, trong đó mỗi tế bào thần kinh được kết nối với tất cả các tế bào thần kinh trong lớp trước.
tính năng: đầu vào của mạng nơron đôi khi được gọi là "tính năng". Nghệ thuật tìm ra những phần của tập dữ liệu (hoặc tổ hợp các phần) cần đưa vào mạng nơron để có được kết quả dự đoán chính xác được gọi là "kỹ thuật xử lý đặc điểm".
nhãn: tên khác của "lớp học" hoặc câu trả lời chính xác trong một bài toán phân loại được giám sát
tốc độ học tập: tỷ lệ độ dốc mà theo đó trọng số và độ chệch được cập nhật ở mỗi lần lặp lại của vòng lặp huấn luyện.
logit: dữ liệu đầu ra của một lớp nơron trước khi áp dụng hàm kích hoạt được gọi là "logit". Thuật ngữ này bắt nguồn từ "hàm logistic", còn gọi là "hàm sigmoid", trước đây là hàm kích hoạt phổ biến nhất. "Đầu ra nơron trước hàm logistic" bị rút gọn thành "logits".
loss: hàm lỗi so sánh đầu ra của mạng nơron với câu trả lời chính xác
neuron: tính tổng trọng số của các đầu vào, thêm một độ lệch và truyền kết quả thông qua một hàm kích hoạt.
mã hoá one-hot: lớp 3/5 được mã hoá dưới dạng một vectơ gồm 5 phần tử, tất cả đều bằng 0 ngoại trừ phần tử thứ 3 là 1.
relu: đơn vị tuyến tính đã chỉnh sửa. Một hàm kích hoạt phổ biến cho các tế bào thần kinh.
sigmoid: một hàm kích hoạt khác từng phổ biến và hiện vẫn hữu ích trong các trường hợp đặc biệt.
softmax: một hàm kích hoạt đặc biệt hoạt động trên một vectơ, làm tăng sự khác biệt giữa thành phần lớn nhất và tất cả các thành phần khác, đồng thời chuẩn hoá vectơ để có tổng là 1 để có thể được diễn giải là một vectơ xác suất. Được dùng làm bước cuối cùng trong thuật toán phân loại.
tensor: "Tensor" giống như một ma trận nhưng có số lượng chiều tuỳ ý. Tensor 1 chiều là một vectơ. Tensor 2 chiều là một ma trận. Và sau đó bạn có thể có các tensor với 3, 4, 5 hoặc nhiều chiều.
5. [THÔNG TIN MỚI] Mạng nơron tích chập
Tóm tắt
Nếu đã biết tất cả các thuật ngữ được in đậm trong đoạn tiếp theo, bạn có thể chuyển sang bài tập tiếp theo. Nếu bạn mới bắt đầu tìm hiểu về mạng nơron tích chập, vui lòng đọc tiếp.
Hình minh hoạ: lọc một hình ảnh có hai bộ lọc liên tiếp, có kích thước 4x4x3=48 trọng số có thể học.
Dưới đây là giao diện của một mạng nơron tích chập đơn giản trong Keras:
model = tf.keras.Sequential([
# input: images of size 192x192x3 pixels (the three stands for RGB channels)
tf.keras.layers.Conv2D(kernel_size=3, filters=24, padding='same', activation='relu', input_shape=[192, 192, 3]),
tf.keras.layers.Conv2D(kernel_size=3, filters=24, padding='same', activation='relu'),
tf.keras.layers.MaxPooling2D(pool_size=2),
tf.keras.layers.Conv2D(kernel_size=3, filters=12, padding='same', activation='relu'),
tf.keras.layers.MaxPooling2D(pool_size=2),
tf.keras.layers.Conv2D(kernel_size=3, filters=6, padding='same', activation='relu'),
tf.keras.layers.Flatten(),
# classifying into 5 categories
tf.keras.layers.Dense(5, activation='softmax')
])
model.compile(
optimizer='adam',
loss= 'categorical_crossentropy',
metrics=['accuracy'])
Kiến thức cơ bản về mạng nơron tích chập
Trong một lớp của mạng nơron tích chập, một "nơron" thực hiện phép cộng trọng số của các pixel ngay phía trên nó, chỉ trên một vùng nhỏ của hình ảnh. Phương thức này thêm độ chệch và cung cấp giá trị tổng thông qua một hàm kích hoạt, giống như một nơron trong một lớp dày đặc thông thường. Sau đó, thao tác này được lặp lại trên toàn bộ hình ảnh với cùng trọng số. Hãy nhớ rằng trong các lớp dày đặc, mỗi tế bào thần kinh đều có trọng số riêng. Ở đây, một "miếng vá" trọng số trượt trên hình ảnh theo cả hai hướng ("convolution" – tích chập). Đầu ra có nhiều giá trị như pixel trong hình ảnh (tuy nhiên, cần có một số khoảng đệm ở các cạnh). Đây là một phép toán lọc, sử dụng bộ lọc có trọng số 4x4x3=48.
Tuy nhiên, 48 trọng số sẽ là không đủ. Để thêm nhiều bậc tự do hơn, chúng ta lặp lại cùng một phép toán với một bộ trọng số mới. Thao tác này sẽ tạo ra một tập hợp đầu ra bộ lọc mới. Hãy gọi đó là "kênh" đầu ra tương tự như các kênh R, G, B trong hình ảnh đầu vào.
Hai (hoặc nhiều) tập hợp trọng số có thể được tổng hợp dưới dạng một tensor bằng cách thêm một chiều mới. Điều này cho chúng ta hình dạng chung của tensor trọng số cho một lớp tích chập. Do số lượng kênh đầu vào và đầu ra là tham số, nên chúng ta có thể bắt đầu xếp chồng và tạo chuỗi các lớp tích chập.
Hình minh hoạ: một mạng nơron tích chập biến đổi các "khối" dữ liệu thành các "khối" dữ liệu khác.
Lớp phủ có bước, tích chập tối đa
Bằng cách thực hiện phép tích chập với bước là 2 hoặc 3, chúng ta cũng có thể thu nhỏ khối dữ liệu thu được theo chiều ngang. Có hai cách phổ biến để làm việc này:
- Tích chập sải chân: bộ lọc trượt như trên nhưng có sải chân >1
- Max pooling (Tối đa hoá): một cửa sổ trượt áp dụng toán tử MAX (thường là trên các mảng 2x2, lặp lại sau mỗi 2 pixel)
Hình minh hoạ: việc trượt cửa sổ tính toán thêm 3 pixel sẽ dẫn đến ít giá trị đầu ra hơn. Tích chập sải chân hoặc gộp nhóm tối đa (tối đa trên cửa sổ 2x2 trượt với một sải chân là 2) là một cách thu gọn khối dữ liệu theo kích thước ngang.
Thuật toán phân loại dựa trên môi trường
Cuối cùng, chúng ta đính kèm một đầu phân loại bằng cách làm phẳng khối dữ liệu cuối cùng và đưa khối dữ liệu đó vào một lớp dày đặc, được kích hoạt bằng softmax. Một bộ phân loại tích chập điển hình có thể có dạng như sau:
Hình minh hoạ: một thuật toán phân loại hình ảnh sử dụng các lớp tích chập và softmax. Sử dụng bộ lọc 3x3 và 1x1. Các lớp maxpool lấy giá trị tối đa của các nhóm gồm 2x2 điểm dữ liệu. Phần đầu phân loại được triển khai bằng một lớp dày đặc có kích hoạt softmax.
Trong Keras
Bạn có thể viết ngăn xếp tích chập được minh hoạ ở trên trong Keras như sau:
model = tf.keras.Sequential([
# input: images of size 192x192x3 pixels (the three stands for RGB channels)
tf.keras.layers.Conv2D(kernel_size=3, filters=32, padding='same', activation='relu', input_shape=[192, 192, 3]),
tf.keras.layers.Conv2D(kernel_size=1, filters=32, padding='same', activation='relu'),
tf.keras.layers.MaxPooling2D(pool_size=2),
tf.keras.layers.Conv2D(kernel_size=3, filters=32, padding='same', activation='relu'),
tf.keras.layers.Conv2D(kernel_size=1, filters=32, padding='same', activation='relu'),
tf.keras.layers.MaxPooling2D(pool_size=2),
tf.keras.layers.Conv2D(kernel_size=3, filters=32, padding='same', activation='relu'),
tf.keras.layers.Conv2D(kernel_size=1, filters=32, padding='same', activation='relu'),
tf.keras.layers.MaxPooling2D(pool_size=2),
tf.keras.layers.Conv2D(kernel_size=3, filters=32, padding='same', activation='relu'),
tf.keras.layers.Conv2D(kernel_size=1, filters=32, padding='same', activation='relu'),
tf.keras.layers.MaxPooling2D(pool_size=2),
tf.keras.layers.Conv2D(kernel_size=3, filters=16, padding='same', activation='relu'),
tf.keras.layers.Conv2D(kernel_size=1, filters=8, padding='same', activation='relu'),
tf.keras.layers.Flatten(),
# classifying into 5 categories
tf.keras.layers.Dense(5, activation='softmax')
])
model.compile(
optimizer='adam',
loss= 'categorical_crossentropy',
metrics=['accuracy'])
6. Mạng chuyển đổi tuỳ chỉnh
Tự thực hành
Hãy cùng xây dựng và huấn luyện một mạng nơron tích chập từ đầu. Việc sử dụng TPU sẽ cho phép chúng ta lặp lại rất nhanh. Vui lòng mở sổ tay dưới đây, thực thi các ô (Shift-ENTER) và làm theo hướng dẫn ở bất cứ nơi nào bạn thấy nhãn "CẦN CÔNG VIỆC".
Keras_Flowers_TPU (playground).ipynb
Mục tiêu là vượt qua độ chính xác 75% của mô hình học chuyển đổi. Mô hình đó có lợi thế là đã được huấn luyện trước về tập dữ liệu gồm hàng triệu hình ảnh trong khi chúng tôi chỉ có 3670 hình ảnh ở đây. Ít nhất thì bạn có thể so khớp được không?
Thông tin khác
Có bao nhiêu lớp, kích thước bao nhiêu?
Việc chọn kích thước lớp không chỉ là nghệ thuật mà còn là một môn khoa học. Bạn phải tìm được sự cân bằng hợp lý giữa việc có quá ít và quá nhiều tham số (trọng số và độ chệch). Khi có quá ít trọng số, mạng nơron không thể thể hiện độ phức tạp của hình dạng hoa. Khi có quá nhiều tệp, phần mềm này có thể dễ bị "trang bị quá mức", tức là chỉ tập trung vào các hình ảnh huấn luyện mà không thể tổng quát hoá. Khi có nhiều tham số, mô hình cũng sẽ được huấn luyện chậm. Trong Keras, hàm model.summary()
cho thấy cấu trúc và số lượng tham số của mô hình:
Layer (type) Output Shape Param #
=================================================================
conv2d (Conv2D) (None, 192, 192, 16) 448
_________________________________________________________________
conv2d_1 (Conv2D) (None, 192, 192, 30) 4350
_________________________________________________________________
max_pooling2d (MaxPooling2D) (None, 96, 96, 30) 0
_________________________________________________________________
conv2d_2 (Conv2D) (None, 96, 96, 60) 16260
_________________________________________________________________
...
_________________________________________________________________
global_average_pooling2d (Gl (None, 130) 0
_________________________________________________________________
dense (Dense) (None, 90) 11790
_________________________________________________________________
dense_1 (Dense) (None, 5) 455
=================================================================
Total params: 300,033
Trainable params: 300,033
Non-trainable params: 0
_________________________________________________________________
Một vài mẹo:
- Việc có nhiều lớp chính là điều làm cho mạng nơron "sâu" trở nên hiệu quả. Đối với bài toán nhận dạng hoa đơn giản này, bạn nên thêm 5 đến 10 lớp.
- Sử dụng bộ lọc nhỏ. Thông thường, bộ lọc 3x3 sẽ phù hợp với mọi nơi.
- Bộ lọc 1x1 cũng có thể được sử dụng và rẻ. Các bộ lọc này không thực sự "lọc" bất kỳ nội dung nào mà chỉ tính toán các tổ hợp tuyến tính của các kênh. Thay thế các bộ lọc này bằng bộ lọc thực. (Tìm hiểu thêm về "lớp phủ 1x1" trong phần tiếp theo.)
- Đối với vấn đề phân loại như thế này, hãy giảm tần suất lấy mẫu bằng các lớp tích luỹ tối đa (hoặc tích chập có bước >1). Bạn không quan tâm hoa ở đâu, chỉ biết đó là hoa hồng hay bồ công anh nên việc mất thông tin x và y không quan trọng và việc lọc các khu vực nhỏ hơn thì rẻ hơn.
- Số lượng bộ lọc thường tương tự như số lớp ở cuối mạng (tại sao? Hãy xem thủ thuật "gộp trung bình trên toàn cầu" bên dưới). Nếu bạn phân loại thành hàng trăm lớp, hãy tăng dần số lượng bộ lọc trong các lớp liên tiếp. Đối với tập dữ liệu hoa có 5 lớp, việc chỉ lọc bằng 5 bộ lọc là chưa đủ. Bạn có thể sử dụng cùng một số lượng bộ lọc trong hầu hết các lớp, ví dụ như 32 và giảm số lượng bộ lọc xuống cuối.
- (Các) lớp dày đặc cuối cùng tốn kém. Lớp này có thể có nhiều trọng số hơn tất cả các lớp convolutional cộng lại. Ví dụ: ngay cả với đầu ra rất hợp lý từ khối dữ liệu cuối cùng gồm 24x24x10 điểm dữ liệu, một lớp dày đặc 100 nơron sẽ có giá 24x24x10x100=576.000 trọng lượng !!! Hãy cố gắng thận trọng hoặc thử gộp trung bình toàn cầu (xem bên dưới).
Tính năng tổng hợp trung bình toàn cục
Thay vì sử dụng một lớp dày đặc đắt tiền ở cuối mạng nơron tích chập, bạn có thể chia "khối" dữ liệu nhận được thành nhiều phần nhất có thể, tính trung bình các giá trị của lớp và cung cấp các giá trị này thông qua hàm kích hoạt Softmax. Cách tạo đầu phân loại này không có trọng số. Trong Keras, cú pháp là tf.keras.layers.GlobalAveragePooling2D().
Giải pháp
Dưới đây là sổ tay giải pháp. Bạn có thể sử dụng tính năng này nếu gặp khó khăn.
Keras_Flowers_TPU (solution).ipynb
Nội dung đã đề cập
- 🤔 Sử dụng các lớp tích chập
- 🤓 Thử nghiệm các phương pháp gộp tối đa, sải chân, gộp trung bình trên toàn cầu, ...
- 😀 lặp lại nhanh một mô hình thực tế trên TPU
Vui lòng dành chút thời gian để xem danh sách kiểm tra này trong đầu bạn.
7. Xin chúc mừng!
Bạn đã xây dựng mạng nơron tích chập hiện đại đầu tiên và huấn luyện mạng đó đạt độ chính xác trên 80%, lặp lại cấu trúc của mạng chỉ trong vài phút nhờ TPU. Vui lòng chuyển sang lớp học tiếp theo để tìm hiểu về các cấu trúc tích chập hiện đại:
- Quy trình dữ liệu tốc độ TPU: tf.data.Dataset và TFRecords
- Mô hình Keras đầu tiên của bạn, với tính năng học chuyển đổi
- [LỚP HỌC NÀY] Mạng nơron tích chập, với Keras và TPU
- Các mạng convnet hiện đại, squeezenet, Xception, với Keras và TPU
TPU trong thực tế
TPU và GPU có trên Cloud AI Platform:
- Máy ảo học sâu
- Trong mục Sổ tay dựa trên nền tảng AI
- Trong việc làm Đào tạo về nền tảng AI
Cuối cùng, chúng tôi rất mong nhận được ý kiến phản hồi của bạn. Vui lòng cho chúng tôi biết nếu bạn thấy có điều gì thiếu trong phòng thí nghiệm này hoặc nếu bạn cho rằng điều đó cần được cải thiện. Bạn có thể cung cấp ý kiến phản hồi thông qua các vấn đề trên GitHub [ feedback link].
|