Nhận dạng các chữ cái

Một phần của tài liệu Nghiên cứu xây dựng và phát triển các thuật toán nhận dạng chữ viết tay (Trang 45 - 59)

CHƯƠNG 3: THUẬT TOÁN NHẬN DẠNG CHỮ VIẾT TAY

3.3. Thuật toán nhận dạng các chữ cái riêng rẽ

3.3.3. Nhận dạng các chữ cái

Hệ thống thị giác của con người là một trong những điều kỳ diệu của thế giới. Quan sát chuỗi ký tự viết tay sau đây:

Hình 3-19: Ví dụ chuỗi ký tự viết tay

Hầu hết mọi người đều dễ dàng nhận ra những chữ này là recognition. Sự dễ dàng là lừa dối. Ở mỗi bán cầu não, chúng ta có vỏ não thị giác chính, còn gọi là V1, bao gồm 140 triệu nơ-ron với hàng chục tỷ kết nối giữa chúng. Thị giác của con người không chỉ liên quan đến V1, mà còn là một loạt các vỏ não khác –V2, V3, V4 và V5 – làm việc xử lý ảnh phức tạp hơn. Chúng ta mang trong đầu một siêu máy tính, hiệu chuẩn bằng tiến hóa trăm triệu năm, và thích nghi tuyệt vời để hiểu được thế giới nhìn thấy.

45 Sự khó khăn trong nhận dạng mẫu hình ảnh trở nên rõ ràng nếu chúng ta cố gắng để viết một chương trình máy tính để nhận diện những chữ viết tay như ở trên.

Điều có vẻ dễ dàng khi chúng ta có thể tự làm đột nhiên trở nên vô cùng khó khăn khi sử dụng máy tính. Trực giác đơn giản về cách chúng ta nhận dạng chữ a là gồm một hình tròn bên trái và một nét thẳng có móc dưới bên phải, nhưng nó không đơn giản để thể hiện dưới dạng thuật toán. Khi chúng ta cố gắng làm cho các quy tắc như vậy trở nên chính xác, chúng ta có thể nhanh chóng nhận lấy thất bại trong các ngoại lệ, trường hợp đặc biệt. Điều này có vẻ vô vọng.

Mạng nơ-ron là cách tiếp cận khác cho vấn đề này. Ý tưởng là sử dụng một số lượng lớn các chữ viết tay, được biết như là các mẫu dạy, sau đó phát triển một hệ thống có thể học từ các mẫu dạy này. Hay nói các khác, mạng nơ-ron sử dụng các mẫu này để tự động suy luận các luật để nhận dạng. Hơn nữa, khi tăng số lượng mẫu dạy, mạng có thể học nhiều hơn và sau đó nâng cao độ chính xác. Ở đây tôi đưa ra 100 mẫu dạy làm ví dụ, chúng ta có thể sẽ sử dụng hàng nghìn, thậm chí hàng triệu, hàng tỳ mẫu.

Hình 3-20: Mẫu dạy

Hai loại nơ-ron nhân tạo quan trọng là perceptronsigmoid nơ-ron và thuật toán dạy mạng stochastic gradient descent sẽ được trình bày trong phần tới.

46 3.3.3.1. Perceptrons

Perceptrons được phát triển trong những năm 1950-1960 bởi các nhà khoa học Frank Rosenblatt dựa trên cảm hứng từ những nghiên cứu trước đó của Warren McCulloch và Walter Pitts. Ngày nay, sigmoid nơ-ron được sử dụng phổ biến hơn trong các nghiên cứu hiện đại trên mạng nơ-ron. Nhưng để hiểu tại sao sigmoid nơ- ron được sử dụng rộng rãi, phần tiếp theo trình bày cơ bản về perceptrons.

Cách hoạt động của perceptrons là sử dụng một vài đầu vào nhị phân x1, x2,…, và tạo ra một đầu ra nhị phân.

Hình 3-21: Cách thức perceptron hoạt động [13]

Giả sử perceptrons có ba đầu vào: x1, x2, x3. Nhà khoa học Rosenblatt đề xuất một luật đơn giản để tính toán đầu ra. Ông đưa ra các trọng số w1, w2,w3,… là các số thực diễn tả độ quan trọng của đầu vào tương ứng. Đầu ra của nơ-ron là 0 hay 1 được xác định thông qua so sánh tổng xích ma của các tích wj*xj với một giá trị ngưỡng. Cũng giống như các trọng số, ngưỡng cũng là một giá trị số thực.

