Thứ Ba, 8 tháng 2, 2022

Cơ bản về xử lý ảnh (Phần 2)

1. Giới thiệu

Hôm nay chúng ta tiếp tục đi sang phần tiếp theo về xử lý ảnh cơ bản

Nội dung

  • Phép tích chập convolutional
  • Các phép toán khác trên ảnh

2. Phép tích chập convolutional

Trước tiên chúng ta cùng đi qua ví dụ dưới đây để hiểu rõ phép tích chập là gì.

Các bạn quan sát ma trận màu vàng được gọi là kernel hay filter

$$K = \begin{bmatrix} 1 & 0 & 1\\ 0 & 1 & 0\\ 1 & 0 & 1\\ \end{bmatrix}$$

Còn ma trận màu xanh là ảnh

$$I = \begin{bmatrix} 1 & 1 & 1 & 0 & 0\\ 0 & 1 & 1 & 1 & 0\\ 0 & 0 & 1 & 1 & 1\\ 0 & 0 & 1 & 1 & 0\\ 0 & 1 & 1 & 0 & 0\\ \end{bmatrix}$$

Ma trận tích chập của Kernel K và ảnh I ký hiệu $C=K⊗I$ (là ma trận màu hồng ở trên) được thực hiện bằng việc trượt ma trận kernel K lên ảnh I từ trên xuống dưới từ trái sang phải. Tại mỗi vị trí của kernel trên ảnh ta nhân các phần tử tương ứng xong cộng lại tất cả.

Ví dụ vị trí đầu tiên trên ma trận C ta có phép tính sau: $$C_{11}=1*1+0*1+1*1+0*0+1*1+0*1+1*0+0*0+1*1=4$$

$$C_{12}=1*1+0*1+1*0+0*1+1*1+0*1+1*0+0*1+1*1=3$$

Tính toán tương tự với $C_{13}, C_{21}, C_{22}, C_{23}, C_{31}, C_{32}, C_{33}$

Gọi $P$ là padding của ảnh, nếu $P=1$ ta được ảnh với padding như hình dưới đây

Lúc này kernel sẽ bắt đầu tự vị trí padding di chuyển từ trái sang phải, trên xuống dưới.

Gọi S là bước nhảy hay thường được gọi stride

Quan sát hình ta thấy nếu stride bằng 1 thì mỗi lần kernel dịch chuyển sang một cột hoặc một hàng(hình trên). Còn nếu stride bằng 2 thì mỗi lần kernel sẽ dịch chuyển 2 cột hoặc 2 hàng(hình dưới) sau đó mới tiến hành sử dụng các phép toán tích chập

Gọi kích thước của ảnh là $w_I*h_I$, padding là P, stride là S, kích thước kernel là $w_K*h_K$ khi đó kích thước output sau phép tích chập là $w_C*h_C$ được tính toán như sau

$$w_C = \frac{w_I - w_K + 2P}{S}+1$$

$$h_C = \frac{h_I - h_K + 2P}{S}+1$$

Từ công thức trên ta thấy việc stride lớn sẽ làm giảm kích thước output, padding lớn sẽ làm tăng kích thước output

Các bạn có thể quan sát trực quan hơn về phép tích chập tại đây

Việc sử dụng convolutional giúp chúng ta trích xuất được các đặc trưng của ảnh như: cạnh, góc hoặc làm nét làm mờ ảnh. Tác dụng của convolutional như thế nào phụ thuộc vào filter ta sử dụng

3. Các phép toán khác trên ảnh

Biến đổi hình học

Đây là phép biến đổi hình ảnh từ dạng này sang dạng khác thông qua việc làm thay đổi phương, chiều, góc của ảnh ban đầu mà không làm thay đổi nội dung ban đầu của ảnh. Về cơ bản phép biến đổi này là sử dụng một ma trận dịch chuyển (translation matrix) $M$. Với mỗi điểm có tọa độ $x, y$ trên ảnh gốc thông qua phép biến đổi $T$ ta sẽ được ảnh trong không gian mới sau dịch chuyển là $T(x, y)$

$$T(x, y) = M \begin{bmatrix} x\\ y \end{bmatrix}=\begin{bmatrix} a_{11} & a_{12}\\ a_{21} & a_{22} \end{bmatrix}\begin{bmatrix} x\\ y \end{bmatrix} \begin{bmatrix} x*a_{11} & y*a_{12}\\ x*a_{21} & y*a_{22} \end{bmatrix}$$

Thay đổi kích thước ảnh là thay đổi kích thước dài, rộng của ảnh mà không làm thay đổi tính chất song song của các đoạn thẳng trên ảnh gốc so với các trục tọa độ X và Y. Ta có ma trận dịch chuyển có dạng

$$M=\begin{bmatrix} a_{1} & 0\\ 0 & a_{2} \end{bmatrix}$$

