Chuyển đến nội dung chính

Chuẩn hoá theo lô (Batch Normalization): Lý thuyết và triển khai với TensorFlow

Batch normalization tiêu chuẩn hoá đầu vào theo mini-batch để ổn định và tăng tốc huấn luyện mạng nơ-ron.
· 15 phút đọc

Khám phá cùng AI

Huấn luyện các mạng nơ-ron sâu có thể đầy thách thức do hiện tượng đạo hàm tiêu biến hoặc bùng nổ và sự dịch chuyển hiệp biến nội bộ. Những yếu tố này có thể làm chậm đáng kể quá trình huấn luyện và cản trở khả năng học hiệu quả của mạng. May mắn thay, chúng ta có thể xử lý các vấn đề này bằng các kỹ thuật chuẩn hoá.

Trong số nhiều kỹ thuật chuẩn hoá, chuẩn hoá theo lô (batch normalization) là một trong những phương pháp phổ biến nhất và đã trở thành thành phần tiêu chuẩn trong nhiều kiến trúc học sâu. Nó giúp hội tụ nhanh hơn, ổn định quá trình huấn luyện và cải thiện khả năng khái quát hoá.

Trong hướng dẫn này, chúng tôi sẽ giải thích batch normalization, cách hoạt động về mặt toán học, và cách triển khai bằng TensorFlow và Keras.

Nếu bạn muốn học các kiến thức nền tảng về mạng nơ-ron bằng Keras, hãy xem khoá học Introduction to Deep Learning in Python này.

Chuẩn hoá trong Machine Learning là gì?

Chuẩn hoá là một bước tiền xử lý quan trọng trong machine learning nhằm tiêu chuẩn hoá dữ liệu đầu vào.

Nhiều kỹ thuật chuẩn hoá như co giãn min-max, chuẩn hoá z-score và biến đổi log thường được dùng để đưa các đặc trưng về cùng một khoảng hoặc phân phối nhất quán. Các kỹ thuật này giúp giảm tác động của ngoại lệ, cải thiện hội tụ và đảm bảo so sánh công bằng giữa các đặc trưng.

Chuẩn hoá dữ liệu đầu vào là điều thiết yếu để huấn luyện mô hình hiệu quả vì nó đảm bảo mọi đặc trưng đều đóng góp ngang nhau vào quá trình học. Nếu không chuẩn hoá, các đặc trưng có thang đo hoặc phương sai lớn hơn có thể chi phối quá trình tối ưu, dẫn đến hiệu năng mô hình kém.

Chuẩn hoá đưa các đặc trưng về cùng thang đo, cho phép mô hình học được các mẫu và mối quan hệ có ý nghĩa từ dữ liệu.

Nếu bạn muốn tìm hiểu tổng quan về chuẩn hoá, hãy xem hướng dẫn What is Normalization in Machine Learning.

Thách thức trong huấn luyện học sâu

Huấn luyện các mạng nơ-ron sâu có nhiều thách thức có thể cản trở hội tụ và khả năng khái quát:

  1. Dịch chuyển hiệp biến nội bộ: Khi dữ liệu đầu vào đi qua nhiều lớp, phân phối của các kích hoạt có thể thay đổi, khiến mô hình khó thích nghi và học hiệu quả.
  2. Đạo hàm tiêu biến và bùng nổ: Mạng sâu có thể gặp tình trạng đạo hàm quá nhỏ hoặc quá lớn trong lan truyền ngược, ngăn cản việc cập nhật trọng số hiệu quả.
  3. Nhạy cảm với khởi tạo: Trọng số khởi tạo có thể ảnh hưởng lớn đến quá trình huấn luyện; khởi tạo kém có thể dẫn đến hội tụ chậm hoặc thất bại.

Batch normalization giải quyết các thách thức này bằng cách chuẩn hoá các kích hoạt trong từng mini-batch, giúp ổn định quá trình huấn luyện và cải thiện hiệu năng mô hình.

Batch Normalization là gì?

Batch normalization là kỹ thuật chuẩn hoá các kích hoạt của một lớp trong phạm vi một mini-batch trong quá trình huấn luyện mạng nơ-ron sâu.