0 if j

1 if

j j

j j j

w x threshold output

w x threshold

 

 

 

 

Chúng ta có thể thấy khi thay đổi các giá trị trọng số, hay ngưỡng chúng ta có thể tạo ra các đầu ra khác nhau. Hay nói cách khác là tạo ra các quyết định khác nhau. Một cách phức tạp hơn, chúng ta có thể kết nối các perceptrons thành một

(3.1)

47 mạng nhiều lớp. Thực tế mỗi perceptrons chỉ tạo ra một đầu ra, các đường mũi tên chỉ diễn tả đầu ra sẽ được sử dụng như là đầu vào của các perceptrons khác.

Hình 3-22: Mạng perceptron nhiều lớp [13]

Ở ví dụ trên, lớp đầu tiên tạo ra 3 quyết định vô cùng đơn giản bằng cách tính trọng số các đầu vào. Mỗi perceptrons ở lớp thứ hai tạo quyết định bằng cách tính trọng số kết quả nhận được từ lớp thứ nhất. Bằng cách này một perceptron ở lớp thứ hai có thể tạo ra một quyết định phức tạp hơn, trừu tượng hơn perceptron ở lớp thứ nhất. Và sau đó các quyết định phức tạp hơn nữa được tạo ra ở lớp thứ ba.

Tương tự, với một mạng nhiều lớp có thể tham gia vào qua trình tạo ra quyết định phức tạp.

Chúng ta có thể đơn giản hóa mô tả perceptrons. Điều kiện

j j

jw xthreshold

 là phức tạp, chúng ta có thể tạo ra hai thay đổi. Một là, viết

j j

jw x

 bằng w x với wx là các vector trọng số và đầu vào. Hai là, chuyển ngưỡng sang bên trái của bất đẳng thức, và đặt chúng là bias của perceptrons. Qua đó chúng ta có thể viết lại công thức (3.1) thành:

0 if 0

1 if 0

w x b output

w x b

  

       (3.2)

48 3.3.3.2. Sigmoid nơ-ron

Giả thiết rằng chúng ta có một mạng các perceptrons, chúng ta muốn dạy cho mạng này để giải quyết vấn đề nhận dạng chữ viết tay. Đầu vào của mạng sẽ là các dữ liệu điểm ảnh thô. Chúng ta muốn học cho mạng các trọng số và bias để mà đầu ra của mạng phản ánh đúng ký tự đầu vào. Để hiểu việc học xảy ra như thế nào, giả sử chúng ta tạo một sự thay đổi nhỏ các trọng số hoặc bias. Điều chúng ta muốn là sự thay đổi nhỏ ở trọng số sẽ chỉ tạo ra một sự thay đổi nhỏ ở đầu ra.

Hình 3-23: Phương thức học mạng [13]

Trong ví dụ mạng đang nhận dạng sai chữ “a” thành “b”. Chúng ta sẽ thay đổi nhỏ trọng số và bias để mạng cho đầu ra tiến dần đến “a”. Lặp đi lặp lại việc này sẽ cho kết quả tốt hơn. Đây là cách mạng học.

Nhưng thực tế, điều chúng ta muốn không xảy ra với mạng perceptrons. Vì khi thay đổi nhỏ ở trọng số hay bias của bất kỳ một perceptron nào đó có thể làm đảo ngược giá trị đầu ra, 0 thành 1, hoặc 1 thành 0.

Chúng ta có thể khắc phục vấn đề này bằng sử dựng một loại nơ-ron nhân tạo gọi là sigmoid nơ-ron. Sigmoid nơ-ron tương tự như perceptron nhưng được chỉnh sửa để mà một sự thay đổi nhỏ trong trọng số hay bias chỉ dẫn đến một sự thay đổi nhỏ trong đầu ra.

49 Khác với perceptron, đầu vào của Sigmoid nơ-ron là các số thực nằm trong khoảng [0:1]. Các trọng số hay bias vẫn giống với perceptron. Nhưng đầu ra không phải là 0 hay 1. Thay vào đó đầu ra là w x b  , với  là hàm sigmoid được định nghĩa như sau:

( ) 1

1 z

z e

  

Hay áp dụng vào nơ-ron có các đầu vào x1, x2,… và các trọng số w1, w2,… và bias b, ta được đầu ra là:

1

1 exp( j j )

jw x b

   

Hình 3-24: Đồ thị hàm sigmoid