Dịch chuyển ảnh là việc dịch chuyển ảnh đến các vị trí khác nhau ví dụ tới các góc trái, phải, ở giữa, bên trên, bên dưới. Phép dịch chuyển sẽ giữ nguyên tính chất song song của các đoạn thẳng sau dịch chuyển đối với các trục X hoặc Y nếu trước dịch chuyển chúng cũng song song với một trong hai trục này. Ma trận dịch chuyển có dạng

$$M=\begin{bmatrix} 1 & 0 & t_x\\ 0 & 1 & t_y \end{bmatrix}$$

Với $t_x, t_y$ là các giá trị dịch chuyển theo trục x và y

Xoay ảnh là quay một bức ảnh theo một góc xác định quanh một điểm nào đó. Ma trận dịch chuyển có dạng

$$M=\begin{bmatrix} cos(\theta) & -sin(\theta)\\ sin(\theta) & cos(\theta) \end{bmatrix}$$

Biến đổi affine, toàn bộ các đường thẳng song song trong bức ảnh gốc giữ nguyên tính chất song song ở ảnh đầu ra. Để tìm ma trận dịch chuyển, chúng ta cần xác định ra 3 điểm từ ảnh đầu vào và tọa độ tương ứng của chúng trong hình ảnh đầu ra. Được tính như hình dưới đây:

Như hình trên với 3 điểm đầu vào ($x, y$) và 3 điểm đầu ra ($x', y'$) ta giải được hệ phương trình để tìm A và B. Sau đó áp dùng A, B cho các điểm khác để được ảnh mới

Biến đổi phối cảnh (perspective) Để biến đổi phối cảnh thì chúng ta cần một ma trận biến đổi 3x3. Đường thẳng sẽ giữ nguyên là đường thẳng sau biến đổi. Để tìm ra ma trận biến đổi này, chúng ta cần tìm ra 4 điểm trong ảnh đầu vào tương ứng với các điểm trong ảnh đầu ra. Trong số 4 điểm này, không có bất kì 3 điểm nào thẳng hàng. Cách tính ma trận dịch chuyển như biến đổi affine

Làm mờ ảnh sử dụng phép tích chập convolutional như mình đã giới thiệu ở trên với kernel là ma trận $5*5$

$$K = \frac{1}{5}\begin{bmatrix} 1 & 1 & 1 & 1 & 1\\ 1 & 1 & 1 & 1 & 1\\ 1 & 1 & 1 & 1 & 1\\ 1 & 1 & 1 & 1 & 1\\ 1 & 1 & 1 & 1 & 1\\ \end{bmatrix}$$

Ngoài ra còn có một số bộ lọc khác như Gaussian, Median. Các bạn có thể tìm hiểu thêm

Trên đây là một số kiến thức cơ bản về xử lý ảnh. Nếu có thắc mắc gì vui lòng để lại comment phía dưới. Xin cảm ơn

Chủ Nhật, 30 tháng 1, 2022

Cơ bản về xử lý ảnh (Phần 1)

1. Giới thiệu

Xin chào hôm nay chúng ta sẽ cùng nhau đi qua bài đầu tiên về Computer Vision. Trước tiên, chúng ta cùng nhau tìm hiểu một số khái niệm cơ bản trước khi đi vào sâu hơn.

2. Phân loại ảnh

Bản chất của ảnh là ma trận với chiều cao và chiều rộng của ảnh là chiều cao và chiều rộng của ma trận. Mỗi vị trí trong ma trận được gọi là 1 pixel hay còn gọi là điểm ảnh. Vị trí này có thể là một số hoặc tuple.

Thông thường ảnh được chia thành 3 loại chính: Ảnh nhị phân, ảnh xám và ảnh màu.

Ảnh nhị phân (binary) là ảnh có giá trị mỗi pixel là 0 hoặc 1 (có thể là 255)

Ví dụ dưới đây ta có ảnh binary có kích thước 5x5

\begin{bmatrix} 0 & 1 & 0 & 1 & 0\\ 1 & 0 & 1 & 0 & 0\\ 1 & 1 & 1 & 0 & 0\\ 1 & 1 & 0 & 0 & 0\\ 1 & 0 & 0 & 0 & 0\\ \end{bmatrix}

Ảnh xám là ảnh có giá trị mỗi pixel nằm trong đoạn từ 0 đến 255 với mỗi pixel được gọi là cường độ xám

Ảnh màu là ảnh mà mỗi pixel là một tuple. Với mỗi tuple có 3 phần tử. Mỗi phần tử của tuple có giá trị từ 0 đến 255. Trong thực tế các màu sắc là sự phối hợp của 3 màu chủ đạo là: Red, Green và Blue. Phối các màu này với các cường độ khác nhau ta được một màu mới.

Ví dụ để được màu hồng ta phối 3 màu (red, green, blue) với giá trị là (131, 58, 115)

Đẻ được màu vàng ta phối các màu (red, green, blue) với giá trị (255, 255, 0)

Nếu muốn biết mã rgb của một màu nào đó các bạn có thể sử dụng tại đây

