Luận án Nghiên cứu một thuật toán tìm điểm tối ưu toàn cục trong quá trình luyện mạng nơron bằng thuật toán vƣợt khe có sự kết hợp với giải thuật di truyền

Tóm lại, khi giải quyết bài toán bằng mạng nơron theo thủ tục truyền ngƣợc có những vấn đề rút ra là: - Sẽ có bao nhiêu nơron trong mạng, bao nhiêu ngõ vào, bao nhiêu ngõ ra và bao nhiêu lớp ẩn. Càng nhiều lớp ẩn bài toán trở nên phức tạp nhƣng có thể giải quyết đƣợc những vấn đề lớn. - Thuật toán Back propagation cung cấp một phƣơng pháp “xấp xỉ” cho việc tìm trong không gian trọng số (nhằm tìm ra những trọng số phù hợp cho mạng). Chúng ta càng lấy giá trị của tham số học càng nhỏ bao nhiêu thì sự thay đổi trọng số càng nhỏ bấy nhiêu và quỹ đạo không gian học sẽ càng trơn. Tuy nhiên điều này lại làm cho tốc độ học chậm đi. Trái lại, nếu chúng ta chọn tham số tốc độ học quá lớn, sự thay đổi lớn của các trọng số có thể làm cho mạng trở nên không ổn định. Về mặt ý tƣởng, tất cả các nơron trong mạng nên chọn cùng một tốc độ học, tham số học  nên gán một giá trị nhỏ. Các nơron với nhiều ngõ vào nên chọn một tham số tốc độ học nhỏ hơn để giữ một thời gian học tƣơng tự cho nhau cho tất cả các nơron trong mạng