Nó hoạt động bằng cách tính trung bình và phương sai của các kích hoạt cho từng đặc trưng trong mini-batch rồi chuẩn hoá các kích hoạt dựa trên các thống kê này.

Các kích hoạt đã chuẩn hoá sau đó được co giãn và tịnh tiến bằng các tham số học được, cho phép mô hình thích nghi với phân phối kích hoạt tối ưu.

batch normalization
AI

Nguồn: Yintai Ma và Diego Klabjan.

Batch Normalization thường được áp dụng sau phép biến đổi tuyến tính của một lớp (ví dụ sau phép nhân ma trận ở lớp fully connected hoặc sau phép tích chập ở lớp tích chập) và trước hàm kích hoạt phi tuyến (ví dụ ReLU).

Các thành phần chính của batch normalization gồm:

  1. Thống kê theo mini-batch: Tính trung bình và phương sai của các kích hoạt cho từng đặc trưng trong mini-batch.
  2. Chuẩn hoá: Chuẩn hoá các kích hoạt bằng cách trừ trung bình mini-batch và chia cho độ lệch chuẩn mini-batch.
  3. Co giãn và tịnh tiến: Thêm các tham số học được (γ và β) để co giãn và tịnh tiến các kích hoạt đã chuẩn hoá, cho phép mô hình học phân phối kích hoạt tối ưu.

Vì sao dùng Batch Normalization?

Một trong những thách thức khi huấn luyện mạng nơ-ron sâu là dịch chuyển hiệp biến nội bộ. Điều này xảy ra khi phân phối các kích hoạt (đầu ra) từ một lớp thay đổi trong suốt quá trình huấn luyện khi các trọng số ở các lớp trước được cập nhật. Sự dịch chuyển này có thể làm việc huấn luyện trở nên khó khăn và chậm.

Batch normalization giảm bớt sự dịch chuyển này bằng cách chuẩn hoá các kích hoạt trong từng mini-batch, giúp đầu vào cho các lớp tiếp theo ổn định và nhất quán hơn.

Chuẩn hoá các kích hoạt cho phép hội tụ nhanh hơn với tốc độ học cao hơn và làm mô hình bớt nhạy với lựa chọn khởi tạo.

Ngoài ra, nó còn tạo ra hiệu ứng regularization giúp ngăn overfitting bằng cách giảm sự phụ thuộc của mô hình vào các mẫu kích hoạt cụ thể.

Sự kết hợp các lợi ích này khiến batch normalization trở thành công cụ mạnh mẽ để huấn luyện các mô hình học sâu vững chắc hơn. Để tìm hiểu thêm về xây dựng mô hình vững chắc, hãy xem khoá học Machine Learning Monitoring Concepts.

Toán học đằng sau Batch Normalization

Giờ khi đã hiểu “vì sao” dùng batch normalization, hãy đi sâu vào “cách” hoạt động.

Batch normalization hoạt động khác nhau giữa giai đoạn huấn luyện và suy luận, vì vậy hãy giải thích toán học phía sau mỗi giai đoạn.

Batch normalization trong giai đoạn huấn luyện

Bắt đầu với bước chuẩn hoá. Chúng ta tính trung bình và phương sai cho từng đặc trưng trong một mini-batch. Đây là các công thức dùng cho trung bình và phương sai.

Sau đó, dùng trung bình và phương sai để chuẩn hoá các kích hoạt. Đây là công thức sử dụng, trong đó ε (epsilon chữ thường) là một hằng số nhỏ thêm vào để ổn định tính toán số:

Kết thúc bước chuẩn hoá, chúng ta chuyển sang bước co giãn và tịnh tiến. Dùng các tham số học được γ và β, chúng ta tịnh tiến các kích hoạt đã chuẩn hoá theo công thức sau:

Các tham số này cho phép mô hình học phân phối kích hoạt tối ưu.

Batch normalization trong giai đoạn suy luận

Trong suy luận, ta thay thế thống kê theo lô (trung bình và phương sai) bằng các thống kê chạy (running statistics) được tính trong quá trình huấn luyện. Các thống kê chạy thường được cập nhật bằng trung bình trượt với một hệ số động lượng.

