Chuyện số 1: Hồi đi học, tôi có một anh bạn thân. Cách học của anh ta và tôi hoàn toàn khác nhau:

  • Anh ý rất chịu khó ghi chép bài, đọc sách tài liệu mượn ở thư viện, cố gắng nhớ tất cả các công thức đến khi thi, do kiến thức quá nhiều và nhớ lộn xộn anh ta thường bị điểm rất kém.
  • Ban đầu tôi cũng giống anh ý, nhưng sau 1 kỳ tôi thấy tôi quên hết kiến thức môn học kỳ trước. Do đó tôi thực hành những gì học được, đóng gói thành phần mềm hoặc mạch điện tử chạy nhấp nháy. Với những môn toàn lý thuyết suông, tôi đủ kiên nhẫn học, nhưng khi kiểm tra phải làm bài thi thật sạch đẹp, viết rất chung chung để thầy giáo không thể cho điểm kém. Kết quả là tôi luôn dành được học bổng loại A khi ở học đại học.

Giờ thì anh ý là một ông chủ của một trại lợn chuyên cung cấp thịt lợn sạch. Còn tôi thì làm bảo vệ ở một công ty, chuyên trông xe, dắt xe, mở cửa đón khách. Tối rảnh rang mới lên mạng viết bài về AI, Deep Learning để sống những ngày xưa hào hùng khi xưa. Bong bóng Dot Com, bong bóng Bit Coin rồi sẽ đến bong bóng AI. Hãy học và hành AI ra sản phẩm cụ thể, ra tiền, ra bài báo chứ đừng học hời hợt. Bạn tôi một tháng xuất chuồng vài chục tấn thịt lợn sạch kiếm 500-600 triệu đồng đó.

Một số bạn không chuyên ngành IT có thể hiểu cơ chế của mạng neural network back propagation (mạng thần kinh lan truyền ngược). Tuy nhiên các loại mạng phức tạp hơn như convolution network chúng ta cần chút hình dung tưởng tượng và liên hệ với đời sống thực tế. Và đây là chuyện số 2:

Chuyện số 2: Vào buổi sáng sớm tầm 4 giờ sáng giáp Tết âm lịch, cách đây 25 năm, ở khu tập thể nhà bạn tôi có vụ trộm giết người cướp của. Hồi đó bao cấp, hung thủ chỉ kip lấy một chiếc đài radio 2 bằng tần VEF-206, còn nạn nhân do tiếc của đuổi theo nên bị đâm chết.  Nhà anh bạn tôi sát nhà nạn nhân nên tôi có cơ hội chứng kiến toàn bộ quá trình điều tra, khám nghiệm hiện trường.

  • Công an đến lấy lời khai của tất cả nhân chứng tại hiện trường, chứng kiến vụ án: hung thủ cao bao nhiêu?, nam hay nữ?, mặc quần áo mầu gì? đi giầy hay dép, đặc điểm nhận dạng khuôn mặt, giọng nói, lúc bỏ chạy thì dùng phương tiện gì?
  • Sự việc diện ra quá nhanh nên mỗi nhân chứng chỉ nhớ loáng thoáng một vài đặc điểm.
    • Người thì bảo hung thủ mặc áo Nato xanh đậm, một số thì bảo hung thu mặc áo khoác tím than
    • Người bảo hung thủ tóc dài, người lại đinh ninh nó trông giống sinh viên, gày cao. Thế là tôi cũng bị gọi lên thẩm vấn
    • Có bà mù ngồi bán nước cổng khu tập thể, thì khẳng định tiếng chân của hung thủ cho thấy nó mắc tật chân thấp, chân cao hoặc khi chạy bị vấp ngã nên một chân bị đau.

Sau vài ngày thẩm vấn, công an ghi chép được hàng xấp lời khai. Câu hỏi lớn nhất, khó nhất hung thủ là thằng nào, tìm nó ở đâu?
Đối với những chuyên gia Deep Learning việc huấn luyện máy tính để máy tính nhìn được một bức ảnh nhận biết thông tin trong đó cũng khó khăn như công an điều tra vậy. Có những vụ án vài năm không phá được, nhiều khi bắt nhầm người, oan gia.

Điều tra tội phạm Huấn luyện máy tính học
Cần thu thập nhiều dữ liệu Cũng vậy !
Dữ liệu nhiều chiều, đa dạng càng quý Cũng vậy !
Có nhiều bước: khám nghiệm hiện trường, lấy lời khai, tổng hợp, phân tích,... Có nhiều layer có chức năng xử lý khác nhau
Một câu hỏi thường thu được nhiều thông tin phản hồi khác nhau: hung thủ mặc áo gì? kích thước, góc nghiêng, đậm nhạt của mẫu ảnh đầu vào cực kỳ đa dạng
Độ chính xác cực quan trọng: bắt nhầm người thì toi Độ chính xác yêu cầu trên 95%

Convolution Network thì liên quan gì?

Kiến trúc mạng CNN
Chi tiết một lớp Convolution + Activation + Max Pooling cho bài toán nhận dạng chữ số MNIST

Dữ liệu thu thập tại hiện trường có thể có nhiều nhiễu loạn sai lệch, thậm chí do cố ý đánh lạc hướng của hung thủ... Do đó CA điều tra sẽ phải lọc (filter) và làm nổi bật những tình tiết, chứng cứ quan trọng nhất.