Với perceptrons, đầu ra sẽ là 1 hay 0 phụ thuộc vào tổng xích ma các tích w x b  là dương hay âm. Chúng ta có thể hiểu đầu ra của các perceptron là hàm bước nhảy đơn vị.

(3.3)

(3.4)

50 Hình 3-25: Đồ thị hàm bước nhảy đơn vị

Trong khi đó, chúng ta có thể xấp xỉ sự thay đổi đầu ra khi thay đổi trọng số và bias với sigmoid nơ-ron như sau:

j

j j

output output

output w b

w b

 

    

 

với output/wjvà output/b là các đạo hàm riêng của đầu ra theo trọng số và bias.

3.3.3.3. Kiến trúc mạng nơ-ron

Kiến trúc mạng nơ-ron vê cơ bản gồm ba lớp. Lớp ngoài cùng bên trái là lớp đầu vào. Các nơ-ron nằm trong lớp này còn được gọi là nơ-ron đầu vào. Lớp ngoài cùng bên phải là lớp đầu ra, chứa các nơ-ron đầu ra. Lớp ở giữa gọi là lớp ẩn.

(3.5)

51 Hình 3-26: Kiến trúc mạng nơ-ron [13]

Ví dụ trên là một mạng nơ-ron có bốn lớp, trong đó có hai lớp ẩn.

Trong bài toán nhận dạng chữ viết tay, tôi sử dụng mạng nơ-ron ba lớp: đầu vào, đầu ra, và một lớp ẩn. Mỗi giá trị điểm ảnh sẽ được sử dụng là một đầu vào.

Giá trị này sẽ được quy chuẩn về giá trị thực trong khoảng [0:1]. Do đó, ảnh đưa vào nhận dạng là ảnh 28x28 sẽ cung cấp 784 đầu vào. Bảng chữ cái tiếng anh chúng ta có 26 chữ cái nên sẽ có 26 đầu ra tương ứng. Giá trị đầu ra của nơ-ron đầu ra tại vị trí i bằng 1 biểu thị cho mạng nhận ra chữ cái thứ i. Như vậy mạng sẽ có 784 nơ- ron đầu vào và 26 nơ-ron đầu ra. Số lượng nơ-ron ở lớp ẩn sẽ được thay đổi để tìm ra phương án tối ưu nhất, cân bằng giữa độ chính xác và thời gian dạy mạng.

52 Hình 3-27: Mạng nơ-ron sử dụng trong nhận dạng chữ viết tay

3.3.3.4. Học mạng với thuật toán stochastic gradient descent

Để dạy học cho mạng, tôi sử dụng hai tập dữ liệu bao gồm các ảnh xám kích thước 28x28. Một tập là tập dạy, một tập là tập kiểm tra. Chúng ta sẽ sử dụng ký hiệu x biểu thị đầu vào, x là một vector 784 ( = 28x28) chiều. Mỗi giá trị trong vector đại diện cho giá trị một điểm ảnh. Đầu ra mong muốn được ký hiệu là y = y(x), y là một vector 26 chiều. Lấy ví dụ một đầu vào cụ thể đại diện cho chữ

“e” thì đầu ra mong muốn là y(x) = (0, 0, 0, 0, 1, 0,…0)T. T là phép toán chuyển vị ma trận.

Việc dạy cho mạng chính là việc đi tìm các trọng số và bias sao cho đầu ra của mạng xấp xỉ y(x) cho tất cả các đầu vào dạy. Để định lượng việc đạt được mục tiêu này như nào, chúng ta định nghĩa hàm chi phí (cost function):

1 2

( , ) ( )

2 x

C w b y x a

n  

(26 neurons)

(3.6)

53 Trong đó w biểu thị tập các trọng số, b biểu thị tập các bias, n là tổng số đầu vào dạy, a là vector đầu ra của mạng tương ứng đầu vào x. ||v|| là mô-đun của vector v. Chúng ta gọi C là hàm chi phí bậc hai, hay đôi khi cũng được gọi là sai số trung bình bình phương. Xem xét kỹ hàm trên, ta thấy C(w, b) là giá trị không âm. Hơn nữa, C (w, b) sẽ trở nên nhỏ xấp xỉ 0 nếu đầu ra mong muốn y(x) xấp xỉ đầu ra a với tất cả các đầu vào x. Do đó thuật toán dạy tối ưu phải tìm ra bộ trọng số và bias sao cho C(w, b) xấp xỉ 0. Ngược lại nếu C(w ,b) lớn, điều đó có nghĩa là đầu ra thực tế rất lệch đầu ra mong muốn trên một số lượng lớn đầu vào. Như vậy, mục đích của thuật toán dạy là tối thiểu hóa chi phí C(w, b), hay tìm tập trọng số và bias sao cho chi phí nhỏ nhất có thể. Tôi sử dụng thuật toán gradient descent để làm điều này.

