Giả sử ta thay convolution kernal bằng một một mạng RNN. Khi đó, mỗi pixel sẽ được đảm nhận bởi 1 mạng neuron, mạng này nhận đầu vào từ khu vực lân cận của pixel này. Mỗi mạng này lần lượt đều có bộ nhớ tế bào (memory cell) và liên kết hồi quy theo thời gian.
Ta thực hiện phép thay thế một lần nữa, nhưng lần này sẽ thay thế các pixel bởi các nốt. Khi đó, ý tưởng của mơ hình đã được thực hiện. Chúng ta xếp những mạng RNN tương tự nhau thành từng stack, mỗi stack này sẽ chịu trách nhiệm cho một nốt đầu ra, và đầu vào cho mỗi stack là thơng tin lân cận cục bộ (ví dụ 1 quãng 8 trên và dưới) của nốt do stack này đảm nhiệm. Điều này sẽ giúp mơ hình đạt được sự bất biến về nhịp lẫn nốt.
Hình 4.2:Mơ hình CNN với nhân RNN cho bài tốn tự sinh âm nhạc (Nguồn: [24]). Tuy nhiên mơ hình này vẫn chưa đủ, sự liên kết hồi quy giúp tạo ra các mẫu theo nhịp nhưng chưa tạo được hợp âm bởi vì mỗi đầu ra hồn tồn độc lập với đầu ra của các nốt khác. Vì vậy tác giả tiếp tục thêm 1 phần trong mơ hình với mục đích là xử lý tạo ra hợp âm phù hợp, dựa vào đầu vào của các nốt trước. Tác giả gọi đây là mơ hình LSTM song trục, với một trục là mơ hình LSTM cổ điển theo nhịp và trục cịn lại cũng là mơ hình LSTM kết hợp một kernel tương tự kernel của một mạng tích chập học sâu cho nốt. Mạng LSTM trục nốt sẽ nhận đầu vào là kết
quả từ mạng LSTM của những nốt trước đó và kích hoạt dựa vào LSTM trục thời gian cho từng nốt cụ thể. Kết quả của lần kích hoạt cuối cùng sẽ được đưa vào một lớp softmax để tính tốn kết quả xác suất nhằm đưa ra dự đốn nốt tiếp theo.
Hình 4.3:Mơ hình học máy LSTM song trục (Nguồn: [24]).
Khi đó, ý tưởng về kiến trúc của mơ hình đã hồn thiện. Vì kiến trúc này, các xử lý đầu vào của mơ hình cũng khá phức tạp và đặc biệt. Với kiến trúc trên, ta không thể truyền đầu vào và một vectorv(t) biểu diễn tồn bộ nốt được nữa. Thay vào đó, mơ hình sẽ được truyền 2 vector đầu vào: vector cửa số cục bộ (local window)w(n,t) và vector tập các thùng (bin) z(n,t). Vector cửa sổ cục bộw(n,t)là một phần của vector nốtv(t), thoảw(n,t)i =v(t)n−13+ivới1≤i≤25. Vector này
cung cấp thông tin các nốt lân cận trong phạm vi 1 quãng 8 ở trên và dưới nốt đang xét. Nếu như cửa sổ cục bộ vượt quá giới hạn củavthì những nốt nằm ngồi vùng giới hạn này sẽ được gán giá trị 0. Bên cạnh đó, mỗi thùngzisẽ chứa giá trị đúng bằng số lượng các nốt cách nốt hiện tại 1 khoảng i xét trên mọi quãng 8.
z(n,t)i = ∞
∑
m=−∞
v(t)i+m+12n (4.3)
Cách làm này tương đương với việc quét tất cả các nốt trên mỗi lớp cao độ (pitchclass) và thực hiện tính tốn quan hệ từng nốt với nốt hiện tại. Lấy ví dụ, nốt hiện tại ở lớp cao độ D, thìz2sẽ là tổng số nốt thuộc lớp cao độ E trên mọi quãng 8.
Dưới đây là hình ảnh minh hoạ của cơ chế window and bin:
Bên cạnh đó, mặc dù âm nhạc mang tính bất biến theo nốt, tuy nhiên vẫn có sự khác biệt giữa nốt cao và nốt trầm trong thực tế. Do đó, ngoại trừ các thơng tin đã đươc đề cập ở trên, tác giả còn bổ sung cho đầu giá trị MIDI biểu diễn cao độ tương ứng của mỗi nốt. Ngoài ra, như đã đề cập ở trên, tác giả mong muốn mơ hình có thể học được về nhịp, tác giả còn bổ sung vào đầu vào cho mơ hình các bit biểu diễn nhịp. Tóm lại, đầu vào sẽ được biểu diễn như sau:
Hình 4.4:Minh hoạ cơ chế window and bin. Ơ vng viền đậm là minh hoạ cho nốt hiện tại.Phía bên trái minh hoạ cho của sổ cục bộ quanh nốt đang xét. Phía bên phải, các nốt cùng lớp Phía bên trái minh hoạ cho của sổ cục bộ quanh nốt đang xét. Phía bên phải, các nốt cùng lớp cao độ trên các quãng 8 được "đóng thùng" với nhau. Lưu ý rằng một quãng 8 trong ảnh minh hoạ được biểu diễn gồm 4 nốt, trên thực tế kích thước của 1 quãng 8 là 12 nốt (Nguồn: [24]).
• 12 bit biểu diễn lớp cao độ của nốt hiện tại.
• 50 bit để biểu diễn cửa sổ cục bộ của nốt. Mỗi nốt nằm trong cửa sổ cục bộ này sẽ được biểu diễn 2 trạng thái bằng 2 bit: 1 bit biểu diễn nốt đó được chơi hay khơng, 1 bit biểu diễn nốt có được chơi dứt khốt (khơng ngân kéo dài qua 2 bước thời gian) hay khơng.
• 12 bit biểu diễn các "thùng".
• 4 bit để biểu diễn nhịp.
Đầu vào này sẽ được truyền vào cho lớp đầu tiên của trục thời gian. Ở trục nốt sẽ nhận vào 2 đầu vào: đầu ra của lớp LSTM cuối cùng theo trục thời gian của nốt đó, và đầu ra cuối cùng của mạng neuron tương ứng với nốt liền trước (thấp hơn nửa cung). Đầu ra cuối cùng sẽ được qua hàm kích hoạt softmax để tính tốn 2 giá trị xác suất:
• Xác suất nốt được chọn để chơi.
• Xác xuất nốt được chơi dứt khốt (tức là khơng ngân nốt liên tục giữa các timestep) nếu nó được chọn để chơi.
4.2 Mơ hình DeepJ
Mơ hình DeepJ thừa hưởng chủ yếu từ mơ hình Biaxial LSTM kết hợp với những cải tiến của nhóm tác giả giúp mơ hình có thể sinh ra nhạc theo một loại hay kết hợp các phong cách soạn nhạc của các tác giả chung loại nhạc lại với nhau.
4.2.1 Biểu diễn dữ liệu
Mơ hình DeepJ sử dụng các biểu diễn các bài hát khá tương tự như mơ hình Biaxial nhưng cải tiến hơn về phương thức biểu diễn tiết tấu.
Cường độ trong âm nhạc được định nghĩa là âm lượng tương đối của một nốt nhạc. Đặc tính này rất quan trọng trong biểu diễn, giúp tăng tính cao trào và cảm xúc của bài nhạc. Tập tin MIDI dữ liệu biểu thị độ to của một nốt nhạc trong khoảng từ 0 tới 127. Nhóm tác giả đã nhận thấy đặc tính này và đã thêm nó vào biểu diễn đầu vào của mơ hình: thay vì sử dụng 2 giá trị nhị phân 0 và 1 để biểu diễn nốt có đang được chơi hay khơng như mơ hình Biaxial-LSTM, tác giả đã dùng các số thực trong khoảng từ 0 đến 1 (với giá trị 1 là giá trị biểu thị âm lượng lớn nhất) để đồng thời biểu thị cả âm lượng chơi của nốt. Tệp tin MIDI bài hát được biểu diễn bởi ma trận có kích thước N x T, trong đó N là số các nốt nhạc xuất hiện trong bài hát xét về cao độ, T là độ dài về thời gian của bài hát. Dưới đây là ví dụ cho N = 4 (nốt) qua T = 4 (timestrep), trong đó có 2 nốt được ngân qua 2 timestep liên tiếp với cường độ chơi là 0.4 .
tdynamics= 0 0 0 0 0.4 0.4 0 0 0 0 0 0 0.4 0.4 0 0
Để đạt được mục tiêu sinh nhạc theo một loại nhạc, mơ hình DeepJ có thêm biểu diễn về loại nhạc bài hát thuộc về và phong cách sáng tác của tác giả bài hát. Các nhạc sĩ sáng tác được gom vào một thể loại âm nhạc cụ thể. Phong cách sáng tác âm nhạc được mã hóa bởi kiểu biểu diễn one-hot cho tất cả cá nhà soạn nhạc. Nếu một dịng nhạc gồm nhiều nhạc sĩ, dịng nhạc đó sẽ được biểu diễn bởi một vector được chuẩn hóa có tổng giá trị tại chỉ số thứ tự của các nhạc sĩ trong dịng nhạc đó tổng bằng 1. Dưới đây là ví dụ vector biểu diễn cho dịng nhạc baroque chứa bài hát của bốn nhạc sĩ có số thứ tự từ 1 tới 4.
sbaroque=
0.25,0.25,0.25,0.25,0,0, ...
Ngồi ra, nhóm tác giả biểu diễn thêm ngữ cảnh đầu vào để mơ hình có thể nắm bắt được cấu trúc bài hát và tạo ra âm nhạc có cấu trúc tốt. Mơ hình được cung cấp vị trí nhịp của thanh nhạc hiện tại bởi vector one-hot có số chiều là q, số lượng qui định nhịp trên mỗi thanh. Mơ hình DeepJ cóq=16để có thể ghi lại được các nốt nhạc ngắn và đồng thời không tốn quá nhiều chi phí cho việc tính tốn.
4.2.2 Hàm mục tiêu
DeepJ tạo ra nốt nhạc và cường độ của nốt nhạc đó, với mỗi nhịp, mơ hình có 3 đầu ra: xác suất chơi, xác suất lặp lại và xác suất cường độ. Xác suất chơi và lặp lại được huấn luyện như bài toán hồi quy với hàm mất mát binary cross entropy.
Lplay=∑tplaylog(yplay) + (1−tplay)log(1−yplay) (4.4)
Lreplay=∑tplay(treplaylog(yreplay) + (1−treplay)log(1−yreplay)) (4.5) Cường độ huấn luyện sử dụng hàm mất mát mean squared error.
Ldynamics=∑tplay(tdynamics−ydynamics)2 (4.6) Mơ hình DeepJ được huấn luyện sử dụng stochastic gradient descent với hàm tối ưu Nesterov Adam.
4.2.3 Mơ hình
Thiết kế mơ hình DeepJ về cơ bản giống như cấu trúc của mơ hình Biaxial LSTM. Sự khác biệt cơ bản của hai mơ hình là việc sử dụng vector phong cách nhạc ở mỗi lớp của DeepJ.
Hình 4.5:Mơ hình DeepJ
Mơ hình DeepJ gồm hai lớp các tầng LSTM. Lớp LSTM trục thời gian gồm 256 đơn vị và lớp LSTM trục nốt nhạc gồm 128 đơn vị.
Các ma trận biểu diễn bài hát trước khi được đưa vào các lớp LSTM sẽ được đi qua 1 lớp tích chập 1 chiều nhằm trích xuất các đặc điểm của nốt nhạc từ vùng lân cận quãng tám của mỗi nốt nhạc. Sau đó kết quả đầu ra của lớp tích chập được nối với ma trận ngữ cảnh của nốt nhạc trước khi đưa vào các lớp LSTM.
Các loại âm nhạc không nhất thiết phải khác biệt nhau hồn tồn, ví dụ như dịng nhạc classical và baroque có chia sẻ nhiều điểm chung. Do đó, nhóm tác giả cho rằng việc biểu diễn phong cách nhạc sử dụng các vector phân phối đã được trích xuất sẽ phù hợp hơn dạng biểu diễn one- hot. Ở đây, DeepJ sử dụng 1 lớp ẩn tuyến tính, kí hiệu là W, biểu diễn thể loại nhạc s ban đầu sau khi qua lớp này sẽ là h.
h=W s (4.7)
Kết quả h sau đó được nối với một mạng ẩn kết nối đầy đủ với hàm kích hoạt tanh để tạo ra một biểu diễn phi tuyến tiềm ẩnh′ của phong cách âm nhạc ở mỗi lớp LSTM.
h′l=tanh(W′lh) (4.8) Trong đó, l là chỉ số thứ tự của lớp LSTM đó.h′l sẽ ảnh hưởng tới tất cả các nốt nhạc trước khi chúng được đưa vào các lớp LSTM thông qua phép tổng kết (summation). Để làm cho kích thước của hai lớp tương thích cho phép tổng kết, mơ hình thực hiện việc tính tốn kèm vớih′
cho các nốt nhạc. Nói cách khác, đối với nốt thứ i và các đặc điểm đầu vào của nó làxi, đầu ra
zicủa LSTM cho nốt đó được định nghĩa là
zi= f(xi+h′) (4.9) Trong đó xi là đầu vào chưa sửa đổi, "+" đề cập đến phép tổng wise và f là hàm áp dụng lớp LSTM cho một số đầu vào. Điều này áp dụng cùng một phong cách âm nhạc cho mỗi nốt nhạc. Dropout được sử dụng cho DeepJ trong q trình đào tạo. Mơ hình sử dụng tỷ lệ dropout 50% ở tất cả các lớp không phải đầu vào (ngoại trừ lớp nhúng của phong cách âm nhạc) và tỷ lệ dropout 20% ở các lớp đầu vào.
4.3 Đánh giá mơ hình Biaxial LSTM và DeepJ
Mơ hình LSTM và DeepJ đã cho ra những kết quả đáng chú ý trong bài toán sinh nhạc. Các kết quả từ 2 mơ hình đã có thể mơ phỏng tương đối tốt các đặc tính của âm nhạc, đặc biệt mơ hình DeepJ cịn có thể mơ phỏng được cả thể loại và phong cách sáng tác.Tuy nhiên, vì cả 2 mơ hình đều dựa trên mơ hình hồi quy RNN, nên cả 2 đều có những hạn chế đặc trưng của mơ hình hồi quy trong bài tốn xử lý ngơn ngữ tự nhiên:
• Sự lặp lại các mẫu: đây là một hạn chế điển hình của mơ hình hồi quy, dẫn đến giai điệu sinh ra từ mơ hình sẽ có khuynh hướng lặp đi lặp lại các mẫu phổ biến một cách liên tục, làm giảm tính hài hồ và tự nhiên của bài nhạc.
• Sự khơng thống nhất về giai điệu: giai điệu được sinh ra đơi lúc có những đoạn chuyển đột ngột, dẫn đến sự kém thống nhất và hài hồ.
• Thời gian huấn luyện dài: cả hai mơ hình đều có thời gian huấn luyện khá lớn, địi hỏi tài nguyên cấu hình khá mạnh. Riêng mơ hình DeepJ vì có thêm các lớp xử lý loại nhạc nên yêu cầu về bộ nhớ và tính tốn càng cao nên cần tài nguyên lớn.
Bên cạnh đó, thời gian sinh đầu ra của mơ hình tương đối lớn, khơng thích hợp với mục tiêu tạo trang web sinh nhạc trực tuyến mà nhóm đã đặt ra cho luận văn. Do đó, nhóm đã quyết định khơng sử dụng cả 2 mơ hình cho phạm vi luận văn của mình sau một khoảng thời gian xem xét và cân nhắc. Thay vào đó, nhóm đã tìm kiếm và thử nghiệm một mơ hình phù hợp với mục đích luận văn đã đặt ra hơn: đó là mơ hình MusicAutobot. Chi tiết về mơ hình sẽ được giới thiệu trong mục tiếp theo.
4.4 Mơ hình MusicAutobot
Mơ hình MusicAutobot được xây dựng dựa trên mơ hình xử lý ngơn ngữ tự nhiên Trans- formerXL. Bên cạnh đó, mơ hình cịn có 2 mơ hình bổ trợ đi kèm, là mơ hình "dịch" giai điêu - hợp âm Seq2Seq và mơ hình phối lại giai điệu BERT Masking. Chi tiết về cách thức xử lý dữ liệu, cùng kiến trúc từng mơ hình sẽ được trình bày chi tiết trong các mục bên dưới. Cách thức hiện thực mơ hình sẽ được phân tích chi tiết hơn trong phần 5 - Hiện thực hệ thống.
4.4.1 Tiền xử lý dữ liệu
Dữ liệu đầu vào của mơ hình là dạng tệp MIDI. Phần này sẽ trình bày cách thức mà tệp MIDI được mã hoá biểu diễn trước khi được truyền vào để huấn luyện mơ hình học sâu.
4.4.1.1 Mã hố token (Tokenization)
Các bài hát dưới dạng tệp MIDI sẽ được mã hóa thành các ký tự chữ biểu diễn để có thể sử dụng huấn luyện trong mơ hình học sâu. Khi mã hóa biểu diễn cho bài hát ta cần quan tâm tới 2 kiểu biểu diễn thường thấy trong khuông nhạc là nốt nhạc đơn và hợp âm.
Mã hóa nốt nhạc đơn
Mỗi nốt nhạc đơn cần được thể hiện 2 giá trị là cao độ và trường độ của nốt nhạc đó. Ở đây, để biểu diễn nốt nhạc với 2 giá trị sử dụng chuỗi ký tự để thể hiện như ví dụ trong hình dưới đây. Các nốt nhạc được mã hóa theo các ký tự được quy định sẵn trong từ điển và thêm vào đó là ký tự kèm theo thể hiện trường độ của nốt nhạc đơn đó.
Hình 4.6:Ví dụ biểu diễn nốt nhạc đơn
Mã hóa hợp âm
Hợp âm gồm các nốt nhạc đơn được chơi cùng một lúc. Do đó để phân biệt việc chơi nhạc cùng lúc và chơi nhạc tuần tự cần có thêm một kí tự đặc biệt để thể hiện sự phân biệt giữa hai sự kiện đó.
Hình 4.7:Ví dụ biểu diễn hợp âm
Mã hóa các ký tự đặc biệt
Ngoài việc biếu diễn các ký hiệu âm nhạc cơ bản, khi mã hóa bài hát cần phải có những ký hiệu đặc biệt để mơ hình được huấn luyện có thể phân biệt và xác định khi nào kết thúc khi nào bắt đầu bài hát, mở đầu của khuông nhạc, ... Các điều đó giúp mơ hình có thể nhận biết được các luật khi viết một bài nhạc.
• xxbos: Bắt đầu bài hát
• xxpad: Bắt đầu khng nhạc
• xxeos: Kết thúc bài hát
• xxsep: Ngăn cách giữa các nốt nhạc, hợp âm với nhau
• xxcseq: Bắt đầu chuỗi hợp âm
• xxmseq: Bắt đầu chuỗi melody
Sau khi kết hợp các ý tưởng biểu diễn trên ta được cách để mã hóa một bài hát thành chuỗi token để đưa vào mơ hình học sâu. Dưới đây là ví dụ mã hóa một đoạn nhạc ngắn thành chuỗi token. Bên cạnh các ký tự đặc biệt đã nêu trên, cao độ của nốt nhạc được ký hiệu bằng ký tự n kèm theo số là giá trị cao độ của nốt nhạc được biểu diễn bởi tệp MIDI. Trường độ được ký hiệu