Như vậy tại mỗi pixel ta chỉ cần phối 3 giá trị của một tuple như trên ta sẽ được màu của điểm ảnh đó

Ví dụ ảnh rgb có kích thước 4x4

$$\begin{bmatrix} (1, 0, 255) & (255, 3, 255) & (255, 0, 255) & (5, 0, 255)\\ (3, 88, 255) & (137, 120, 0) & (254, 22, 251) & (2, 19, 255)\\ (255, 100, 255) & (255, 4, 255) & (255, 66, 7) & (255, 2, 255)\\ (255, 0, 4) & (255, 1, 6) & (255, 5, 255) & (255, 9, 9)\\ \end{bmatrix}$$

Thông thường để tiện cho việc lưu trữ và xử lý thì chúng ta tách thành các ma trận riêng với mỗi ma trận được gọi là 1 chanel. Như vậy ta có 3 channel là red channel, green channel và blue channel

Với ví dụ trên ta có thể tách thành 3 ma trận như sau:

$$\begin{bmatrix} 1 & 255 & 255 & 5\\ 3 & 137 & 254 & 2\\ 255 & 255 & 255 & 255\\ 255 & 255 & 255 & 255\\ \end{bmatrix}$$

Ma trận này được gọi là red channel. Các bạn để ý là đối với red channel mình lấy mỗi phần tử đầu tiên của tuple

Tương tự đối với green channel bằng việc lấy phần tử số 2 của tuple

$$\begin{bmatrix} 0 & 3 & 0 & 0\\ 88 & 120 & 22 & 19\\ 100 & 4 & 66 & 2\\ 0 & 1 & 5 & 9\\ \end{bmatrix}$$

Tươg tự đối với blue channel bằng việc lấy phần tử số 3 của tuple

$$\begin{bmatrix} 255 & 255 & 255 & 255\\ 255 & 0 & 251 & 255\\ 255 & 255 & 7 & 255\\ 4 & 6 & 255 & 9\\ \end{bmatrix}$$

Chồng 3 ma trận trên lại với nhau ta được một Tensor. Tensor là khái niệm mới. Trước giờ ta chỉ quen các khái niệm như matrix hay vector. Các bạn để ý chồng nhiều vector thì ta được 1 matrix. Như vậy chồng nhiều matrix ta được một tensor. Đối với tensor ta có một thông số mới ngoài chiều rộng và chiều cao ra ta còn có độ sâu của tensor nữa.

Như hình trên các bạn có thể thấy ảnh được biểu diễn bằng 1 tensor với chiều rộng là 4, chiều cao 4, chiều sâu là 3 kích thước tensor được ký hiệu là 4x4x3 hay tổng quát hơn là wxhxc với $w$ là chiều rộng của tensor, h là chiều cao của tensor, c là chiều sâu hay là số channel

3. Kết luận

Trên đây mình đã giới thiệu về cách phân loại ảnh phổ biến trong computer vision. Ở bài viết khác mình sẽ trình bày một số phép toán phổ biến trên ảnh trước khi đi vào sâu hơn về deep learning. Nếu có thắc mắc gì vui lòng để lại comment phía dưới

Thứ Sáu, 21 tháng 1, 2022

Các vấn đề trong Neural Network

1. Giới thiệu

Hôm nay mình sẽ giới thiệu đến các bạn về một số vấn đề thường hay gặp trong neural network ảnh hưởng rất nhiều đến kết quả bài toán.

Nhắc lại một chút về công thức gradient descent $$w = w - \eta \frac{\partial L(X, w)}{\partial w}$$

  • Vanishing Gradient
  • Exploding Gradient
  • Giải pháp
  • Các activation thường gặp

2. Exploding Gradient

Đối với backpropagation đó chính là chain rule cụ thể hơn

Hình trên mình lấy từ bài hôm trước nó là tích của các đạo hàm. Khi các đạo hàm này nhỏ hơn 1 thì tích của các số nhỏ hơn 1 sẽ tiến dần về 0. Việc tính gradient tại những layer đầu trong trường hợp neural network có nhiều layer sẽ dẫn đến trường hợp gradient tại những layer này sẽ tiến dần về 0. Quay trở lại với công thức Gradient Descent. Nếu các gradient này tiến về 0. Thì các parameters sẽ không được cập nhật hay thường được gọi là freeze. Hiện tượng này được gọi là Vanishing Gradient

Ở bài trước chúng ta thường hay sử dụng activation function là sigmoid một điều đáng lưu ý là đạo hàm của hàm sigmoid nhỏ hơn 1

3. Exploding Gradient

Ngược lại với Vanishing Gradient là Exploding Gradient nghĩa là khi các tích đạo hàm lớn hơn 1 tích các đạo hàm này có thể tiến đến dương vô cùng. Khi đó công thức Gradient Descent để cập nhật parameters sẽ biến thiên rất lớn mà không hội tụ tại điểm minimum hiện tượng này được gọi là Exploding Gradient