Thuật toán gradient descent

Giả thiết chúng ta đang cố gắng tối thiểu hóa hàm C(v). Hàm này có thể là hàm bất kỳ giá trị thực của rất nhiều biến v = v1, v2, …

Xét hàm C(v) chỉ có 2 biến

Hình 3-28: Đồ thị hàm C(v) có 2 biến

Điều chúng ta phải làm là tìm vị trí mà C đạt giá trị nhỏ nhất. Ở đồ thị trên, chúng ta có thể dễ dàng tìm thấy điểm nhỏ nhất của C. Trong các hàm thông

54 thường, C có thể là hàm phức tạp của nhiều biến, và chúng ta không thể nhìn bằng mắt và tìm được điểm nhỏ nhất. Một phương thức để giải quyết vấn đề là sử dụng giải tích để tìm điểm nhỏ nhất. Chúng ta tính đạo hàm, sau đó sử dụng chúng để tìm điểm mà ở đó C là một cực trị. Nếu C là hàm của một vài biến, phương thức có thể hoạt động, những sẽ là không khả thi nếu chúng ta có rất nhiều biến. Trong mạng nơ-ron, chúng ta sẽ có rất nhiều biến. Một mạng lớn cũng có thể có hàng triệu, hàng tỷ trọng số và bias. Do đó dùng giải tích để giải quyết sẽ không thực hiện được.

Khi phương pháp giải tích không giải quyết được vấn đề. Chúng ta hãy bắt đầu nghĩ rằng đồ thị hàm chi phí là một loại thung lũng. Nếu chúng ta thả một quả bóng vào thì cuối cùng quả bóng cũng sẽ nằm ở đáy của thung lũng. Chúng ta sẽ dùng cách này để tìm điểm cực tiểu của hàm. Chúng ta sẽ chọn một điểm bắt đầu bất kỳ cho một quả bóng tưởng tượng, sau đó môt phỏng dự di chuyển của quả bóng như cách nó rơi xuống đáy của thung lũng. Chúng ta có thể làm được mô phỏng này đơn giản bằng cách tính toán đạo hàm bậc một, và có thể đạo hàm bậc hai của C.

Những đạo hàm này sẽ cho ta biết hình dạng của thung lũng, và quả bóng sẽ lăn như nào.

Khi chúng ta di chuyển quả bóng một lượng nhỏ Δv1 theo hướng v1, và một lượng nhỏ Δv2 theo hướng v2. Giải tích chỉ ra C sẽ thay đổi như sau:

1 2

1 2

C C

C v v

v v

 

    

 

Chúng ta sẽ tìm cách chọn Δv1 và Δv2 sao cho ΔC âm. Để tìm hiểu làm thế nào để chọn được một lựa chọn như vậy, chúng ta định nghĩa Δv là vector thể hiện sự thay đổi của v, Δv≡(Δv1, Δv2)T, T là phép chuyển vị ma trận. Chúng ta cũng định nghĩa độ dốc (gradient) của C là một vector của đạo hàm riêng,(∂C/∂v1, ∂C/∂v2)T. Lúc này vector độ dốc của C kí hiệu là ∇C

(3.7)

55

1 2

, C C T

C v v

   

       

Viết lại sự thay đổi của C (ΔC ) thông qua sự thay đổi của v v ) và gradient

C, công thức (3.7) sẽ thành:

C C v

   

Công thức này giải thích tại sao ∇C được gọi là vector độ dốc. ∇C liên quan đến thay đổi của v Δv, để thay đổi C. Hơn nữa công thức chỉ ra cho chúng ta cách chọn Δv sao cho ΔC âm. Giả sử rằng chúng ta chọn:

vC

   

khi η là một số nhỏ, dương (được biết đến là hệ số học). Công thức (3.9) sẽ tương đương ΔC ≈−ηC⋅∇C = − η∥∇C∥2 . Vì ∥∇C∥2 > 0, điều này đảm bảo ΔC ≤ 0, C sẽ luôn luôn giảm nếu chúng ta thay đổi v theo công thức (3.10). Qua đó chúng ta chọn công thức (3.10) là luật thay đổi di chuyển của quả bóng trong thuật toán gradient descent. Điều đó có nghĩa là chúng ta sẽ sử dụng công thức (3.10) để tính toán giá trị cho Δv, rồi di chuyển quả bóng từ vị trí v sang v’ một lượng:

v     v, vC

Sau đó chúng ta tiếp tục sử dụng luật cập nhật này để tạo một di chuyển khác. Lặp đi lặp lại, chúng ta sẽ tiếp tục giảm C đến khi chúng ta hy vọng đã chạm đến cực tiểu của C.

Tổng quát lại, phương thức thuật toán gradient descent hoạt động là tính toán lặp đi lặp lại độ dốc ∇C, sau đó di chuyển theo hướng ngược lại, như là rơi xuống thung lũng.

(3.8)

(3.9)

(3.10)

(3.11)

56 Hình 3-29: Phương thức hoạt động của thuật toán gradient descent

Để đảm bảo thuật toán gradient descent hoạt động đúng, chúng ta cần chọn hệ số học η đủ nhỏ để công thức (3.9) có xấp xỉ tốt nhất, nếu không có thể ΔC > 0.

Chúng ta cũng không muốn hệ số học η quá nhỏ, nó sẽ khiến thay đổi Δv quá nhỏ, thuật toán sẽ làm việc rất chậm.

Xét hàm C(v) có nhiều biến (m biến)

Bây giờ ta xét đến hàm chi phí C có rất nhiều biến. Giả sử rằng hàm Cm biến: v1, v2, …, vm. Ta có sự thay đổi ΔC được tạo ra bằng sự thay đổi nhỏ Δv = (Δv1,…,Δvm)T là:

C C v

   

Trong đó độ dốc của C là một vector được tính theo công thức:

1

,...,

T

m

C C

C v v

  

     Chọn thay đổi Δv,

(3.12)

(3.13)

57 vC

   

Chúng ta đảm bảo xấp xỉ công thức (3.12) và ΔC âm. Bằng áp dụng lặp đi lặp lại luật cập nhật sau đây thì chúng ta có thể tìm được điểm cực tiểu của C.

v   v, vC

Áp dụng thuật toán gradient descent vào học mạng nơ-ron

Áp dụng vào tối thiểu hóa chi phí trong công thức (3.6), thay thế các biến vj bằng các trọng số và bias. Luật cập nhật sẽ là:

,

,

k k k

k

l l l

l

w w w C

w b b b C

w

   

   

Có một vấn đề khi áp dụng luật cập nhật này cho mạng nơ-ron,. Khi chúng ta phải tính gradient ∇Cx cho mỗi đầu vào dạy x, sau đó tính trung bình,

1

x x

C C

  n  . Do số lượng mẫu dạy rất lớn, nên việc tính toán sẽ mất nhiều thời gian, dẫn tới việc học rất chậm.

Một phương pháp stochastic gradient descent được sử dụng để tăng tốc học.

Thay vì tính gradient trên toàn bộ mẫu đầu vào, ta chỉ tính ∇Cx cho một lượng nhỏ ngẫu nhiên số lượng đầu vào, sau đó tính trung bình trên lượng nhỏ đó. Lượng nhỏ mẫu ngẫu nhiên này được gọi là lô đầu vào nhỏ (mini-batch). Giả sử có m mẫu ngẫu nhiên trong một lô đầu vào. Nếu m đủ lớn, chúng ta kỳ vọng trung bình của các gradient trong lô này sẽ xấp xỉ gradient tính trên toàn bộ mẫu.

1 j

m

X x

j C x C

m n C

  

  

 

Đổi vế ta được xấp xỉ như sau:

(3.14)

(3.15)

(3.16) (3.17)

(3.18)

58

1

1

j

m X j

C C

m

  

Thuật toán stochastic gradient descent hoạt động dựa trên luật cập nhật trọng số và bias như sau:

,

,

j

j

X

k k k

j k

X

l l l

j l

w w w C

m w

b b b C

m b

   

   

ở đây Xj là một mẫu trong một lô đầu vào. Chúng ta sẽ duyệt qua tất cả các lô đầu vào và dạy cho mạng. Mỗi một lần duyệt hết toàn bộ mẫu dạy, gọi là hoàn thành một epoch. Chúng ta sẽ duyệt qua nhiều epoch.

Một phần của tài liệu Nghiên cứu xây dựng và phát triển các thuật toán nhận dạng chữ viết tay (Trang 45 - 59)

Tải bản đầy đủ (PDF)

(92 trang)