Mạng nơron Kohonen chỉ bao gồm một lớp dữ liệu đầu vào và một lớp dữ liệu đầu ra của các nơron và nó không chứa lớp ẩn.
Lớp dữ liệu đầu vào đối với mạng nơron Kohonen là các nơron đầu vàọ Các nơron đầu vào này tạo thành mẫu dữ liệu đầu vào của mạng. Đối với mạng nơron Kohonen, ta nên chọn dữ liệu đầu vào chuẩn hóa trong khoảng giữa -1 và 1. Khi thực thi mẫu dữ liệu đầu vào, mạng sẽ tạo ra các nơron đầu rạ
Lớp đầu ra của mạng nơron Kohonen rất khác với lớp đầu ra của mạng nơron truyền thẳng. Đối với mạng truyền thẳng, nếu chúng ta có một mạng nơron với 5 nơron đầu ra, chúng sẽ có thể cho kết quả bao gồm 5 giá trị. Còn trong mạng nơron Kohonen chỉ có một nơron đầu ra cho ra một giá trị. Giá trị duy nhất này có thể là đúng hoặc saị Dữ liệu đầu ra từ mạng nơron Kohonen thường là các chỉ số của nơron (Ví dụ nơron số 5,…). Cấu trúc đặc trưng của mạng nơron Kohonen được chỉ ra trong hình 2.1.
Hình 2.1: Một dạng mạng nơron Kohonen
Bây giờ, chúng ta xem xét mạng nơron Kohonen xử lý thông tin như thế nàọ Để kiểm tra quá trình này, chúng ta xem xét một ví dụ sau:
Ví dụ
Chúng ta sẽ xém xét một mạng nơron Kohonen đơn giản. Mạng này sẽ chỉ có 2 nơron đầu vào, và 2 nơron đầu rạ Dữ liệu đầu vào được cho là 2 nơron được chỉ ra trong bảng 2.1 và các trọng số kết nối giữa các nơron trong bảng 2.2.
Bảng 2.1 Bảng 2.2
Sử dụng các giá trị này, chúng ta xem xét nơron có thể thắng và cung cấp dữ liệu đầu rạ Chúng ta bắt đầu bằng cách chuẩn hóa dữ liệu đầu vàọ
2.2.3 Chuẩn hóa dữ liệu đầu vào
Mạng nơron Kohonen đòi hỏi dữ liệu đầu vào phải được chuẩn hóạ Yêu cầu của mạng nơron Kohonen là dữ liệu đầu vào của nó phải được phân hoạch trên miền xác định giữa -1 và 1. Mỗi dữ liệu đầu vào nên sử dụng hoàn toàn miền xác định, vì nếu các nơron đầu vào chỉ sử dụng các số giữa 0 và 1, thì thành quả của mạng nơron sẽ không cao (bị tổn thất).
Để chuẩn hóa dữ liệu đầu vào, chúng ta sẽ tính toán độ dài vector (vector length) của các dữ liệu đầu vào, hoặc vector đầu vàọ Trong trường hợp này độ dài vector sẽ là: (0.5 * 0.5) + (0.75 * 0.75) = 0.8125.
Vậy trường hợp trên sẽ có độ dài vector là 0.8125. Sử dụng độ dài này, chúng ta có thể xác định được hệ số chuẩn hóạ Hệ số chuẩn hóa là số nghịch đảo của căn bậc hai độ dài vector đầu vàọ Trong trường hợp trên thì hệ số chuẩn hóa là:
Tính toán giá trị trên cho kết quả hệ số chuẩn hóa là 1.1094. Hệ số chuẩn hóa này sẽ sử dụng cho bước tiếp theo, đó là tính toán đầu ra cho nơron.
2.2.4 Tính toán dữ liệu đầu ra của nơron
Để tính toán dữ liệu đầu ra, vector dữ liệu đầu vào và các trọng số kế nối nơron đều phải được xem xét. Thứ nhất, tính tích vô hướng của hai vector vector đầu vào và vector các trọng số liên kết. Để tính toán tích vô hướng giữa hai vector này, ta thực hiện như saụ
Ta bắt đầu tính toán cho nơron thức nhất. Thuật toán Kohonen cho việc lấy tích vô hướng hai vector của vector đầu vào và vector trọng số được tính như sau:
Phép tính toán trên "dot product" cho kết quả là 0.395. Tính toán này sẽ được thực hiện cho nơron đầu ra đầu tiên, và nó sẽ được thực hiện như vậy đối với mỗi nơron đầu ra tiếp theọ
Bây giờ, dữ liệu đầu ra này phải được chuẩn hóa bằng nhân kết quả của "dot product" trên (0.395) với hệ số chuẩn hóa là 1.1094, và cho kết quả là 0.438213. Dữ liệu đầu ra đã được tính toán và chuẩn hóa, nó được ánh xạ tới một số lưỡng cực?.
2.2.5 Ánh xạ lưỡng cực
Khi tạo bản đồ lưỡng cực, số 0 sẽ là -1, và các số còn lại là 1. Tức là tạo bản đồ lưỡng cực từ [-1,1] tới [0,1].
Ví dụ, để biến đổi chuỗi 0101 về số lưỡng cực ta làm như sau:
Do dữ liệu đầu vào được chuẩn hóa trong khoảng [-1,1] nên ta phải thực hiện chuẩn hóa tương tự đối với nơron đầu rạ Để lập được bản đồ, ta cộng thêm 1 vào kết quả rồi lấy ½ kết quả đó. Theo kết quả trên có kết quả đầu ra là 0.438213, và kết quả trong dữ liệu đầu ra cuối cùng là :
(0.438213+1)/2 = 0.7191065.
Giá trị 0.7191065 là dữ liệu đầu ra của nơron đầu tiên. Giá trị này sẽ được so sánh với các dữ liệu đầu ra của nơron khác. Bằng cách so sánh các giá trị này, chúng ta có thể xác định được nơron “ thắng”.
2.2.6 Chọn nơron thắng
Nếu chúng ta muốn xác định được một nơron đầu ra thắng, chúng ta phải tính toán giá trị cho nơron đầu ra thứ haị Bây giờ, chúng ta sẽ xem nhanh quá trình tính toán cho nơron đầu ra thứ haị
Nơron dữ liệu đầu ra thứ hai sẽ sử dụng hệ số chuẩn hóa giống như đã sử dụng để tính toán cho nơron đầu ra đầu tiên. Theo trên ta có hệ số chuẩn hóa là 1.1094. Chúng ta áp dụng phương pháp tính tích vô hướng cho trọng số của nơron đầu ra thứ hai và vector dữ liệu đầu vào, chúng ta sẽ nhận được một giá trị là :
|0.5 0.75|*|0.3 0.4| = (0.5*0.75)+(0.3*0.4) = 0.45.
Giá trị này được nhân với hệ số chuẩn hóa 1.1094, chúng ta nhận được kết quả là 0.49923.
Bây giờ chúng ta đã có giá trị đầu ra cho mỗi nơron. Nơron đầu tiên có giá trị đầu ra là 0.7191065 và nơron thứ hai có một giá trị đầu ra là 0.49923. Để chọn nơron thắng, chúng ta chọn giá trị của dữ liệu đầu ra là lớn nhất. Trong trường hợp này thì nơron thắng là nơron đầu ra đầu tiên với giá trị đầu ra là 0.7191065.
Như vậy ta đã xác định được giá trị đầu ra của mạng nơron Kohonen. Ta thấy các trọng số giữa nơron đầu vào và nơron đầu ra xác định dữ liệu đầu rạ Trong phần
sau, chúng ta sẽ điều chỉnh các trọng số này để nó cung cấp dữ liệu đầu ra phù hợp với cái mà ta mong muốn.
2.2.7 Quá trình học của mạng Kohonen
Toàn bộ quá trình huấn luyện cho một mạng nơron Kohonen cần phải lặp lại qua vài công đoạn. Nếu sai số đã tính toán của mạng nơron Kohonen ở mức thấp hơn mức có thể chấp nhận được thì sẽ hoàn tất quá trình huấn luyện. Để tính toán tỉ lệ sai số cho mạng nơron Kohonen, ta sẽ điều chỉnh các trọng số cho mỗi công đoạn.
Quá trình huấn luyện cho mạng nơron Kohonen là luyện cạnh tranh nên mỗi tập huấn luyện sẽ có một nơron thắng. Nơron thắng này sẽ có trọng số được điều chỉnh sao cho ngay lập tức nó sẽ tác động trở lại mạnh mẽ hơn trong dữ liệu đầu vào ở lần tiếp theọ Sự khác nhau giữa các nơron thắng sẽ dẫn tới sự khác nhau giữa các mẫu đầu vào tiếp theọ
Chúng ta xem xét toàn bộ quá trình liên quan đến việc huấn luyện mạng nơron Kohonen. Các bước được tóm tắt trong hình 2.2.
Từ hình 2.2 ta thấy, mạng nơron Kohonen được huấn luyện bởi các công đoạn tuần hoàn cho đến khi một trong hai vấn đề sau xảy ra:
- Nếu tính toán các sai số ở mức thấp hơn mức có thể chấp nhận được thì nhiệm vụ của chu kỳ sẽ hoàn thành quá trình huấn luyện.
- Nếu tất cả các tỉ lệ sai số chỉ thay đổi bởi đa số cận biên, thì chu kỳ riêng lẻ này sẽ bị loại bỏm và các trọng số lại được khởi tạo lại với các giá trị ngẫu nhiên, đông thời một chu kỳ huấn luyện mới lại bắt đầụ Chu kỳ huấn luyện này sẽ tiếp tục chu kỳ huấn luyện trước và nó sẽ phân tích các công đoạn để đưa ra kết quả; hoặc là chu kỳ bị loại bỏ hoặc tạo ra một tập các trọng số đó mà có mức sai số có thể chấp nhận được.
Bắt đầu
Khởi tạo ngẫu nhiên ma trận trọng số
Tính toán sai số
Kiểm tra sai số xem có ở mức chấp nhận được
không?
Thực hiện huấn luyện, điều chỉnh trọng số dựa vào nơron
thắng
Tính toán lại tỉ lệ sai số, ghi lại những giá trị đã được cải
thiện Cải thiện tỉ lệ sai số là tầm thường? Ma trận trọng số này đã tốt nhất chưả Nếu có ma trận trọng số tốt hơn của ma trận trọng số tốt nhất? Gán ma trận trọng số này thành ma trận trọng số tốt nhất Đã quá số chu kỳ xác định? Yes No Yes Yes No No No No Yes Yes
Hình 2.2: Sơ đồ khối biểu diễn huấn luyện mạng nơron Kohonen.
2.2.8 Tỉ lệ (tốc độ) học
Tham số học là một hằng và nó là một số nhỏ hơn 1, ở trên ký hiệu là α.
Thông thường, ta đặt cho tham số học một giá trị từ 0.4 đến 0.5, nếu tỉ lệ học lớn thì quá trình huấn luyện nhanh hơn. Tuy nhiên, việc đặt cho tỉ lệ học một giá trị
quá lớn có thể sẽ làm cho mạng không bao giờ hội tụ. Điều này làm thay đổi các vector trọng số sẽ quá lớn gây ảnh hưởng tới việc phân loại các mẫu nên ta chỉ cần chọn tỉ lệ học vừa đủ, và sử dụng nó để điều chỉnh các trọng số của các nơron. Trong phần tiếp theo, chúng ta sẽ xem các trọng số này được điều chỉnh sử dụng tham số học như thế nàọ
2.2.9 Điều chỉnh các trọng số (cập nhật trọng số)
Một công đoạn xuất hiện khi dữ liệu huấn luyện được đưa vào mạng nơron Kohonen, và các trọng số được điều chỉnh dựa trên các kết quả của dữ liệu huấn luyện. Sự điều chỉnh các trọng số sẽ làm cho mạng có thuận lợi hơn ngay sau khi nó được đưa trở lại mạng. Ma trận trọng số cuối cùng được sử dụng sẽ là ma trận tốt nhất được xác định từ mỗi chu kỳ. Bây giờ, chúng ta sẽ xem xét các trọng số này được thay đổi như thế nàọ
Phương pháp cho việc tính toán thay đổi các trọng số sử dụng phương trình sau: ) ( 1 t t t w x w w+ = +α − (2.48)
Biến x là vector huấn luyện được đưa vào mạng. Biến wt là trọng số của nơron thắng, và biến wt+1 là trọng số mới, α là hệ số học.
2.2.10 Tính toán sai số
Khi mạng huấn luyện không giám sát bao giờ cũng có sai số, đó là sự khác nhau giữa kết quả mong đợi và kết quả thực tế của mạng nơron. Sai số mà chúng ta tính toán là những cái mà không đúng giữa kết quả mong đợi và kết quả thực tế.
ej = ||x-wj||
Mục đích của mạng nơron Kohonen là phân loại dữ liệu đầu vào vào trong các tập khác nhau, cho nên sai số của mạng nơron Kohonen phải được đo lường. Sai số này sẽ được tính toán trong quá trình huấn luyện mạng.
2.3. Thực thi mạng nơron Kohonen
Có vài lớp có thể được sử dụng cùng nhau để tạo ra một mạng nơron Kohonen. Chương sau ta sẽ chỉ ra cách để xây dựng một ứng dụng dựa trên mạng nơron Kohonen, đó là ứng dụng nhận dạng ký tự quang (cụ thể là nhận dạng chữ viết tay). Các lớp được mô tả như sau:
· KohonenNetwork – Thực thi các phương thức thuộc về mạng nơron
Kohonen. Đây là nơi mà mạng nơron Kohonen được huấn luyện và lấy các mẫụ
· Network – Chứa đựng các phương pháp không thuộc về mạng nơron
Kohonen. Các lớp này chứa các phương pháp để tính toán tích vô hướng, và chiều dài vector.
· NeuralReportable – Một giao diện đơn giản cho phép mạng nơron Kohonen
trả về thông tin tiến bộ sau khi mạng nơron được huấn luyện.
· TrainingSet – Một tập huấn luyện chứa đối tượng, đó là có thể chứa các
mảng của các lần huấn luyện riêng lẻ. Tập huấn luyện có thể chứa cả các phần tử dữ liệu đầu vào và dữ liệu đầu rạ
Các lớp này hoạt động cùng nhau để cung cấp các chức năng cho mạng Kohonen. Trước tiên, ta xem việc thực thi mạng nơron truyền thẳng xem chúng hoạt động như thế nàọ
2.3.1 Thực thi mạng nơron truyền thẳng
Khi thực thi mạng nơron truyền thẳng, dữ liệu được truyền đến đối tượng “synapse”. Phương thức run chạy một vòng lặp luôn luôn đợi mẫu dữ liệu mới và sau đó chuyển chúng thành dữ liệu đầu ra, danh sách 2.1 chỉ ra phương thức run hoạt động để nhớ mẫu của lớp Layer.
Danh sách 2.1: Phương thức Layer.run public void run() {
while ( running ) { int dimI = getRows(); int dimO = getDimension(); // Nhớ mẫu
inps = new double[dimI]; this.fireFwdGet(); if ( m_pattern != null ) { forward(inps); m_pattern.setArray(outs); fireFwdPut(m_pattern); } if ( step != -1 )
// Kiểm tra nếu bước tiếp theo đang được học m_learning = monitor.isLearningCicle(step); else
// Dừng mạng running = false;
//Nếu ((m_learning) && (m_batch != 1)) if ( (m_learning) && (running) )
{ // Học
gradientInps = new double[dimO]; fireRevGet();
backward(gradientInps);
m_pattern = new Pattern(gradientOuts); m_pattern.setCount(step);
fireRevPut(m_pattern); }
} // Kết thúc while (running = false) myThread = null;
}
Phương thức fireFwdPut được gọi để truyền mẫu vào trong “synapse” đầu rạ
forward(inps);
m_pattern.setArray(outs); fireFwdPut(m_pattern);
Khi các phương thức “forward” và “fireFwdPut” được gọi, có ba biến liên quan đó là:
· Các trọng số kết nối · Độ lệch trọng số · Hàm ngưỡng
Phương thức đầu tiên được gọi là phương thức fireFwdGet. Công việc chính của phương thức này là nhận mẫu từ “synapse” đầu vào, và đợi cho đến khi không có mẫu nào được đưa vàọ
Lớp dữ liệu đầu vào chỉ nhận các giá trị {0,1} của mẫu để nhớ. Sau đó, lớp đầu vào sẽ áp dụng hàm ngưỡng, đưa chúng đến lớp tiếp theọ Chúng ta sử dụng kiểu hàm sigmoid trong lớp dữ liệu đầu vào, thực thi hàm sigmoid qua lớp SigmoidLayer. Danh sách 2.2 chỉ ra phương thức SigmoidLayer.forward().
Danh sách 2.2: Phương thức SigmoidLayer.forward public void forward(double[] pattern)
{ int x; double in; int n = getRows(); try { for ( x = 0; x < n; ++x ) { in = pattern[x] + bias.value[x][0]; outs[x] = 1 / (1 + Math.exp(-in)); }
} catch ( Exception aioobe ) { aioobẹprintStackTrace(); }
}
Từ danh sách 2.2 ta thấy, phương thức SigmoidLayer.layer() áp dụng hàm sigmoid cho mỗi nơron trong lớp nàỵ Hàm sigmoid đã được đề cập ở trên.
Phương thức Layer.run đã xử lý dữ liệu đầu vào bằng cách sử dụng hàm ngưỡng sigmoid, lớp này sẵn sàng đưa mẫu tới lớp kế tiếp. Khi mẫu được đưa vào lớp tiếp theo, thì các trọng số thích hợp được cập nhật.
Bây giờ, phương thức Layer.run áp dụng hàm ngưỡng cho mỗi giá trị nơron, lớp phải truyền mẫu lên trên synapsẹ Synapse này áp các trọng số kết nối và gửi mẫu tới lớp tiếp theo, chúng được thể hiện ở phương thức fireFwdPut(). Phương thức fireFwdPut được chỉ ra trong danh sách 2.3.
Danh sách 2.3: Phương thức Layer.fireFwdPut protected void fireFwdPut(Pattern pattern) {
if ( aOutputPatternListener == null ) { return;
};
int currentSize = aOutputPatternListener.size(); OutputPatternListener tempListener = null;
for ( int index = 0; index < currentSize; index++ ){ tempListener = (OutputPatternListener)aOutputPatternListener.elementAt(index); if ( tempListener != null ) { tempListener.fwdPut((Pattern)pattern.clone()); }; }; }
Phương thức Layer.fireFwdPut chịu hai trách nhiệm. Thứ nhất, nó áp các trọng số kết nối giữa các nơron ở lớp hiện thời cho các nơron ở lớp tiếp theọ Thứ hai, nó chuyển mẫu này đến synapsẹ Phương thức này chuyển mẫu đến synapse bằng cách gọi phương thức SynapsẹfireFwdPut. Phương thức SynapsẹfireFwdPut được chỉ ra trong danh sách 2.4.
Danh sách 2.4: Phương thức SynapsẹfireFwdPut public synchronized void fwdPut(Pattern pattern) { if ( isEnabled() ) { count = pattern.getCount(); while ( items > 0 ) { try { wait(); } catch ( InterruptedException e ) { //ẹprintStackTrace(); return; } } m_pattern = pattern; inps = (double[])pattern.getArray(); forward(inps); ++items; notifyAll(); } }
Khi vòng lặp chờ hoàn thành synapse, nó sẽ xử lý dữ liệu đầu vào, và sau đó truyền mẫu tới lớp tiếp theọ Việc xử lý chỉ là synapse sẽ thực hiện trên mẫu để áp độ lệch. Theo các quy trình của phương thức SynapsẹfwdPut, nó sẽ sao chép mẫu mà nó đã truyền vào biến lớp m_pattern.
m_pattern = pattern;
Mảng mẫu sau đó được sao chép tới một mảng hai giá trị để xử lý.
inps = (double[])pattern.getArray();
Sau đó, mảng mẫu hai giá trị được truyền vào phương thức forward. Trong tất cả các lớp, phương thức forward luôn luôn được sử dụng để áp độ lệch.
forward(inps);
Khi độ lệch đã được áp, mẫu được sẵn sàng được xử lý ở lớp tiếp theọ