4. Giải pháp

Có một số giải pháp phổ biến để giải quyết các vấn đề này tùy thuộc vào bài toán có thể kể đến: Trong NLP thay vì sử dụng RNN thì người ta sử dụng GRU hoặc LSTM, kĩ thuật Residual Network, sử dụng activation phù hợp...

Các phương pháp trên về mặt kiến thức vượt ra khỏi phạm vi của bài viết này nên mình sẽ giới thiệu sau.

5. Các activation thường gặp

Từ đầu đến giờ mình chỉ sử dụng sigmoid như là một activation. Trong thực tế ngoài sigmoid chúng ta còn một số các activation khác nữa

  • Hình a là sigmoid, mình sẽ không trình bày về activation này nữa
  • Hình b là tanh hàm này có giá trị $[-1, 1]$. Đạo hàm của tanh function cũng nhỏ hơn 1
  • Hình c là relu. Hàm này được sử dụng rất nhiều trong các bài toán về deep learning. Lý do là đơn giản, tính toán nhanh, có đạo hàm tại mọi điểm và giải quyết được phần nào Vanishing gradient. Vì đạo hàm của nó là 1 nếu $z > 0$. Tuy nhiên với các giá trị nhỏ hơn 0 khi đi qua relu thì nó bằng 0 hiện tượng này được gọi là Dying ReLU
  • Hình d là leakly relu được sinh ra giải quyết vấn đề của relu

Trên đây là một số vấn đề trong neural network, nếu các bạn có thắc mắc gì vui lòng để lại comment phía dưới. Xin cảm ơn

Deep Neural Network trong bài toán nhiều lớp

1. Giới thiệu

Ở bài trước mình đã trình bày về Deep Neural Network trong bài toán binary classification. Hôm nay mình sẽ trình bày về Deep Neural Network trong bài toán nhiều lớp.

Trong thực tế chúng ta gặp rất nhiều bài toán liên quan đến phân loại nhiều lớp ví dụ: Cho một bức ảnh phân loại xem bức ảnh đó chứa con chó, mèo hay gà. Hoặc phân loại một câu bình luận sản phẩm của khách hàng là tiêu cực, tích cực hay bình thường.

Trong bài toán binary classification thì output layer chỉ có 1 neural và activation function sẽ là sigmoid. Còn bài toán multiple classification thì số neural ở output layer bằng với số class mà bạn muốn phân loại với activation function là softmax. Softmax là gì mình sẽ giới thiệu trong bài viết này.

Nội dung

  • Deep Neural Network trong bài toán nhiều lớp
  • Biễu diễn dưới dạng toán học
  • Hàm softmax

2. Deep Neural Network trong bài toán nhiều lớp

Giả sử bài toán yêu cầu phân loại bình luận sản phẩm của user gồm 3 trạng thái: Tích cực, tiêu cực và bình thường

Để đơn giản mình sử dụng mạng neural với kiến trúc bao gồm: 1 input layer (2 neural), 2 hidden layer (2 neural, 2 neural), 1 output layer (3 neural tương ứng với 3 lớp).

3. Biểu diễn dưới dạng toán học

Cách biểu diễn toán học cũng như ở bài trước

Gọi $a^{(1)}, a^{(2)}$ chính là vector output của layer đó(hidden layer) với input của nó là output của layer trước. Số mũ trên đầu cũng là thứ tự của layer.

Đặt: $z^{(1)} = W^{(1)}*X$ và $z^{(2)} = W^{(2)}*a^{(1)}$ là vector tích của parameter và output của layer trước

$$z^{(1)} = \begin{bmatrix} z_{1}^{(1)}\\ z_{2}^{(1)}\\ ... ...\\ z_{n_1}^{(1)}\\ \end{bmatrix} = \begin{bmatrix} w_{1}^{(1)}*1 + w_{11}^{(1)}*x_{1} + w_{21}^{(1)}*x_{2} + w_{31}^{(1)}*x_{3} + ... + w_{n_01}^{(1)}*x_{n_0}\\ w_{2}^{(1)}*1 + w_{12}^{(1)}*x_{1} + w_{22}^{(1)}*x_{2} + w_{32}^{(1)}*x_{3} + ... + w_{n_02}^{(1)}*x_{n_0}\\ ... ... ... ... ... ...\\ w_{n_1}^{(1)}*1 + w_{1n_1}^{(1)}*x_{1} + w_{2n_1}^{(1)}*x_{2} + w_{3n_1}^{(1)}*x_{3} + ... + w_{n_0n_1}^{(1)}*x_{n_0}\\ \end{bmatrix}$$

Với $z_{i}^{(l)}$ là vector output neural $k$ của layer thứ $l$. Tương tự đối với $z^{(2)}$

