Capsule Networks
Với những người làm việc trong lĩnh vực machine learning hay deep learning hẳn không còn xa lạ gì với Convolutional neural network (CNN hay ConvNet), một mô hình mạng nơ-ron nhân tạo đã được áp dụng rất thành công đặc biệt trong lớp các bài toán Computer Vision. Tuy nhiên, các nhà nghiên cứu nhận thấy rằng một lượng thông tin quan trọng đã bị mất mát trong quá trình xây dựng CNN. Capsule Network ra đời như là một sự cải tiến từ CNN, hứa hẹn cho kết quả tốt hơn "người anh" của nó. Đặc biệt hơn, nếu như các phương pháp machine learning trước đây gần như chỉ có thể cho kết quả tốt nếu như được cung cấp bộ dữ liệu đầu vào tốt, Capsule Network với các đặc tính của mình có thể vẫn cho kết quả tốt ngay cả khi dữ liệu đầu vào "không đẹp" (ví dụ imbalanced dataset).
1. Giới thiệu
Capsule Network được coi như chính thức ra đời vào năm 2017, do tác giả Geoffrey Hinton(Professor at university of Toronto & Reseacher at Google Brain) và cộng sự. Thực tế việc nung nấu ý tưởng cải tiến CNN đã có từ rất lâu nhưng mãi đến thời điểm đó Hinton mới lần đầu đưa ra được một giải pháp hoàn chỉnh. Ông từng nói rằng việc sử dụng max pooling trong CNN vẫn cho kết quả tốt là một sai lầm lớn và là một thảm họa.
Hinton: "The pooling operation used in convolutional neural networks is a big mistake and the fact that it works so well is a disaster."
2. Nhược điểm của CNN
Thành phần chính của CNN là cách lớp Convolution. Công việc của chúng là dectect các feature quan trọng trong bức ảnh. Các layer ở mức thấp hơn sẽ detect các feature đơn giản như các cạnh, đường nét. Các layer ở mức cao hơn tổ hợp các feature đơn giản thành các feature phức tạp hơn.
Chúng ta có thể nhận thấy rằng CNN không lưu giữ các thông tin về hướng, mối quan hệ không gian giữa các thành phần. Tức là, ví dụ ở dưới đây, với CNN thì 2 bức ảnh sau đều là ảnh một khuôn mặt.
Từ những nhược điểm này mà Hinton cho rằng cần phải bổ sung thông tin về mối quan hệ không gian giữa các thành phần.
3. Ý tưởng của Capsule Network
CapsNet lấy ý tưởng từ một quá trình trong Computer Graphics gọi là Rendering: Máy tính sử dụng các thông tin lưu trữ về đối tượng bao gồm thông tin về không gian, góc nhìn, cấu tạo, chiếu sáng, bóng đổ, ... để hiển thị ra hình ảnh của đối tượng lên màn hình.
Hinton suy đoán rằng, cách thức não bộ của con người nhận diện ra một vật thể có thể là quá trình ngược lại với Rendering. Ông gọi quá trình đó là Inverse Graphics, được hiểu là khi mắt nhìn một vật thể, chúng phân tách vật thể thành các features, và cố gắng match chúng với các features và các mối quan hệ giữa chúng đã được học từ trước được lưu ở trong não.
4. Capsule là gì, hoạt động như thế nào và cấu trúc chung của CapsNet
Bên trên đã nói về ý tưởng của việc hình thành CapsNet, phần này sẽ nói về việc tác giả đã thực hiện các ý tưởng đó như thế nào.
Capsule thực hiện đóng gói tất cả thông tin quan trọng của trạng thái của feature đang được detect dưới dạng một vector. Chiều dài vector biểu diễn xác suất dectect feature. Hướng vector biểu diễn trạng thái của feature.
Mỗi capsule sẽ đóng vai trò như một neuron trong một artificial neural network truyền thống. Các thông tin từ lớp thấp hơn trước khi được chuyển cho lớp cao hơn sẽ được nhân với ma trận mã hóa các mối quan hệ quan trọng giữa feature ở mức thấp hơn với feature ở mức cao hơn.
Cấu trúc của CapsNet gồm 2 phần chính là Encoder và Decoder. Encoder bao gồm các lớp convolution (không sử dung max pooling) và các lớp capsule, nhận đầu vào là một bức ảnh và mã hóa nó thành một feature vector, rồi xuất ra predict class. Decoder bao gồm các lớp dense, nhận đầu vào là feature vector và nhãn đúng tương ứng, đưa đầu ra là bức ảnh tái cấu tạo. Cả 2 phần Encoder và Decoder được huấn luyện đồng thời.
Chi tiết về cấu tạo và thuật toán có thể tìm thêm tại đây.
5. Thực nghiệm
Bộ dữ liệu: tập ảnh chữ số viết tay lấy từ bộ EMNIST, thực hiện padding để mở rộng kích thước ảnh từ 28*28 thành 56*56, sau đó thực hiện các phép biến đổi lên chúng bao gồm: rotate, translate, rescale, shear. Với lưu ý là độ biến đổi trên training data sẽ nhỏ hơn độ biến đổi trên testing data. Như vậy model sau khi huấn luyện sẽ phải test trên tập data mà nó chưa từng được nhìn thấy.
Định nghĩa model, sử dụng framework Keras:
def CapsNet(input_shape, n_class, routings):
"""
A Capsule Network on MNIST.
:param input_shape: data shape, 3d, [width, height, channels]
:param n_class: number of classes
:param routings: number of routing iterations
:return: Two Keras Models, the first one used for training, and the second one for evaluation.
`eval_model` can also be used for training.
"""
x = layers.Input(shape=input_shape)
# Layer 1: Just a conventional Conv2D layer
conv1 = layers.Conv2D(filters=256, kernel_size=9, strides=1, padding='valid', activation='relu', name='conv1'
, kernel_initializer=initializers.glorot_normal())(x)
# new added conv layer
conv2 = layers.Conv2D(filters=256, kernel_size=9, strides=2, padding='valid', activation='relu', name='conv2'
, kernel_initializer=initializers.RandomNormal())(conv1)
# Layer 2+1: Conv2D layer with `squash` activation, then reshape to [None, num_capsule, dim_capsule]
primarycaps = PrimaryCap(conv2, dim_capsule=8, n_channels=32, kernel_size=9, strides=2, padding='valid')
# Layer 3+1: Capsule layer. Routing algorithm works here.
digitcaps = CapsuleLayer(num_capsule=n_class, dim_capsule=16, routings=routings,
name='digitcaps')(primarycaps)
# Layer 4+1: This is an auxiliary layer to replace each capsule with its length. Just to match the true label's shape.
# If using tensorflow, this will not be necessary. :)
out_caps = Length(name='capsnet')(digitcaps)
# Decoder network.
y = layers.Input(shape=(n_class,))
masked_by_y = Mask()([digitcaps, y]) # The true label is used to mask the output of capsule layer. For training
masked = Mask()(digitcaps) # Mask using the capsule with maximal length. For prediction
# Shared Decoder model in training and prediction
decoder = models.Sequential(name='decoder')
decoder.add(layers.Dense(512, activation='relu', input_dim=16*n_class))
decoder.add(layers.Dense(1024, activation='relu'))
decoder.add(layers.Dense(np.prod(input_shape), activation='sigmoid'))
decoder.add(layers.Reshape(target_shape=input_shape, name='out_recon'))
# Models for training and evaluation (prediction)
train_model = models.Model([x, y], [out_caps, decoder(masked_by_y)])
eval_model = models.Model(x, [out_caps, decoder(masked)])
return train_model
Full source code: tại đây.
Kết quả do bản thân thực hiện, so sánh với các phương pháp khác:
Có thể thấy CapsNet có kết quả nhỉnh hơn so với CNN, và tốt hơn hẳn so với các phương pháp cũ. Có một số bài báo cũng thực hiện thí nghiệm tương tự, và họ cho kết quả cao hơn ở đây nhưng cũng có một điểm chung là CapsNet luôn cho kết quả tốt nhất.
6. Tổng kết
Capsule Networks là một Neural Network mới, ra đời dựa trên ý tưởng cải tiến CNN, do đó nó mang tiềm năng sẽ hoạt động tốt hơn CNN, đặc biệt khi ta phải làm việc với bias data. Dù vậy, trong suốt hơn một năm qua từ khi ra đời nó vẫn chỉ chủ yếu được sử dụng trong các phòng thí nghiệm. Năm 2018, Hinton đã đưa ra thêm một thuật toán mới sử dụng trong CapsNet. Do đó ta hoàn toàn có thể tin tưởng rằng các nhà nghiên cứu hàng đầu vẫn đang tiếp tục tìm cách cải tiến cũng như hoàn thiện loại mạng mới này.
Tài liệu tham khảo
1. Assessing Capsule Networks WithBiased Data
2. Dynamic Routing Between Capsules
3. MATRIX CAPSULES WITH EMROUTING
4. Understanding Hinton’s Capsule Networks
5. A Keras implementation of CapsNet in NIPS2017 paper "Dynamic Routing Between Capsules".