Để tính trung bình và phương sai chạy, ta dùng hai công thức sau, trong đó α là hệ số động lượng điều khiển tốc độ cập nhật của các thống kê chạy:

Trung bình và phương sai chạy được lưu như tham số của mô hình và dùng để chuẩn hoá trong suy luận. Các tham số co giãn và tịnh tiến (γ và β) học được trong huấn luyện cũng được dùng trong suy luận.

Tiếp theo, hãy học cách triển khai batch normalization bằng TensorFlow.

Batch Normalization trong TensorFlow

Bắt đầu bằng cách nhập các thư viện cần thiết:

import tensorflow as tf 
from tensorflow import keras

Tiếp theo, tải bộ dữ liệu MNIST, gồm 60.000 ảnh huấn luyện và 10.000 ảnh kiểm thử của các chữ số viết tay. Ta tải dữ liệu bằng hàm keras.datasets.mnist.load_data() và tách thành dữ liệu huấn luyện (x_train, y_train) và dữ liệu kiểm thử (x_test, y_test):

# Load the MNIST dataset
(x_train, y_train), (x_test, y_test) = keras.datasets.mnist.load_data()

Để tiền xử lý dữ liệu, ta thực hiện các bước sau:

  • Đổi hình dạng ảnh huấn luyện và kiểm thử thành (num_samples, 28, 28, 1), trong đó num_samples là số ảnh, và mỗi ảnh là ảnh xám 28x28 với một kênh.
  • Chuẩn hoá giá trị điểm ảnh bằng cách chia cho 255.0 để đưa về khoảng từ 0 đến 1.
  • Chuyển nhãn huấn luyện và kiểm thử sang dạng phân loại bằng keras.utils.to_categorical(), hàm này chuyển nhãn số nguyên thành vector one-hot.
# Preprocess the data
x_train = x_train.reshape((60000, 28, 28, 1)) / 255.0  # Reshape and normalize training images
x_test = x_test.reshape((10000, 28, 28, 1)) / 255.0    # Reshape and normalize test images
y_train = keras.utils.to_categorical(y_train)         # Convert training labels to categorical format
y_test = keras.utils.to_categorical(y_test)           # Convert test labels to categorical format

Giờ chuyển sang bước tiếp theo: định nghĩa kiến trúc mô hình. Để làm vậy, ta thực hiện các bước sau:

  • Định nghĩa kiến trúc mô hình bằng API keras.Sequential, cho phép xếp chồng các lớp tuần tự.
  • Mô hình gồm các lớp tích chập (Conv2D) để trích xuất đặc trưng, theo sau là các lớp chuẩn hoá theo lô (BatchNormalization) để chuẩn hoá kích hoạt.
  • Dùng gộp cực đại (MaxPooling2D) để giảm kích thước không gian của bản đồ đặc trưng.
  • Làm phẳng bản đồ đặc trưng (Flatten) trước khi đưa vào các lớp dày đặc.
  • Lớp dày đặc cuối có 10 đơn vị với kích hoạt softmax, tương ứng với 10 lớp chữ số.
# Define the model architecture
model = keras.Sequential([
    keras.layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)),
    keras.layers.BatchNormalization(),
    keras.layers.Conv2D(64, (3, 3), activation='relu'),
    keras.layers.BatchNormalization(),
    keras.layers.MaxPooling2D((2, 2)),
    keras.layers.Flatten(),
    keras.layers.Dense(128, activation='relu'),
    keras.layers.BatchNormalization(),
    keras.layers.Dense(10, activation='softmax')
])

Tiếp theo, biên dịch mô hình bằng phương thức .compile(), chỉ định bộ tối ưu, hàm mất mát và thước đo đánh giá. Chúng ta dùng:

  • Bộ tối ưu Adam ('adam') để tối ưu hoá.
  • Mất mát entropy chéo đa lớp ('categorical_crossentropy') vì đây là bài toán phân loại đa lớp.
  • Độ chính xác ('accuracy') làm thước đo đánh giá hiệu năng mô hình.