$$z^{(2)} = \begin{bmatrix} z_{1}^{(2)}\\ z_{2}^{(2)}\\ ... ...\\ z_{n_2}^{(2)}\\ \end{bmatrix} = \begin{bmatrix} w_{1}^{(2)}*1 + w_{11}^{(2)}*a_{1}^{(1)} + w_{21}^{(2)}*a_{2}^{(1)} + w_{31}^{(2)}*a_{3}^{(1)} + ... + w_{n_11}^{(2)}*a_{n_1}^{(1)}\\ w_{2}^{(2)}*1 + w_{12}^{(2)}*a_{1}^{(1)} + w_{22}^{(2)}*a_{2}^{(1)} + w_{32}^{(2)}*a_{3}^{(1)} + ... + w_{n_12}^{(2)}*a_{n_1}^{(1)}\\ ... ... ... ... ... ...\\ w_{n_2}^{(2)}*1 + w_{1n_2}^{(2)}*a_{n_1}^{(1)} + w_{2n_2}^{(2)}*a_{n_1}^{(1)} + w_{3n_2}^{(2)}*a_{n_1}^{(1)} + ... + w_{n_1n_2}^{(2)}*a_{n_1}^{(1)}\\ \end{bmatrix}$$

Khi đó: $a^{(1)} = \sigma(z^{(1)})$ và $a^{(2)} = \sigma(z^{(2)})$

Về mặt bản chất nó giống với ký hiệu ở bài trước, tuy nhiên ở bài này mình đặt biến $z$ là biến phụ mà thôi

4. Hàm softmax

Hàm softmax này thường được sử dụng làm activation của output layer. Bây giờ chúng ta cùng áp dụng để tính $y_1, y_2, y_3$ như hình trên.

$$y_1 = \frac{e^{z_{1}^{(2)}}}{e^{z_{1}^{(2)}} + ... + e^{z_{n_2}^{(2)}}} = \frac{e^{z_{1}^{(2)}}}{\sum_{i=1}^{n_2} e^{z_{i}^{(2)}}}$$

Với $n_2$ là số neural tại hidden layer thứ 2

Tương tự với $y_2, y_3$

$$y_2 = \frac{e^{z_{2}^{(2)}}}{e^{z_{1}^{(2)}} + ... + e^{z_{n_2}^{(2)}}} = \frac{e^{z_{2}^{(2)}}}{\sum_{i=1}^{n_2} e^{z_{i}^{(2)}}}$$

$$y_3 = \frac{e^{z_{3}^{(2)}}}{e^{z_{1}^{(2)}} + ... + e^{z_{n_2}^{(2)}}} = \frac{e^{z_{3}^{(2)}}}{\sum_{i=1}^{n_2} e^{z_{i}^{(2)}}}$$

Quan sát thấy $y_1 + y_2 + y_3 = 1$. $y_1, y_2, y_3$ là các giá trị xác suất xảy ra ứng với từng class. Ví dụ bài toán phân loại câu bình luận với 3 trạng thái là tích cực, bình thường, tiêu cực. Sau khi dự đoán ta được: $y_1 = 0.8, y_2=0.1, y_3=0.1$. Lúc này rõ ràng $y_1$ là lớn nhất khi đó ta có thể đưa ra kết luận rằng với câu bình luận input đưa vào thì model sẽ dự đoán là tích cực vì xác suất xảy ra class tích cực là lớn nhất.

Đối với bài toán deep neural network nhiều lớp thì Feed Forward và Backpropagation y chang so với Binary Classification

Mình sẽ dừng bài viết này tại đây, trong quá trình viết công thức có thể sẽ gây nhầm lẫn, nếu có thắc mắc gì vui lòng comment phía dưới. Xin cảm ơn

Thứ Sáu, 7 tháng 1, 2022

Deep Neural Network

1. Giới thiệu

Trong bài viết này mình sẽ giới thiệu cải tiến của Neural Network mà chúng ta đã tìm hiểu ở bài viết trước được gọi là Deep Neural Network.

Nội dung

  • Đặt vấn đề
  • Deep Neural Network
  • Biểu diễn dưới dạng toán học
  • Cách tính output bài toán binary classification

2. Đặt vấn đề

Như các bạn đã biết, Logistic Regression được xem như là một Neural Network đơn giản

Đối với dữ liệu được mô tả như hình trên, đơn giản chỉ cần 1 boundary là có thể phân loại được rồi. Nhưng trong thực tế dữ liệu không hề đơn giản như vậy. Ví dụ như dữ liệu dưới đây:

Các bạn thấy đó đối với dữ liệu như trên thì 1 boundary là không đủ để phân loại dữ liệu. Để giải quyết vấn đề này Deep Neural Network ra đời

3. Deep Neural Network

Quay lại với dữ liệu trên, Deep Neural Network xử lý như sau:

Từ hình trên ta thấy Deep Neural Network sử dụng 2 boundaries thay vì chỉ sử dụng 1. Ban đầu tìm đường $A_1$ (Màu đỏ) để phân tách thành 2 vùng: Vùng chứa điểm số 2 và vùng còn lại chứa 1,3,4. Đường còn lại $A_2$ (Màu vàng) phân tách các điểm dữ liệu thành 2 vùng: Vùng chứa điểm số 3 và vùng còn lại chứa 1, 4