pdf144 trang | Chia sẻ: huyhoang44 | Lượt xem: 659 | Lượt tải: 0download
Bạn đang xem trước 20 trang tài liệu Luận án Nghiên cứu một thuật toán tìm điểm tối ưu toàn cục trong quá trình luyện mạng nơron bằng thuật toán vƣợt khe có sự kết hợp với giải thuật di truyền, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
uấn luyện chất lƣợng mạng, performance learning, là một lớp quan trọng khác của luật huấn luyện, trong phƣơng pháp này thì các thông số mạng đƣợc điều chỉnh để tối ƣu hóa chất lƣợng của mạng. Thuật toán lan truyền ngƣợc là một phát minh chính trong nghiên cứu về mạng nơ-ron, thuộc loại thuật học chất lƣợng mạng (học có giám sát). Ngƣợc dòng thời gian, chúng ta thấy rằng sau khoảng mƣời năm kể từ khi lan truyền ngƣợc bắt đầu đƣợc thai nghén, năm 1974, thì thuật học lan truyền ngƣợc đƣợc chính thức nghiên cứu lại và mở rộng ra một cách độc lập bởi David Rumelhart, Geoffey Hinton và Ronald Williams; David Parker và Yann Le Cun. Thuật toán đã đƣợc phổ biến hóa bởi cuốn sách Parallel Distributed Processing của nhóm tác giả David Rumelhart và James Mc Clelland. Tuy nhiên, thuật toán nguyên thủy thì quá chậm chạp đối với hầu hết các ứng dụng thực tế [1], có nhiều lý do cho việc hội tụ chậm trong đó có sự ảnh hƣởng của bƣớc học. Luận án Tiến sĩ Kỹ thuật 2013 111 Nhắc lại rằng lan truyền ngƣợc, tiền thân của nó là thuật học Widow-Hoff (thuật toán LMS, Least Mean Square), là một thuật toán xấp xỉ giảm dốc nhất. Giống với luật học LMS, hàm mục tiêu là trung bình bình phƣơng sai số. Điểm khác giữa thuật toán LMS và lan truyền ngƣợc chỉ là cách mà các đạo hàm đƣợc tính. Đối với mạng tuyến tính một lớp đơn giản, sai số là hàm tuyến tính tƣờng minh của các trọng số, và các đạo hàm của nó liên quan tới các trọng số có thể đƣợc tính toán một cách dễ dàng. Trong các mạng nhiều lớp với các hàm phi tuyến, mối quan hệ giữa các trọng số mạng và sai số là cực kỳ phức tạp. Để tính các đạo hàm, chúng ta cần sử dụng luật chuỗi. Chúng ta đã thấy rằng giảm dốc nhất là một thuật toán đơn giản, và thông thƣờng chậm nhất. Thuật toán gradient liên hợp và phƣơng pháp Newton’s nói chung mang đến sự hội tụ nhanh hơn [6]. Khi nghiên cứu về các thuật toán nhanh hơn thì thƣờng rơi vào hai trƣờng phái. Trƣờng phái thứ nhất phát triển về các kỹ thuật tìm kiếm. Các kỹ thuật tìm kiếm bao gồm các ý tƣởng nhƣ việc thay đổi tốc độ học, sử dụng qui tắc mô-men, bƣớc học thích nghi. Trƣờng phái khác của nghiên cứu nhằm vào các kỹ thuật tối ƣu hóa số chuẩn, điển hình là phƣơng pháp gradient liên hợp, hay thuật toán Levengerg-Marquardt (một biến thể của phƣơng pháp Newton). Tối ƣu hóa số đã là một chủ đề nghiên cứu quan trọng với 30, 40 năm, nó dƣờng nhƣ là nguyên nhân để tìm kiếm các thuật toán huấn luyện nhanh. Ta biết rằng, thuật toán LMS đƣợc đảm bảo để hội tụ tới một lời giải cực tiểu hóa trung bình bình phƣơng sai số, miễn là tốc độ học không quá lớn. Điều này là đúng bởi vì trung bình bình phƣơng sai số cho một mạng tuyến tính một lớp là một hàm toàn phƣơng. Hàm toàn phƣơng chỉ có một điểm tĩnh. Hơn nữa, ma trận Hessian của hàm toàn phƣơng là hằng số, cho nên độ dốc của hàm theo hƣớng là không thay đổi, và các hàm đồng mức có dạng hình e-lip. Lan truyền ngƣợc giảm dốc nhất (SDBP) cũng nhƣ LMS, nó cũng là một thuật toán xấp xỉ giảm dốc nhất cho việc cực tiểu trung bình bình phƣơng sai số. Thật vậy, lan truyền ngƣợc giảm dốc nhất là tƣơng đƣơng thuật toán LMS khi sử dụng trên mạng tuyến tính một lớp. Bâ . . Luận án Tiến sĩ Kỹ thuật 2013 112 . . . (1985). . . . . C Luận án Tiến sĩ Kỹ thuật 2013 113 . . phân loại nhau, gradient descend. Tóm lại, khi giải quyết bài toán bằng mạng nơron theo thủ tục truyền ngƣợc có những vấn đề rút ra là: - Sẽ có bao nhiêu nơron trong mạng, bao nhiêu ngõ vào, bao nhiêu ngõ ra và bao nhiêu lớp ẩn. Càng nhiều lớp ẩn bài toán trở nên phức tạp nhƣng có thể giải quyết đƣợc những vấn đề lớn. - Thuật toán Back propagation cung cấp một phƣơng pháp “xấp xỉ” cho việc tìm trong không gian trọng số (nhằm tìm ra những trọng số phù hợp cho mạng). Chúng ta càng lấy giá trị của tham số học càng nhỏ bao nhiêu thì sự thay đổi trọng số càng nhỏ bấy nhiêu và quỹ đạo không gian học sẽ càng trơn. Tuy nhiên điều này lại làm cho tốc độ học chậm đi. Trái lại, nếu chúng ta chọn tham số tốc độ học quá lớn, sự thay đổi lớn của các trọng số có thể làm cho mạng trở nên không ổn định. Về mặt ý tƣởng, tất cả các nơron trong mạng nên chọn cùng một tốc độ học, tham số học  nên gán một giá trị nhỏ. Các nơron với nhiều ngõ vào nên chọn một tham số tốc độ học nhỏ hơn để giữ một thời gian học tƣơng tự cho nhau cho tất cả các nơron trong mạng. Luận án Tiến sĩ Kỹ thuật 2013 114 II.3.2. Hiệu quả của lan truyền ngƣợc . (w) trọng hóa  i ijij zwa , v i ji ; trên (w). (w) (w 2 ) g O(w) (w) để lan truyền ngƣợc (w) (w 2 ) (w) - . II.4. Các vấn đề trong xây dựng mạng MLP II.4.1. Chuẩn bị dữ liệu a. Kích thước mẫu Không có nguyên tắc nào hƣớng dẫn kích thƣớc mẫu phải là bao nhiêu đối với một bài toán cho trƣớc. Hai yếu tố quan trọng ảnh hƣởng đến kích thƣớc mẫu: ♦ Dạng hàm đích: khi hàm đích càng phức tạp thì kích thƣớc mẫu cần tăng. ♦ Nhiễu: khi dữ liệu bị nhiễu (thông tin sai hoặc thiếu thông tin) kích thƣớc mẫu cần tăng. Luận án Tiến sĩ Kỹ thuật 2013 115 Đối với mạng truyền thẳng, cho hàm đích có độ phức tạp nhất định, kèm một lƣợng nhiễu nhất định thì độ chính xác của mô hình luôn có một giới hạn nhất định. Có thể cần tập mẫu vô hạn để đạt đến giới hạn chính xác. Nói cách khác độ chính xác của mô hình là hàm theo kích thƣớc tập mẫu. Khi kích thƣớc mẫu tăng, độ chính xác sẽ đƣợc cải thiện - lúc đầu nhanh, nhƣng chậm dần khi tiến đến giới hạn. Dạng tổng quát của mối liên hệ giữa sai số và kích thƣớc mẫu nhƣ sau: Hình 3: Mối liên hệ giữa sai số và kích thước mẫu Trong thực hành thƣờng gặp phải 2 vấn đề sau: ♦ Đối với hầu hết bài toán thực tế, mẫu bị ràng buộc chặt chẽ với dữ liệu có sẵn. Ta thƣờng không có đƣợc số lƣợng mẫu mong muốn. ♦ Kích thƣớc mẫu cũng có thể bị giới hạn bởi bộ nhớ hoặc khả năng lƣu trữ của máy tính. Nếu tất cả các dữ liệu đồng thời đƣợc giữ trong bộ nhớ suốt thời gian luyện, kích thƣớc bộ nhớ máy tính sẽ bị chiếm dụng nghiêm trọng. Nếu lƣu trữ trên đĩa sẽ cho phép dùng mẫu lớn hơn nhƣng thao tác đọc đĩa từ thế hệ này sang thế hệ khác khiến cho tiến trình chậm đi rất nhiều. Chú ý: việc tăng kích thƣớc mẫu không làm tăng thời gian luyện. Những tập mẫu lớn hơn sẽ yêu cầu ít thế hệ luyện hơn. Nếu ta tăng gấp đôi kích thƣớc của mẫu, mỗi thế hệ luyện sẽ tốn thời gian khoảng gấp đôi, nhƣng số thế hệ cần luyện sẽ giảm đi một nửa. Điều này có nghĩa là kích thƣớc mẫu (cũng có nghĩa là độ chính xác của mô hình) không bị giới hạn bởi thời gian luyện. Luật cơ bản là: Sử dụng mẫu lớn nhất có thể sao cho đủ khả năng lƣu trữ trong bộ nhớ trong (nếu lƣu trữ đồng thời) hoặc trên đĩa từ (đủ thời gian đọc từ đĩa). Luận án Tiến sĩ Kỹ thuật 2013 116 b. Mẫu con Trong xây dựng mô hình cần chia tập mẫu thành 2 tập con: một để xây dựng mô hình gọi là tập huấn luyện (training set), và một để kiểm nghiệm mô hình gọi là tập kiểm tra (test set). Thông thƣờng dùng 2/3 mẫu cho huấn luyện và 1/3 cho kiểm tra. Điều này là để tránh tình trạng quá khớp (overfitting). c. Sự phân tầng mẫu Nếu ta tổ chức mẫu sao cho mỗi mẫu trong quần thể đều có cơ hội nhƣ nhau thì tập mẫu đƣợc gọi là tập mẫu đại diện. Tuy nhiên khi ta xây dựng một mạng để xác định xem một mẫu thuộc một lớp hay thuộc một loại nào thì điều ta mong muốn là các lớp có cùng ảnh hƣởng lên mạng, để đạt đƣợc điều này ta có thể sử dụng mẫu phân tầng. Xét ví dụ sau: Giả sử ta xây dựng mô hình nhận dạng chữ cái viết tay tiếng Anh, và nguồn dữ liệu của ta có 100.000 ký tự mà mỗi ký tự đƣợc kèm theo một mã cho biết nó là chữ cái nào. Chữ cái xuất hiện thƣờng xuyên nhất là e, nó xuất hiện 11.668 lần chiếm khoảng 12%; chữ cái xuất hiện ít nhất là chữ z, chỉ có 50 lần chiếm 0,05%. Trƣớc hết do giới hạn của bộ nhớ máy tính, giả sử bộ nhớ chỉ có thể xử lý đƣợc 1300 mẫu. Ta tạo hai dạng tập mẫu: tập mẫu đại diện và tập mẫu phân tầng. Với tập mẫu đại diện, chữ e sẽ xuất hiện 152 lần (11,67% của 1300) trong khi đó chữ z chỉ xuất hiện một lần (0,05% của 1300). Ngƣợc lại ta có thể tạo tập mẫu phân tầng để mỗi chữ có 50 mẫu. Ta thấy rằng nếu chỉ có thể dùng 1300 mẫu thì tập mẫu phân tầng sẽ tạo ra mô hình tốt hơn. Việc tăng số mẫu của z từ 1 lên 50 sẽ cải thiện rất nhiều độ chính xác của z, trong khi nếu giảm số mẫu của e từ 152 xuống 50 sẽ chỉ giảm chút ít độ chính xác của e. Bây giờ giả sử ta dùng máy tính khác có bộ nhớ đủ để xử lý một lƣợng mẫu gấp 10 lần, nhƣ vậy số mẫu sẽ tăng lên 13000. Rõ ràng việc tăng kích thƣớc mẫu sẽ giúp cho mô hình chính xác hơn. Tuy nhiên ta không thể dùng tập mẫu phân tầng nhƣ trên nữa vì lúc này ta sẽ cần tới 500 mẫu cho chữ z trong khi ta chỉ có 50 mẫu trong nguồn dữ liệu. Để giải quyết điều này ta tạo tập mẫu nhƣ sau: tập mẫu gồm tất cả các chữ hiếm với số lần xuất hiện của nó và kèm thêm thông tin về chữ có nhiều mẫu nhất. Chẳng hạn ta tạo tập mẫu có 50 mẫu của chữ z (đó là tất cả) và 700 mẫu của chữ e (chữ mà ta có nhiều mẫu nhất). Nhƣ vậy trong tập mẫu của ta, chữ e có nhiều hơn chữ z 14 lần. Nếu ta muốn các chữ z cũng có nhiều ảnh hƣởng nhƣ các chữ e, khi học chữ z ta cho chúng trọng Luận án Tiến sĩ Kỹ thuật 2013 117 số lớn hơn 14 lần. Để làm đƣợc điều này ta có thể can thiệp chút ít vào quá trình lan truyền ngƣợc trên mạng. Khi mẫu học là chữ z, ta thêm vào 14 lần đạo hàm, nhƣng khi mẫu là chữ e ta chỉ thêm vào 1 lần đạo hàm. Ở cuối thế hệ, khi cập nhật các trọng số, mỗi chữ z sẽ có ảnh hƣởng hơn mỗi chữ e là 14 lần, và tất cả các chữ z gộp lại sẽ có bằng có ảnh hƣởng bằng tất cả các chữ e. d. Chọn biến Khi tạo mẫu cần chọn các biến sử dụng trong mô hình. Có 2 vấn đề cần quan tâm: ♦ Cần tìm hiểu cách biến đổi thông tin sao cho có lợi cho mạng hơn: thông tin trƣớc khi đƣa vào mạng cần đƣợc biến đổi ở dạng thích hợp nhất, để mạng đạt đƣợc hiệu suất cao nhất. Xét ví dụ về bài toán dự đoán một ngƣời có mắc bệnh ung thƣ hay không. Khi đó ta có trƣờng thông tin về ngƣời này là “ngày tháng năm sinh”. Mạng sẽ đạt đƣợc hiệu quả cao hơn khi ta biến đổi trƣờng thông tin này sang thành “tuổi”. Thậm chí ta có thể quy tuổi về một trong các giá trị: 1 = “trẻ em” (dƣới 18), 2 = “thanh niên” (từ 18 đến dƣới 30), 3 = “trung niên” (từ 30 đến dƣới 60) và 4 = “già” (từ 60 trở lên). ♦ Chọn trong số các biến đã đƣợc biến đổi biến nào sẽ đƣợc đƣa vào mô hình: không phải bất kì thông tin nào về mẫu cũng có lợi cho mạng. Trong ví dụ dự đoán ngƣời có bị ung thƣ hay không ở trên, những thuộc tính nhƣ “nghề nghiệp”, “nơi sinh sống”, “tiểu sử gia đình”, là những thông tin có ích. Tuy nhiên những thông tin nhƣ “thu nhập”, “số con cái”, là những thông tin không cần thiết. II.4.2. Xác định các tham số cho mạng a. Chọn hàm truyền Không phải bất kỳ hàm truyền nào cũng cho kết quả nhƣ mong muốn. Để trả lời cho câu hỏi «hàm truyền như thế nào được coi là tốt ? » là điều không hề đơn giản. Có một số quy tắc khi chọn hàm truyền nhƣ sau: ♦ Không dùng hàm truyền tuyến tính ở tầng ẩn. Vì nếu dùng hàm truyền tuyến tính ở tầng ẩn thì sẽ làm mất vai trò của tầng ẩn đó: Xét tầng ẩn thứ i: Tổng trọng số ni = wiai-1 + bi ai = f(ni) = wf ni +bf (hàm truyền tuyến tính) Khi đó: tổng trọng số tại tầng thứ (i + 1) ni+1 = wi+1ai + bi+1 Luận án Tiến sĩ Kỹ thuật 2013 118 = wi+1[wf ni +bf] + bi+1 = wi+1 [wf(wiai-1 + bi) + bf] + bi+1 = Wai-1 + b Nhƣ vậy ni+1 = Wai-1 + b, và tầng i đã không còn giá trị nữa. ♦ Chọn các hàm truyền sao cho kiến trúc mạng nơron là đối xứng (tức là với đầu vào ngẫu nhiên thì đầu ra có phân bố đối xứng). Nếu một mạng nơron không đối xứng thì giá trị đầu ra sẽ lệch sang một bên, không phân tán lên toàn bộ miền giá trị của output. Điều này có thể làm cho mạng rơi vào trạng thái bão hòa, không thoát ra đƣợc. Trong thực tế ngƣời ta thƣờng sử dụng các hàm truyền dạng – S. Một hàm s(u) đƣợc gọi là hàm truyền dạng – S nếu nó thỏa mãn 3 tính chất sau: – s(u) là hàm bị chặn: tức là tồn tại các hằng số C1 ≤ C2 sao cho: C1 ≤ s(u) ≤ C2 với mọi u. – s(u) là hàm đơn điệu tăng: giá trị của s(u) luôn tăng khi u tăng. Do tính chất thứ nhất, s(u) bị chặn, nên s(u) sẽ tiệm cận tới giá trị cận trên khi u dần tới dƣơng vô cùng, và tiệm cận giá trị cận dƣới khi u dần tới âm vô cùng. – s(u) là hàm khả vi: tức là s(u) liên tục và có đạo hàm trên toàn trục số. Có 3 dạng hàm kích hoạt thƣờng đƣợc dùng trong thực tế: *Hàm dạng bước:         00 01 x x xstep           x x xstep 0 1 *Hàm dấu:         01 01 x x xstep           x x xstep 1 1 *Hàm sigmoid:     xe xSigmoid 1 1 )( Một hàm truyền dạng - S điển hình và đƣợc áp dụng rộng rãi là hàm Sigmoid. Luận án Tiến sĩ Kỹ thuật 2013 119 b. Xác định số nơron tầng ẩn Câu hỏi chọn số lƣợng noron trong tầng ẩn của một mạng MLP thế nào là khó, nó phụ thuộc vào bài toán cụ thể và vào kinh nghiệm của nhà thiết kế mạng. Nếu tập dữ liệu huấn luyện đƣợc chia thành các nhóm với các đặc tính tƣơng tự nhau thì số lƣợng các nhóm này có thể đƣợc sử dụng để chọn số lƣợng nơron ẩn. Trong trƣờng hợp dữ liệu huấn luyện nằm rải rác và không chứa các đặc tính chung, số lƣợng kết nối có thể gần bằng với số lƣợng các mẫu huấn luyện để mạng có thể hội tụ. Có nhiều đề nghị cho việc chọn số lƣợng nơron tầng ẩn h trong một mạng MLP. Chẳng hạn h phải thỏa mãn h>(p-1)/(n+2), trong đó p là số lƣợng mẫu huấn luyện và n là số lƣợng đầu vào của mạng. Càng nhiều nút ẩn trong mạng, thì càng nhiều đặc tính của dữ liệu huấn luyện sẽ đƣợc mạng nắm bắt, nhƣng thời gian học sẽ càng tăng. Một kinh nghiệm khác cho việc chọn số lƣợng nút ẩn là số lƣợng nút ẩn bằng với số tối ƣu các cụm mờ (fuzzy clusters)[8]. Phát biểu này đã đƣợc chứng minh bằng thực nghiệm. Việc chọn số tầng ẩn cũng là một nhiệm vụ khó. Rất nhiều bài toán đòi hỏi nhiều hơn một tầng ẩn để có thể giải quyết tốt. Để tìm ra mô hình mạng nơron tốt nhất, Ishikawa and Moriyama (1995) sử dụng học cấu trúc có quên (structural leanrning with forgetting), tức là trong thời gian học cắt bỏ đi các liên kết có trọng số nhỏ. Sau khi huấn luyện, chỉ các noron có đóng góp vào giải quyết bài toán mới đƣợc giữ lại, chúng sẽ tạo nên bộ xƣơng cho mô hình mạng nơron. c. Khởi tạo trọng số Trọng thƣờng đƣợc khởi tạo bằng phƣơng pháp thử sai, nó mang tính chất kinh nghiệm và phụ thuộc vào từng bài toán. Việc định nghĩ thế nào là một bộ trọng tốt cũng không hề đơn giản. Một số quy tắc khi khởi tạo trọng: ♦ Khởi tạo trọng sao cho mạng nơron thu đƣợc là cân bằng (với đầu vào ngẫu nhiên thì sai số lan truyền ngƣợc cho các ma trận trọng số là xấp xỉ bằng nhau): |ΔW1/W1| = |ΔW2/W2| = |ΔW3/W3| Nếu mạng nơron không cân bằng thì quá trình thay đổi trọng số ở một số ma trận là rất nhanh trong khi ở một số ma trận khác lại rất chậm, thậm chí không đáng kể. Do đó để các ma trận này đạt tới giá trị tối ƣu sẽ mất rất nhiều thời gian. Luận án Tiến sĩ Kỹ thuật 2013 120 ♦ Tạo trọng sao cho giá trị kết xuất của các nút có giá trị trung gian. (0.5 nếu hàm truyền là hàm Sigmoid). Rõ ràng nếu ta không biết gì về giá trị kết xuất thì giá trị ở giữa là hợp lý. Điều này cũng giúp ta tránh đƣợc các giá trị thái quá. Thủ tục khởi tạo trọng thƣờng đƣợc áp dụng: – B1: Khởi tạo các trọng số nút ẩn (và các trọng số của các cung liên kết trực tiếp giữa nút nhập và nút xuất, nếu có) giá trị ngẫu nhiên, nhỏ, phân bố đều quanh 0. – B2: Khởi tạo một nửa số trọng số của nút xuất giá trị 1, và nửa kia giá trị -1. Giải thuật di truyền Giải thuật di truyền (Genetic Algorithms - GA) đã đƣợc đề cập trong rất nhiều tài liệu, trong đó có các công trình của D.E. Goldberg [26] và Thomas Back [27]. Trong phần này chỉ trình bày các khái niệm cơ bản về giải thuật di truyền và khả năng ứng dụng của nó. I.2. Tóm tắt về giải thuật di truyền Từ trƣớc tới nay, trong các nghiên cứu và ứng dụng tin học đã xuất hiện nhiều bài toán chƣa tìm ra đƣợc phƣơng pháp giải nhanh và hợp lý. Phần lớn đó là các bài toán tối ƣu nảy sinh trong các ứng dụng. Để giải các bài toán này ngƣời ta thƣờng phải tìm đến một giải thuật hiệu quả mà kết quả thu đƣợc chỉ là xấp xỉ tối ƣu. Trong nhiều trƣờng hợp chúng ta có thể sử dụng giải thuật xác suất, tuy không bảo đảm kết quả tối ƣu nhƣng cũng có thể chọn các giá trị sao cho sai số đạt đƣợc sẽ nhỏ nhƣ mong muốn. Theo lời giải xác suất, việc giải bài toán quy về quá trình tìm kiếm trên không gian tập hợp các lời giải có thể. Tìm đƣợc lời giải tốt nhất và quá trình đƣợc hiểu là tối ƣu. Với miền tìm kiếm nhỏ, một số thuật toán cổ điển đƣợc sử dụng. Tuy nhiên đối với các miền lớn, phải sử dụng các kỹ thuật trí tuệ nhân tạo đặc biệt, giải thuật di truyền là một trong những công cụ đó. Ý tƣởng của giải thuật di truyền là mô phỏng những gì mà tự nhiên đã thực hiện. GA hình thành dựa trên quan niệm cho rằng: quá trình tiến hóa tự nhiên là quá trình hoàn hảo nhất, hợp lý nhất và tự nó đã mang tính tối ƣu. Giải thuật di truyền áp dụng quá trình tiến hóa tự nhiên để giải các bài toán tối ưu trong thực tế (từ tập các lời giải có thể ban đầu thông qua nhiều bước Luận án Tiến sĩ Kỹ thuật 2013 121 tiến hóa hình thành các tập hợp mới với lời giải tốt hơn và cuối cùng sẽ tìm được lời giải gần tối ưu). Giải thuật di truyền là một kỹ thuật của khoa học máy tính nhằm tìm kiếm giải pháp thích hợp cho các bài toán tối ƣu tổ hợp (combinatorial optimization). Giải thuật di truyền là một phân ngành của giải thuật tiến hóa vận dụng các nguyên lý của tiến hóa nhƣ di truyền, đột biến, chọn lọc tự nhiên, và trao đổi chéo. Giải thuật di truyền thƣờng đƣợc ứng dụng nhằm sử dụng ngôn ngữ máy tính để mô phỏng quá trình tiến hoá của một tập hợp những đại diện trừu tƣợng (gọi là những nhiễm sắc thể) của các giải pháp có thể (gọi là những cá thể) cho bài toán tối ƣu hóa vấn đề. Tập hợp này sẽ tiến triển theo hƣớng chọn lọc những giải pháp tốt hơn. Thông thƣờng, những giải pháp đƣợc thể hiện dƣới dạng nhị phân với những chuỗi 0 và 1, nhƣng lại mang nhiều thông tin mã hóa khác nhau. Quá trình tiến hóa xảy ra từ một tập hợp những cá thể hoàn toàn ngẫu nhiên ở tất cả các thế hệ. Trong từng thế hệ, tính thích nghi của tập hợp này đƣợc ƣớc lƣợng, nhiều cá thể đƣợc chọn lọc định hƣớng từ tập hợp hiện thời (dựa vào thể trạng), đƣợc sửa đổi (bằng đột biến hoặc tổ hợp lại) để hình thành một tập hợp mới. Tập hợp này sẽ tiếp tục đƣợc chọn lọc lặp đi lặp lại trong các thế hệ kế tiếp của giải thuật. Giải thuật di truyền cũng nhƣ các thuật toán tiến hoá đều đƣợc hình thành dựa trên một quan niệm đƣợc coi là một tiên đề phù hợp với thực tế khách quan. Đó là quan niệm "Quá trình tiến hoá tự nhiên là quá trình hoàn hảo nhất, hợp lý nhất và tự nó đã mang tính tối ƣu". Quá trình tiến hoá thể hiện tính tối ƣu ở chỗ thế hệ sau bao giờ cũng tốt hơn thế hệ trƣớc. Quá trình phát triển của giải thuật di truyền có thể đƣợc chỉ ra qua các mốc thời gian sau: 1960: Ý tƣởng đầu tiên về Tính toán tiến hoá đƣợc Rechenberg giới thiệu trong công trình "Evolution Strategies" (Các chiến lƣợc tiến hoá). Ý tƣởng này sau đó đƣợc nhiều nhà nghiên cứu phát triển. Luận án Tiến sĩ Kỹ thuật 2013 122 1975: Giải thuật gen do John Holland phát minh và đƣợc phát triển bởi ông cùng với các đồng nghiệp và những sinh viên. Cuốn sách "Adaption in Natural and Artificial Systems" (Sự thích nghi trong các hệ tự nhiên và nhân tạo) xuất bản năm 1975 đã tổng hợp các kết quả của quá trình nghiên cứu và phát triển đó. 1992: John Koza đã dùng GA để xây dựng các chƣơng trình giải quyết một số bài toán và gọi phƣơng pháp này là "lập trình gen". Ngày nay giải thuật di truyền càng trở nên quan trọng, đặc biệt là trong lĩnh vực tối ƣu hoá, một lĩnh vực có nhiều bài toán thú vị, đƣợc ứng dụng nhiều trong thực tiễn nhƣng thƣờng khó và chƣa có giải thuật hiệu quả để giải. I.3. Các khái niệm cơ bản Giải thuật di truyền dựa vào quá trình tiến hoá trong tự nhiên nên các khái niệm và thuật ngữ của nó đều có liên quan đến các thuật ngữ của di truyền học. I.3.1. Cá thể, nhiễm sắc thể Một cá thể trong giải thuật di truyền, biểu diễn một giải pháp của bài toán. Tuy nhiên không giống với trong tự nhiên, một cá thể có nhiều nhiễm sắc thể (NST),có 1 thì gọi là thể đơn bội, còn nếu có nhiều thì là thể đa bội, ở đây để giới hạn trong giải thuật di truyền ta quan niệm một cá thể có một nhiễm sắc thể. Do đó khái niệm cá thể và nhiễm sắc thể trong giải thuật di truyền coi nhƣ là tƣơng đƣơng. Một NST đƣợc tạo thành từ nhiều gen, mỗi gen có thể có các giá trị khác nhau để quy định một tính trạng nào đó. Trong GA, một gen đƣợc coi nhƣ một phần tử trong chuỗi NST. I.3.2. Quần thể Quần thể là một tập hợp các cá thể có cùng một số đặc điểm nào đấy. Trong giải thuật di truyền ta quan niệm quần thể là một tập các lời giải của một bài toán. I.3.3. Các toán tử di truyền a. Chọn lựa Trong tự nhiên, quá trình chọn lọc và đấu tranh sinh tồn đã làm thay đổi các cá thể trong quần thể. Những cá thể tốt, thích nghi đƣợc với điều kiện sống thì có Luận án Tiến sĩ Kỹ thuật 2013 123 khả năng đấu tranh lớn hơn, do đó có thể tồn tại và sinh sản. Các cá thể không thích nghi đƣợc với điều kiện sống thì dần mất đi. Dựa vào nguyên lý của quá trình chọn lọc và đấu tranh sinh tồn trong tự nhiên, chọn lựa các cá thể trong GA chính là cách chọn các cá thể có độ thích nghi tốt để đƣa vào thế hệ tiếp theo hoặc để cho lai ghép, với mục đích là sinh ra các cá thể mới tốt hơn. Có nhiều cách để lựa chọn nhƣng cuối cùng đều nhằm đáp ứng mục tiêu là các cá thể tốt sẽ có khả năng đƣợc chọn cao hơn. b. Lai ghép Lai ghép trong tự nhiên là sự kết hợp các tính trạng của bố mẹ để sinh ra thế hệ con. Trong giải thuật di truyền, lai ghép đƣợc coi là một sự tổ hợp lại các tính chất (thành phần) trong hai lời giải cha mẹ nào đó để sinh ra một lời giải mới mà có đặc tính mong muốn là tốt hơn thế hệ cha mẹ. Đây là một quá trình xảy ra chủ yếu trong giải thuật di truyền. c. Đột biến Đột biến là một sự biến đổi tại một (hay một số) gen của nhiễm sắc thể ban đầu để tạo ra một nhiễm sắc thể mới. Đột biến có xác suất xảy ra thấp hơn lai ghép. Đột biến có thể tạo ra một cá thể mới tốt hơn hoặc xấu hơn cá thể ban đầu. Tuy nhiên trong giải thuật di truyền thì ta luôn muốn tạo ra những phép đột biến cho phép cải thiện lời giải qua từng thế hệ. I.4. Mô hình giải thuật di truyền Luận án Tiến sĩ Kỹ thuật 2013 124 Nhận các tham số của bài toán Khởi tạo quần thể ban đầu Tính giá trị thích nghi Sinh sản Lai ghép Đột biến Điều kiện dừng Kết thúc Bắt đầu Lựa chọn giải pháp tốt nhất Với các khái niệm đƣợc nêuở trên, giải thuật di truyền đƣợc mô tả nhƣ sau: 1.[Bắt đầu] Nhận các tham số cho thuật toán. 2.[Khởi tạo] Sinh ngẫu nhiên một quần thể gồm n cá thể (là n lời giải cho bài toán). 3. [Quần thể mới] Tạo quần thể mới bằng cách lặp lại các bƣớc sau cho đến khi quần thể mới hoàn thành. a.[Thích nghi] Ƣớc lƣợng độ thích nghi eval(x) của mỗi cá thể. Hình 4: Mô hình của giải thuật di truyền Luận án Tiến sĩ Kỹ thuật 2013 125 b.[Kiểm tra] Kiểm tra điều kiện kết thúc giải thuật. c.[Chọn lọc] Chọn hai cá thể bố mẹ từ quần thể cũ theo độ thích nghi của chúng (cá thể có độ thích nghi càng cao thì càng có nhiều khả năng đƣợc chọn) d.[Lai ghép] Với một xác suất lai ghép đƣợc chọn, lai ghép hai cá thể bố mẹ để tạo ra một cá thể mới. e.[Đột biến] Với một xác suất đột biến đƣợc chọn, biến đổi cá thể mới 4. [Chọn kết quả] Nếu điều kiện dừng đƣợc thỏa mãn thì thuật toán kết thúc và trả về lời giải tốt nhất trong quần thể hiện tại. Mặc dù GA có khả năng đạt tới cực trị toàn cục cho quá trình tìm kiếm nhƣng do có kết hợp những yếu tố ngẫu nhiên nên tốc độ tìm kiếm nói chung là rất chậm. Mặt khác nó không thể hoàn toàn đạt đƣợc tới cực trị toàn cục mà chỉ cho những kết quả xung quanh đó. Đối lập với GA, giải thuật lan truyền ngƣợc sai số (BP) lại cho phép đạt đƣợc những cực trị nếu nhƣ điểm xuất phát của quá trình tìm kiếm nằm trong vùng cực trị toàn cục. Luận án Tiến sĩ Kỹ thuật 2013 126 PHỤ LỤC 2: MÃ NGUỒN CHƢƠNG TRÌNH LUYỆN MẠNG NƠRON VỚI BƢỚC HỌC VƢỢT KHE NHẬN DẠNG ĐỐI TƢỢNG % Lap trinh tong quat cho thuat toan vuot khe % Date:15-10-2011 % Version 1 %------------------------------------------------------- a=ap; u0=up; % huongtim d1=subs(Ju1,u1);%d1=diff(J,u1) d2=subs(Ju2,u2);%d2=diff(J,u2) Ju=[d1 d2]; s0=-Ju; PPThammuctieu %J=(u1-5)^2+(u2-5)^2; Jtruoc=J; %Buoc 1 ---------------------------------------- %XL=anpha %XU=beta XL=a; u01=u0+XL*s0; u1=u01(1); u2=u01(2); %J=(u1-5)^2+(u2-5)^2; PPThammuctieu Jsau=J; if Jsau > Jtruoc %Jsau=Jsau; Jtruoc=Jtruoc XL=0; XU=a; else XL=a; b=1.5*a; XU=b; Jtruoc=Jsau; end u02=u0+XU*s0; u1=u02(1); u2=u02(2); PPThammuctieu Jsau=J; while Jsau<Jtruoc % if Jsau > Jtruoc` % F=Jtruoc; % break % else XL=a; b=1.5*a; XU=b; Jtruoc=Jsau; u03=u0+XU*s0; Luận án Tiến sĩ Kỹ thuật 2013 127 u1=u03(1); u2=u03(2); PPThammuctieu Jsau=J; end %end if Jsau > Jtruoc F = Jtruoc; end % Buoc 2 --------------------------------------- % FL1=abs(XU-XL) while (abs(XU-XL)>FD) %FL=abs(XU-XL); %FL1=FL; % if FL <=FD % break % else TH=XL+gama*(XU-XL); teta = TH; u04=u0+TH*s0; u1=u04(1); u2=u04(2); PPThammuctieu Jsau=J; if Jsau<F XU =TH; Jtruoc = F; else XL=TH; u05=u0+XL*s0; u1=u05(1); u2=u05(2); PPThammuctieu Jtruoc=J; end % end end tocdohoc=TH; % if abs(XU-XL)<=FD % XL=XU % end c=tocdohoc %Gradient------------------------------ e{3}=t(:,k)-x{3}; J=J+sum(e{3}.^2); Ju1=diff(J,u1); Ju2=diff(J,u2); %Ham muc tieu e{3}=t(:,k)-x{3}; J=J+sum(e{3}.^2); Luận án Tiến sĩ Kỹ thuật 2013 128 %------------------------------------------ % Lap trinh tong quat cho thuat toan vuot khe % Date:15-10-2011 % Version 1 %------------------------------------------------------- function y = PPTbexulynuocthai(p,t) clc clear; %Nhap du lieu vao he thong L=3;%so lop g=inline('1./(1+exp(-x))');%Activation function unl=[5 16 3];%The units of each layers % lt=0.3;% learning rate J=1; sum=0; sum1=0; %Initital the Weights and biases for i=1:L-1 for n=1:unl(i) for m=1:unl(i+1) w{i}(m,n)=1*rand;%The Weights end end for m=1:unl(i+1) b{i}(m,1)=1*rand;% The biases end end w{L}=eye(unl(L)); while (J>0.00001)& sum<1000 sum=sum+1;%Number of Loops J=0; for k=1:length(p) x{1}=p(:,k);% Inputs vector % Feed forward Propagation for i=1:L-1 s{i}=w{i,1}*x{i}+b{i}; x{i+1}=g(s{i}); %x{i+1}; end %The caculatar error PPThammuctieu %Feed back Propagation for i=L-1:-1:1 e{i}=(x{i+1}.*(1- x{i+1})).*(w{i+1}'*e{i+1}); thuattoanvuotkhe%Su dung thuat toan vuot khe de xac %dinh toc do hoc cua mang neural deltw{i}=(c.*e{i})*x{i}; w{i}=w{i}+deltw{i};% The modify Weights Luận án Tiến sĩ Kỹ thuật 2013 129 deltb{i}=(c.*e{i}).*ones(unl(i+1),1); b{i}=b{i}+deltb{i};% The modify biases end end J=J/2; if mod(sum,100)==0 sum1=sum1+1; data(sum1,1)=sum; data(sum1,2)=J; end end % Example a value x{1} = [22 35 1 6 36]'; for i=1:L-1 s{i}=w{i}*x{i}+b{i}; x{i+1}=g(s{i}); end x{i+1} %x{L} semilogy(data(:,1),data(:,2)),grid %------------------------------- Luận án Tiến sĩ Kỹ thuật 2013 130 PHỤ LỤC 3: MÃ NGUỒN CHƢƠNG TRÌNH LUYỆN MẠNG NƠRON VỚI BƢỚC HỌC VƢỢT KHE ĐỂ NHẬN DẠNG CHỮ VIẾT dinhnghia.h /* *=======================================================================* *------------------------------------------------------------------------ * * DE TAI : HUAN LUYEN MANG NO-RON VOI BUOC HOC TINH THEO NGUYEN LY VUOT KHE * * NGON NGU : C * TRINH DICH : VISUAL C++ * TEN TEP : dinhnghia.h *-----------------------------------------------------------------------* *=======================================================================* */ #define SIGMF(x) 1/(1 + exp(-(double)x))//HAM KICH HOAT NO RON #define DSIGM(y) (float)(y)*(1.0-y))//DAO HAM CUA HAM KICH HOAT NO RON #define SLNRLV 35 // SO LUONG NO RON LOP VAO #define SLNRLA 5 // SO LUONG NO RON LOP AN #define SLNRLR 10 // SO LUONG NO RON LOP RA #define EPSILON 0.06 // SAI SO TRUNG BINH BINH PHUONG DE DUNG QUA TRINH LUYEN MANG #define SLMHL 18 // SO LUONG MAU HUAN LUYEN MANG #define STEPinit 0.5 // GIA TRI KHOI TAO BUOC HOC, CO THE DUNG CHO NHIEU TRUONG HOP #define DCBH 0.0001 // DIEU CHINH BUOC HOC #define MSDCBH 5 // MAU SO DIEU CHINH BUOC HOC #define TSDCBH 5 // TU SO DIEU CHINH BUOC HOC #define BLTD 30000 // BUOC LAP TOI DA #define FD 1e-1 // taphuanluyen.h /* *====================================================================* *-----------------------------------------------------------------------* * DE TAI : HUAN LUYEN MANG NO-RON VOI BUOC HOC TINH THEO NGUYEN LY VUOT KHE * * NGON NGU : C * TRINH DICH : VISUAL C++ * TEN TEP : taphuanluyen.h *-----------------------------------------------------------------------* *=======================================================================* */ #include "dinhnghia.h" //TAP MAU HUAN LUYEN DAU VAO int TAPHUANLUYEN[SLMHL][SLNRLV] = { { 0,1,1,1,1,1,0, /* 0 */ 1,0,0,0,0,0,1, 1,0,0,0,0,0,1, 1,0,0,0,0,0,1, 0,1,1,1,1,1,0 }, { 0,0,0,0,0,0,0, /* 1 */ 0,1,0,0,0,0,1, 1,1,1,1,1,1,1, 0,0,0,0,0,0,1, Luận án Tiến sĩ Kỹ thuật 2013 131 0,0,0,0,0,0,0 }, { 0,1,0,0,0,0,1, /* 2 */ 1,0,0,0,0,1,1, 1,0,0,0,1,0,1, 1,0,0,1,0,0,1, 0,1,1,0,0,0,1 }, { 1,0,0,0,0,1,0, /* 3 */ 1,0,0,0,0,0,1, 1,0,0,1,0,0,1, 1,1,1,0,1,0,1, 1,0,0,0,1,1,0 }, { 0,0,0,1,1,0,0, /* 4 */ 0,0,1,0,1,0,0, 0,1,0,0,1,0,0, 1,1,1,1,1,1,1, 0,0,0,0,1,0,0 }, { 1,1,1,0,0,1,0, /* 5 */ 1,0,1,0,0,0,1, 1,0,1,0,0,0,1, 1,0,1,0,0,0,1, 1,0,0,1,1,1,0 }, { 0,0,1,1,1,1,0, /* 6 */ 0,1,0,1,0,0,1, 1,0,0,1,0,0,1, 1,0,0,1,0,0,1, 0,0,0,0,1,1,0 }, { 1,0,0,0,0,0,0, /* 7 */ 1,0,0,0,0,0,0, 1,0,0,1,1,1,1, 1,0,1,0,0,0,0, 1,1,0,0,0,0,0 }, { 0,1,1,0,1,1,0, /* 8 */ 1,0,0,1,0,0,1, 1,0,0,1,0,0,1, 1,0,0,1,0,0,1, 0,1,1,0,1,1,0 }, { 0,1,1,0,0,0,0, /* 9 */ 1,0,0,1,0,0,1, 1,0,0,1,0,0,1, 1,0,0,1,0,1,0, 0,1,1,1,1,0,0 }, { 1,1,1,1,0,0,0, /* 4 */ 0,0,0,1,0,0,0, 0,0,0,1,0,0,0, 0,0,0,1,0,0,0, 1,1,1,1,1,1,1 }, { 1,1,1,1,0,1,0, /* 5 */ 1,0,0,1,0,0,1, 1,0,0,1,0,0,1, 1,0,0,1,0,0,1, 1,0,0,0,1,1,0 }, Luận án Tiến sĩ Kỹ thuật 2013 132 { 1,0,0,0,0,0,0, /* 7 */ 1,0,0,0,0,0,0, 1,0,0,1,0,0,0, 1,1,1,1,1,1,1, 0,0,0,1,0,0,0 }, { 0,1,0,0,0,1,0, /* 3 */ 1,0,0,0,0,0,1, 1,0,0,1,0,0,1, 1,0,1,0,1,0,1, 0,1,1,0,1,1,0 }, { 1,0,0,0,0,1,1, /* 2 */ 1,0,0,0,1,0,1, 1,0,0,1,0,0,1, 1,0,1,0,0,0,1, 1,1,0,0,0,0,1 }, { 1,1,1,1,0,0,0, /* 4 */ 0,0,0,1,0,0,0, 0,0,0,1,0,0,0, 1,1,1,1,1,1,1, 0,0,0,1,0,0,0 }, { 1,1,1,1,1,1,1, /* 0 */ 1,0,0,0,0,0,1, 1,0,0,0,0,0,1, 1,0,0,0,0,0,1, 1,1,1,1,1,1,1 }, { 0,1,1,0,0,0,1, /* 9 */ 1,0,0,1,0,0,1, 1,0,0,1,0,0,1, 1,0,0,1,0,0,1, 0,1,1,1,1,1,1 } }; //DAU RA MONG MUON TUONG UNG int DRMM[SLMHL][SLNRLR] = { { 1,0,0,0,0,0,0,0,0,0 }, /* 0 */ { 0,1,0,0,0,0,0,0,0,0 }, /* 1 */ { 0,0,1,0,0,0,0,0,0,0 }, /* 2 */ { 0,0,0,1,0,0,0,0,0,0 }, /* 3 */ { 0,0,0,0,1,0,0,0,0,0 }, /* 4 */ { 0,0,0,0,0,1,0,0,0,0 }, /* 5 */ { 0,0,0,0,0,0,1,0,0,0 }, /* 6 */ { 0,0,0,0,0,0,0,1,0,0 }, /* 7 */ { 0,0,0,0,0,0,0,0,1,0 }, /* 8 */ { 0,0,0,0,0,0,0,0,0,1 }, /* 9 */ { 0,0,0,0,1,0,0,0,0,0 }, /* 4 */ { 0,0,0,0,0,1,0,0,0,0 }, /* 5 */ { 0,0,0,0,0,0,0,1,0,0 }, /* 7 */ { 0,0,0,1,0,0,0,0,0,0 }, /* 3 */ { 0,0,1,0,0,0,0,0,0,0 }, /* 2 */ { 0,0,0,0,1,0,0,0,0,0 }, /* 4 */ { 1,0,0,0,0,0,0,0,0,0 }, /* 0 */ { 0,0,0,0,0,0,0,0,0,1 } };/* 9 */ backprop5.c /* *=======================================================================* Luận án Tiến sĩ Kỹ thuật 2013 133 *------------------------------------------------------------------------ * * DE TAI : HUAN LUYEN MANG NO-RON VOI BUOC HOC TINH THEO NGUYEN LY VUOT KHE * * NGON NGU : C * TRINH DICH : VISUAL C++ * TEN TEP : backprop.c *------------------------------------------------------------------------ * *=======================================================================* */ #include #include #include #include "taphuanluyen.h" #include "dinhnghia.h" /************************** DINH NGHIA CAC BIEN TOAN CUC ****************************/ float MTTSLA[SLNRLV][SLNRLA]; //MA TRAN TRONG SO LOP AN float MTTSLR[SLNRLA][SLNRLR]; //MA TRAN TRONG SO LOP RA float BTMTTSLA[SLNRLV][SLNRLA];//BIEN THIEN MA TRAN TRONG SO LOP AN float BTMTTSLR[SLNRLA][SLNRLR];//BIEN THIEN MA TRAN TRONG SO LOP RA float x[SLNRLV]; //VEC-TO DAU VAO LOP VAO float y[SLNRLA]; //VEC TO DAU RA LOP AN float z[SLNRLR]; //VEC TO DAU RA LOP RA float HW1[SLNRLV][SLNRLA]; //KHONG SU DUNG float HW2[SLNRLV][SLNRLA]; //KHONG SU DUNG float OW1[SLNRLA][SLNRLR]; //KHONG SU DUNG float OW2[SLNRLA][SLNRLR]; //KHONG SU DUNG float SSLA[SLNRLA]; //SAI SO LOP AN float SSLR[SLNRLR]; //SAI SO LOP RA int PATR[SLMHL]; float ECM[SLMHL]; float TOCDOHOC=2; //TOC DO HOC int SOBUOCLAP=0; float BVK=0; //BUOC VUOT KHE int NBS=0; float FX[SLMHL]; float F[SLMHL]; float A,GAMA; float QUANTINH=0.1; //TOAN HANG QUAN TINH int MTDVKT[35]; //MA TRAN DAU VAO KIEM TRA long int itr; int HTHL; //HOAN THANH HUAN LUYEN int LCBH; //LUA CHON BUOC HOC int RESET; //RESET MANG int RES=1; //RESET MANG int SDM; //SU DUNG MANG /*************** KET THUC DINH NGHIA CAC BIEN TOAN CUC ****************/ /*************************** CAC NGUYEN MAU HAM ***********************/ int KHOITAOMANG(); void QUATRINHHUANLUYEN(); void DAPUNGDAURA(int afer[]); float GIATRIHAMMUCTIEU(int x[],float y[],int SIZE); void DIEUCHINHTRONGSO(int k); void HAMMUCTIEU(); void BUOCLAP(); /***************************** CAC HAM VA CAC THU TUC ******************/ Luận án Tiến sĩ Kỹ thuật 2013 134 /*---------------------------------------------------------------------- Ten Ham: KHOITAOMANG Mo ta: 1. KHOI TAO MA TRAN TRONG SO LOP AN, VOI CACS GIA TRI NGAU NHIEN BI CHAN 2. KHOI TAO MA TRAN TRONG SO LOP RA, VOI CACS GIA TRI NGAU NHIEN BI CHAN Cac dau vao: KHONG CO Gia tri tra ve: 1 --------------------------------------------------------------------*/ int KHOITAOMANG() { int i,j; int ch; int num; NBS=0; HTHL=2; RESET=0; RES=1; MHL=0; srand(time(0)); for(i=0;i<SLNRLV;i++) for(j=0;j<SLNRLA;j++) { MTTSLA[i][j] = -0.5+ (float) rand()/RAND_MAX; BTMTTSLA[i][j] = 0; } for(i=0;i<SLNRLA;i++) for(j=0;j<SLNRLR;j++) { MTTSLR[i][j] = -0.5 + (float) rand()/RAND_MAX; BTMTTSLR[i][j] = 0; } for(i=0;i<SLMHL;i++) PATR[i] = 0; for(i=0;i<35;i++) MTDVKT[i]=0; return 1; } /*--------------------------------------------------------------------- Ten Thu tuc: TOCDOHOCZERO Mo ta: 1. CAC DAU RA CUA MANG VAN LA ZERO, VI TOC DO HOC LA ZERO. 2. CAC SAI SO HOAN TOAN BANG VOI CAC DAU RA MONG MUON. 3. THU TUC NAY DUNG DE PHUC VU CHO VIEC TINH TOAN BUOC VUOT KHE. Cac dau vao: KHONG CO Gia tri tra ve: KHONG CO ------------------------------------------------------------------------ */ void TOCDOHOCZERO(void) { int t; TOCDOHOC=0; Luận án Tiến sĩ Kỹ thuật 2013 135 BUOCLAP(); HAMMUCTIEU(); for(t=0;t<SLMHL;t++) FX[t] = ECM[t]; } /*--------------------------------------------------------------------- Ten Thu tuc: TINHBUOCHOCVUOTKHE Ngay sua : 03-11-2007 Phien ban : V2 Mo ta: THU TUC TINH BUOC HOC THEO NGUYEN LY VUOT KHE Cac dau vao: KHONG CO Gia tri tra ve: KHONG CO ----------------------------------------------------------------------*/ void TINHBUOCHOCVUOTKHE(void) { float XL,XU,FL[SLMHL],temp; int i,t,j; if(NBS==0) { A=0.5; GAMA=0.1; TOCDOHOC=A; } for(t=0;t<SLMHL;t++) FL[t]=FX[t]; XL=0; BUOC1: TOCDOHOC=A; BUOCLAP(); HAMMUCTIEU(); for(t=0;t<SLMHL;t++) F[t] = ECM[t]; if(F[t]>FL[t]) { XU=A; goto BUOC2; } //XL=A; for(t=0;t<SLMHL;t++) FL[t]=F[t]; XL=A; A=1.5*A; XU=A; goto BUOC1; BUOC2: if(FD>=(XU-FL)) goto BUOC3; A=XL+GAMA*(XU-XL); temp=TOCDOHOC; TOCDOHOC=A; BUOCLAP(); HAMMUCTIEU(); TOCDOHOC=temp; for(t=0;t<SLMHL;t++) F[t] = ECM[t]; for(t=0;t<SLMHL;t++) Luận án Tiến sĩ Kỹ thuật 2013 136 if(FL[t]>F[t]) { XU=A; for(j=0;j<SLMHL;j++) FL[j]=F[j]; goto BUOC2; } for(t=0;t<SLMHL;t++) if(F[t]>FL[t]) { for(j=0;j<SLMHL;j++) FL[j]=F[j]; XL=A; goto BUOC2; } BUOC3: for(t=0;t<SLMHL;t++) FX[t]=F[t]; NBS=NBS+1; TOCDOHOC=A; } /*----------------------------------------------------------------------- ---- Ten Thu tuc: TINHTOANBUOCHOC Mo ta: TINH TOAN TOC DO HOC SAU MOI BUOC LAP Cac dau vao: KHONG CO Gia tri tra ve: KHONG CO -----------------------------------------------------------------------*/ void TINHTOANBUOCHOC() { TOCDOHOC=TSDCBH/(SOBUOCLAP*0.001+MSDCBH); } /*----------------------------------------------------------------------- Ten Thu tuc: BUOCLAP Mo ta: DIEU CHINH CAC TRONG SO CUA MANG Cac dau vao: KHONG CO Gia tri tra ve: KHONG CO ------------------------------------------------------------------------ */ void BUOCLAP() { int i; i=0; //LUA CHON MAU HUAN LUYEN NGAU NHIEN: i = (int)(SLMHL*rnd), VOI 0<rnd<1 do { i = (int)(SLMHL*(float) rand() / RAND_MAX); }while(PATR[i]); DAPUNGDAURA(TAPHUANLUYEN[i]); DIEUCHINHTRONGSO(i); } /*----------------------------------------------------------------------- Ten Thu tuc: HUANLUYENCODINH Mo ta: HUAN LUYEN MANG DE TB-BINH PHUONG SAI SO DAU RA NHO HON EPSILON CHO TRUOC BUOC HOC LA MOT HANG SO. Cac dau vao: KHONG CO Gia tri tra ve: KHONG CO Luận án Tiến sĩ Kỹ thuật 2013 137 -----------------------------------------------------------------------*/ void HUANLUYENCODINH() { int t,l; printf("\nDANG HUAN LUYEN MANG VOI BUOC HOC CO DINH...\n"); START: if(RES==0) printf("\nKHOI DONG VA HUAN LUYEN LAI MANG!"); KHOITAOMANG(); //Luyen mang do { TOCDOHOC=0.2; BUOCLAP(); HAMMUCTIEU(); l = 1; for(t=0;t<SLMHL;t++) { PATR[t] = ECM[t] < EPSILON; l = l && (PATR[t]); } SOBUOCLAP++; RESET++; if(RESET>15000)break; if(SOBUOCLAP>BLTD) { HTHL=0; printf("\nQUA TRINH HUAN LUYEN MANG THAT BAI! \n"); printf("\nDE NGHI HUAN LUYEN LAI! \n"); break; } }while(!l);//while(!l && !kbhit()); if(RESET>15000) { RES=0; goto START; } if(SOBUOCLAP<BLTD) { printf("\n\nMANG DA DUOC HUAN LUYEN XONG SAU: "); printf("%ld",RESET); printf(" BUOC LAP!\n\n"); } } /*----------------------------------------------------------------------- - Ten Thu tuc: HUANLUYENGIAMDAN Mo ta: HUAN LUYEN MANG DE TB-BINH PHUONG SAI SO DAU RA NHO HON EPSILON CHO TRUOC BUOC HOC DUOC TINH THEO PHUONG PHAP GIAM DAN DON GIAN Cac dau vao: KHONG CO Gia tri tra ve: KHONG CO ------------------------------------------------------------------------- -*/ void HUANLUYENGIAMDAN() { int t,l; printf("\n\nDANG HUAN LUYEN MANG VOI BUOC HOC GIAM DAN...\n"); Luận án Tiến sĩ Kỹ thuật 2013 138 START: if(RES==0) printf("\n\nKHOI DONG VA HUAN LUYEN LAI MANG!"); KHOITAOMANG(); //Luyen mang do { TINHTOANBUOCHOC(); BUOCLAP(); HAMMUCTIEU(); l = 1; for(t=0;t<SLMHL;t++) { PATR[t] = ECM[t] < EPSILON; l = l && (PATR[t]); } SOBUOCLAP++; RESET++; if(RESET>3000)break; if(SOBUOCLAP>BLTD) { HTHL=0; printf("\nQUA TRINH HUAN LUYEN MANG THAT BAI! \n"); printf("\nDE NGHI HUAN LUYEN LAI! \n"); break; } }while(!l);//while(!l && !kbhit()); if(RESET>3000) } if(SOBUOCLAP<BLTD) { HTHL=1; printf("\n\nMANG DA DUOC HUAN LUYEN XONG SAU: "); printf("%ld",RESET); printf(" BUOC LAP!\n\n"); } } /*----------------------------------------------------------------------- - Ten Thu tuc: HUANLUYENVUOTKHE Mo ta: HUAN LUYEN MANG DE TB-BINH PHUONG SAI SO DAU RA NHO HON EPSILON CHO TRUOC BUOC HOC DUOC TINH THEO NGUYEN LY VUOT KHE Cac dau vao: KHONG CO Gia tri tra ve: KHONG CO ------------------------------------------------------------------------ */ void HUANLUYENVUOTKHE() { int t,l; printf("\n\nDANG HUAN LUYEN MANG THEO BUOC VUOT KHE...\n"); START: if(RES==0){ printf("\nKHOI DONG VA HUAN LUYEN LAI MANG!"); } KHOITAOMANG(); TOCDOHOCZERO(); TINHBUOCHOCVUOTKHE(); //Luyen mang Luận án Tiến sĩ Kỹ thuật 2013 139 do { TINHBUOCHOCVUOTKHE(); BUOCLAP(); HAMMUCTIEU(); l = 1; for(t=0;t<SLMHL;t++) { PATR[t] = ECM[t] < EPSILON; l = l && (PATR[t]); } SOBUOCLAP++; RESET++; // printf("lan lap thu %d\n",RESET); if(RESET>100)break; if(SOBUOCLAP>BLTD) { HTHL=0; printf("\nQUA TRINH HUAN LUYEN MANG THAT BAI! \n"); printf("\nDE NGHI HUAN LUYEN LAI! \n"); break; } }while(!l);//while(!l && !kbhit()); if(RESET>100) { RES=0; goto START; } if(SOBUOCLAP<BLTD) { HTHL=1; printf("\n\nMANG DA DUOC HUAN LUYEN XONG SAU: "); printf("%ld",RESET); printf(" BUOC LAP!\n\n"); } } /*----------------------------------------------------------------------- - Ten Thu tuc: DAPUNGDAURA Mo ta: TINH CAC DAU RA LOP AN, y, VA DAU RA LOP RA, z, TU DAU VAO LOPA VAO, x. Cac dau vao: VEC-TO DAU VAO x[i] Gia tri tra ve: KHONG CO ------------------------------------------------------------------------ */ void DAPUNGDAURA(int afer[]) { int i,j; float totin; for(i=0;i<SLNRLV;i++) x[i] = (float)afer[i]; for(j=0;j<SLNRLA;j++) { totin = 0; for(i=0;i<SLNRLV;i++) totin = totin + x[i]*MTTSLA[i][j]; Luận án Tiến sĩ Kỹ thuật 2013 140 y[j] = SIGMF(totin); } for(j=0;j<SLNRLR;j++) { totin = 0; for(i=0;i<SLNRLA;i++) totin = totin + y[i]*MTTSLR[i][j]; z[j] = SIGMF(totin); } } /*----------------------------------------------------------------------- Ten Ham: TB_BINHPHUONGSAISO Mo ta: TINH BINH PHUONG SAI SO DAU RA CUA MANG THEO VEC-TO DAU RA VA VEC-TO DICH Cac dau vao: 1. VEC-TO DAU RA MONG MUON DRMM[i], 2. VEC-TO DAU RA CU LOP RA z[i], 3. SO LUONG NO-RON CUA LAOP DAU RA, SLNRLR Gia tri tra ve: TRUNG BINH BINH PHUONG SAI SO DAU RA CUA LOP RA ------------------------------------------------------------------------ */ float TB_BINHPHUONGSAISO(int a[],float b[],int SIZE) { int i; float e=0; for(i=0;i<SIZE;i++) e = e + ((float)a[i] - b[i])*(a[i] - b[i]); e = 0.5 * e; return e; } /*----------------------------------------------------------------------- - Ten Thu tuc: SAISODAURA Mo ta: TINH SAI SO DAU RA CUA MANG THEO VEC-TO DAU RA VA VEC-TO DICH 1. VEC-TO DAU RA MONG MUON DRMM[i], 2. VEC-TO DAU RA CU LOP RA z[i], Cac dau vao: SO THU TU MAU Gia tri tra ve: KHONG CO ------------------------------------------------------------------------ */ void SAISODAURA(int i) { int j; for(j=0;j<SLNRLR;j++) SSLR[j] = 0; for(j=0;j<SLNRLR;j++) SSLR[j] = z[j] - (float)DRMM[i][j]; } /*----------------------------------------------------------------------- Ten Thu tuc: SAISOLOPAN Mo ta: TINH SAI SO DAU RA CUA LOP AN THEO SAI SO LOP RA VA DAO HAM CUA SIGMF Cac dau vao: KHONG CO Gia tri tra ve: KHONG CO -----------------------------------------------------------------------*/ Luận án Tiến sĩ Kỹ thuật 2013 141 void SAISOLOPAN() { int i,j; for(i=0;i<SLNRLA;i++) SSLA[i] = 0; for(i=0;i<SLNRLA;i++) for(j=0;j<SLNRLR;j++) SSLA[i] = SSLA[i] + MTTSLR[i][j]*z[j]*(1-z[j])*SSLR[j]; } /*------------------------------------------------------------------- Ten Thu tuc: DIEUCHINHTRONGSO Mo ta: CAP NHAT MA TRAN TRONG SO LOP AN VA LOP RA Cac dau vao: SO THU TU MAU Gia tri tra ve: KHONG CO ----------------------------------------------------------------------*/ void DIEUCHINHTRONGSO(int k) { int i,j; float temp; SAISODAURA(k); SAISOLOPAN(); for(i=0;i<SLNRLA;i++) { for(j=0;j<SLNRLR;j++) { temp = -TOCDOHOC*y[i]*z[j]*(1-z[j])*SSLR[j]; MTTSLR[i][j] = MTTSLR[i][j] + temp + QUANTINH*BTMTTSLR[i][j]; BTMTTSLR[i][j] = temp; } } for(i=0;i<SLNRLV;i++) { for(j=0;j<SLNRLA;j++) { temp = -TOCDOHOC*x[i]*y[j]*(1-y[j])*SSLA[j]; MTTSLA[i][j] = MTTSLA[i][j] + temp + QUANTINH*BTMTTSLA[i][j]; BTMTTSLA[i][j] = temp; } } } /*---------------------------------------------------------------------- Ten Thu tuc: HAMMUCTIEU Mo ta: TINH BINH PHUONG SAI SO DAU RA CUA MANG THEO VEC-TO DAU RA VA VEC-TO DICH Cac dau vao: KHONG CO Gia tri tra ve: KHONG CO ---------------------------------------------------------------------*/ void HAMMUCTIEU() { int i; Luận án Tiến sĩ Kỹ thuật 2013 142 for(i=0;i<SLMHL;i++) { DAPUNGDAURA(TAPHUANLUYEN[i]); ECM[i]=TB_BINHPHUONGSAISO(DRMM[i],z,SLNRLR); } } /*---------------------------------------------------------------------- Ten Thu tuc: KIEMTRAMANG Mo ta: NGUOI SU DUNG NHAP MA TRAN DAU VAO, TINH TOAN DAP UNG DAU RA CUA MANG Cac dau vao: KHONG CO Gia tri tra ve: KHONG CO ------------------------------------------------------------------------ */ void KIEMTRAMANG() { int i,j,t,ind; float temp; float tempz1[SLNRLR]; float tempz2[3]; ind=0; for(;;) { printf("\n\nXIN MOI DUA VEC-TO DAU VAO DE KIEM TRA MANG\n\n"); for(i=0;i<7;i++) { for(j=0;j<5;j++) scanf("%d",&MTDVKT[j*7+i]); printf("\n"); } printf("\n\nDAP UNG DAU RA CUA MANG:\n"); DAPUNGDAURA(MTDVKT); for(i=0;i<SLNRLR;i++) printf("\nNO-RON %d, Z = %f",i,z[i]); for(i=0;i<SLNRLR;i++) tempz1[i]=z[i]; printf("\n\nBA DAU RA CO DAP UNG CAO NHAT UNG VOI VEC-TO DAU VAO:\n"); for(t=0;t<3;t++) { temp=0; ind=0; for(i=0;i<SLNRLR;i++) if(temp<=tempz1[i]) { temp=tempz1[i]; ind=i; } tempz2[t]=temp; printf("\nDAU RA THU %d LA %3.0f%%",ind, tempz2[t]*100); tempz1[ind]=0; } temp=z[0]; ind=0; Luận án Tiến sĩ Kỹ thuật 2013 143 for(i=0;i<SLNRLR;i++) if(temp<=z[i]) { temp=z[i]; ind=i; } printf("\n\nKET LUAN CUA MANG NO-RON:\n"); printf("\nVEC-TO DAU VAO MANG LA MA CUA KY TU: %d",ind); } } /*---------------------------------------------------------------------- Ten Thu tuc: MATRANTRONGSOLOPAN Mo ta: IN MA TRAN TRONG SO LOP AN RA MAN HINH Cac dau vao: KHONG CO Gia tri tra ve: KHONG CO ------------------------------------------------------------------------ */ void MATRANTRONGSOLOPAN() { int i,j; printf("\n\nMA TRAN TRONG SO LOP AN MTTSLA[slnrlv][slnrla]:\n\n"); for(i=0;i<SLNRLV;i++) { for(j=0;j<SLNRLA;j++) { if(MTTSLA[i][j]>=0) printf("+%f ",MTTSLA[i][j]); else printf("%f ",MTTSLA[i][j]); } printf("\n"); } } /*---------------------------------------------------------------------- Ten Thu tuc: MATRANTRONGSOLOPRA Mo ta: IN MA TRAN TRONG SO LOP RA RA MAN HINH Cac dau vao: KHONG CO Gia tri tra ve: KHONG CO ---------------------------------------------------------------------*/ void MATRANTRONGSOLOPRA() { int i,j; printf("\n\nMA TRAN TRONG SO LOP RA MTTSLR[slnrla][slnrlr]:\n\n"); for(j=0;j<SLNRLR;j++) { for(i=0;i<SLNRLA;i++) { if(MTTSLR[i][j]>=0) printf("+%f ",MTTSLR[i][j]); else printf("%f ",MTTSLR[i][j]); } printf("\n"); } } Luận án Tiến sĩ Kỹ thuật 2013 144 /******************************* HAM CHINH ***********************/ void main(int argc,char *argv[]) { int read; char c; KHOITAOMANG(); printf("*******************************************\n\n"); printf("* CHUONG TRINH HUAN LUYEN MANG NO-RON *\n\n"); printf("* BUOC HOC TINH THEO NGUYEN LY VUOT KHE *\n\n"); printf("*******************************************\n\n"); /* printf("/Vao\\ /~~~~Lop an~~~~\\ /~~~~~Lop ra~~~~~\\\n"); printf(" -- ------- ---- --------- ---- \n"); printf("| | | | | |Y | | | | Z\n"); printf("|X |->| W11 |->| f1 |->| W21 |->| f2 |-->\n"); printf("| | | (35x5)| | | | (5x10) | | |\n"); printf("| | | | | | | | | |\n"); printf(" -- ------- ---- --------- ---- \n"); printf("\\35/ \\__Y=f1(W11.X)__/ \\__Z=f1(W11.X)___/ \n\n"); printf(" f=sigm(net) \n\n"); printf("\nSU DUNG MANG: TRUOC KHI HOC, t, SAU KHI HOC, s.\n"); SDM = getchar(); if(SDM=='t') KIEMTRAMANG();// SU DUNG MANG TRUOC KHI HUAN LUYEN else if(SDM=='s') { printf("\n\nLUA CHON LOAI BUOC HOC\n"); printf("\nCO DINH: c, GIAM DAN: g, NGUYEN LY VUOT KHE: v\n\n"); c = getchar(); } LCBH = getchar(); switch(LCBH) { case 'c': HUANLUYENCODINH(); break; case 'g': HUANLUYENGIAMDAN(); break; case 'v': HUANLUYENVUOTKHE(); break; } */ HUANLUYENVUOTKHE(); if(HTHL==1)//NEU MANG DA DUOC HUAN LUYEN XONG { MATRANTRONGSOLOPAN(); MATRANTRONGSOLOPRA(); // KIEMTRAMANG(); } }

Các file đính kèm theo tài liệu này:

  • pdflun_an_tin_si_k_thut_2013_1_mc_lc_6151.pdf