
Pengarang: David Schiff
Awalnya diterbitkan di Towards AI the World’s Leading AI and Technology News and Media Company. Jika Anda sedang membangun produk atau layanan terkait AI, kami mengundang Anda untuk mempertimbangkan untuk menjadi sponsor AI. Di Towards AI, kami membantu menskalakan AI dan startup teknologi. Biarkan kami membantu Anda melepaskan teknologi Anda kepada massa.
Salah satu batas terbesar dalam TI dan administrasi sistem adalah berurusan dengan kegagalan aplikasi dan sistem. Terkadang alasan kegagalan sangat sulit ditemukan. Ketika teknisi sistem dan pengembang aplikasi perlu menemukan penyebab kegagalan aplikasi mereka, mereka biasanya membaca file log yang dihasilkan oleh sistem tersebut. Teknisi kemudian akan menemukan log yang relevan dengan kerusakan dan akan menggunakan informasi ini untuk memulihkan dari kegagalan. Masalah dengan teknik ini adalah terkadang sistem dan aplikasi menghasilkan ratusan ribu log dan bahkan jutaan. Pekerjaan mencari pesan log tunggal yang akan memprediksi crash bisa memakan waktu yang sangat lama, dan tugas itu sendiri mungkin melelahkan.
Selama bertahun-tahun, banyak metode telah diusulkan untuk menangani tugas menemukan pesan log yang relevan ini. Banyak dari metode ini menggunakan ide yang berasal dari bidang deteksi anomali. Seperti yang dapat kita asumsikan secara apriori, log yang akan memprediksi crash dan dapat memberikan indikasi tentang apa yang menyebabkannya seharusnya menjadi anomali. Ini karena jika tidak anomali, kami tidak dapat membedakan antara aktivitas sistem normal dan aktivitas yang dapat memprediksi kegagalan yang akan datang.
Deteksi anomali seperti itu, hingga saat ini, sebagian besar melibatkan teknik ekstraksi fitur yang berbeda yang diterapkan untuk digunakan dalam model deteksi anomali klasik seperti IsolationForest atau OneClassSVM dan banyak lagi. Idenya pada dasarnya adalah bahwa kami mengekstrak fitur yang relevan dari teks yang mungkin relevan untuk membedakan antara log normal dan anomali. Masalah dengan teknik ini adalah kita mengasumsikan banyak hal tentang distribusi data kita. Selain itu, teknik ini tidak umum seperti yang kita inginkan. Salah satu teknik ekstraksi fitur mungkin relevan untuk log HDFS, dan teknik lainnya akan relevan untuk log SQL. Ini berarti bahwa tidak ada “model universal” untuk deteksi anomali log.
Akhir-akhir ini, teknik yang melibatkan pembelajaran mendalam telah menjadi populer. Menggunakan Jaringan Saraf Berulang seperti LSTM atau GRU telah menjadi metode populer untuk mendeteksi anomali dalam urutan seperti urutan teks yang ada dalam log sistem. Sayangnya, RNN kekurangan memori yang kami butuhkan untuk analisis log sistem yang kompleks.
Pada artikel ini, saya ingin menjelaskan dan menyederhanakan metode LogBERT untuk mendeteksi anomali dalam urutan log.
Untuk memulai analisis mendalam, kami akan memecah blok transformator, yang merupakan komponen utama BERT.
Blok Transformer
Untuk memulai, kita akan masuk ke lapisan embedding. Komponen penting di sebagian besar jaringan saraf yang berhubungan dengan bahasa alami. Jadi bagaimana cara kerja lapisan embedding?
Embeddings — word embeddings, tepatnya, adalah representasi dari token di beberapa ruang vektor. Kami ingin representasi vektor ini menangkap arti kata itu sendiri. Contoh yang bagus dari jenis metode penyisipan kata adalah Word2Vec. Tujuan dari Word2Vec adalah untuk memaksimalkan kesamaan kosinus dari penyisipan kata yang muncul dalam konteks yang sama dalam sebuah kalimat [I really like eating apples. I enjoy eating tuna. => tuna and apples should have similar representations]. Kami tidak akan membahasnya di sini, tetapi Anda mendapatkan idenya. Tujuannya adalah untuk menemukan beberapa representasi dari sebuah kata yang akan cukup bermakna ketika diberikan sebagai masukan ke jaringan saraf.
Lalu bagaimana kita mengolah sebuah kalimat menjadi sesuatu yang bermakna? Dalam kasus kami, bagaimana kami memproses urutan kata dalam pesan log menjadi sesuatu yang bermakna? Mari kita menyelam ke dalamnya.
Nah, mulailah dengan contoh berjalan yang akan kita gunakan di seluruh rangkaian artikel kita.
Kami akan mulai dengan menandai kalimat ini, setiap kata akan dianggap sebagai token. Kami kemudian memiliki daftar token. Tentu saja, dalam file log, ada lebih banyak kata tetapi pertimbangkan pesan log tunggal ini sebagai contoh. Setiap kata akan ditempatkan dalam kamus atau daftar dengan nomor yang mewakilinya (saya tidak menghilangkan semua kata berhenti dan melakukan langkah-langkah prapemrosesan lainnya hanya untuk contoh ini):
Sekarang, lapisan embedding terlihat seperti ini:
Matriks Penyematan
Apa yang kita lihat di sini adalah array yang berisi vektor di setiap sel array. Pada dasarnya yang terjadi adalah ketika urutan kata-kata [1,2,3,4,5,6] diberikan sebagai input ke jaringan saraf, lapisan embedding menerjemahkan setiap indeks kata ke representasi vektor menggunakan lapisan embedding. Jadi jaringan saraf itu sendiri tidak melihat urutan kata atau urutan indeks tetapi urutan vektor! Lapisan embedding itu sendiri memiliki ukuran embedding yang dapat dikonfigurasi (dimensi representasi kata). Hanya untuk bersenang-senang, contoh lain adalah:
Ini akan diterjemahkan ke urutan [1,6,3,4], yang berarti lapisan embedding kami mengambil vektor dalam indeks no. 1 dalam matriks embedding, maka vektor no. 6, dan kemudian tidak. 3 dan akhirnya, tidak. 4. Tentu saja, padding akan diperlukan karena kita harus memiliki panjang yang konstan dalam urutan kita. Dan hasilnya akan menjadi matriks yang mewakili kalimat atau urutan kita.
Sekarang setelah kita mendapatkannya, mari kita simpulkan:
Lapisan embedding berisi matriks embedding yang pada dasarnya berisi referensi ke vektor yang harus mewakili kata itu. Ketika kata-kata dimasukkan ke dalam lapisan penyematan, kata-kata itu dimasukkan sebagai urutan indeks yang mengacu pada vektor yang harus mewakilinya dalam matriks penyematan.
Secara matematis, itu dapat direpresentasikan sebagai perkalian matriks dari dua matriks. Matriks A adalah representasi vektor one-hot dari kata-kata dalam kalimat, dan Matriks B adalah matriks embedding itu sendiri yang berisi representasi vektor dari setiap kata dalam korpus. Jadi A x B Harus memberi kita urutan penuh kata-kata yang direpresentasikan sebagai vektor.
Bagian selanjutnya dari blok transformator adalah pengkodean posisi. Ini adalah bagian dari blok transformator tempat kami mengkodekan informasi tentang posisi kata dalam urutan. Bagaimana ini dilakukan?
Diberikan sebuah vektor V = , yang mewakili penyisipan beberapa kata X, kita ingin merepresentasikan posisi kata dalam barisan itu sendiri.
Fungsi pengkodean posisi
Seperti yang bisa kita lihat, fungsi ini digunakan untuk mengkodekan posisi sebuah kata. Bagaimana ini dilakukan? Mengingat urutan kata, kata X bisa hadir di posisi yang berbeda dalam urutan. Katakanlah, dalam sebuah contoh kalimat, kata tersebut dapat diposisikan di tengah seperti:
Bob makan dua X pagi ini.
Dalam hal ini, X berada di tengah kalimat, dan posisi X adalah 4 dan akan dikodekan menggunakan fungsi di atas. Jika V tertanam dalam ruang 4 dimensi seperti yang dinyatakan di atas V = maka transformasi V menjadi:
Dan akhirnya, kata X kami direpresentasikan dalam ruang 4 dimensi menggunakan lapisan penyematan dan lapisan pengkodean posisi untuk menangkap lokasi kata dalam urutan.
Perhatian dan normalisasi
Selanjutnya, urutan kami, direpresentasikan sebagai matriks dimensi DxN di mana D mewakili dimensi embedding kami dan N mewakili ukuran urutan kami, dimasukkan ke dalam lapisan perhatian multi-kepala. Mari kita menyelam ke dalamnya.
Apa itu perhatian multi-kepala? Mari kita mulai dengan lapisan perhatian-diri yang sederhana:
Perhatian Diri
Pada dasarnya, Self Attention adalah fungsi yang kami lakukan pada matriks input kami:
Perhatian Diri
Kami akan memecah fungsi ini, tetapi untuk artikel ini, kami akan mengabaikan penyebut karena digunakan untuk normalisasi dan bukan inti untuk memahami ide di balik perhatian.
Kami memiliki perhatian diri kami di sini. Prosesnya terdiri dari beberapa tahap. Yang pertama adalah kita menerapkan transformasi linier pada matriks input kita sebanyak 3 kali — satu untuk matriks Query, satu lagi untuk Key, dan satu lagi untuk Value (Kita akan menyebutnya Q,K,V). Sekali lagi, matriks input kami pada dasarnya adalah urutan input yang dikodekan sebagai vektor. Jadi matriks input kami sedang ditransformasikan menjadi tiga matriks yang berbeda.
Pada gambar di atas, kita dapat melihat bahwa perkalian matriks diterapkan pada matriks Kunci dan Nilai. Ini menghasilkan matriks yang mewakili hubungan kata dua arah kami (tentu saja, setelah bobot dalam matriks dipelajari dengan benar). Matriks hubungan kata ini memungkinkan kita untuk menangkap struktur dan makna kalimat dengan cara yang belum dapat kita tangkap dalam rangkaian pembelajaran jaringan saraf sebelumnya seperti LSTM atau GRU. Ini karena jenis jaringan saraf tersebut menderita kekurangan memori jangka panjang, sementara perhatian diri memperhatikan hubungan antara kata-kata di seluruh kalimat seperti:
Matriks perhatian, yang menangkap hubungan kata, akhirnya dikalikan dengan matriks nilai. Perhatikan bagaimana setiap kata memiliki “skor” untuk seberapa banyak itu terkait dengan kata-kata lain dalam kalimat. Dalam contoh di atas, pengguna dan admin memiliki skor hubungan yang tinggi.
Seperti disebutkan dalam makalah (Terjemahan Mesin Neural oleh Jointly Learning to Align and Translate), perhatian, menurut definisi, hanyalah nilai rata-rata tertimbang,
di mana
Jika kita membatasi menjadi vektor satu panas, operasi ini menjadi sama dengan mengambil dari himpunan elemen h dengan indeks . Dengan dihilangkannya batasan, operasi perhatian dapat dianggap melakukan “pengambilan proporsional” menurut vektor probabilitas .
Harus jelas bahwa h dalam konteks ini adalah nilai (dalam kasus kami, matriks nilai).
Setelah memperhatikan hal ini, kita dapat melihat bahwa matriks nilai dikalikan dengan matriks yang dihasilkan dari perkalian kueri dan kunci. Ini akhirnya menjadi definisi yang tepat dari perhatian, karena kami menggunakan teknik pengambilan berbobot dengan bobot diambil dari matriks hubungan kata.
Jika kita menerapkan perkalian matriks di sini, kita akan melihat bahwa pengkodean untuk urutan dalam matriks di sebelah kiri dikalikan dengan hubungan proporsional setiap kata dengan semua kata lainnya.
Selanjutnya, kita memiliki Perhatian Multi-Kepala. Ini mirip dengan beberapa filter yang kami gunakan dalam jaringan saraf convolutional. Alasannya adalah karena kami menggunakan beberapa filter untuk menangkap pola berbeda dalam gambar kami yang dapat menunjukkan apa pun yang kami cari dalam gambar itu. Dalam Multi-Head Attention, kami menangkap kemungkinan hubungan yang berbeda dalam kalimat yang dapat menghasilkan makna yang berbeda sama sekali. Perhatian Multi-Kepala sebenarnya sangat sederhana setelah kita memahami perhatian. Pada dasarnya, semua yang kita lakukan adalah menggabungkan matriks yang dihasilkan dari kepala perhatian seperti:
Concatenation berarti kita hanya melampirkan semua matriks satu sama lain. Produk akhir harus berupa matriks besar.
Bagian ini seharusnya merangkum komponen utama LogBERT dan Struktur BERT. Saya tidak masuk ke semua lapisan normalisasi dan penskalaan dan semua itu karena saya pikir itu bukan detail penting dan tidak ingin membuang waktu untuk menulis tentangnya. Jika ada yang bingung tentang hal itu, mereka dapat membacanya di tempat lain.
Di bagian selanjutnya, saya ingin membahas arsitektur LogBERT terakhir dan fungsi kerugian sehingga kita dapat melihat bagaimana semuanya cocok satu sama lain. Terima kasih telah membaca sejauh ini.
LogBERT Dijelaskan Secara Mendalam: Bagian I awalnya diterbitkan di Towards AI on Medium, di mana orang-orang melanjutkan percakapan dengan menyoroti dan menanggapi cerita ini.
Diterbitkan melalui Menuju AI