Giả sử có 1 điểm dữ liệu mới chúng ta cần phân loại xem nó thuộc class nào: Sử dụng boundary $A_1$(Màu đỏ) để phân loại. Nếu nó thuộc ở vùng chứa điểm dữ liệu số 2 thì nó thuộc class dấu x màu xanh. Ngược lại nếu đường boundray $A_1$ phân loại điểm đó vào vùng chứa điểm dữ liệu 1,3,4 thì ta sử dụng tiếp đường boundary $A_2$(Màu vàng). Nếu nó thuộc vùng chứa điểm dữ liệu số 3 thì nó thuộc class dấu x màu xanh, ngược lại nếu thuộc vùng chứa điểm 1,4 thì nó thuộc class dấu x màu đỏ

Như vậy boundary $A_1$ phân loại được output sau đó output này được đưa vô làm input của boundary $A_2$. Để được output cuối cùng.

Biễu diễn bài toán dưới dạng Deep Neural Network

Trong thực tế mạng Neural Network chúng ta sử dụng nhiều layers và nhiều neural trong một layer để giải quyết các bài toán phức tạp hơn. Dưới đây là Neural Network tổng quát nhất.

Mỗi layer sẽ có nhiều neural. Các bạn nhớ rằng, nếu có ai hỏi Neural Network trên có bao nhiêu layer thì bạn đừng có tính Input layer vào nhé. Vì người ta chỉ tính hidden layer và output layer thôi. Như hình trên thì chỉ có 4 layers (3 màu xanh da lá cây là hidden layer, 1 màu xanh lam nhạt ở cuối cùng là output layer)

Lưu ý: Đối với bài toán binary classification thì output layer chỉ có một layer. Còn bài toán multiple classification thì số neural tại output layer bằng với số class mình sẽ giới thiệu trong bài sau

4. Biễu diễn dưới dạng toán học

Vì biễu diễn các parameter riêng lẽ, nhìn vào hình sẽ rất rối nên mình sẽ biểu diễn dưới dạng ma trận.

Gọi $W^{(1)}, W^{(2)}, W^{(3)}$ là parameters của hàm giả thuyết(mình cũng quy định luôn là từ nay mình sẽ gọi là Activation Function nhé), các bạn nhớ là trong parameters phải có cả vector bias nữa nhé. Các chỉ số trên đầu chính là thứ tự của layer. Trong trường hợp này là hàm sigmoid.

$$W^{(1)} = \begin{bmatrix} w_{1}^{(1)} & w_{11}^{(1)} & w_{21}^{(1)} & w_{31}^{(1)} & ... & w_{n_{0}1}^{(1)}\\ w_{2}^{(1)} & w_{12}^{(1)} & w_{22}^{(1)} & w_{32}^{(1)} & ... & w_{n_{0}2}^{(1)}\\ ... & ... & ... & ... & ... & ...\\ w_{n_{1}}^{(1)} & w_{1n_{1}}^{(1)} & w_{2n_{1}}^{(1)} & w_{3n_{1}}^{(1)} & ... & w_{n_{0}n_{1}}^{(1)}\\ \end{bmatrix}$$

Với $n_0$, $n_1$ lần lượt là số neural của input layer và hidden layer 1. Trong hình vẽ trên $n_0 = 3, n_1 = 4$

$w_{1}^{(1)}$ là bias của neural 1 tại hidden layer 1, $w_{11}^{(1)}$ là parameter liên kết giữa neural 1 của input layer và neural 1 của hidden layer 1, $w_{1n_1}^{(1)}$ là parameter liên kết giữa neural 1 của input layer và neural $n_1$ của hidden layer 1. Biễu diễn tương tự với các parameter khác

$$W^{(2)} = \begin{bmatrix} w_{1}^{(2)} & w_{11}^{(2)} & w_{21}^{(2)} & w_{31}^{(2)} & ... & w_{n_{1}}^{(2)}\\ w_{2}^{(2)} & w_{12}^{(2)} & w_{22}^{(2)} & w_{32}^{(2)} & ... & w_{n_{1}2^{(2)}}\\ ... & ... & ... & ... & ... & ...\\ w_{n_2}^{(2)} & w_{1n_{2}^{(2)}} & w_{2n_{2}^{(2)}} & w_{3n_{2}^{(2)}} & ... & w_{n_{1}n_{2}}^{(2)}\\ \end{bmatrix}$$

Với $n_1, n_2$ lần lượt là số neural của hidden layer 1 và hidden layer 2. Trong hình vẽ trên $n_1 = 4, n_2 = 4$

Gọi $a^{(1)}, a^{(2)}$ chính là vector output của layer đó(hidden layer) với input của nó là output của layer trước. Số mũ trên đầu cũng là thứ tự của layer.