# Compile the model
model.compile(optimizer='adam',
              loss='categorical_crossentropy',
              metrics=['accuracy'])

Tiếp theo, hãy huấn luyện mô hình bằng phương thức .fit():

  • Chỉ định dữ liệu huấn luyện (x_train, y_train), kích thước lô, số epoch và dữ liệu kiểm định (x_test, y_test).
  • batch_size quyết định số mẫu cho mỗi lần cập nhật gradient.
  • Tham số epochs chỉ số lần mô hình lặp qua toàn bộ dữ liệu huấn luyện.
  • Dữ liệu kiểm định được dùng để đánh giá hiệu năng mô hình trên dữ liệu chưa thấy trong quá trình huấn luyện.
# Train the model
model.fit(x_train, y_train, batch_size=128, epochs=5, validation_data=(x_test, y_test))

Bằng cách làm theo các bước này và đưa các lớp batch normalization vào kiến trúc mô hình, chúng ta có thể huấn luyện mô hình hiệu quả trên bộ dữ liệu MNIST, hưởng lợi từ việc chuẩn hoá kích hoạt và sự ổn định huấn luyện được cải thiện.

Giờ khi đã tìm hiểu về batch normalization và cách triển khai, hãy xem xét các lợi ích của nó.

Các lưu ý khi triển khai

Hãy nhìn sâu hơn vào việc triển khai batch normalization trong các kiến trúc học sâu.

Vị trí trong kiến trúc mạng nơ-ron

Các lớp batch normalization hiệu quả nhất khi được đặt một cách chiến lược trong mạng. Thông thường, chúng được đặt sau phép biến đổi tuyến tính (ví dụ các lớp tích chập hoặc fully connected) và trước hàm kích hoạt phi tuyến.

Trong mạng tích chập, điều này tương đương với việc đặt batch normalization sau mỗi lớp tích chập và trước hàm kích hoạt.

Tương tự, trong mạng fully connected, thường thêm batch normalization sau phép biến đổi tuyến tính và trước hàm kích hoạt của mỗi lớp ẩn.

Vị trí của các lớp Batch Normalization có thể ảnh hưởng đến hiệu năng và động lực huấn luyện của mô hình. Có thể cần thử nghiệm để tìm cấu hình tối ưu cho từng kiến trúc cụ thể.

Ảnh hưởng của kích thước lô

Kích thước lô dùng trong huấn luyện có thể ảnh hưởng đến hiệu quả của batch normalization. Lô lớn hơn cung cấp ước lượng chính xác hơn của thống kê theo lô (trung bình và phương sai), dẫn đến chuẩn hoá tốt hơn và huấn luyện ổn định hơn.

Tuy nhiên, tăng kích thước lô cũng làm tăng mức sử dụng bộ nhớ và yêu cầu tính toán, có thể là rào cản tuỳ theo tài nguyên phần cứng sẵn có.

Điều quan trọng là cân bằng giữa kích thước lô và tính khả thi tính toán, đồng thời đảm bảo thống kê theo lô vẫn đủ tin cậy cho việc chuẩn hoá.

Hiệu ứng regularization và hệ quả

Batch normalization tự thân tạo ra hiệu ứng regularization do nhiễu phát sinh từ các thống kê mini-batch. Tính ngẫu nhiên do thống kê theo lô tạo nên đóng vai trò như một dạng regularization, giảm overfitting và cải thiện khả năng khái quát.

Tuy nhiên, hiệu ứng regularization này có thể tương tác với các kỹ thuật regularization khác như dropout hoặc L2.

Khi dùng batch normalization, cần xem xét sự tương tác giữa các phương pháp regularization và điều chỉnh tương ứng để tránh regularization quá mức hoặc hiệu năng suy giảm.

Thử nghiệm và theo dõi hiệu năng mô hình trên dữ liệu kiểm định có thể giúp tìm được sự cân bằng phù hợp giữa các kỹ thuật regularization khi dùng batch normalization.

Hạn chế và thách thức của Batch Normalization

Mặc dù batch normalization hữu ích, vẫn có một số hạn chế và thách thức cần lưu ý.

