Năm 1859, nhà sinh vật học người Anh Charles Darwin đã đề xuất Thuyết tiến hóa để lý giải nguồn gốc sự sống của các loài sinh vật trên thế giới. Theo quan điểm của Thuyết tiến hóa, sinh vật trên thế giới phát triển dựa trên sự chọn lọc tự nhiên, dần dần thích nghi với môi trường sống. Qua các thế hệ,những cá thể nào thích nghi với môi trường sống sẽ tồn tại và duy trì những đặc tính của mình cho thế hệ sau, những cá thể kém thích nghi sẽ dần dần bị tuyệt chủng.
15 trang |
Chia sẻ: vietpd | Lượt xem: 1916 | Lượt tải: 5
Bạn đang xem nội dung tài liệu Lập trình di truyền và Phân tích hồi quy, để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
49
Chương 5: Lập trình di truyền và Phân tích hồi quy
5.1. Sơ lược về lập trình di truyền
5.1.1. Thuyết tiến hóa
Năm 1859, nhà sinh vật học người Anh Charles Darwin ñã ñề xuất Thuyết tiến hóa
ñể lý giải nguồn gốc sự sống của các loài sinh vật trên thế giới. Theo quan ñiểm của
Thuyết tiến hóa, sinh vật trên thế giới phát triển dựa trên sự chọn lọc tự nhiên, dần
dần thích nghi với môi trường sống. Qua các thế hệ, những cá thể nào thích nghi với
môi trường sống sẽ tồn tại và duy trì những ñặc tính của mình cho thế hệ sau, những
cá thể kém thích nghi sẽ dần dần bị tuyệt chủng.
Với sự phát triển của ngành di truyền học, người ta khám phá ra rằng: tất cả những
ñặc tính của một sinh vật ñều ñược lưu giữ trong chất liệu di truyền của sinh vật. ðó
chính là gen. Trong quá trình sinh sản của sinh vật, gen của hai cá thể lai ghép với
nhau ñể tạo ra gen của cá thể thế hệ sau. Gen này làm cho cá thể có những ñặc tính
hỗn hợp của thế hệ trước. Cũng có khi trong quá trình phát triển của sinh vật, một
ñoạn nào ñó trên gen do tác ñộng của môi trường sống bị ñột biến, làm xuất hiện
ñặc tính mới nơi cá thể, và ñặc tính này ñược truyền lại cho các thế hệ sau.
Như vậy, từ một vài cá thể nguyên thủy ban ñầu, trải qua hàng trăm triệu năm tiến
hóa, với sự tác ñộng của chọn lọc tự nhiên, cùng với các quá trình lai ghép, ñột biến
giữa các cá thể sinh sống trong quần thể sinh vật qua các thế hệ, ñã giúp hình thành
nên các loài sinh vật ña dạng phong phú, thích nghi tốt với môi trường sống như
ngày nay.
50
5.1.2. Giải thuật di truyền [17]
Lấy ý tưởng từ Thuyết tiến hóa của Charles Darwin, John Holland ñã phát triển một
kỹ thuật trí tuệ nhân tạo ñể giúp tìm ra lời giải gần ñúng cho một bài toán. Kỹ thuật
này ñược gọi là giải thuật di truyền [17].
Trong giải thuật di truyền, bài toán cần giải quyết chính là môi trường sống. Những
lời giải “ứng cử viên” của bài toán là các cá thể trong quần thể. Thông qua các phép
toán chọn lọc, lai ghép, ñột biến và ñặc biệt là một hàm thích nghi dùng ñể tính toán
ñộ thích nghi của từng cá thể, quẩn thể lời giải sẽ tiến hóa qua các thế hệ và dần dần
cho ra những lời giải chính xác hơn cho bài toán ban ñầu.
Tư tưởng chính của giải thuật di truyền ñược trình bày trong bảng 5.1.
Bảng 5.1. Giải thuật di truyền của John Holland.
- Bước 1: initialize(Q0), // khởi tạo quần thể ban ñầu
- Bước 2: e = evaluate(Q0), i = 0 // ñánh giá quần thể ban ñầu
- Bước 3: Lặp khi e chưa ñạt lời giải ưng ý
* Bước 3.1: Qi+1 = select(Qi) // tạo quần thể thế hệ kế tiếp bằng
// cách chọn lọc cá thể từ quần thể cũ
* Bước 3.2: alter(Qi+1) // thay ñổi quần thể mới bằng cách
// lai ghép, ñột biến trên các cá thể
* Bước 3.3: e = evaluate(Qi+1) // ñánh giá quần thể mới
* Bước 3.4 : i = i + 1
5.1.3. Lập trình di truyền [17]
Chương trình máy tính ñược tạo ra ñể giúp con người giải quyết một vấn ñề nào ñó.
Nó là cách thức giải quyết vấn ñề ñược trình bày ở dạng sao cho máy tính có thể
hiểu ñược. Công việc trình bày này ñược gọi là lập trình. ðó luôn là một công việc
khó, ñòi hỏi nhiều thời gian và công sức của con người. Vì vậy khi phát triển trí tuệ
51
nhân tạo, người ta luôn mong muốn tìm ra phương pháp ñể máy tính có thể tự lập
trình. Chương trình bấy giờ không phải do con người viết nữa, mà chính máy tính
sẽ làm nhiệm vụ này.
Như ñã biết, ý tưởng của giải thuật di truyền là ñể máy tính tự tìm lời giải gần ñúng
cho một bài toán. Trong trường hợp bài toán ñược ñặt ra là tìm chương trình ñể giải
quyết một vấn ñề, khi ñó lời giải tìm ñược chính là chương trình ñể giải quyết vấn
ñề ñó. Tập cá thể chính là những chương trình máy tính làm “ứng cử viên” cho việc
giải quyết vấn ñề. Với xuất phát ñiểm ban ñầu là một vài chương trình ngẫu nhiên,
cũng thông qua các phép toán chọn lọc, lai ghép, ñột biến và hàm thích nghi, qua
một số thế hệ tiến hóa, kết quả thu ñược sẽ là những chương trình ñể giải quyết gần
ñúng một vấn ñề nào ñó. Như vậy, giải thuật di truyền hoàn toàn có thể trở thành
một công cụ làm cho máy tính có khả năng tự lập trình. Công cụ này do John Koza
ñề xuất vào ñầu thập niên 1990 và ñược gọi là lập trình di truyền [17]. ðây có thể
nói là một hướng nghiên cứu rất ñược quan tâm hiện nay.
ðể hiện thực hóa lập trình di truyền, mỗi cá thể là một chương trình máy tính ñược
biểu diễn dưới dạng cây cú pháp có số lượng nút và ñộ sâu khác nhau. Các phép
toán lai ghép, ñột biến ñược thực hiện trên các nhánh của cây cú pháp này.
Ban ñầu, ý tưởng của lập trình di truyền chỉ gói gọn trong phạm vi lập trình tự ñộng,
tìm chương trình máy tính giải quyết bài toán. Nhưng sau một thời gian phát triển, ý
tưởng này ñược mở rộng ra cho nhiều lĩnh vực khác có cách biểu diễn cá thể tương
tự: dạng cây. Vì vậy, có thể hiểu nôm na: lập trình di truyền chính là giải thuật di
truyền với các cá thể trong quần thể ñược biểu diễn dưới dạng cây.
52
5.2. Những thành phần của lập trình di truyền
5.2.1. Cá thể
Trong giải thuật di truyền, mỗi cá thể là một lời giải “ứng cử viên” cho bài toán cần
giải quyết. Thông thường, mỗi cá thể ñược biểu diễn dưới dạng một chuỗi bit có ñộ
dài như nhau. Tùy theo mỗi bài toán sẽ có cách diễn giải chuỗi bit này khác nhau.
Việc lai ghép, ñột biến cá thể ñược thực hiện trên chuỗi bit này.
Trong khi ñó, ñối với lập trình di truyền, mỗi cá thể ñược biểu diễn dưới dạng cây
(gọi là cây cá thể) có số lượng nút và ñộ sâu khác nhau. Tùy theo mỗi bài toán, các
nút mang ý nghĩa khác nhau. ðiều này làm tăng khả năng khả năng biểu diễn lời
giải cho những loại bài toán khác nhau.
Cây cá thể ñược xây dựng dựa trên hai tập: tập toán tử F và tập toán hạng T.
- Tập toán tử F (Function): bao gồm những nút không phải là lá của cây cá thể,
gọi là nút toán tử. Mỗi nút toán tử có ngôi quy ñịnh số nhánh con của nút
trong cây.
F = {
{Tập toán tử số học: +, -, *, /, …},
{Tập toán tử logic: NOT, AND, OR, …},
{Tập các cấu trúc chương trình: IF-THEN-ELSE, WHILE-DO, …},
{Tập các hàm của chương trình}
}
Ví dụ tập toán tử F dùng ñể xây dựng cây cú pháp chương trình. Nút toán tử + có
hai ngôi, nút toán tử IF-THEN-ELSE có ba ngôi.
53
- Tập toán hạng T (Terminal): bao gồm những nút lá của cây cá thể, gọi là nút
toán hạng. Các nút toán hạng không có nhánh con.
T = {
{Tập các hằng số},
{Tập các ký hiệu}
}
Ví dụ tập toán hạng T dùng ñể xây dựng cây cú pháp chương trình.
Lấy ví dụ một ñoạn chương trình máy tính như sau:
if (a < 10) then
c = a + b;
else
c = a – b;
Tập toán tử F = {+, -, <, IF-THEN-ELSE }, tập toán hạng T = {a, b, c, số nguyên}.
Dựa trên F và T, cây cá thể của ñoạn chương trình này ñược xây dựng như hình 5.1.
Hình 5.1. Cây cá thể biểu diễn ñoạn chương trình ñược xây dựng từ tập F và T.
54
5.2.2. Quần thể
Quần thể là tập hợp các cá thể. Sau khi ñã biểu diễn lời giải bài toán bằng các cá
thể, bước tiếp theo là khởi tạo quần thể ban ñầu làm tiền ñề cho quá trình tiến hóa
trên quần thể sau này.
Có hai cách thức ñể khởi tạo quần thể ban ñầu:
- Khởi tạo bằng thuật toán GROW [17]: mỗi cá thể ñược khởi tạo ngẫu nhiên
với các nhánh của cây có ñộ sâu tùy ý nhưng không vượt quá một giới hạn
cho trước.
Bảng 5.2. Thuật toán GROW khởi tạo quần thể ban ñầu.
initialise(node, depth)
Nếu (depth = 1)
child = selectNode(F).
Ngược lại nếu depth = MAX_DEPTH
child = selectNode(T).
Ngược lại
child = selectNode(F U T).
Cuối nếu
Nếu child là nút toán tử
Lặp i từ 1 ñến số ngôi của child
initialise(child, depth + 1)
Cuối lặp
Cuối nếu
55
- Khởi tạo bằng thuật toán FULL [17]: mỗi cá thể ñược khởi tạo ngẫu nhiên
với các nhánh của cây có ñộ sâu ñúng bằng một giới hạn cho trước.
Bảng 5.3. Thuật toán FULL khởi tạo quần thể ban ñầu.
initialise(node, depth)
Nếu (depth = 1)
child = selectNode(F).
Ngược lại nếu depth = MAX_DEPTH
child = selectNode(T).
Ngược lại
child = selectNode(F).
Cuối nếu
Nếu child là nút toán tử
Lặp i từ 1 ñến số ngôi của child
initialise(child, depth + 1)
Cuối lặp
Cuối nếu
5.2.3. Hàm thích nghi
Hàm thích nghi dùng ñể tính toán ñộ thích nghi của cá thể, cho phép so sánh ñộ
thích nghi của các cá thể trong quần thể với nhau. Tùy theo bài toán, ñộ thích nghi
có cách thức tính và thang ño khác nhau.
Thông thường, ñộ thích nghi thô (Raw Fitness) của cá thể ñược tính theo công thức
5.1. Theo công thức này, ñộ thích nghi càng nhỏ (tiến về giá trị 0) thì cá thể càng
thích nghi với môi trường, tức cho lời giải gần ñúng với bài toán.
56
iii EvaluatedExpectedFitness −=
Công thức 5.1. Tính ñộ thích nghi thô của cá thể.
Trong ñó:
- Fitnessi: ñộ thích nghi của cá thể i trong quần thể.
- Expectedi: giá trị mong ñợi (chính xác theo bài toán) của cá thể i trong quần
thể.
- Evaluatedi: giá trị thật của cá thể i trong quần thể.
5.2.4. Toán tử di truyền
5.2.4.1. Chọn lọc
Chọn lọc là toán tử quan trọng nhất của giải thuật di truyền. Trong lập trình di
truyền, toán tử chọn lọc tương tự như trong giải thuật di truyền. Sau mỗi thế hệ tiến
hóa, toán tử chọn lọc thực hiện việc sàng lọc quần thể. Những cá thể ñược chọn lọc
sẽ ñược sao chép lại ñể trở thành cá thể trong quần thể mới. Những cá thể càng
thích nghi với môi trường sẽ có cơ hội ñược chọn lọc cao hơn những cá thể kém
thích nghi. Toán tử này cho phép giữ lại những cá thể tốt nhưng vẫn không loại bỏ
hoàn toàn những cá thể xấu. Những cá thể xấu vẫn có cơ hội, dù thấp, ñể ñược chọn
lọc. ðiều này giúp cho quần thể luôn giữ ñược ñộ ña dạng cần thiết, một yếu tố rất
quan trọng trong quá trình tiến hóa.
Theo quy luật của Thuyết tiến hóa, toán tử chọn lọc làm cho khả năng thích nghi
của các cá thể trong quần thể ngày càng tăng lên qua mỗi thế hệ. Theo Koza [17],
10% cá thể thích nghi nhất trong quần thể nên ñược giữ lại qua mỗi thế hệ. Tỷ lệ
này có ảnh hướng nhiều ñến tốc ñộ của giải thuật di truyền. Vì việc tính ñộ thích
nghi cho các cá thể mất khá nhiều thời gian. Với những cá thể ñược chọn lọc, ñộ
thích nghi của chúng không thay ñổi qua các thế hệ. Do ñó, việc tính toán lại ñộ
thích nghi cho những cá thể này là không cần thiết.
57
5.2.4.2. Lai ghép
Toán tử lai ghép ñược thực hiện trên hai cá thể của quần thể. Hai cá thể này có thể
giống hoặc khác nhau. Một nhánh bất kỳ trong mỗi cá thể ñược chọn và hoán ñổi
cho nhau ñể hình thành nên hai cá thể mới trong thế hệ kế tiếp. Hai cá thể mới này
chính là sự pha trộn ngẫu nhiên giữa hai cá thể ban ñầu ñược chọn ñể thực hiện lai
ghép.
Ví dụ mô tả quá trình lai ghép hai cá thể biểu diễn cây logic.
(NOT D1) OR (D0 AND D1)
(D1 OR (NOT D0)) OR ((NOT D0) AND (NOT D1))
Hình 5.2. Hai cá thể trước khi thực hiện lai ghép [17].
((NOT D0) AND (NOT D1)) OR (D0 AND D1)
(D1 OR (NOT D0)) OR (NOT D1)
Hình 5.3. Hai cá thể sau khi thực hiện lai ghép [17].
58
Lai ghép cũng là một toán tử quan trọng trong lập trình di truyền. Theo Thuyết tiến
hóa, cá thể con hình thành từ việc lai ghép hai cá thể bố mẹ tốt có tỷ lệ tốt cao hơn
so với tỷ lệ xấu. Toán tử này ñược sử dụng phổ biến trong quá trình tiến hóa của
quần thể. Nó cũng giúp tạo ra sự ña dạng trong quần thể. Theo công trình nghiên
cứu của mình [17], Koza ñề xuất tỷ lệ sử dụng toán tử lai ghép trên quần thể là
90%. ðiều này có nghĩa là với quần thể gồm 100 cá thể, ở mỗi thế hệ, trung bình
việc lai ghép ñược thực hiện trên 90 cá thể (45 cặp).
5.2.4.3. ðột biến
Việc lai ghép lòng vòng giữa các cá thể trong quần thể một lúc nào sẽ dẫn ñến ñộ
thích nghi của quần thể không thể tăng lên ñược nữa. ðể giải quyết vấn ñề này, một
vài cá thể phải ñột biến ñể tạo ra một sự ña dạng mới trong quần thể. Toán tử ñột
biến ñược dùng ñể thực hiện việc này.
ðột biến ñược áp dụng trên một cá thể ngẫu nhiên. Khi ñó, một nhánh bất kỳ của cá
thể sẽ bị loại bỏ và thay thế bằng một nhánh mới ñược tạo bằng thuật toán GROW
hoặc FULL.
Tỷ lệ sử dụng toán tử ñột biến trong quần thể ở mỗi thế hệ là không nhiều. Koza ñề
nghị ở mỗi thế hệ, chỉ nên áp dụng ñột biến trên 1% số cá thể trong quần thể.
Ví dụ mô tả quá trình ñột biến ở một cá thể biểu diễn cây logic.
(NOT D1) OR (D0 AND D1)
Hình 5.4. Cá thể trước khi thực hiện ñột biến [17].
59
((NOT D0) AND (NOT D1)) OR (D0 AND D1)
Hình 5.5. Cá thể sau khi thực hiện ñột biến [17].
5.2.5. Các tham số ảnh hưởng ñến quá trình tiến hóa
5.2.5.1. Kích thước quần thể
Kích thước quần thể là một tham số có ảnh hưởng lớn ñến mức ñộ ña dạng của quần
thể. Kích thước quần thể càng lớn, mức ñộ ña dạng khi khởi tạo quần thể ban ñầu
càng lớn. ðộ ña dạng tăng sẽ làm tăng khả năng tìm ra ñược những lời giải chính
xác cho bài toán.
Tuy nhiên kích thước quần thế quá lớn sẽ ảnh hưởng không nhỏ ñến tốc ñộ thực
hiện của giải thuật di truyền. Số lượng cá thể nhiều ñòi hỏi mất nhiều thời gian hơn
cho quá trình khởi tạo quần thể ban ñầu. Quần thể lớn sẽ làm tăng số lần lai ghép,
ñột biến, dẫn tới quá trình tiến hóa của quần thể qua từng thế hệ chậm lại. Koza [17]
ñề xuất kích thước quần thể thông thường là 500 cá thể.
5.2.5.2. Số thế hệ tiến hóa
Một tham số quan trọng khác trong lập trình di truyền là số thế hệ tiến hóa của quần
thể.
Qua mỗi thế hệ tiến hóa, ñộ thích nghi của quần thể ngày càng tăng, số lượng các
lời giải gần chính xác càng nhiều. Nhưng không phải lúc nào thời gian cũng cho
phép quần thể phát triển cho ñến khi thu ñược lời giải tối ưu. Vì vậy việc xem xét,
60
cân nhắc giữa mức ñộ gần ñúng của lời giải và thời gian cho phép ñể thu ñược lời
giải là ñáng quan tâm. Koza [17] ñề xuất số thế hệ tiến hóa thông thường là 50 lần.
5.3. Phân tích hồi quy bằng lập trình di truyền
5.3.1. Phương pháp phân tích hồi quy
Phân tích hồi quy là một phương pháp dùng ñể tìm mối liên hệ toán học (thường
thông qua một hàm số) giữa một ñại lượng gốc (Dependent Variable) với một tập
những biến số thành phần (Independent Variables) dựa trên tập dữ liệu thực
nghiệm.
Nói một cách hình tượng, ñây là quá trình ñi tìm ñồ thị hàm số gần ñúng “ñi qua”
các ñiểm cho trước trên ñồ thị, tức một ñường cong có “khoảng cách tương ñối” ñến
tất cả các ñiểm là nhỏ nhất.
Hình 5.6. Minh họa phương pháp phân tích hồi quy [19].
Phân tích hồi quy ñược tiến hành qua hai bước:
- Bước 1: tìm hàm cơ sở, quan sát và xem xét tập ñiểm trên ñồ thị ñể quyết
ñịnh một hàm số cơ sở dùng là nền tảng cho việc phân tích. ðây là quá trình
tìm dạng của hàm số kết quả. Thông thường có hai dạng là: tuyến tính và phi
tuyến. Dạng của hàm số tìm ñược ở bước này sẽ ảnh hưởng rất lớn ñến ñộ
61
phức tạp của bước tối ưu hóa kế tiếp. Dạng tuyến tính ñơn giản nhưng kết
quả thường không như mong muốn, vì ña số các trường hợp mối quan hệ
giữa các ñại lượng cần tìm là phi tuyến. Bước tìm hàm cơ sở thường ñược
thực hiện dựa trên phán ñoán của chuyên gia.
- Bước 2: tối ưu hóa hàm cơ sở, tinh chỉnh các hệ số của hàm cơ sở tìm ñược ở
bước 1 ñể thu ñược hàm số kết quả tối ưu. Quá trình tinh chỉnh thường dựa
trên phương pháp bình phương tối tiểu: tìm các hệ số của hàm cơ sở sao cho
tổng bình phương khoảng cách từ hàm cơ sở ñến tập ñiểm thực nghiệm là
nhỏ nhất. Các hệ số cần tìm là nghiệm của hệ phương trình 5.2.
∑∑ −=
22 ))(( ii yxfR
Công thức 5.2. Hệ phương trình của phương pháp bình phương tối tiểu [19].
Trong ñó:
• xi, yi: tọa ñộ ñiểm thứ i trong tập ñiểm thực nghiệm.
• f: hàm cơ sở tìm ñược ở bước 1.
Nếu hàm cơ sở tìm ñược ở bước 1 có dạng phi tuyến, giải hệ phương trình
5.2 là một vấn ñề nan giải. Vì vậy trong nhiều trường hợp, kết quả ñạt ñược
chỉ mang tính gần ñúng.
Kết quả phân tích hồi quy phụ thuộc rất lớn vào sự phân bố của tập dữ liệu thực
nghiệm. Tập dữ liệu này phải có tính “toàn diện”, phản ánh ñược một phần nào ñó
tính chất (dạng) của hàm số. Các ñiểm dữ liệu phải phân bố toàn cục chứ không rơi
vào một vùng cục bộ nào ñó của ñồ thị.
62
Ngoài ra, một vấn ñề cần phải quan tâm về tập dữ liệu thức nghiệm, ñó là sai số của
tập dữ liệu này không ñược mang tính hệ thống, các sai số này phải phân bố trên
toàn cục và mang tính ngẫu nhiên.
5.3.2. Áp dụng lập trình di truyền vào bài toán phân tích hồi quy [2]
Phân tích hồi quy là một công việc phức tạp ñòi hỏi những chuyên gia có nhiều kinh
nghiệm trong lĩnh vực sử dụng kết quả phân tích. Chuyên gia cần phải am hiểu tập
dữ liệu thực nghiệm ñể có thể ñưa ra ñược hàm cơ sở phù hợp.
Lập trình di truyền ñược dùng ñể tìm lời giải gần ñúng cho những bài toán phức tạp,
với ñiều kiện những lời giải cho bài toán có thể biểu diễn ñược dưới dạng cây. Hàm
số cần tìm trong phân tích hồi quy hoàn toàn phù hợp với ñiều kiện này. Nó có thể
ñược biểu diễn dưới dạng cây biểu thức. Vì vậy việc áp dụng lập trình di truyền vào
bài toán phân tích hồi quy là khả thi.
5.3.2.1. Biểu diễn cá thể
Trong bài toán phân tích hồi quy, cá thể là những hàm số “ứng cử viên” ñược biểu
diễn bằng cây biểu thức. Quá trình xây dựng cây biểu thức ñược thực hiện theo
thuật toán GROW hoặc FULL (trình bày trong bảng 5.2 và bảng 5.3). Tập toán tử F
và toán hạng T như sau:
F = {
{Tập toán tử số học: +, -, *, /, ^, log, exp, sin, cos, …}
}
T = {
{Tập biến số của hàm cần tìm},
{Tập số thực R}
}
63
5.3.2.2. Hàm thích nghi
ðối với mỗi hàm số “ứng cử viên”, ñộ thích nghi ñược tính dựa trên phương pháp
bình phương tối tiểu. Hàm số càng chính xác khi tổng bình phương khoảng cách của
nó ñến tất cả các ñiểm trên ñồ thị càng nhỏ. Ơ ñây, tập dữ liệu thực nghiệm ñược sử
dụng. ðộ thích nghi ñược tính theo công thức 5.3.
∑ ∑ −==
22 ))(( YXfRFitness ii
Công thức 5.3. ðộ thích nghi của cá thể trong bài toán phân tích hồi quy.
Trong ñó:
- Fitnessi: ñộ thích nghi của cá thể i trong quần thể.
- fi: hàm nhiều biến mà cá thể i biểu diễn.
- X, Y: tập dữ liệu thực nghiệm.