$a^{(1)} = \sigma(W^{(1)}*X)$

$$a^{(1)} = \begin{bmatrix} a_{1}^{(1)}\\ a_{2}^{(1)}\\ ... ...\\ a_{n_1}^{(1)}\\ \end{bmatrix} = \begin{bmatrix} \sigma(w_{1}^{(1)}*1 + w_{11}^{(1)}*x_{1} + w_{21}^{(1)}*x_{2} + w_{31}^{(1)}*x_{3} + ... + w_{n_01}^{(1)}*x_{n_0})\\ \sigma(w_{2}^{(1)}*1 + w_{12}^{(1)}*x_{1} + w_{22}^{(1)}*x_{2} + w_{32}^{(1)}*x_{3} + ... + w_{n_02}^{(1)}*x_{n_0})\\ ... ... ... ... ... ...\\ \sigma(w_{n_1}^{(1)}*1 + w_{1n_1}^{(1)}*x_{1} + w_{2n_1}^{(1)}*x_{2} + w_{3n_1}^{(1)}*x_{3} + ... + w_{n_0n_1}^{(1)}*x_{n_0})\\ \end{bmatrix}$$

Với $a_{i}^{(l)}$ là vector output neural $k$ của layer thứ $l$. Tương tự đối với $a^{(2)}$

$a^{(2)} = \sigma(W^{(2)}*a^{(1)})$

$$a^{(2)} = \begin{bmatrix} a_{1}^{(2)}\\ a_{2}^{(2)}\\ ... ...\\ a_{n_2}^{(2)}\\ \end{bmatrix} = \begin{bmatrix} \sigma(w_{1}^{(2)}*1 + w_{11}^{(2)}*a_{1}^{(1)} + w_{21}^{(2)}*a_{2}^{(1)} + w_{31}^{(2)}*a_{3}^{(1)} + ... + w_{n_11}^{(2)}*a_{n_1}^{(1)})\\ \sigma(w_{2}^{(2)}*1 + w_{12}^{(2)}*a_{1}^{(1)} + w_{22}^{(2)}*a_{2}^{(1)} + w_{32}^{(2)}*a_{3}^{(1)} + ... + w_{n_12}^{(2)}*a_{n_1}^{(1)})\\ ... ... ... ... ... ...\\ \sigma(w_{n_2}^{(2)}*1 + w_{1n_2}^{(2)}*a_{n_1}^{(1)} + w_{2n_2}^{(2)}*a_{n_1}^{(1)} + w_{3n_2}^{(2)}*a_{n_1}^{(1)} + ... + w_{n_1n_2}^{(2)}*a_{n_1}^{(1)})\\ \end{bmatrix}$$

Gọi $\hat{y}$ là output của Neural Network khi đó: $y = \sigma(W^{(3)}*a^{(2)})$. Có $\hat{y}$ rồi ta dễ dàng tìm được Loss Function L tùy vào bài toán ta sử dụng Loss Function thích hợp

Như vậy quá trình từ $X$ ban đầu đến khi tìm được $\hat{y}$ được gọi là Feed Forward

Bây giờ ta áp dụng Gradient Descent để cập nhật parameters như thế nào?

Để cập nhật $W^{(1)}$ ta áp dụng Gradient Descent như sau:$$W^{(1)} = W^{(1)} - \eta \frac{\partial L}{\partial W^{(1)}}$$

Để tính $\frac{\partial L}{\partial W^{(1)}}$ ta áp dụng chain rule vì bản chất của Neural Network là các hàm toán học lồng nhau. Giống như những gì mình đã viết trong bài chain rule

Sau khi tính được $\frac{\partial L}{\partial W^{(1)}}$ chúng ta áp dụng Gradient Descent để cập nhật $W^{(1)}$

Ở đây mình chỉ trình bày cách Neural Network hoạt động. Chứ không tính đạo hàm chi tiết. Việc tính các đạo hàm này các thư viện nổi tiếng như tensorflow hoặc pytorch người ta đã tính rồi các bạn không phải ngồi tính nữa.

Tương tự đối với $W^{(2)}, W^{(3)}$

Quá trình thực hiện như trên được gọi là Backpropagation

Quá trình Feed Forward và Backpropagation được thực hiện một cách tuần tự. Feed Forward dùng để tìm $\hat{y}$ sau đó tính L. Còn quá trình Backpropagation sẽ tính đạo hàm sau đó sử dụng Gradient Descent để cập nhật parameters. Lặp đi lặp lại quá trình này cho đến khi hội tụ (điều kiện dừng của Gradient descent mình đã trình bày ở đây)

Trong ví dụ trên mình chỉ trình bày một Neural Network đơn giản. Thực tế Neural Network phức tạp hơn nhiều (nhiều neural hơn, nhiều layer hơn). Tuy nhiên cách hoạt động thì không khác nhau.

5. Cách tính output bài toán binary classification