Batch normalization trong các kiến trúc phi tích chập

Batch Normalization ban đầu được thiết kế cho mạng nơ-ron tích chập (CNN) và đặc biệt thành công trong lĩnh vực này.

Tuy nhiên, hiệu quả của nó trong các kiến trúc phi tích chập như mạng hồi quy (RNN) hoặc transformer có thể bị hạn chế.

Tính tuần tự của RNN và cơ chế attention trong transformer có thể khiến việc áp dụng batch normalization trở nên khó khăn hơn.

Các kỹ thuật chuẩn hoá thay thế như layer normalization hoặc instance normalization có thể phù hợp hơn cho các kiến trúc này.

Kích thước lô nhỏ và hiệu năng khi suy luận

Batch normalization dựa vào các thống kê theo lô được tính trong huấn luyện để chuẩn hoá các kích hoạt. Khi kích thước lô nhỏ, các thống kê này có thể kém tin cậy, đưa thêm nhiễu hoặc bất ổn vào quá trình chuẩn hoá.

Điều này có thể dẫn đến hiệu năng kém tối ưu hoặc thậm chí khó khăn khi huấn luyện, đặc biệt khi giảm kích thước lô do hạn chế bộ nhớ.

Trong suy luận, batch normalization dùng các thống kê chạy được tính trong huấn luyện, có thể không phản ánh chính xác thống kê của từng mẫu riêng lẻ hoặc các lô nhỏ. Điều này có thể gây sai lệch giữa phân phối khi huấn luyện và suy luận, ảnh hưởng đến hiệu năng mô hình.

Nhược điểm và đánh đổi của batch normalization

Batch normalization tạo thêm chi phí tính toán trong huấn luyện do phải tính toán thống kê theo lô và phép chuẩn hoá. Chi phí này có thể làm tăng nhu cầu bộ nhớ và thời gian huấn luyện, đặc biệt với mô hình hoặc dữ liệu lớn.

Batch normalization có thể không phù hợp với một số loại dữ liệu hoặc tác vụ mà quá trình chuẩn hoá có thể làm méo mó thông tin quan trọng hoặc loại bỏ những biến thiên có ý nghĩa.

Ví dụ, batch normalization có thể gây tác động không mong muốn với các tác vụ liên quan đến chi tiết tinh vi hoặc thông tin không gian chính xác, như phân đoạn hoặc định vị.

Hiệu ứng regularization của Batch Normalization đôi khi có thể tương tác với các kỹ thuật regularization khác như dropout theo những cách khó lường, đòi hỏi điều chỉnh và cân nhắc cẩn thận.

Cách giảm nhẹ các hạn chế của Batch Normalization

Bất chấp các hạn chế và thách thức, batch normalization vẫn là kỹ thuật hiệu quả và được dùng rộng rãi trong học sâu. Các nhà nghiên cứu và thực hành vẫn tiếp tục khám phá cách xử lý những vấn đề này và cải tiến công thức gốc.

Hãy xem một vài cách tiếp cận để giảm nhẹ các hạn chế của batch normalization:

  • Adaptive batch normalization: Kỹ thuật này điều chỉnh thống kê theo lô dựa trên đặc trưng cụ thể của từng mẫu, giúp giảm các vấn đề liên quan đến kích thước lô nhỏ.
  • Virtual batch normalization: Phương pháp này tính thống kê chuẩn hoá bằng một lô ảo gồm các mẫu từ nhiều lô, cải thiện độ ổn định và độ tin cậy của quá trình chuẩn hoá.
  • Các kỹ thuật chuẩn hoá lai: Kết hợp batch normalization với các phương pháp khác như layer normalization hoặc instance normalization có thể giúp xử lý các hạn chế đặc thù của một số kiến trúc hoặc tác vụ.

Biến thể và mở rộng của Batch Normalization

Giờ hãy xem các biến thể và mở rộng khác của batch normalization mà chúng ta cũng có thể dùng để giảm các thách thức tiềm ẩn do batch normalization gây ra.

Layer normalization

Layer normalization hoạt động trên các kích hoạt qua tất cả các kênh trong một lớp, thay vì theo chiều lô.