Bước 1: Với CNN, tại một convolution layer sẽ có nhiều mã trận kernel kích thước lẻ, ma trận vuông có hệ số (weight) ban đầu là ngẫu nhiên. Dot product của ảnh đầu vào với từng ma trận kernel sẽ từng feature. Số lượng ma trận kernel càng nhiều giống như việc CA điều tra không thể chỉ lấy lời khai của một nhân chứng để ra kết luôn. Tuy nhiên nếu quá nhiều thì việc tính toán cũng sẽ nặng nề, phức tạp. Sau mỗi lần huấn luyện, hệ số được điều chỉnh để làm sau tính chất (feature map) của ảnh được bóc tách rõ nhất, nếu là ký tự thì tách ra các đường tròn, móc, dấu... Chú ý: phép toán ở bước 1 thực tế là Cross Correlation chứ không phải là Convolution. Hai phép toán này gần giống chỉ khác kernel được lật trái qua phải, trên xuống dưới.

quá trình lọc bằng phép Dot Product với Kernel
Feature Map được lọc ra bởi nhiều Kernel khác nhau trong Convolution Layer

Bước 2: Các feature map sẽ đi qua Activation Function. Activation Function còn có chức năng điều chỉnh dải giá trị đầu vào (rescale input range of feature map). Bạn nào đã từng chơi ampy rời sẽ hiểu thế nào là phối hợp trở kháng giữa các tầng khuyếch đại. Còn Activation Function không khác gì Amply làm nhiệm vụ khuyếch đại tin hiểu!

Bước 3: Đi qua Pooling. Ở bước 1 do phải dùng nhiều Kernels để lọc ra tính chất dẫn đến dữ liệu sẽ bùng nổ. Pooling có thể là Max hoặc Mean sẽ thu gọn feature lại, giảm bớt khối lượng thông tin. Trong điều tra, sau khi có bằng chứng ngoại phạm hoặc qua đối chiếu, có thể bỏ bớt một số hướng điều tra không hợp lý, hoặc bỏ qua những dữ liệu lời khai không liên quan, giữ lại những thông tin cần thiết nhất. Code tham khảo hàm pooling, các bạn vào xem file này 
Qua pooling, kích thước dài rộng của ảnh sẽ chia cho bước xải (stride). Stride = 2 giảm một nửa...

def pool(img, w=2, h=2): #w, h là bước xải ~ stride
    img_height = img.shape[0]
    img_width = img.shape[1]
    new_height = int(img_height / h)
    new_width = int(img_width / w)
    out = np.zeros((new_height, new_width))

    for i in np.arange(0, new_height):
        for j in np.arange(0, new_width):
            top = i * h # nhân bước stride hàng
            left = j * w # nhân bước stride cột
            out[i, j] = np.max(img[top:top + h, left: left + w])

    return out


Tổng thể một đoạn code định nghĩa cấu trúc CNN sẽ kiểu như thế này. File chi tiết tại đây https://github.com/TechMaster/CythonOpenCV/blob/master/Convolution/mnist3.py

model = tf.keras.Sequential()
model.add(layers.Conv2D(28, kernel_size=(3, 3), input_shape=input_shape))
model.add(layers.MaxPooling2D(pool_size=(2, 2)))
model.add(layers.Flatten())  # Flattening the 2D arrays for fully connected layers
model.add(layers.Dense(128, activation=tf.nn.relu))
model.add(layers.Dropout(0.2))
model.add(layers.Dense(10, activation=tf.nn.softmax))


Kết luận

Hiện nay có nhiều biến thể mạng Neural Network được xây dựng sẵn, thậm chí model weight được huấn luyện sẵn, bạn chỉ cần tải về dùng, độ chính xác khá ổn. Tuy nhiên để không bị lăn tăn mang tiếng là chỉ biết dùng framework, copy paste máy móc, thì việc hiểu CNN cũng đang làm. Thực ra viết bài này xong, tôi vẫn tiếp tục tìm hiểu tiếp CNN và các biến thể, thậm chí chọc vào mã nguồn mở họ viết xem mình có hiểu đúng không.

Một số câu hỏi tôi đã từng hỏi và tìm ra câu trả lời sau khi đọc nhiều bài viết:

  1. Q: Tại sao không dùng mạng neural network truyền thống để nhận dạng ảnh?
    A: Nội dung trong bức ảnh có tính tương quan về không gian 2 chiều, để truyền ảnh vào một neural network truyền thống, chúng ta phải duỗi thẳng mã trận 2 chiều thành mảng 1 chiều. Tính tương quan không gian không còn giữ được.
     
  2. Q: Các kernel trong Convolution Layer Network có giống nhưng kernel trong hàm xử lý ảnh không?
    A: Giống ở hầu hết các điểm khác ở chỗ hệ số kernel ban đầu là ngẫu nhiên, còn sau mỗi lần huấn luyện sẽ được điều chỉnh lại.
    Để CNN hiệu quả, bạn nên có bước tiền xử lý ảnh đầu vào áp dụng các filter ảnh kiểu như làm sắc nét, nhận dạng đường viền
     
  3. Q: Làm sao để xử lý ảnh có kích thước khác nhau?
    A:  C1: tiền xử lý, co dãn ảnh về kích thước phù hợp. C2: Fully connected CNN xử lý được ảnh có kích thước khác nhau.
     

Tài liệu tham khảo các bạn xem mấy bài này nhé