Đối với bài toán binary classification thì cách tính output như Logistic Regression các bạn có thể xem lại tại đây

Trên đây mình đã trình bày về Neural Network, nếu có thắc mắc gì vui lòng để lại comment phía dưới. Xin cảm ơn

Neural Network

1. Giới thiệu

Xin chào các bạn hôm nay mình xin giới thiệu tới các bạn Neural Network là nền tảng của Deep Learning.

Nội dung

  • Logistic là một Neural network cơ bản
  • Feed forward
  • Backpropagation

2. Logistic là một Neural network cơ bản

Các bạn còn nhớ Logistic Regression được sử dụng trong các bài toán Binary Classification, bản chất ở đây là tìm đường boundary để phân tách dữ liêu, các bạn có thể xem lại tại đây

Quan sát hình dưới đây:

Từ hình trên bạn quan sát thấy

  • Chỉ cần 1 boundary để phân chia được dữ liệu một cách rõ ràng.
  • Logistic là một Neural Network cơ bản nhất với một Neural
  • Các bạn để ý cái ký tự ở phía trong neural đó chính là hàm Sigmoid, hàm Sigmoid này thường được gọi là hàm giả thuyết. Nhưng trong Neural network thường được gọi là Activation function. Mình vẽ dưới dạng neural nhìn lạ vậy thôi chứ về cách hoạt động thì nó là Logistic Regression mà.

3. Feed forward

Feed forward đơn giản là tìm $\hat{y}$ ứng với bộ parameters $w$. Các bạn nhớ lại bài Gradient Descent chúng ta tìm $\hat{y}$ tại vị trí $w_t$ sau đó tìm Loss Function đúng không nào. Feed Forward chỉ là một tên gọi thôi

Tóm lại Feed forward là tìm giá trị dự đoán $\hat{y}$ và Loss function $L$

4. Backpropagation

Backpropagation thực ra chỉ là quá trình update parameters $w$ sử dụng Gradient Descent mà thôi. Với Feed forward chúng ta tìm được $\hat{y}$ và $L$. Sau đó chỉ cần áp dụng Gradient Descent với các giá trị này là xong. Quá trình Feed Forward và Backpropagation được thực hiện một cách tuần tự lặp đi lặp lại nhiều lần cho đến khi hội tụ

Sau mỗi epoch thì ta lại được bộ parameters $w$. Rồi lại tiếp tục Feed forward rồi lại Backproparagion

Bài viết này mình chỉ giới thiệu một Neural Network cơ bản thôi. Bản chất nó là Gradient Descent và Logistic Regression mình đã trình bày. Nó khác ở chỗ dùng Neural Network để giải thích. Ở bài viết khác mình sẽ trình bày Deep Neural Network. Có nhiều thứ hay ho hơn để nói. Nếu có thắc mắc gì vui lòng để lại comment. Xin cảm ơn

Chain rule

1. Giới thiệu

Xin chào các bạn hôm nay mình xin giới thiệu cho các bạn một phương pháp tính đạo hàm, đây cũng là xương sống của thuật toán backpropagation trong neural network mà mình sẽ giới thiệu trong các bài sau

Nội dung

  • Phương pháp
  • Ví dụ

2. Phương pháp

Chain rule là một phương pháp tính đạo hàm của hàm hợp theo một biến nào đó dưới dạng công thức như sau: Ví dụ chúng ta có hàm số như sau: $y = f(g(x))$. Trong đó $f, g$ là các hàm số. $x$ là biến

Khi đó: $$\frac{\partial y}{\partial x} = \frac{\partial y}{\partial f} * \frac{\partial f}{\partial g} * \frac{\partial g}{\partial x}$$

Bạn có thể nhìn hình dưới đây để hiểu rõ hơn (Nhìn như một sợi dây xích đúng không nào).

3. Ví dụ

3.1. Tính $\frac{\partial f(x)}{\partial x}$ của hàm số $y = sin^{2}(x)$

Kết quả cuối cùng: $$\frac{\partial f(x)}{\partial x} = 2sin(x)cos(x)$$

3.2. Tính $\frac{\partial f(x)}{\partial x}$ của hàm số $y = \sqrt{x^2 + 3x + 5}$

Kết quả cuối cùng: $$\frac{\partial f(x)}{\partial x} = \frac{2x + 3}{2 \sqrt{x^2 + 2x + 3}}$$

3.3. Tính $\frac{\partial f(x)}{\partial x}$ của hàm số $y = \frac{1}{1 + e^{-x}}$

Các bạn thấy hàm này quen chứ. Đây chính là hàm sigmoid trong thuật toán Logistic Regression

Kết quả cuối cùng: $$\frac{\partial f(x)}{\partial x} = \frac{e^{-x}}{(1 + e^{-x})^2}$$

Trên đây mình đã giới thiệu về phương pháp tính đạo hàm của hàm hợp. Nếu có thắc mắc gì vui lòng để lại comment bên dưới. Xin cảm ơn