Nó chuẩn hoá các kích hoạt dựa trên trung bình và phương sai được tính cho từng mẫu riêng lẻ trong lô.

Layer normalization đặc biệt hữu ích cho mạng hồi quy (RNN) và các tình huống kích thước lô nhỏ hoặc biến thiên.

Group normalization

Group normalization chia các kênh thành nhiều nhóm và tính thống kê chuẩn hoá trong mỗi nhóm.

Nó cân bằng giữa layer normalization và batch normalization bằng cách chuẩn hoá theo từng tập con kênh.

Group normalization hiệu quả trong các tình huống kích thước lô hạn chế, như môi trường bị giới hạn bộ nhớ hoặc khi xử lý ảnh độ phân giải cao.

Instance normalization

Instance normalization áp dụng chuẩn hoá cho từng kênh riêng lẻ của mỗi mẫu trong lô.

Nó thường được dùng trong chuyển phong cách và sinh ảnh, nơi mục tiêu là chuẩn hoá nội dung trong khi vẫn giữ thông tin phong cách.

Instance normalization được chứng minh giúp cải thiện chất lượng và độ ổn định của ảnh sinh ra trong các ứng dụng như vậy.

Batch renormalization

Batch renormalization mở rộng batch normalization bằng cách đưa thêm các hạng hiệu chỉnh vào quá trình chuẩn hoá.

Nó nhằm xử lý sự sai khác giữa thống kê theo lô và thống kê tổng thể, đặc biệt khi kích thước lô nhỏ.

Batch renormalization giúp ổn định huấn luyện và cải thiện khả năng khái quát của mô hình, đặc biệt trong bối cảnh kích thước lô hạn chế.

Weight normalization

Weight Normalization là kỹ thuật tái tham số hoá trọng số của mạng nơ-ron để tách độ lớn và hướng của trọng số.

Nó chuẩn hoá trọng số bằng cách chia cho chuẩn Euclid của chúng và thêm một tham số co giãn học được.

Weight normalization có thể dùng cùng với Batch Normalization hoặc như một phương pháp chuẩn hoá thay thế.

Nó được chứng minh giúp cải thiện điều kiện của bài toán tối ưu và tăng tốc hội tụ trong một số trường hợp.

Các biến thể và mở rộng của batch normalization này cung cấp thêm công cụ và kỹ thuật để xử lý các thách thức cụ thể và cải thiện việc huấn luyện cũng như hiệu năng của mô hình học sâu. Mỗi biến thể có ưu điểm và cân nhắc riêng; lựa chọn dùng loại nào phụ thuộc vào yêu cầu tác vụ, kiến trúc mô hình và tài nguyên tính toán sẵn có.

Kết luận

Batch normalization đã trở thành kỹ thuật then chốt trong học sâu, mang lại lợi ích đáng kể cho việc huấn luyện các mạng nơ-ron sâu.

Bằng cách chuẩn hoá các kích hoạt trong mini-batch, chúng ta có thể giải quyết dịch chuyển hiệp biến nội bộ, cải thiện hội tụ và tăng cường khả năng khái quát. Với tư cách là một người thực hành dữ liệu mới vào nghề, hãy ghi nhớ các điểm chính sau:

  • Đưa các lớp Batch Normalization vào mô hình học sâu để cải thiện độ ổn định huấn luyện và hiệu năng.
  • Thử nghiệm vị trí đặt các lớp batch normalization và theo dõi tác động lên hiệu năng mô hình.
  • Cập nhật các nghiên cứu và tiến bộ mới về kỹ thuật chuẩn hoá để tận dụng những phương pháp hiệu quả nhất cho dự án của bạn.

Nếu bạn muốn trở thành kỹ sư machine learning, hãy cân nhắc lộ trình 12 khoá học để trở thành Machine Learning Engineer.

Tác giả

Rajesh Kumar

Tôi là một biên tập viên nội dung về khoa học dữ liệu. Tôi yêu thích sáng tạo nội dung xoay quanh các chủ đề AI/ML/DS. Tôi cũng khám phá các công cụ AI mới và viết về chúng.

Chủ đề

Liên quan